const char* ExtensionToString(Extension extension) { switch (extension) { case Extension::kSPV_AMD_gcn_shader: return "SPV_AMD_gcn_shader"; case Extension::kSPV_AMD_gpu_shader_half_float: return "SPV_AMD_gpu_shader_half_float"; case Extension::kSPV_AMD_gpu_shader_half_float_fetch: return "SPV_AMD_gpu_shader_half_float_fetch"; case Extension::kSPV_AMD_gpu_shader_int16: return "SPV_AMD_gpu_shader_int16"; case Extension::kSPV_AMD_shader_ballot: return "SPV_AMD_shader_ballot"; case Extension::kSPV_AMD_shader_explicit_vertex_parameter: return "SPV_AMD_shader_explicit_vertex_parameter"; case Extension::kSPV_AMD_shader_fragment_mask: return "SPV_AMD_shader_fragment_mask"; case Extension::kSPV_AMD_shader_image_load_store_lod: return "SPV_AMD_shader_image_load_store_lod"; case Extension::kSPV_AMD_shader_trinary_minmax: return "SPV_AMD_shader_trinary_minmax"; case Extension::kSPV_AMD_texture_gather_bias_lod: return "SPV_AMD_texture_gather_bias_lod"; case Extension::kSPV_EXT_descriptor_indexing: return "SPV_EXT_descriptor_indexing"; case Extension::kSPV_EXT_fragment_fully_covered: return "SPV_EXT_fragment_fully_covered"; case Extension::kSPV_EXT_shader_stencil_export: return "SPV_EXT_shader_stencil_export"; case Extension::kSPV_EXT_shader_viewport_index_layer: return "SPV_EXT_shader_viewport_index_layer"; case Extension::kSPV_GOOGLE_decorate_string: return "SPV_GOOGLE_decorate_string"; case Extension::kSPV_GOOGLE_hlsl_functionality1: return "SPV_GOOGLE_hlsl_functionality1"; case Extension::kSPV_INTEL_subgroups: return "SPV_INTEL_subgroups"; case Extension::kSPV_KHR_16bit_storage: return "SPV_KHR_16bit_storage"; case Extension::kSPV_KHR_8bit_storage: return "SPV_KHR_8bit_storage"; case Extension::kSPV_KHR_device_group: return "SPV_KHR_device_group"; case Extension::kSPV_KHR_multiview: return "SPV_KHR_multiview"; case Extension::kSPV_KHR_post_depth_coverage: return "SPV_KHR_post_depth_coverage"; case Extension::kSPV_KHR_shader_atomic_counter_ops: return "SPV_KHR_shader_atomic_counter_ops"; case Extension::kSPV_KHR_shader_ballot: return "SPV_KHR_shader_ballot"; case Extension::kSPV_KHR_shader_draw_parameters: return "SPV_KHR_shader_draw_parameters"; case Extension::kSPV_KHR_storage_buffer_storage_class: return "SPV_KHR_storage_buffer_storage_class"; case Extension::kSPV_KHR_subgroup_vote: return "SPV_KHR_subgroup_vote"; case Extension::kSPV_KHR_variable_pointers: return "SPV_KHR_variable_pointers"; case Extension::kSPV_NVX_multiview_per_view_attributes: return "SPV_NVX_multiview_per_view_attributes"; case Extension::kSPV_NV_geometry_shader_passthrough: return "SPV_NV_geometry_shader_passthrough"; case Extension::kSPV_NV_sample_mask_override_coverage: return "SPV_NV_sample_mask_override_coverage"; case Extension::kSPV_NV_shader_subgroup_partitioned: return "SPV_NV_shader_subgroup_partitioned"; case Extension::kSPV_NV_stereo_view_rendering: return "SPV_NV_stereo_view_rendering"; case Extension::kSPV_NV_viewport_array2: return "SPV_NV_viewport_array2"; case Extension::kSPV_VALIDATOR_ignore_type_decl_unique: return "SPV_VALIDATOR_ignore_type_decl_unique"; }; return ""; } bool GetExtensionFromString(const char* str, Extension* extension) { static const char* known_ext_strs[] = { "SPV_AMD_gcn_shader", "SPV_AMD_gpu_shader_half_float", "SPV_AMD_gpu_shader_half_float_fetch", "SPV_AMD_gpu_shader_int16", "SPV_AMD_shader_ballot", "SPV_AMD_shader_explicit_vertex_parameter", "SPV_AMD_shader_fragment_mask", "SPV_AMD_shader_image_load_store_lod", "SPV_AMD_shader_trinary_minmax", "SPV_AMD_texture_gather_bias_lod", "SPV_EXT_descriptor_indexing", "SPV_EXT_fragment_fully_covered", "SPV_EXT_shader_stencil_export", "SPV_EXT_shader_viewport_index_layer", "SPV_GOOGLE_decorate_string", "SPV_GOOGLE_hlsl_functionality1", "SPV_INTEL_subgroups", "SPV_KHR_16bit_storage", "SPV_KHR_8bit_storage", "SPV_KHR_device_group", "SPV_KHR_multiview", "SPV_KHR_post_depth_coverage", "SPV_KHR_shader_atomic_counter_ops", "SPV_KHR_shader_ballot", "SPV_KHR_shader_draw_parameters", "SPV_KHR_storage_buffer_storage_class", "SPV_KHR_subgroup_vote", "SPV_KHR_variable_pointers", "SPV_NVX_multiview_per_view_attributes", "SPV_NV_geometry_shader_passthrough", "SPV_NV_sample_mask_override_coverage", "SPV_NV_shader_subgroup_partitioned", "SPV_NV_stereo_view_rendering", "SPV_NV_viewport_array2", "SPV_VALIDATOR_ignore_type_decl_unique" }; static const Extension known_ext_ids[] = { Extension::kSPV_AMD_gcn_shader, Extension::kSPV_AMD_gpu_shader_half_float, Extension::kSPV_AMD_gpu_shader_half_float_fetch, Extension::kSPV_AMD_gpu_shader_int16, Extension::kSPV_AMD_shader_ballot, Extension::kSPV_AMD_shader_explicit_vertex_parameter, Extension::kSPV_AMD_shader_fragment_mask, Extension::kSPV_AMD_shader_image_load_store_lod, Extension::kSPV_AMD_shader_trinary_minmax, Extension::kSPV_AMD_texture_gather_bias_lod, Extension::kSPV_EXT_descriptor_indexing, Extension::kSPV_EXT_fragment_fully_covered, Extension::kSPV_EXT_shader_stencil_export, Extension::kSPV_EXT_shader_viewport_index_layer, Extension::kSPV_GOOGLE_decorate_string, Extension::kSPV_GOOGLE_hlsl_functionality1, Extension::kSPV_INTEL_subgroups, Extension::kSPV_KHR_16bit_storage, Extension::kSPV_KHR_8bit_storage, Extension::kSPV_KHR_device_group, Extension::kSPV_KHR_multiview, Extension::kSPV_KHR_post_depth_coverage, Extension::kSPV_KHR_shader_atomic_counter_ops, Extension::kSPV_KHR_shader_ballot, Extension::kSPV_KHR_shader_draw_parameters, Extension::kSPV_KHR_storage_buffer_storage_class, Extension::kSPV_KHR_subgroup_vote, Extension::kSPV_KHR_variable_pointers, Extension::kSPV_NVX_multiview_per_view_attributes, Extension::kSPV_NV_geometry_shader_passthrough, Extension::kSPV_NV_sample_mask_override_coverage, Extension::kSPV_NV_shader_subgroup_partitioned, Extension::kSPV_NV_stereo_view_rendering, Extension::kSPV_NV_viewport_array2, Extension::kSPV_VALIDATOR_ignore_type_decl_unique }; const auto b = std::begin(known_ext_strs); const auto e = std::end(known_ext_strs); const auto found = std::equal_range( b, e, str, [](const char* str1, const char* str2) { return std::strcmp(str1, str2) < 0; }); if (found.first == e || found.first == found.second) return false; *extension = known_ext_ids[found.first - b]; return true; } const char* CapabilityToString(SpvCapability capability) { switch (capability) { case SpvCapabilityMatrix: return "Matrix"; case SpvCapabilityShader: return "Shader"; case SpvCapabilityGeometry: return "Geometry"; case SpvCapabilityTessellation: return "Tessellation"; case SpvCapabilityAddresses: return "Addresses"; case SpvCapabilityLinkage: return "Linkage"; case SpvCapabilityKernel: return "Kernel"; case SpvCapabilityVector16: return "Vector16"; case SpvCapabilityFloat16Buffer: return "Float16Buffer"; case SpvCapabilityFloat16: return "Float16"; case SpvCapabilityFloat64: return "Float64"; case SpvCapabilityInt64: return "Int64"; case SpvCapabilityInt64Atomics: return "Int64Atomics"; case SpvCapabilityImageBasic: return "ImageBasic"; case SpvCapabilityImageReadWrite: return "ImageReadWrite"; case SpvCapabilityImageMipmap: return "ImageMipmap"; case SpvCapabilityPipes: return "Pipes"; case SpvCapabilityGroups: return "Groups"; case SpvCapabilityDeviceEnqueue: return "DeviceEnqueue"; case SpvCapabilityLiteralSampler: return "LiteralSampler"; case SpvCapabilityAtomicStorage: return "AtomicStorage"; case SpvCapabilityInt16: return "Int16"; case SpvCapabilityTessellationPointSize: return "TessellationPointSize"; case SpvCapabilityGeometryPointSize: return "GeometryPointSize"; case SpvCapabilityImageGatherExtended: return "ImageGatherExtended"; case SpvCapabilityStorageImageMultisample: return "StorageImageMultisample"; case SpvCapabilityUniformBufferArrayDynamicIndexing: return "UniformBufferArrayDynamicIndexing"; case SpvCapabilitySampledImageArrayDynamicIndexing: return "SampledImageArrayDynamicIndexing"; case SpvCapabilityStorageBufferArrayDynamicIndexing: return "StorageBufferArrayDynamicIndexing"; case SpvCapabilityStorageImageArrayDynamicIndexing: return "StorageImageArrayDynamicIndexing"; case SpvCapabilityClipDistance: return "ClipDistance"; case SpvCapabilityCullDistance: return "CullDistance"; case SpvCapabilityImageCubeArray: return "ImageCubeArray"; case SpvCapabilitySampleRateShading: return "SampleRateShading"; case SpvCapabilityImageRect: return "ImageRect"; case SpvCapabilitySampledRect: return "SampledRect"; case SpvCapabilityGenericPointer: return "GenericPointer"; case SpvCapabilityInt8: return "Int8"; case SpvCapabilityInputAttachment: return "InputAttachment"; case SpvCapabilitySparseResidency: return "SparseResidency"; case SpvCapabilityMinLod: return "MinLod"; case SpvCapabilitySampled1D: return "Sampled1D"; case SpvCapabilityImage1D: return "Image1D"; case SpvCapabilitySampledCubeArray: return "SampledCubeArray"; case SpvCapabilitySampledBuffer: return "SampledBuffer"; case SpvCapabilityImageBuffer: return "ImageBuffer"; case SpvCapabilityImageMSArray: return "ImageMSArray"; case SpvCapabilityStorageImageExtendedFormats: return "StorageImageExtendedFormats"; case SpvCapabilityImageQuery: return "ImageQuery"; case SpvCapabilityDerivativeControl: return "DerivativeControl"; case SpvCapabilityInterpolationFunction: return "InterpolationFunction"; case SpvCapabilityTransformFeedback: return "TransformFeedback"; case SpvCapabilityGeometryStreams: return "GeometryStreams"; case SpvCapabilityStorageImageReadWithoutFormat: return "StorageImageReadWithoutFormat"; case SpvCapabilityStorageImageWriteWithoutFormat: return "StorageImageWriteWithoutFormat"; case SpvCapabilityMultiViewport: return "MultiViewport"; case SpvCapabilitySubgroupDispatch: return "SubgroupDispatch"; case SpvCapabilityNamedBarrier: return "NamedBarrier"; case SpvCapabilityPipeStorage: return "PipeStorage"; case SpvCapabilityGroupNonUniform: return "GroupNonUniform"; case SpvCapabilityGroupNonUniformVote: return "GroupNonUniformVote"; case SpvCapabilityGroupNonUniformArithmetic: return "GroupNonUniformArithmetic"; case SpvCapabilityGroupNonUniformBallot: return "GroupNonUniformBallot"; case SpvCapabilityGroupNonUniformShuffle: return "GroupNonUniformShuffle"; case SpvCapabilityGroupNonUniformShuffleRelative: return "GroupNonUniformShuffleRelative"; case SpvCapabilityGroupNonUniformClustered: return "GroupNonUniformClustered"; case SpvCapabilityGroupNonUniformQuad: return "GroupNonUniformQuad"; case SpvCapabilitySubgroupBallotKHR: return "SubgroupBallotKHR"; case SpvCapabilityDrawParameters: return "DrawParameters"; case SpvCapabilitySubgroupVoteKHR: return "SubgroupVoteKHR"; case SpvCapabilityStorageBuffer16BitAccess: return "StorageBuffer16BitAccess"; case SpvCapabilityUniformAndStorageBuffer16BitAccess: return "UniformAndStorageBuffer16BitAccess"; case SpvCapabilityStoragePushConstant16: return "StoragePushConstant16"; case SpvCapabilityStorageInputOutput16: return "StorageInputOutput16"; case SpvCapabilityDeviceGroup: return "DeviceGroup"; case SpvCapabilityMultiView: return "MultiView"; case SpvCapabilityVariablePointersStorageBuffer: return "VariablePointersStorageBuffer"; case SpvCapabilityVariablePointers: return "VariablePointers"; case SpvCapabilityAtomicStorageOps: return "AtomicStorageOps"; case SpvCapabilitySampleMaskPostDepthCoverage: return "SampleMaskPostDepthCoverage"; case SpvCapabilityStorageBuffer8BitAccess: return "StorageBuffer8BitAccess"; case SpvCapabilityUniformAndStorageBuffer8BitAccess: return "UniformAndStorageBuffer8BitAccess"; case SpvCapabilityStoragePushConstant8: return "StoragePushConstant8"; case SpvCapabilityFloat16ImageAMD: return "Float16ImageAMD"; case SpvCapabilityImageGatherBiasLodAMD: return "ImageGatherBiasLodAMD"; case SpvCapabilityFragmentMaskAMD: return "FragmentMaskAMD"; case SpvCapabilityStencilExportEXT: return "StencilExportEXT"; case SpvCapabilityImageReadWriteLodAMD: return "ImageReadWriteLodAMD"; case SpvCapabilitySampleMaskOverrideCoverageNV: return "SampleMaskOverrideCoverageNV"; case SpvCapabilityGeometryShaderPassthroughNV: return "GeometryShaderPassthroughNV"; case SpvCapabilityShaderViewportIndexLayerEXT: return "ShaderViewportIndexLayerEXT"; case SpvCapabilityShaderViewportMaskNV: return "ShaderViewportMaskNV"; case SpvCapabilityShaderStereoViewNV: return "ShaderStereoViewNV"; case SpvCapabilityPerViewAttributesNV: return "PerViewAttributesNV"; case SpvCapabilityFragmentFullyCoveredEXT: return "FragmentFullyCoveredEXT"; case SpvCapabilityShaderNonUniformEXT: return "ShaderNonUniformEXT"; case SpvCapabilityRuntimeDescriptorArrayEXT: return "RuntimeDescriptorArrayEXT"; case SpvCapabilityInputAttachmentArrayDynamicIndexingEXT: return "InputAttachmentArrayDynamicIndexingEXT"; case SpvCapabilityUniformTexelBufferArrayDynamicIndexingEXT: return "UniformTexelBufferArrayDynamicIndexingEXT"; case SpvCapabilityStorageTexelBufferArrayDynamicIndexingEXT: return "StorageTexelBufferArrayDynamicIndexingEXT"; case SpvCapabilityUniformBufferArrayNonUniformIndexingEXT: return "UniformBufferArrayNonUniformIndexingEXT"; case SpvCapabilitySampledImageArrayNonUniformIndexingEXT: return "SampledImageArrayNonUniformIndexingEXT"; case SpvCapabilityStorageBufferArrayNonUniformIndexingEXT: return "StorageBufferArrayNonUniformIndexingEXT"; case SpvCapabilityStorageImageArrayNonUniformIndexingEXT: return "StorageImageArrayNonUniformIndexingEXT"; case SpvCapabilityInputAttachmentArrayNonUniformIndexingEXT: return "InputAttachmentArrayNonUniformIndexingEXT"; case SpvCapabilityUniformTexelBufferArrayNonUniformIndexingEXT: return "UniformTexelBufferArrayNonUniformIndexingEXT"; case SpvCapabilityStorageTexelBufferArrayNonUniformIndexingEXT: return "StorageTexelBufferArrayNonUniformIndexingEXT"; case SpvCapabilitySubgroupShuffleINTEL: return "SubgroupShuffleINTEL"; case SpvCapabilitySubgroupBufferBlockIOINTEL: return "SubgroupBufferBlockIOINTEL"; case SpvCapabilitySubgroupImageBlockIOINTEL: return "SubgroupImageBlockIOINTEL"; case SpvCapabilityGroupNonUniformPartitionedNV: return "GroupNonUniformPartitionedNV"; case SpvCapabilityMax: assert(0 && "Attempting to convert SpvCapabilityMax to string"); return ""; }; return ""; }