Implement support for VK_EXT_shader_atomic_float

This commit is contained in:
baldurk
2020-10-20 13:08:47 +01:00
parent d1574f4f42
commit bd36f07bce
7 changed files with 64 additions and 11 deletions
@@ -2871,6 +2871,7 @@ void ThreadState::StepNext(ShaderDebugState *state, const rdcarray<ThreadState>
}
break;
}
case Op::AtomicFAddEXT:
case Op::AtomicIAdd:
case Op::AtomicISub:
case Op::AtomicSMin:
@@ -2930,6 +2931,8 @@ void ThreadState::StepNext(ShaderDebugState *state, const rdcarray<ThreadState>
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<ThreadState>
break;
}
case Op::AtomicFAddEXT:
case Op::GroupIAddNonUniformAMD:
case Op::GroupFAddNonUniformAMD:
case Op::GroupFMinNonUniformAMD:
@@ -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:
+2
View File
@@ -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);
+3
View File
@@ -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,
+2 -1
View File
@@ -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: \
+32 -3
View File
@@ -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 <typename SerialiserType>
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 <typename SerialiserType>
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);
@@ -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)