in renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp [398:797]
void Reflector::CheckDebuggable(bool &debuggable, rdcstr &debugStatus) const
{
debuggable = true;
debugStatus.clear();
if(m_MajorVersion > 1 || m_MinorVersion > 6)
{
debugStatus +=
StringFormat::Fmt("Unsupported SPIR-V version %u.%u\n", m_MajorVersion, m_MinorVersion);
debuggable = false;
}
// this list is sorted in order of the SPIR-V registry.
const rdcstr whitelist[] = {
"SPV_KHR_shader_draw_parameters",
"SPV_KHR_16bit_storage",
"SPV_KHR_device_group",
"SPV_KHR_multiview",
"SPV_KHR_storage_buffer_storage_class",
"SPV_KHR_post_depth_coverage",
"SPV_KHR_shader_atomic_counter_ops",
"SPV_EXT_shader_stencil_export",
"SPV_EXT_shader_viewport_index_layer",
"SPV_EXT_fragment_fully_covered",
"SPV_GOOGLE_decorate_string",
"SPV_GOOGLE_hlsl_functionality1",
"SPV_EXT_descriptor_indexing",
"SPV_KHR_8bit_storage",
"SPV_KHR_vulkan_memory_model",
"SPV_EXT_fragment_invocation_density",
"SPV_KHR_no_integer_wrap_decoration",
"SPV_KHR_float_controls",
"SPV_EXT_physical_storage_buffer",
"SPV_KHR_shader_clock",
"SPV_EXT_demote_to_helper_invocation",
"SPV_KHR_non_semantic_info",
"SPV_EXT_shader_atomic_float_add",
"SPV_KHR_terminate_invocation",
"SPV_EXT_shader_image_int64",
"SPV_GOOGLE_user_type",
"SPV_KHR_physical_storage_buffer",
};
// whitelist supported extensions
for(const rdcstr &ext : extensions)
{
bool supported = false;
for(const rdcstr &check : whitelist)
{
if(ext == check)
{
supported = true;
break;
}
}
if(supported)
continue;
debuggable = false;
debugStatus += StringFormat::Fmt("Unsupported SPIR-V extension %s\n", ext.c_str());
}
for(Capability c : capabilities)
{
bool supported = false;
switch(c)
{
case Capability::Matrix:
case Capability::Shader:
// we "support" geometry/tessellation in case the module contains other entry points, but
// these can't be debugged right now.
case Capability::Geometry:
case Capability::Tessellation:
case Capability::AtomicStorage:
case Capability::TessellationPointSize:
case Capability::GeometryPointSize:
case Capability::ImageGatherExtended:
case Capability::StorageImageMultisample:
case Capability::UniformBufferArrayDynamicIndexing:
case Capability::SampledImageArrayDynamicIndexing:
case Capability::StorageBufferArrayDynamicIndexing:
case Capability::StorageImageArrayDynamicIndexing:
case Capability::ClipDistance:
case Capability::CullDistance:
case Capability::ImageCubeArray:
case Capability::SampleRateShading:
case Capability::ImageRect:
case Capability::SampledRect:
case Capability::InputAttachment:
case Capability::MinLod:
case Capability::Sampled1D:
case Capability::Image1D:
case Capability::SampledCubeArray:
case Capability::SampledBuffer:
case Capability::ImageBuffer:
case Capability::ImageMSArray:
case Capability::StorageImageExtendedFormats:
case Capability::ImageQuery:
case Capability::DerivativeControl:
case Capability::TransformFeedback:
case Capability::GeometryStreams:
case Capability::StorageImageReadWithoutFormat:
case Capability::StorageImageWriteWithoutFormat:
case Capability::MultiViewport:
case Capability::ShaderLayer:
case Capability::ShaderViewportIndex:
case Capability::DrawParameters:
case Capability::DeviceGroup:
case Capability::MultiView:
case Capability::AtomicStorageOps:
case Capability::SampleMaskPostDepthCoverage:
case Capability::StencilExportEXT:
case Capability::ShaderClockKHR:
case Capability::ShaderViewportIndexLayerEXT:
case Capability::FragmentFullyCoveredEXT:
case Capability::FragmentDensityEXT:
case Capability::ShaderNonUniform:
case Capability::RuntimeDescriptorArray:
case Capability::InputAttachmentArrayDynamicIndexing:
case Capability::UniformTexelBufferArrayDynamicIndexing:
case Capability::StorageTexelBufferArrayDynamicIndexing:
case Capability::UniformBufferArrayNonUniformIndexing:
case Capability::SampledImageArrayNonUniformIndexing:
case Capability::StorageBufferArrayNonUniformIndexing:
case Capability::StorageImageArrayNonUniformIndexing:
case Capability::InputAttachmentArrayNonUniformIndexing:
case Capability::UniformTexelBufferArrayNonUniformIndexing:
case Capability::StorageTexelBufferArrayNonUniformIndexing:
case Capability::VulkanMemoryModel:
case Capability::VulkanMemoryModelDeviceScope:
case Capability::DemoteToHelperInvocationEXT:
case Capability::AtomicFloat32AddEXT:
case Capability::AtomicFloat32MinMaxEXT:
case Capability::AtomicFloat16AddEXT:
case Capability::AtomicFloat16MinMaxEXT:
case Capability::AtomicFloat64AddEXT:
case Capability::AtomicFloat64MinMaxEXT:
case Capability::Float16Buffer:
case Capability::Float16:
case Capability::Int64:
case Capability::Int16:
case Capability::Int8:
case Capability::StorageBuffer16BitAccess:
case Capability::UniformAndStorageBuffer16BitAccess:
case Capability::StoragePushConstant16:
case Capability::StorageInputOutput16:
case Capability::StorageBuffer8BitAccess:
case Capability::UniformAndStorageBuffer8BitAccess:
case Capability::StoragePushConstant8:
case Capability::Float64:
case Capability::Int64Atomics:
case Capability::Int64ImageEXT:
case Capability::ExpectAssumeKHR:
case Capability::BitInstructions:
case Capability::UniformDecoration:
case Capability::SignedZeroInfNanPreserve:
case Capability::PhysicalStorageBufferAddresses:
{
supported = true;
break;
}
case Capability::GroupNonUniformArithmetic:
{
if(Vulkan_Hack_AllowNonUniformSubgroups())
{
supported = true;
}
else
{
supported = false;
}
break;
}
// we plan to support these but needs additional testing/proving
// MSAA custom interpolation
case Capability::InterpolationFunction:
// variable pointers
case Capability::VariablePointersStorageBuffer:
case Capability::VariablePointers:
// float controls
case Capability::DenormPreserve:
case Capability::DenormFlushToZero:
case Capability::RoundingModeRTE:
case Capability::RoundingModeRTZ:
// group instructions
case Capability::Groups:
case Capability::GroupNonUniform:
case Capability::GroupNonUniformVote:
case Capability::GroupNonUniformBallot:
case Capability::GroupNonUniformShuffle:
case Capability::GroupNonUniformShuffleRelative:
case Capability::GroupNonUniformClustered:
case Capability::GroupNonUniformQuad:
case Capability::SubgroupBallotKHR:
case Capability::SubgroupVoteKHR:
case Capability::GroupNonUniformRotateKHR:
// workgroup layout:
case Capability::WorkgroupMemoryExplicitLayout16BitAccessKHR:
case Capability::WorkgroupMemoryExplicitLayout8BitAccessKHR:
case Capability::WorkgroupMemoryExplicitLayoutKHR:
// sparse operations
case Capability::SparseResidency:
// fragment interlock
case Capability::FragmentShaderSampleInterlockEXT:
case Capability::FragmentShaderShadingRateInterlockEXT:
case Capability::FragmentShaderPixelInterlockEXT:
{
supported = false;
break;
}
// fragment shading rate
case Capability::FragmentShadingRateKHR:
{
supported = false;
break;
}
// integer dot product
case Capability::DotProductKHR:
case Capability::DotProductInput4x8BitKHR:
case Capability::DotProductInput4x8BitPackedKHR:
case Capability::DotProductInputAllKHR:
{
supported = false;
break;
}
// raytracing
case Capability::RayQueryKHR:
case Capability::RayTraversalPrimitiveCullingKHR:
case Capability::RayTracingKHR:
case Capability::RayCullMaskKHR:
case Capability::RayTracingOpacityMicromapEXT:
case Capability::ShaderInvocationReorderNV:
{
supported = false;
break;
}
// mesh shading
case Capability::MeshShadingEXT:
{
supported = false;
break;
}
// no plans to support these - mostly Kernel/OpenCL related or vendor extensions
case Capability::Addresses:
case Capability::Linkage:
case Capability::Kernel:
case Capability::Vector16:
case Capability::ImageBasic:
case Capability::ImageReadWrite:
case Capability::ImageMipmap:
case Capability::Pipes:
case Capability::DeviceEnqueue:
case Capability::LiteralSampler:
case Capability::GenericPointer:
case Capability::SubgroupDispatch:
case Capability::NamedBarrier:
case Capability::PipeStorage:
case Capability::Float16ImageAMD:
case Capability::ImageGatherBiasLodAMD:
case Capability::FragmentMaskAMD:
case Capability::ImageReadWriteLodAMD:
case Capability::SampleMaskOverrideCoverageNV:
case Capability::GeometryShaderPassthroughNV:
case Capability::ShaderViewportMaskNV:
case Capability::ShaderStereoViewNV:
case Capability::PerViewAttributesNV:
case Capability::MeshShadingNV:
case Capability::FragmentBarycentricNV:
case Capability::ImageFootprintNV:
case Capability::ComputeDerivativeGroupQuadsNV:
case Capability::GroupNonUniformPartitionedNV:
case Capability::RayTracingNV:
case Capability::ComputeDerivativeGroupLinearNV:
case Capability::CooperativeMatrixNV:
case Capability::ShaderSMBuiltinsNV:
case Capability::SubgroupShuffleINTEL:
case Capability::SubgroupBufferBlockIOINTEL:
case Capability::SubgroupImageBlockIOINTEL:
case Capability::SubgroupImageMediaBlockIOINTEL:
case Capability::IntegerFunctions2INTEL:
case Capability::SubgroupAvcMotionEstimationINTEL:
case Capability::SubgroupAvcMotionEstimationIntraINTEL:
case Capability::SubgroupAvcMotionEstimationChromaINTEL:
case Capability::FunctionPointersINTEL:
case Capability::IndirectReferencesINTEL:
case Capability::FPGAKernelAttributesINTEL:
case Capability::FPGALoopControlsINTEL:
case Capability::FPGAMemoryAttributesINTEL:
case Capability::FPGARegINTEL:
case Capability::UnstructuredLoopControlsINTEL:
case Capability::KernelAttributesINTEL:
case Capability::BlockingPipesINTEL:
case Capability::OptNoneINTEL:
case Capability::RayTracingMotionBlurNV:
case Capability::RoundToInfinityINTEL:
case Capability::FloatingPointModeINTEL:
case Capability::AsmINTEL:
case Capability::VectorAnyINTEL:
case Capability::VectorComputeINTEL:
case Capability::VariableLengthArrayINTEL:
case Capability::FunctionFloatControlINTEL:
case Capability::FPFastMathModeINTEL:
case Capability::ArbitraryPrecisionFixedPointINTEL:
case Capability::ArbitraryPrecisionFloatingPointINTEL:
case Capability::ArbitraryPrecisionIntegersINTEL:
case Capability::FPGAMemoryAccessesINTEL:
case Capability::FPGAClusterAttributesINTEL:
case Capability::LoopFuseINTEL:
case Capability::FPGABufferLocationINTEL:
case Capability::USMStorageClassesINTEL:
case Capability::IOPipesINTEL:
case Capability::LongCompositesINTEL:
case Capability::DebugInfoModuleINTEL:
case Capability::BindlessTextureNV:
case Capability::MemoryAccessAliasingINTEL:
case Capability::SplitBarrierINTEL:
case Capability::GroupUniformArithmeticKHR:
case Capability::CoreBuiltinsARM:
case Capability::FPGADSPControlINTEL:
case Capability::FPGAInvocationPipeliningAttributesINTEL:
case Capability::RuntimeAlignedAttributeINTEL:
case Capability::TileImageColorReadAccessEXT:
case Capability::TileImageDepthReadAccessEXT:
case Capability::TileImageStencilReadAccessEXT:
case Capability::TextureSampleWeightedQCOM:
case Capability::TextureBoxFilterQCOM:
case Capability::TextureBlockMatchQCOM:
case Capability::RayQueryPositionFetchKHR:
case Capability::RayTracingPositionFetchKHR:
case Capability::BFloat16ConversionINTEL:
case Capability::FPGAKernelAttributesv2INTEL:
case Capability::FPGALatencyControlINTEL:
case Capability::FPGAArgumentInterfacesINTEL:
case Capability::TextureBlockMatch2QCOM:
case Capability::ShaderEnqueueAMDX:
case Capability::QuadControlKHR:
case Capability::DisplacementMicromapNV:
case Capability::AtomicFloat16VectorNV:
case Capability::RayTracingDisplacementMicromapNV:
case Capability::CooperativeMatrixKHR:
case Capability::FloatControls2:
case Capability::FPGAClusterAttributesV2INTEL:
case Capability::FPMaxErrorINTEL:
case Capability::GlobalVariableFPGADecorationsINTEL:
case Capability::MaskedGatherScatterINTEL:
case Capability::CacheControlsINTEL:
case Capability::RegisterLimitsINTEL:
case Capability::GlobalVariableHostAccessINTEL:
case Capability::Max:
case Capability::Invalid:
{
supported = false;
break;
}
// deprecated provisional raytracing
case Capability::RayQueryProvisionalKHR:
case Capability::RayTracingProvisionalKHR:
{
supported = false;
break;
}
}
if(!supported)
{
debuggable = false;
debugStatus += StringFormat::Fmt("Unsupported capability '%s'\n", ToStr(c).c_str());
}
}
for(auto it = extSets.begin(); it != extSets.end(); it++)
{
Id id = it->first;
const rdcstr &setname = it->second;
if(setname == "GLSL.std.450" || setname.beginsWith("NonSemantic."))
continue;
debuggable = false;
debugStatus += StringFormat::Fmt("Unsupported extended instruction set: '%s'\n", setname.c_str());
}
debugStatus.trim();
}