diff options
| author | Yong He <yonghe@outlook.com> | 2023-08-25 08:49:02 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-08-25 23:49:02 +0800 |
| commit | 036abc85ba1db9c8c06289f0a0492e9a95a228b9 (patch) | |
| tree | e497168c36e95190a6d8b4dae9f483f27e5aa2cd | |
| parent | 0470ea05a42d6c3f35d81a433fefdd440500cdbd (diff) | |
Support SPIRV Capability declaration on intrinsic functions. (#3150)
* Spirv Capability lookup.
* Fix.
---------
Co-authored-by: Yong He <yhe@nvidia.com>
| -rw-r--r-- | build/visual-studio/generate-lookup-tables/generate-lookup-tables.vcxproj | 17 | ||||
| -rw-r--r-- | build/visual-studio/generate-lookup-tables/generate-lookup-tables.vcxproj.filters | 31 | ||||
| -rw-r--r-- | build/visual-studio/slang/slang.vcxproj | 1 | ||||
| -rw-r--r-- | build/visual-studio/slang/slang.vcxproj.filters | 3 | ||||
| -rw-r--r-- | external/spirv/spirv-capabilities.txt | 238 | ||||
| -rw-r--r-- | premake5.lua | 11 | ||||
| -rw-r--r-- | source/slang/slang-ast-modifier.h | 8 | ||||
| -rw-r--r-- | source/slang/slang-diagnostic-defs.h | 2 | ||||
| -rw-r--r-- | source/slang/slang-emit-spirv.cpp | 18 | ||||
| -rw-r--r-- | source/slang/slang-ir-inst-defs.h | 1 | ||||
| -rw-r--r-- | source/slang/slang-ir-insts.h | 5 | ||||
| -rw-r--r-- | source/slang/slang-lookup-spirv.h | 1 | ||||
| -rw-r--r-- | source/slang/slang-lookup-spvcapability.cpp | 303 | ||||
| -rw-r--r-- | source/slang/slang-lower-to-ir.cpp | 33 | ||||
| -rw-r--r-- | source/slang/slang-parser.cpp | 14 | ||||
| -rw-r--r-- | tools/slang-lookup-generator/lookup-generator-main.cpp | 41 |
16 files changed, 674 insertions, 53 deletions
diff --git a/build/visual-studio/generate-lookup-tables/generate-lookup-tables.vcxproj b/build/visual-studio/generate-lookup-tables/generate-lookup-tables.vcxproj index 3d27b3cb2..e558d3cb7 100644 --- a/build/visual-studio/generate-lookup-tables/generate-lookup-tables.vcxproj +++ b/build/visual-studio/generate-lookup-tables/generate-lookup-tables.vcxproj @@ -174,6 +174,23 @@ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">../../../external/spirv-headers/include/spirv/unified1/spirv.core.grammar.json;../../../bin/windows-x64/release/slang-lookup-generator.exe</AdditionalInputs>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release aarch64|ARM64'">../../../external/spirv-headers/include/spirv/unified1/spirv.core.grammar.json;../../../bin/windows-aarch64/release/slang-lookup-generator.exe</AdditionalInputs>
</CustomBuild>
+ <CustomBuild Include="..\..\..\external\spirv\spirv-capabilities.txt">
+ <FileType>Document</FileType>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"../../../bin/windows-x86/debug/slang-lookup-generator" %(FullPath) $(SolutionDir)/source/slang/slang-lookup-spvcapability.cpp SpvCapability SpvCapability spirv/unified1/spirv.h</Command>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"../../../bin/windows-x64/debug/slang-lookup-generator" %(FullPath) $(SolutionDir)/source/slang/slang-lookup-spvcapability.cpp SpvCapability SpvCapability spirv/unified1/spirv.h</Command>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug aarch64|ARM64'">"../../../bin/windows-aarch64/debug/slang-lookup-generator" %(FullPath) $(SolutionDir)/source/slang/slang-lookup-spvcapability.cpp SpvCapability SpvCapability spirv/unified1/spirv.h</Command>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"../../../bin/windows-x86/release/slang-lookup-generator" %(FullPath) $(SolutionDir)/source/slang/slang-lookup-spvcapability.cpp SpvCapability SpvCapability spirv/unified1/spirv.h</Command>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"../../../bin/windows-x64/release/slang-lookup-generator" %(FullPath) $(SolutionDir)/source/slang/slang-lookup-spvcapability.cpp SpvCapability SpvCapability spirv/unified1/spirv.h</Command>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release aarch64|ARM64'">"../../../bin/windows-aarch64/release/slang-lookup-generator" %(FullPath) $(SolutionDir)/source/slang/slang-lookup-spvcapability.cpp SpvCapability SpvCapability spirv/unified1/spirv.h</Command>
+ <Outputs>../../../source/slang/slang-lookup-spvcapability.cpp</Outputs>
+ <Message>slang-lookup-generator for slang-lookup-spvcapability.cpp</Message>
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../../external/spirv/spirv-capabilities.txt;../../../bin/windows-x86/debug/slang-lookup-generator.exe</AdditionalInputs>
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">../../../external/spirv/spirv-capabilities.txt;../../../bin/windows-x64/debug/slang-lookup-generator.exe</AdditionalInputs>
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug aarch64|ARM64'">../../../external/spirv/spirv-capabilities.txt;../../../bin/windows-aarch64/debug/slang-lookup-generator.exe</AdditionalInputs>
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../../external/spirv/spirv-capabilities.txt;../../../bin/windows-x86/release/slang-lookup-generator.exe</AdditionalInputs>
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">../../../external/spirv/spirv-capabilities.txt;../../../bin/windows-x64/release/slang-lookup-generator.exe</AdditionalInputs>
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release aarch64|ARM64'">../../../external/spirv/spirv-capabilities.txt;../../../bin/windows-aarch64/release/slang-lookup-generator.exe</AdditionalInputs>
+ </CustomBuild>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
diff --git a/build/visual-studio/generate-lookup-tables/generate-lookup-tables.vcxproj.filters b/build/visual-studio/generate-lookup-tables/generate-lookup-tables.vcxproj.filters new file mode 100644 index 000000000..8936bc45b --- /dev/null +++ b/build/visual-studio/generate-lookup-tables/generate-lookup-tables.vcxproj.filters @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="spirv"> + <UniqueIdentifier>{593A5F10-C54E-87C1-8ED0-2A21FAA383F2}</UniqueIdentifier> + </Filter> + <Filter Include="spirv-headers"> + <UniqueIdentifier>{62802470-CE40-A0A6-977B-E92303FBE482}</UniqueIdentifier> + </Filter> + <Filter Include="spirv-headers\include"> + <UniqueIdentifier>{D5E9D41E-4156-9019-0A4A-28777675B281}</UniqueIdentifier> + </Filter> + <Filter Include="spirv-headers\include\spirv"> + <UniqueIdentifier>{58E55631-C4F2-8417-4DD9-8002B9E550CE}</UniqueIdentifier> + </Filter> + <Filter Include="spirv-headers\include\spirv\unified1"> + <UniqueIdentifier>{3C495E56-2830-204E-D180-866BBD4699B4}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <CustomBuild Include="..\..\..\external\spirv-headers\include\spirv\unified1\extinst.glsl.std.450.grammar.json"> + <Filter>spirv-headers\include\spirv\unified1</Filter> + </CustomBuild> + <CustomBuild Include="..\..\..\external\spirv-headers\include\spirv\unified1\spirv.core.grammar.json"> + <Filter>spirv-headers\include\spirv\unified1</Filter> + </CustomBuild> + <CustomBuild Include="..\..\..\external\spirv\spirv-capabilities.txt"> + <Filter>spirv</Filter> + </CustomBuild> + </ItemGroup> +</Project>
\ No newline at end of file diff --git a/build/visual-studio/slang/slang.vcxproj b/build/visual-studio/slang/slang.vcxproj index ebbb4f98d..573e4dff2 100644 --- a/build/visual-studio/slang/slang.vcxproj +++ b/build/visual-studio/slang/slang.vcxproj @@ -688,6 +688,7 @@ IF EXIST ..\..\..\external\slang-glslang\bin\windows-aarch64\release\slang-glsla <ClCompile Include="..\..\..\source\slang\slang-language-server.cpp" />
<ClCompile Include="..\..\..\source\slang\slang-legalize-types.cpp" />
<ClCompile Include="..\..\..\source\slang\slang-lookup-glslstd450.cpp" />
+ <ClCompile Include="..\..\..\source\slang\slang-lookup-spvcapability.cpp" />
<ClCompile Include="..\..\..\source\slang\slang-lookup-spvop.cpp" />
<ClCompile Include="..\..\..\source\slang\slang-lookup.cpp" />
<ClCompile Include="..\..\..\source\slang\slang-lower-to-ir.cpp" />
diff --git a/build/visual-studio/slang/slang.vcxproj.filters b/build/visual-studio/slang/slang.vcxproj.filters index 0c4f8a4d3..1eca9a115 100644 --- a/build/visual-studio/slang/slang.vcxproj.filters +++ b/build/visual-studio/slang/slang.vcxproj.filters @@ -1148,6 +1148,9 @@ <ClCompile Include="..\..\..\source\slang\slang-lookup-glslstd450.cpp">
<Filter>Source Files</Filter>
</ClCompile>
+ <ClCompile Include="..\..\..\source\slang\slang-lookup-spvcapability.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
<ClCompile Include="..\..\..\source\slang\slang-lookup-spvop.cpp">
<Filter>Source Files</Filter>
</ClCompile>
diff --git a/external/spirv/spirv-capabilities.txt b/external/spirv/spirv-capabilities.txt new file mode 100644 index 000000000..abdd73fc0 --- /dev/null +++ b/external/spirv/spirv-capabilities.txt @@ -0,0 +1,238 @@ +Matrix +Shader +Geometry +Tessellation +Addresses +Linkage +Kernel +Vector16 +Float16Buffer +Float16 +Float64 +Int64 +Int64Atomics +ImageBasic +ImageReadWrite +ImageMipmap +Pipes +Groups +DeviceEnqueue +LiteralSampler +AtomicStorage +Int16 +TessellationPointSize +GeometryPointSize +ImageGatherExtended +StorageImageMultisample +UniformBufferArrayDynamicIndexing +SampledImageArrayDynamicIndexing +StorageBufferArrayDynamicIndexing +StorageImageArrayDynamicIndexing +ClipDistance +CullDistance +ImageCubeArray +SampleRateShading +ImageRect +SampledRect +GenericPointer +Int8 +InputAttachment +SparseResidency +MinLod +Sampled1D +Image1D +SampledCubeArray +SampledBuffer +ImageBuffer +ImageMSArray +StorageImageExtendedFormats +ImageQuery +DerivativeControl +InterpolationFunction +TransformFeedback +GeometryStreams +StorageImageReadWithoutFormat +StorageImageWriteWithoutFormat +MultiViewport +SubgroupDispatch +NamedBarrier +PipeStorage +GroupNonUniform +GroupNonUniformVote +GroupNonUniformArithmetic +GroupNonUniformBallot +GroupNonUniformShuffle +GroupNonUniformShuffleRelative +GroupNonUniformClustered +GroupNonUniformQuad +ShaderLayer +ShaderViewportIndex +UniformDecoration +CoreBuiltinsARM +TileImageColorReadAccessEXT +TileImageDepthReadAccessEXT +TileImageStencilReadAccessEXT +FragmentShadingRateKHR +SubgroupBallotKHR +DrawParameters +WorkgroupMemoryExplicitLayoutKHR +WorkgroupMemoryExplicitLayout8BitAccessKHR +WorkgroupMemoryExplicitLayout16BitAccessKHR +SubgroupVoteKHR +StorageBuffer16BitAccess +StorageUniformBufferBlock16 +StorageUniform16 +UniformAndStorageBuffer16BitAccess +StoragePushConstant16 +StorageInputOutput16 +DeviceGroup +MultiView +VariablePointersStorageBuffer +VariablePointers +AtomicStorageOps +SampleMaskPostDepthCoverage +StorageBuffer8BitAccess +UniformAndStorageBuffer8BitAccess +StoragePushConstant8 +DenormPreserve +DenormFlushToZero +SignedZeroInfNanPreserve +RoundingModeRTE +RoundingModeRTZ +RayQueryProvisionalKHR +RayQueryKHR +RayTraversalPrimitiveCullingKHR +RayTracingKHR +Float16ImageAMD +ImageGatherBiasLodAMD +FragmentMaskAMD +StencilExportEXT +ImageReadWriteLodAMD +Int64ImageEXT +ShaderClockKHR +SampleMaskOverrideCoverageNV +GeometryShaderPassthroughNV +ShaderViewportIndexLayerEXT +ShaderViewportIndexLayerNV +ShaderViewportMaskNV +ShaderStereoViewNV +PerViewAttributesNV +FragmentFullyCoveredEXT +MeshShadingNV +ImageFootprintNV +MeshShadingEXT +FragmentBarycentricKHR +FragmentBarycentricNV +ComputeDerivativeGroupQuadsNV +FragmentDensityEXT +ShadingRateNV +GroupNonUniformPartitionedNV +ShaderNonUniform +ShaderNonUniformEXT +RuntimeDescriptorArray +RuntimeDescriptorArrayEXT +InputAttachmentArrayDynamicIndexing +InputAttachmentArrayDynamicIndexingEXT +UniformTexelBufferArrayDynamicIndexing +UniformTexelBufferArrayDynamicIndexingEXT +StorageTexelBufferArrayDynamicIndexing +StorageTexelBufferArrayDynamicIndexingEXT +UniformBufferArrayNonUniformIndexing +UniformBufferArrayNonUniformIndexingEXT +SampledImageArrayNonUniformIndexing +SampledImageArrayNonUniformIndexingEXT +StorageBufferArrayNonUniformIndexing +StorageBufferArrayNonUniformIndexingEXT +StorageImageArrayNonUniformIndexing +StorageImageArrayNonUniformIndexingEXT +InputAttachmentArrayNonUniformIndexing +InputAttachmentArrayNonUniformIndexingEXT +UniformTexelBufferArrayNonUniformIndexing +UniformTexelBufferArrayNonUniformIndexingEXT +StorageTexelBufferArrayNonUniformIndexing +StorageTexelBufferArrayNonUniformIndexingEXT +RayTracingPositionFetchKHR +RayTracingNV +RayTracingMotionBlurNV +VulkanMemoryModel +VulkanMemoryModelKHR +VulkanMemoryModelDeviceScope +VulkanMemoryModelDeviceScopeKHR +PhysicalStorageBufferAddresses +PhysicalStorageBufferAddressesEXT +ComputeDerivativeGroupLinearNV +RayTracingProvisionalKHR +CooperativeMatrixNV +FragmentShaderSampleInterlockEXT +FragmentShaderShadingRateInterlockEXT +ShaderSMBuiltinsNV +FragmentShaderPixelInterlockEXT +DemoteToHelperInvocation +DemoteToHelperInvocationEXT +RayTracingOpacityMicromapEXT +ShaderInvocationReorderNV +BindlessTextureNV +RayQueryPositionFetchKHR +SubgroupShuffleINTEL +SubgroupBufferBlockIOINTEL +SubgroupImageBlockIOINTEL +SubgroupImageMediaBlockIOINTEL +RoundToInfinityINTEL +FloatingPointModeINTEL +IntegerFunctions2INTEL +FunctionPointersINTEL +IndirectReferencesINTEL +AsmINTEL +AtomicFloat32MinMaxEXT +AtomicFloat64MinMaxEXT +AtomicFloat16MinMaxEXT +VectorComputeINTEL +VectorAnyINTEL +ExpectAssumeKHR +SubgroupAvcMotionEstimationINTEL +SubgroupAvcMotionEstimationIntraINTEL +SubgroupAvcMotionEstimationChromaINTEL +VariableLengthArrayINTEL +FunctionFloatControlINTEL +FPGAMemoryAttributesINTEL +FPFastMathModeINTEL +ArbitraryPrecisionIntegersINTEL +ArbitraryPrecisionFloatingPointINTEL +UnstructuredLoopControlsINTEL +FPGALoopControlsINTEL +KernelAttributesINTEL +FPGAKernelAttributesINTEL +FPGAMemoryAccessesINTEL +FPGAClusterAttributesINTEL +LoopFuseINTEL +FPGADSPControlINTEL +MemoryAccessAliasingINTEL +FPGAInvocationPipeliningAttributesINTEL +FPGABufferLocationINTEL +ArbitraryPrecisionFixedPointINTEL +USMStorageClassesINTEL +RuntimeAlignedAttributeINTEL +IOPipesINTEL +BlockingPipesINTEL +FPGARegINTEL +DotProductInputAll +DotProductInputAllKHR +DotProductInput4x8Bit +DotProductInput4x8BitKHR +DotProductInput4x8BitPacked +DotProductInput4x8BitPackedKHR +DotProduct +DotProductKHR +RayCullMaskKHR +BitInstructions +GroupNonUniformRotateKHR +AtomicFloat32AddEXT +AtomicFloat64AddEXT +LongConstantCompositeINTEL +OptNoneINTEL +AtomicFloat16AddEXT +DebugInfoModuleINTEL +SplitBarrierINTEL +FPGAArgumentInterfacesINTEL +GroupUniformArithmeticKHR +Max
\ No newline at end of file diff --git a/premake5.lua b/premake5.lua index dddf1e12e..81f5f6c6b 100644 --- a/premake5.lua +++ b/premake5.lua @@ -1410,7 +1410,13 @@ generatorProject("generate-lookup-tables") header = "spirv/unified1/spirv.h", prefix = "Spv", type = "SpvOp" - } + }, + { + json = "external/spirv/spirv-capabilities.txt", + header = "spirv/unified1/spirv.h", + prefix = "SpvCapability", + type = "SpvCapability" + }, } for _, t in pairs(tables) do files {t.json} @@ -1601,7 +1607,8 @@ standardProject("slang", "source/slang") -- Similarly for any generated lookup tables files { "source/slang/slang-lookup-spvop.cpp", - "source/slang/slang-lookup-glslstd450.cpp" + "source/slang/slang-lookup-glslstd450.cpp", + "source/slang/slang-lookup-spvcapability.cpp", } -- diff --git a/source/slang/slang-ast-modifier.h b/source/slang/slang-ast-modifier.h index 7b772e645..f5809ff4b 100644 --- a/source/slang/slang-ast-modifier.h +++ b/source/slang/slang-ast-modifier.h @@ -132,6 +132,14 @@ class RequiredSPIRVVersionModifier : public Modifier }; // A modifier to tag something as an intrinsic that requires +// a certain SPIRV capability to be enabled when used. +class RequiredSPIRVCapabilityModifier : public Modifier +{ + SLANG_AST_CLASS(RequiredSPIRVCapabilityModifier) + int32_t capability; +}; + +// A modifier to tag something as an intrinsic that requires // a certain CUDA SM version to be enabled when used. Specified as "major.minor" class RequiredCUDASMVersionModifier : public Modifier { diff --git a/source/slang/slang-diagnostic-defs.h b/source/slang/slang-diagnostic-defs.h index 8f2413c51..0243543e9 100644 --- a/source/slang/slang-diagnostic-defs.h +++ b/source/slang/slang-diagnostic-defs.h @@ -233,8 +233,8 @@ DIAGNOSTIC(20008, Error, invalidOperator, "invalid operator '$0'.") DIAGNOSTIC(20011, Error, unexpectedColon, "unexpected ':'.") DIAGNOSTIC(20012, Error, invalidSPIRVVersion, "Expecting SPIR-V version as either 'major.minor', or quoted if has patch (eg for SPIR-V 1.2, '1.2' or \"1.2\"')") DIAGNOSTIC(20013, Error, invalidCUDASMVersion, "Expecting CUDA SM version as either 'major.minor', or quoted if has patch (eg for '7.0' or \"7.0\"')") - DIAGNOSTIC(20014, Error, classIsReservedKeyword, "'class' is a reserved keyword in this context; use 'struct' instead.") +DIAGNOSTIC(20015, Error, unknownSPIRVCapability, "unknown SPIR-V capability '$0'.") DIAGNOSTIC(20101, Warning, unintendedEmptyStatement, "potentially unintended empty statement at this location; use {} instead.") diff --git a/source/slang/slang-emit-spirv.cpp b/source/slang/slang-emit-spirv.cpp index 0878b3494..29114424d 100644 --- a/source/slang/slang-emit-spirv.cpp +++ b/source/slang/slang-emit-spirv.cpp @@ -3805,27 +3805,15 @@ struct SPIRVEmitContext void handleRequiredCapabilitiesImpl(IRInst* inst) { - // TODO: declare required SPV capabilities. - for (auto decoration : inst->getDecorations()) { switch (decoration->getOp()) { default: break; - - case kIROp_RequireGLSLExtensionDecoration: - { - break; - } - case kIROp_RequireGLSLVersionDecoration: - { - break; - } - case kIROp_RequireSPIRVVersionDecoration: - { - break; - } + case kIROp_RequireSPIRVCapabilityDecoration: + requireSPIRVCapability((SpvCapability)getIntVal(decoration->getOperand(0))); + break; } } } diff --git a/source/slang/slang-ir-inst-defs.h b/source/slang/slang-ir-inst-defs.h index c1b021181..d264dfd06 100644 --- a/source/slang/slang-ir-inst-defs.h +++ b/source/slang/slang-ir-inst-defs.h @@ -676,6 +676,7 @@ INST(HighLevelDeclDecoration, highLevelDecl, 1, 0) INST(VulkanHitObjectAttributesDecoration, vulkanHitObjectAttributes, 0, 0) INST(RequireSPIRVVersionDecoration, requireSPIRVVersion, 1, 0) + INST(RequireSPIRVCapabilityDecoration, requireSPIRVCapability, 1, 0) INST(RequireGLSLVersionDecoration, requireGLSLVersion, 1, 0) INST(RequireGLSLExtensionDecoration, requireGLSLExtension, 1, 0) INST(RequireCUDASMVersionDecoration, requireCUDASMVersion, 1, 0) diff --git a/source/slang/slang-ir-insts.h b/source/slang/slang-ir-insts.h index 0b2cc790d..5639d90dd 100644 --- a/source/slang/slang-ir-insts.h +++ b/source/slang/slang-ir-insts.h @@ -4076,6 +4076,11 @@ public: addDecoration(value, kIROp_RequireSPIRVVersionDecoration, getIntValue(getBasicType(BaseType::UInt64), intValue)); } + void addRequireSPIRVCapabilityDecoration(IRInst* value, int32_t capabilityName) + { + addDecoration(value, kIROp_RequireSPIRVCapabilityDecoration, getIntValue(getIntType(), IRIntegerValue(capabilityName))); + } + void addRequireCUDASMVersionDecoration(IRInst* value, const SemanticVersion& version) { SemanticVersion::IntegerType intValue = version.toInteger(); diff --git a/source/slang/slang-lookup-spirv.h b/source/slang/slang-lookup-spirv.h index bc8dfb5a4..47cd5b277 100644 --- a/source/slang/slang-lookup-spirv.h +++ b/source/slang/slang-lookup-spirv.h @@ -7,4 +7,5 @@ namespace Slang { bool lookupSpvOp(const UnownedStringSlice& str, SpvOp& value); bool lookupGLSLstd450(const UnownedStringSlice& str, GLSLstd450& value); +bool lookupSpvCapability(const UnownedStringSlice& str, SpvCapability& value); } diff --git a/source/slang/slang-lookup-spvcapability.cpp b/source/slang/slang-lookup-spvcapability.cpp new file mode 100644 index 000000000..5e7e18037 --- /dev/null +++ b/source/slang/slang-lookup-spvcapability.cpp @@ -0,0 +1,303 @@ +// Hash function for SpvCapability +// +// This file was thoughtfully generated by a machine, +// don't even think about modifying it yourself! +// + +#include "../core/slang-common.h" +#include "../core/slang-string.h" +#include "spirv/unified1/spirv.h" + + +namespace Slang +{ + +static const unsigned tableSalt[238] ={ + 4, 1, 0, 0, 0, 5, 1, 1, 1, 1, 0, 3, 4, 1, 0, 0, + 1, 6, 0, 1, 4, 0, 0, 1, 5, 0, 0, 1, 2, 0, 2, 2, + 0, 0, 0, 2, 3, 3, 7, 3, 0, 4, 0, 4, 5, 3, 1, 2, + 0, 6, 1, 4, 2, 1, 0, 1, 7, 3, 0, 0, 0, 1, 2, 2, + 0, 4, 1, 1, 5, 2, 0, 0, 1, 6, 4, 1, 0, 5, 1, 0, + 7, 1, 1, 2, 2, 1, 1, 0, 4, 0, 0, 2, 0, 4, 10, 0, + 0, 0, 1, 0, 4, 3, 1, 0, 0, 1, 4, 6, 2, 5, 1, 1, + 0, 3, 1, 4, 3, 1, 0, 2, 1, 0, 0, 0, 1, 1, 3, 3, + 9, 0, 0, 0, 0, 2, 5, 0, 0, 8, 0, 12, 0, 0, 0, 5, + 5, 4, 2, 1, 6, 1, 0, 0, 20, 3, 7, 1, 13, 0, 4, 14, + 5, 2, 0, 5, 0, 8, 3, 0, 1, 2, 1, 0, 3, 0, 18, 5, + 8, 0, 10, 0, 14, 0, 3, 0, 0, 0, 13, 0, 0, 2, 24, 6, + 4, 0, 3, 0, 1, 0, 0, 7, 4, 0, 0, 5, 2, 0, 35, 6, + 0, 0, 2, 5, 6, 34, 32, 29, 0, 10, 7, 0, 90, 0, 3, 36, + 73, 39, 193, 0, 1, 1, 0, 83, 8, 0, 0, 712, 2, 0 +}; + +struct KV +{ + const char* name; + SpvCapability value; +}; + +static const KV words[238] = +{ + {"ShaderViewportIndex", SpvCapabilityShaderViewportIndex}, + {"FragmentBarycentricNV", SpvCapabilityFragmentBarycentricNV}, + {"StorageImageWriteWithoutFormat", SpvCapabilityStorageImageWriteWithoutFormat}, + {"RayTracingMotionBlurNV", SpvCapabilityRayTracingMotionBlurNV}, + {"StorageImageArrayNonUniformIndexingEXT", SpvCapabilityStorageImageArrayNonUniformIndexingEXT}, + {"UnstructuredLoopControlsINTEL", SpvCapabilityUnstructuredLoopControlsINTEL}, + {"BlockingPipesINTEL", SpvCapabilityBlockingPipesINTEL}, + {"Image1D", SpvCapabilityImage1D}, + {"LiteralSampler", SpvCapabilityLiteralSampler}, + {"SubgroupAvcMotionEstimationINTEL", SpvCapabilitySubgroupAvcMotionEstimationINTEL}, + {"GroupNonUniformQuad", SpvCapabilityGroupNonUniformQuad}, + {"FunctionPointersINTEL", SpvCapabilityFunctionPointersINTEL}, + {"UniformTexelBufferArrayNonUniformIndexing", SpvCapabilityUniformTexelBufferArrayNonUniformIndexing}, + {"RayCullMaskKHR", SpvCapabilityRayCullMaskKHR}, + {"CoreBuiltinsARM", SpvCapabilityCoreBuiltinsARM}, + {"USMStorageClassesINTEL", SpvCapabilityUSMStorageClassesINTEL}, + {"ArbitraryPrecisionIntegersINTEL", SpvCapabilityArbitraryPrecisionIntegersINTEL}, + {"IOPipesINTEL", SpvCapabilityIOPipesINTEL}, + {"MultiView", SpvCapabilityMultiView}, + {"RayTracingNV", SpvCapabilityRayTracingNV}, + {"OptNoneINTEL", SpvCapabilityOptNoneINTEL}, + {"SubgroupBufferBlockIOINTEL", SpvCapabilitySubgroupBufferBlockIOINTEL}, + {"TessellationPointSize", SpvCapabilityTessellationPointSize}, + {"Vector16", SpvCapabilityVector16}, + {"RayQueryPositionFetchKHR", SpvCapabilityRayQueryPositionFetchKHR}, + {"GenericPointer", SpvCapabilityGenericPointer}, + {"UniformBufferArrayDynamicIndexing", SpvCapabilityUniformBufferArrayDynamicIndexing}, + {"ImageMSArray", SpvCapabilityImageMSArray}, + {"AtomicStorageOps", SpvCapabilityAtomicStorageOps}, + {"DotProductInputAll", SpvCapabilityDotProductInputAll}, + {"InputAttachmentArrayNonUniformIndexing", SpvCapabilityInputAttachmentArrayNonUniformIndexing}, + {"AsmINTEL", SpvCapabilityAsmINTEL}, + {"DotProductInput4x8BitPackedKHR", SpvCapabilityDotProductInput4x8BitPackedKHR}, + {"StorageTexelBufferArrayNonUniformIndexing", SpvCapabilityStorageTexelBufferArrayNonUniformIndexing}, + {"FPGADSPControlINTEL", SpvCapabilityFPGADSPControlINTEL}, + {"DotProduct", SpvCapabilityDotProduct}, + {"StorageImageMultisample", SpvCapabilityStorageImageMultisample}, + {"StorageTexelBufferArrayDynamicIndexingEXT", SpvCapabilityStorageTexelBufferArrayDynamicIndexingEXT}, + {"SampledImageArrayDynamicIndexing", SpvCapabilitySampledImageArrayDynamicIndexing}, + {"VulkanMemoryModelDeviceScopeKHR", SpvCapabilityVulkanMemoryModelDeviceScopeKHR}, + {"ShadingRateNV", SpvCapabilityShadingRateNV}, + {"DotProductInput4x8BitKHR", SpvCapabilityDotProductInput4x8BitKHR}, + {"ShaderNonUniformEXT", SpvCapabilityShaderNonUniformEXT}, + {"ShaderStereoViewNV", SpvCapabilityShaderStereoViewNV}, + {"UniformAndStorageBuffer16BitAccess", SpvCapabilityUniformAndStorageBuffer16BitAccess}, + {"RoundingModeRTE", SpvCapabilityRoundingModeRTE}, + {"TileImageColorReadAccessEXT", SpvCapabilityTileImageColorReadAccessEXT}, + {"TileImageDepthReadAccessEXT", SpvCapabilityTileImageDepthReadAccessEXT}, + {"PerViewAttributesNV", SpvCapabilityPerViewAttributesNV}, + {"DemoteToHelperInvocationEXT", SpvCapabilityDemoteToHelperInvocationEXT}, + {"AtomicFloat16MinMaxEXT", SpvCapabilityAtomicFloat16MinMaxEXT}, + {"GroupNonUniformArithmetic", SpvCapabilityGroupNonUniformArithmetic}, + {"ShaderLayer", SpvCapabilityShaderLayer}, + {"VariableLengthArrayINTEL", SpvCapabilityVariableLengthArrayINTEL}, + {"ImageReadWriteLodAMD", SpvCapabilityImageReadWriteLodAMD}, + {"ImageCubeArray", SpvCapabilityImageCubeArray}, + {"Float16Buffer", SpvCapabilityFloat16Buffer}, + {"VulkanMemoryModelDeviceScope", SpvCapabilityVulkanMemoryModelDeviceScope}, + {"ImageRect", SpvCapabilityImageRect}, + {"UniformDecoration", SpvCapabilityUniformDecoration}, + {"AtomicFloat64AddEXT", SpvCapabilityAtomicFloat64AddEXT}, + {"VectorComputeINTEL", SpvCapabilityVectorComputeINTEL}, + {"Float16", SpvCapabilityFloat16}, + {"DeviceEnqueue", SpvCapabilityDeviceEnqueue}, + {"MinLod", SpvCapabilityMinLod}, + {"Float16ImageAMD", SpvCapabilityFloat16ImageAMD}, + {"SubgroupImageMediaBlockIOINTEL", SpvCapabilitySubgroupImageMediaBlockIOINTEL}, + {"SparseResidency", SpvCapabilitySparseResidency}, + {"UniformTexelBufferArrayDynamicIndexing", SpvCapabilityUniformTexelBufferArrayDynamicIndexing}, + {"Pipes", SpvCapabilityPipes}, + {"InputAttachment", SpvCapabilityInputAttachment}, + {"FPGAMemoryAttributesINTEL", SpvCapabilityFPGAMemoryAttributesINTEL}, + {"RuntimeDescriptorArrayEXT", SpvCapabilityRuntimeDescriptorArrayEXT}, + {"GeometryPointSize", SpvCapabilityGeometryPointSize}, + {"Shader", SpvCapabilityShader}, + {"IntegerFunctions2INTEL", SpvCapabilityIntegerFunctions2INTEL}, + {"StorageImageArrayDynamicIndexing", SpvCapabilityStorageImageArrayDynamicIndexing}, + {"Int64Atomics", SpvCapabilityInt64Atomics}, + {"ImageFootprintNV", SpvCapabilityImageFootprintNV}, + {"IndirectReferencesINTEL", SpvCapabilityIndirectReferencesINTEL}, + {"ShaderSMBuiltinsNV", SpvCapabilityShaderSMBuiltinsNV}, + {"StoragePushConstant8", SpvCapabilityStoragePushConstant8}, + {"FPGAKernelAttributesINTEL", SpvCapabilityFPGAKernelAttributesINTEL}, + {"ImageBuffer", SpvCapabilityImageBuffer}, + {"ImageReadWrite", SpvCapabilityImageReadWrite}, + {"AtomicStorage", SpvCapabilityAtomicStorage}, + {"SignedZeroInfNanPreserve", SpvCapabilitySignedZeroInfNanPreserve}, + {"Groups", SpvCapabilityGroups}, + {"DebugInfoModuleINTEL", SpvCapabilityDebugInfoModuleINTEL}, + {"GroupUniformArithmeticKHR", SpvCapabilityGroupUniformArithmeticKHR}, + {"Int16", SpvCapabilityInt16}, + {"DenormFlushToZero", SpvCapabilityDenormFlushToZero}, + {"TransformFeedback", SpvCapabilityTransformFeedback}, + {"StencilExportEXT", SpvCapabilityStencilExportEXT}, + {"InputAttachmentArrayNonUniformIndexingEXT", SpvCapabilityInputAttachmentArrayNonUniformIndexingEXT}, + {"DotProductKHR", SpvCapabilityDotProductKHR}, + {"FPGABufferLocationINTEL", SpvCapabilityFPGABufferLocationINTEL}, + {"DotProductInput4x8Bit", SpvCapabilityDotProductInput4x8Bit}, + {"ShaderInvocationReorderNV", SpvCapabilityShaderInvocationReorderNV}, + {"ImageMipmap", SpvCapabilityImageMipmap}, + {"FunctionFloatControlINTEL", SpvCapabilityFunctionFloatControlINTEL}, + {"AtomicFloat16AddEXT", SpvCapabilityAtomicFloat16AddEXT}, + {"RayQueryProvisionalKHR", SpvCapabilityRayQueryProvisionalKHR}, + {"GroupNonUniformVote", SpvCapabilityGroupNonUniformVote}, + {"StorageTexelBufferArrayNonUniformIndexingEXT", SpvCapabilityStorageTexelBufferArrayNonUniformIndexingEXT}, + {"ArbitraryPrecisionFloatingPointINTEL", SpvCapabilityArbitraryPrecisionFloatingPointINTEL}, + {"StorageInputOutput16", SpvCapabilityStorageInputOutput16}, + {"SampledImageArrayNonUniformIndexing", SpvCapabilitySampledImageArrayNonUniformIndexing}, + {"SubgroupVoteKHR", SpvCapabilitySubgroupVoteKHR}, + {"Tessellation", SpvCapabilityTessellation}, + {"Geometry", SpvCapabilityGeometry}, + {"SubgroupAvcMotionEstimationChromaINTEL", SpvCapabilitySubgroupAvcMotionEstimationChromaINTEL}, + {"StorageImageReadWithoutFormat", SpvCapabilityStorageImageReadWithoutFormat}, + {"Int64", SpvCapabilityInt64}, + {"DemoteToHelperInvocation", SpvCapabilityDemoteToHelperInvocation}, + {"MeshShadingEXT", SpvCapabilityMeshShadingEXT}, + {"UniformAndStorageBuffer8BitAccess", SpvCapabilityUniformAndStorageBuffer8BitAccess}, + {"RayTracingProvisionalKHR", SpvCapabilityRayTracingProvisionalKHR}, + {"UniformBufferArrayNonUniformIndexing", SpvCapabilityUniformBufferArrayNonUniformIndexing}, + {"VulkanMemoryModelKHR", SpvCapabilityVulkanMemoryModelKHR}, + {"SubgroupShuffleINTEL", SpvCapabilitySubgroupShuffleINTEL}, + {"SubgroupDispatch", SpvCapabilitySubgroupDispatch}, + {"MemoryAccessAliasingINTEL", SpvCapabilityMemoryAccessAliasingINTEL}, + {"StorageBuffer16BitAccess", SpvCapabilityStorageBuffer16BitAccess}, + {"RuntimeDescriptorArray", SpvCapabilityRuntimeDescriptorArray}, + {"StorageImageArrayNonUniformIndexing", SpvCapabilityStorageImageArrayNonUniformIndexing}, + {"Kernel", SpvCapabilityKernel}, + {"BitInstructions", SpvCapabilityBitInstructions}, + {"WorkgroupMemoryExplicitLayout8BitAccessKHR", SpvCapabilityWorkgroupMemoryExplicitLayout8BitAccessKHR}, + {"Sampled1D", SpvCapabilitySampled1D}, + {"StorageTexelBufferArrayDynamicIndexing", SpvCapabilityStorageTexelBufferArrayDynamicIndexing}, + {"ImageQuery", SpvCapabilityImageQuery}, + {"MultiViewport", SpvCapabilityMultiViewport}, + {"UniformTexelBufferArrayDynamicIndexingEXT", SpvCapabilityUniformTexelBufferArrayDynamicIndexingEXT}, + {"StorageUniform16", SpvCapabilityStorageUniform16}, + {"SubgroupImageBlockIOINTEL", SpvCapabilitySubgroupImageBlockIOINTEL}, + {"WorkgroupMemoryExplicitLayout16BitAccessKHR", SpvCapabilityWorkgroupMemoryExplicitLayout16BitAccessKHR}, + {"KernelAttributesINTEL", SpvCapabilityKernelAttributesINTEL}, + {"PipeStorage", SpvCapabilityPipeStorage}, + {"ShaderViewportMaskNV", SpvCapabilityShaderViewportMaskNV}, + {"Matrix", SpvCapabilityMatrix}, + {"GroupNonUniformShuffleRelative", SpvCapabilityGroupNonUniformShuffleRelative}, + {"RuntimeAlignedAttributeINTEL", SpvCapabilityRuntimeAlignedAttributeINTEL}, + {"CullDistance", SpvCapabilityCullDistance}, + {"Int8", SpvCapabilityInt8}, + {"RayTraversalPrimitiveCullingKHR", SpvCapabilityRayTraversalPrimitiveCullingKHR}, + {"SampleMaskPostDepthCoverage", SpvCapabilitySampleMaskPostDepthCoverage}, + {"GroupNonUniformShuffle", SpvCapabilityGroupNonUniformShuffle}, + {"ImageBasic", SpvCapabilityImageBasic}, + {"WorkgroupMemoryExplicitLayoutKHR", SpvCapabilityWorkgroupMemoryExplicitLayoutKHR}, + {"FPGAClusterAttributesINTEL", SpvCapabilityFPGAClusterAttributesINTEL}, + {"PhysicalStorageBufferAddresses", SpvCapabilityPhysicalStorageBufferAddresses}, + {"UniformTexelBufferArrayNonUniformIndexingEXT", SpvCapabilityUniformTexelBufferArrayNonUniformIndexingEXT}, + {"StorageBufferArrayNonUniformIndexingEXT", SpvCapabilityStorageBufferArrayNonUniformIndexingEXT}, + {"FragmentShaderSampleInterlockEXT", SpvCapabilityFragmentShaderSampleInterlockEXT}, + {"SampledImageArrayNonUniformIndexingEXT", SpvCapabilitySampledImageArrayNonUniformIndexingEXT}, + {"InterpolationFunction", SpvCapabilityInterpolationFunction}, + {"AtomicFloat32AddEXT", SpvCapabilityAtomicFloat32AddEXT}, + {"Int64ImageEXT", SpvCapabilityInt64ImageEXT}, + {"SubgroupBallotKHR", SpvCapabilitySubgroupBallotKHR}, + {"RoundToInfinityINTEL", SpvCapabilityRoundToInfinityINTEL}, + {"DrawParameters", SpvCapabilityDrawParameters}, + {"VariablePointers", SpvCapabilityVariablePointers}, + {"FragmentShaderShadingRateInterlockEXT", SpvCapabilityFragmentShaderShadingRateInterlockEXT}, + {"NamedBarrier", SpvCapabilityNamedBarrier}, + {"ComputeDerivativeGroupQuadsNV", SpvCapabilityComputeDerivativeGroupQuadsNV}, + {"SampledCubeArray", SpvCapabilitySampledCubeArray}, + {"Addresses", SpvCapabilityAddresses}, + {"LongConstantCompositeINTEL", SpvCapabilityLongConstantCompositeINTEL}, + {"ArbitraryPrecisionFixedPointINTEL", SpvCapabilityArbitraryPrecisionFixedPointINTEL}, + {"RayTracingKHR", SpvCapabilityRayTracingKHR}, + {"RayQueryKHR", SpvCapabilityRayQueryKHR}, + {"FragmentDensityEXT", SpvCapabilityFragmentDensityEXT}, + {"InputAttachmentArrayDynamicIndexingEXT", SpvCapabilityInputAttachmentArrayDynamicIndexingEXT}, + {"FPGAInvocationPipeliningAttributesINTEL", SpvCapabilityFPGAInvocationPipeliningAttributesINTEL}, + {"ShaderViewportIndexLayerEXT", SpvCapabilityShaderViewportIndexLayerEXT}, + {"PhysicalStorageBufferAddressesEXT", SpvCapabilityPhysicalStorageBufferAddressesEXT}, + {"SplitBarrierINTEL", SpvCapabilitySplitBarrierINTEL}, + {"ImageGatherExtended", SpvCapabilityImageGatherExtended}, + {"CooperativeMatrixNV", SpvCapabilityCooperativeMatrixNV}, + {"FloatingPointModeINTEL", SpvCapabilityFloatingPointModeINTEL}, + {"SubgroupAvcMotionEstimationIntraINTEL", SpvCapabilitySubgroupAvcMotionEstimationIntraINTEL}, + {"DotProductInputAllKHR", SpvCapabilityDotProductInputAllKHR}, + {"AtomicFloat64MinMaxEXT", SpvCapabilityAtomicFloat64MinMaxEXT}, + {"DeviceGroup", SpvCapabilityDeviceGroup}, + {"RayTracingOpacityMicromapEXT", SpvCapabilityRayTracingOpacityMicromapEXT}, + {"GroupNonUniform", SpvCapabilityGroupNonUniform}, + {"BindlessTextureNV", SpvCapabilityBindlessTextureNV}, + {"GeometryShaderPassthroughNV", SpvCapabilityGeometryShaderPassthroughNV}, + {"FragmentFullyCoveredEXT", SpvCapabilityFragmentFullyCoveredEXT}, + {"ShaderNonUniform", SpvCapabilityShaderNonUniform}, + {"DotProductInput4x8BitPacked", SpvCapabilityDotProductInput4x8BitPacked}, + {"ShaderViewportIndexLayerNV", SpvCapabilityShaderViewportIndexLayerNV}, + {"RayTracingPositionFetchKHR", SpvCapabilityRayTracingPositionFetchKHR}, + {"VectorAnyINTEL", SpvCapabilityVectorAnyINTEL}, + {"FPFastMathModeINTEL", SpvCapabilityFPFastMathModeINTEL}, + {"AtomicFloat32MinMaxEXT", SpvCapabilityAtomicFloat32MinMaxEXT}, + {"SampleMaskOverrideCoverageNV", SpvCapabilitySampleMaskOverrideCoverageNV}, + {"FragmentShadingRateKHR", SpvCapabilityFragmentShadingRateKHR}, + {"GroupNonUniformPartitionedNV", SpvCapabilityGroupNonUniformPartitionedNV}, + {"StorageBufferArrayNonUniformIndexing", SpvCapabilityStorageBufferArrayNonUniformIndexing}, + {"ExpectAssumeKHR", SpvCapabilityExpectAssumeKHR}, + {"FPGAMemoryAccessesINTEL", SpvCapabilityFPGAMemoryAccessesINTEL}, + {"StorageImageExtendedFormats", SpvCapabilityStorageImageExtendedFormats}, + {"FPGAArgumentInterfacesINTEL", SpvCapabilityFPGAArgumentInterfacesINTEL}, + {"SampleRateShading", SpvCapabilitySampleRateShading}, + {"VariablePointersStorageBuffer", SpvCapabilityVariablePointersStorageBuffer}, + {"StoragePushConstant16", SpvCapabilityStoragePushConstant16}, + {"GeometryStreams", SpvCapabilityGeometryStreams}, + {"FPGARegINTEL", SpvCapabilityFPGARegINTEL}, + {"LoopFuseINTEL", SpvCapabilityLoopFuseINTEL}, + {"Linkage", SpvCapabilityLinkage}, + {"ComputeDerivativeGroupLinearNV", SpvCapabilityComputeDerivativeGroupLinearNV}, + {"DerivativeControl", SpvCapabilityDerivativeControl}, + {"StorageBufferArrayDynamicIndexing", SpvCapabilityStorageBufferArrayDynamicIndexing}, + {"SampledBuffer", SpvCapabilitySampledBuffer}, + {"StorageBuffer8BitAccess", SpvCapabilityStorageBuffer8BitAccess}, + {"FragmentBarycentricKHR", SpvCapabilityFragmentBarycentricKHR}, + {"GroupNonUniformClustered", SpvCapabilityGroupNonUniformClustered}, + {"MeshShadingNV", SpvCapabilityMeshShadingNV}, + {"RoundingModeRTZ", SpvCapabilityRoundingModeRTZ}, + {"StorageUniformBufferBlock16", SpvCapabilityStorageUniformBufferBlock16}, + {"DenormPreserve", SpvCapabilityDenormPreserve}, + {"FragmentShaderPixelInterlockEXT", SpvCapabilityFragmentShaderPixelInterlockEXT}, + {"Max", SpvCapabilityMax}, + {"GroupNonUniformBallot", SpvCapabilityGroupNonUniformBallot}, + {"InputAttachmentArrayDynamicIndexing", SpvCapabilityInputAttachmentArrayDynamicIndexing}, + {"GroupNonUniformRotateKHR", SpvCapabilityGroupNonUniformRotateKHR}, + {"ClipDistance", SpvCapabilityClipDistance}, + {"ShaderClockKHR", SpvCapabilityShaderClockKHR}, + {"FragmentMaskAMD", SpvCapabilityFragmentMaskAMD}, + {"FPGALoopControlsINTEL", SpvCapabilityFPGALoopControlsINTEL}, + {"Float64", SpvCapabilityFloat64}, + {"TileImageStencilReadAccessEXT", SpvCapabilityTileImageStencilReadAccessEXT}, + {"UniformBufferArrayNonUniformIndexingEXT", SpvCapabilityUniformBufferArrayNonUniformIndexingEXT}, + {"ImageGatherBiasLodAMD", SpvCapabilityImageGatherBiasLodAMD}, + {"SampledRect", SpvCapabilitySampledRect}, + {"VulkanMemoryModel", SpvCapabilityVulkanMemoryModel}, +}; + +static UInt32 hash(const UnownedStringSlice& str, UInt32 salt) +{ + UInt64 h = salt; + for(const char c : str) + h = ((h * 0x00000100000001B3) ^ c); + return h % (sizeof(tableSalt)/sizeof(tableSalt[0])); +} + +bool lookupSpvCapability(const UnownedStringSlice& str, SpvCapability& value) +{ + const auto i = hash(str, tableSalt[hash(str, 0)]); + if(str == words[i].name) + { + value = words[i].value; + return true; + } + else + { + return false; + } +} + +} diff --git a/source/slang/slang-lower-to-ir.cpp b/source/slang/slang-lower-to-ir.cpp index 0d7e27bc4..497981a94 100644 --- a/source/slang/slang-lower-to-ir.cpp +++ b/source/slang/slang-lower-to-ir.cpp @@ -8736,29 +8736,6 @@ struct DeclLoweringVisitor : DeclVisitor<DeclLoweringVisitor, LoweredValInfo> addCatchAllIntrinsicDecorationIfNeeded(irFunc, decl); - // If this declaration requires certain GLSL extension (or a particular GLSL version) - // for it to be usable, then declare that here. - // - // TODO: We should wrap this an `SpecializedForTargetModifier` together into a single - // case for enumerating the "capabilities" that a declaration requires. - // - for (auto extensionMod : decl->getModifiersOfType<RequiredGLSLExtensionModifier>()) - { - getBuilder()->addRequireGLSLExtensionDecoration(irFunc, extensionMod->extensionNameToken.getContent()); - } - for (auto versionMod : decl->getModifiersOfType<RequiredGLSLVersionModifier>()) - { - getBuilder()->addRequireGLSLVersionDecoration(irFunc, Int(getIntegerLiteralValue(versionMod->versionNumberToken))); - } - for (auto versionMod : decl->getModifiersOfType<RequiredSPIRVVersionModifier>()) - { - getBuilder()->addRequireSPIRVVersionDecoration(irFunc, versionMod->version); - } - for (auto versionMod : decl->getModifiersOfType<RequiredCUDASMVersionModifier>()) - { - getBuilder()->addRequireCUDASMVersionDecoration(irFunc, versionMod->version); - } - // Register the value now, to avoid any possible infinite recursion when lowering ForwardDerivativeAttribute context->setGlobalValue(decl, LoweredValInfo::simple(findOuterMostGeneric(irFunc))); @@ -8934,6 +8911,16 @@ struct DeclLoweringVisitor : DeclVisitor<DeclLoweringVisitor, LoweredValInfo> { getBuilder()->addDecoration(irFunc, kIROp_PreferRecomputeDecoration); } + else if (auto extensionMod = as<RequiredGLSLExtensionModifier>(modifier)) + getBuilder()->addRequireGLSLExtensionDecoration(irFunc, extensionMod->extensionNameToken.getContent()); + else if (auto versionMod = as<RequiredGLSLVersionModifier>(modifier)) + getBuilder()->addRequireGLSLVersionDecoration(irFunc, Int(getIntegerLiteralValue(versionMod->versionNumberToken))); + else if (auto spvVersion = as<RequiredSPIRVVersionModifier>(modifier)) + getBuilder()->addRequireSPIRVVersionDecoration(irFunc, spvVersion->version); + else if (auto capMod = as<RequiredSPIRVCapabilityModifier>(modifier)) + getBuilder()->addRequireSPIRVCapabilityDecoration(irFunc, capMod->capability); + else if (auto cudasmVersion = as<RequiredCUDASMVersionModifier>(modifier)) + getBuilder()->addRequireCUDASMVersionDecoration(irFunc, cudasmVersion->version); } if (!isInline) diff --git a/source/slang/slang-parser.cpp b/source/slang/slang-parser.cpp index 98c227159..fabf1ffb4 100644 --- a/source/slang/slang-parser.cpp +++ b/source/slang/slang-parser.cpp @@ -6,6 +6,7 @@ #include "slang-compiler.h" #include "slang-lookup.h" #include "slang-visitor.h" +#include "slang-lookup-spirv.h" #include "../core/slang-semantic-version.h" @@ -6531,6 +6532,18 @@ namespace Slang return nullptr; } + static NodeBase* parseSPIRVCapabilityModifier(Parser* parser, void*) + { + Token token; + token = parser->ReadToken(); + auto modifier = parser->astBuilder->create<RequiredSPIRVCapabilityModifier>(); + SpvCapability cap; + if (!lookupSpvCapability(token.getContent(), cap)) + parser->sink->diagnose(token, Diagnostics::unknownSPIRVCapability, token); + modifier->capability = (int32_t)cap; + return modifier; + } + static NodeBase* parseCUDASMVersionModifier(Parser* parser, void* /*userData*/) { Token token; @@ -6889,6 +6902,7 @@ namespace Slang _makeParseModifier("__glsl_extension", parseGLSLExtensionModifier), _makeParseModifier("__glsl_version", parseGLSLVersionModifier), _makeParseModifier("__spirv_version", parseSPIRVVersionModifier), + _makeParseModifier("__spirv_capability", parseSPIRVCapabilityModifier), _makeParseModifier("__cuda_sm_version", parseCUDASMVersionModifier), _makeParseModifier("__builtin_type", parseBuiltinTypeModifier), diff --git a/tools/slang-lookup-generator/lookup-generator-main.cpp b/tools/slang-lookup-generator/lookup-generator-main.cpp index cb1c15dd3..f64e2a78f 100644 --- a/tools/slang-lookup-generator/lookup-generator-main.cpp +++ b/tools/slang-lookup-generator/lookup-generator-main.cpp @@ -6,6 +6,7 @@ #include "../../source/compiler-core/slang-lexer.h" #include "../../source/core/slang-io.h" #include "../../source/core/slang-secure-crt.h" +#include "../../source/core/slang-string-util.h" using namespace Slang; @@ -310,7 +311,7 @@ int main(int argc, const char* const* argv) return 1; } - const char* const inJsonPath = argv[1]; + const char* const inPath = argv[1]; const char* const outCppPath = argv[2]; const char* const enumName = argv[3]; const char* const enumerantPrefix = argv[4]; @@ -322,20 +323,36 @@ int main(int argc, const char* const* argv) DiagnosticSink sink(&sourceManager, Lexer::sourceLocationLexer); sink.writer = writer; - JSONContainer container(sink.getSourceManager()); - JSONBuilder builder(&container); - if (SLANG_FAILED(parseJson(inJsonPath, &sink, builder))) + List<String> opnames; + + if (String(inPath).endsWith("json")) { - sink.diagnoseRaw(Severity::Error, "Json parsing failed\n"); - return 1; - } + // If source is a json file parse it. + JSONContainer container(sink.getSourceManager()); + JSONBuilder builder(&container); + if (SLANG_FAILED(parseJson(inPath, &sink, builder))) + { + sink.diagnoseRaw(Severity::Error, "Json parsing failed\n"); + return 1; + } - UnownedStringSlice error; - const List<String> opnames = extractOpNames(error, builder.getRootValue(), container); - if (error.getLength()) + UnownedStringSlice error; + opnames = extractOpNames(error, builder.getRootValue(), container); + if (error.getLength()) + { + sink.diagnoseRaw(Severity::Error, error); + return 1; + } + } + else { - sink.diagnoseRaw(Severity::Error, error); - return 1; + // Otherwise, we assume the input is a text file with one name per line. + String content; + File::readAllText(inPath, content); + List<UnownedStringSlice> words; + StringUtil::split(content.getUnownedSlice(), '\n', words); + for (auto w : words) + opnames.add(w); } HashParams hashParams; |
