diff --git a/renderdoc/driver/shaders/spirv/spirv_debug.cpp b/renderdoc/driver/shaders/spirv/spirv_debug.cpp index ee7e0cda2..c93e6f710 100644 --- a/renderdoc/driver/shaders/spirv/spirv_debug.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_debug.cpp @@ -2871,6 +2871,7 @@ void ThreadState::StepNext(ShaderDebugState *state, const rdcarray } break; } + case Op::AtomicFAddEXT: case Op::AtomicIAdd: case Op::AtomicISub: case Op::AtomicSMin: @@ -2930,6 +2931,8 @@ void ThreadState::StepNext(ShaderDebugState *state, const rdcarray result.value.uv[0] |= value.value.uv[0]; else if(opdata.op == Op::AtomicXor) result.value.uv[0] ^= value.value.uv[0]; + else if(opdata.op == Op::AtomicFAddEXT) + result.value.fv[0] += value.value.fv[0]; // write the new value if(ptr.members.empty()) @@ -3083,7 +3086,6 @@ void ThreadState::StepNext(ShaderDebugState *state, const rdcarray break; } - case Op::AtomicFAddEXT: case Op::GroupIAddNonUniformAMD: case Op::GroupFAddNonUniformAMD: case Op::GroupFMinNonUniformAMD: diff --git a/renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp b/renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp index 5115a1caf..08fb101af 100644 --- a/renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp @@ -208,7 +208,7 @@ void Reflector::CheckDebuggable(bool &debuggable, rdcstr &debugStatus) const ext == "SPV_EXT_fragment_invocation_density" || ext == "SPV_KHR_no_integer_wrap_decoration" || ext == "SPV_KHR_float_controls" || ext == "SPV_KHR_shader_clock" || ext == "SPV_KHR_non_semantic_info" || - ext == "SPV_KHR_terminate_invocation") + ext == "SPV_KHR_terminate_invocation" || ext == "SPV_EXT_shader_atomic_float_add") { continue; } @@ -286,7 +286,7 @@ void Reflector::CheckDebuggable(bool &debuggable, rdcstr &debugStatus) const case Capability::VulkanMemoryModel: case Capability::VulkanMemoryModelDeviceScope: case Capability::DemoteToHelperInvocationEXT: - case Capability::Float64: + case Capability::AtomicFloat32AddEXT: { supported = true; break; @@ -307,12 +307,10 @@ void Reflector::CheckDebuggable(bool &debuggable, rdcstr &debugStatus) const case Capability::StorageBuffer8BitAccess: case Capability::UniformAndStorageBuffer8BitAccess: case Capability::StoragePushConstant8: - - // atomics + case Capability::Float64: + case Capability::AtomicFloat64AddEXT: case Capability::Int64Atomics: case Capability::Int64ImageEXT: - case Capability::AtomicFloat32AddEXT: - case Capability::AtomicFloat64AddEXT: // physical pointers case Capability::PhysicalStorageBufferAddresses: diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index 7e9ac733e..6c396cd41 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -927,6 +927,7 @@ DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceSamplerYcbcrConversionFeatures); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceScalarBlockLayoutFeatures); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceShaderAtomicInt64Features); +DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceShaderAtomicFloatFeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceShaderClockFeaturesKHR); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceShaderCorePropertiesAMD); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT); @@ -1242,6 +1243,7 @@ DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceSamplerYcbcrConversionFeatures); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceScalarBlockLayoutFeatures); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceShaderAtomicInt64Features); +DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceShaderAtomicFloatFeaturesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceShaderClockFeaturesKHR); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceShaderCorePropertiesAMD); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT); diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 684b46b1d..5fa385008 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -898,6 +898,9 @@ static const VkExtensionProperties supportedExtensions[] = { { VK_EXT_SEPARATE_STENCIL_USAGE_EXTENSION_NAME, VK_EXT_SEPARATE_STENCIL_USAGE_SPEC_VERSION, }, + { + VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME, VK_EXT_SHADER_ATOMIC_FLOAT_SPEC_VERSION, + }, { VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME, VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_SPEC_VERSION, diff --git a/renderdoc/driver/vulkan/vk_next_chains.cpp b/renderdoc/driver/vulkan/vk_next_chains.cpp index c5161c7ef..0b4185440 100644 --- a/renderdoc/driver/vulkan/vk_next_chains.cpp +++ b/renderdoc/driver/vulkan/vk_next_chains.cpp @@ -313,6 +313,8 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES, \ VkPhysicalDeviceShaderAtomicInt64Features); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT, \ + VkPhysicalDeviceShaderAtomicFloatFeaturesEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD, \ VkPhysicalDeviceShaderCorePropertiesAMD); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR, \ @@ -671,7 +673,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_KHR: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV: \ - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL: \ diff --git a/renderdoc/driver/vulkan/vk_serialise.cpp b/renderdoc/driver/vulkan/vk_serialise.cpp index 5e0fc4628..e4c23062f 100644 --- a/renderdoc/driver/vulkan/vk_serialise.cpp +++ b/renderdoc/driver/vulkan/vk_serialise.cpp @@ -689,6 +689,10 @@ SERIALISE_VK_HANDLES(); PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES, \ VkPhysicalDeviceScalarBlockLayoutFeatures) \ \ + /* VK_EXT_shader_atomic_float */ \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT, \ + VkPhysicalDeviceShaderAtomicFloatFeaturesEXT) \ + \ /* VK_EXT_shader_demote_to_helper_invocation */ \ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT, \ VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT) \ @@ -1140,9 +1144,6 @@ SERIALISE_VK_HANDLES(); PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT) \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT) \ \ - /* VK_EXT_shader_atomic_float */ \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT) \ - \ /* VK_EXT_shader_image_atomic_int64 */ \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT) \ \ @@ -7692,6 +7693,33 @@ void Deserialise(const VkSamplerYcbcrConversionImageFormatProperties &el) DeserialiseNext(el.pNext); } +template +void DoSerialise(SerialiserType &ser, VkPhysicalDeviceShaderAtomicFloatFeaturesEXT &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(shaderBufferFloat32Atomics); + SERIALISE_MEMBER(shaderBufferFloat32AtomicAdd); + SERIALISE_MEMBER(shaderBufferFloat64Atomics); + SERIALISE_MEMBER(shaderBufferFloat64AtomicAdd); + SERIALISE_MEMBER(shaderSharedFloat32Atomics); + SERIALISE_MEMBER(shaderSharedFloat32AtomicAdd); + SERIALISE_MEMBER(shaderSharedFloat64Atomics); + SERIALISE_MEMBER(shaderSharedFloat64AtomicAdd); + SERIALISE_MEMBER(shaderImageFloat32Atomics); + SERIALISE_MEMBER(shaderImageFloat32AtomicAdd); + SERIALISE_MEMBER(sparseImageFloat32Atomics); + SERIALISE_MEMBER(sparseImageFloat32AtomicAdd); +} + +template <> +void Deserialise(const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT &el) +{ + DeserialiseNext(el.pNext); +} + template void DoSerialise(SerialiserType &ser, VkPhysicalDeviceShaderAtomicInt64Features &el) { @@ -8962,6 +8990,7 @@ INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceSamplerYcbcrConversionFeatures); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceScalarBlockLayoutFeatures); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceShaderAtomicInt64Features); +INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceShaderAtomicFloatFeaturesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceShaderClockFeaturesKHR); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceShaderCorePropertiesAMD); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT); diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index cfe769938..4999e6829 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -2652,6 +2652,24 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi CHECK_PHYS_EXT_FEATURE(robustImageAccess); } END_PHYS_EXT_CHECK(); + + BEGIN_PHYS_EXT_CHECK(VkPhysicalDeviceShaderAtomicFloatFeaturesEXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT); + { + CHECK_PHYS_EXT_FEATURE(shaderBufferFloat32Atomics); + CHECK_PHYS_EXT_FEATURE(shaderBufferFloat32AtomicAdd); + CHECK_PHYS_EXT_FEATURE(shaderBufferFloat64Atomics); + CHECK_PHYS_EXT_FEATURE(shaderBufferFloat64AtomicAdd); + CHECK_PHYS_EXT_FEATURE(shaderSharedFloat32Atomics); + CHECK_PHYS_EXT_FEATURE(shaderSharedFloat32AtomicAdd); + CHECK_PHYS_EXT_FEATURE(shaderSharedFloat64Atomics); + CHECK_PHYS_EXT_FEATURE(shaderSharedFloat64AtomicAdd); + CHECK_PHYS_EXT_FEATURE(shaderImageFloat32Atomics); + CHECK_PHYS_EXT_FEATURE(shaderImageFloat32AtomicAdd); + CHECK_PHYS_EXT_FEATURE(sparseImageFloat32Atomics); + CHECK_PHYS_EXT_FEATURE(sparseImageFloat32AtomicAdd); + } + END_PHYS_EXT_CHECK(); } if(availFeatures.depthClamp)