diff options
| author | Yong He <yonghe@outlook.com> | 2023-09-13 09:48:32 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-09-13 09:48:32 -0700 |
| commit | d2466a602774fcaec063e2f8cdbf86fd5e160a21 (patch) | |
| tree | 13d453cbf79c51ddba4131453da89055fe9740af /source/slang | |
| parent | c0a77c360436c4f1ec4d284e331063c35bdf95ad (diff) | |
Add all RayQuery SPIRV Intrinsics. (#3204)
* Add all RayQuery SPIRV Intrinsics.
* Fix
* Fix.
* fix.
* Fix.
* Fix.
* Fix.
---------
Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang')
| -rw-r--r-- | source/slang/hlsl.meta.slang | 398 | ||||
| -rw-r--r-- | source/slang/slang-artifact-output-util.cpp | 1 | ||||
| -rw-r--r-- | source/slang/slang-ir-spirv-legalize.cpp | 4 | ||||
| -rw-r--r-- | source/slang/slang-language-server.cpp | 3 | ||||
| -rw-r--r-- | source/slang/slang-lookup.cpp | 4 |
5 files changed, 208 insertions, 202 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index dce44c9cc..c04a88923 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -7874,6 +7874,36 @@ struct RayQuery <let rayFlagsGeneric : RAY_FLAG = RAY_FLAG_NONE> } } + // Commit the current non-opaque triangle hit. + __glsl_extension(GL_EXT_ray_query) + __glsl_version(460) + [__NoSideEffect] + [mutating] + void CommitNonOpaqueTriangleHit() + { + __target_switch + { + case hlsl: __intrinsic_asm ".CommitNonOpaqueTriangleHit"; + case glsl: __intrinsic_asm "rayQueryConfirmIntersectionEXT"; + case spirv: spirv_asm { OpRayQueryConfirmIntersectionKHR &this }; + } + } + + // Commit the current procedural primitive hit, with hit time `t`. + __glsl_extension(GL_EXT_ray_query) + __glsl_version(460) + [__NoSideEffect] + [mutating] + void CommitProceduralPrimitiveHit(float t) + { + __target_switch + { + case hlsl: __intrinsic_asm ".CommitProceduralPrimitiveHit"; + case glsl: __intrinsic_asm "rayQueryGenerateIntersectionEXT"; + case spirv: spirv_asm { OpRayQueryGenerateIntersectionKHR &this $t }; + } + } + // Get the type of candidate hit being considered. // // The ray query coroutine will suspend when it encounters @@ -7885,7 +7915,7 @@ struct RayQuery <let rayFlagsGeneric : RAY_FLAG = RAY_FLAG_NONE> // __glsl_extension(GL_EXT_ray_query) __glsl_version(460) - [__readNone] + [__NoSideEffect] CANDIDATE_TYPE CandidateType() { __target_switch @@ -7900,125 +7930,10 @@ struct RayQuery <let rayFlagsGeneric : RAY_FLAG = RAY_FLAG_NONE> } } - // Access properties of a candidate hit. - - __target_intrinsic(glsl, "transpose(rayQueryGetIntersectionObjectToWorldEXT($0, false))") - __glsl_extension(GL_EXT_ray_query) - __glsl_version(460) - [__readNone] - float3x4 CandidateObjectToWorld3x4(); - - __target_intrinsic(glsl, "rayQueryGetIntersectionObjectToWorldEXT($0, false)") - __glsl_extension(GL_EXT_ray_query) - __glsl_version(460) - [__readNone] - float4x3 CandidateObjectToWorld4x3(); - - __target_intrinsic(glsl, "transpose(rayQueryGetIntersectionWorldToObjectEXT($0, false))") - __glsl_extension(GL_EXT_ray_query) - __glsl_version(460) - [__readNone] - float3x4 CandidateWorldToObject3x4(); - - __target_intrinsic(glsl, "rayQueryGetIntersectionWorldToObjectEXT($0, false)") - __glsl_extension(GL_EXT_ray_query) - __glsl_version(460) - [__readNone] - float4x3 CandidateWorldToObject4x3(); - - __target_intrinsic(glsl, "rayQueryGetIntersectionInstanceIdEXT($0, false)") - __glsl_extension(GL_EXT_ray_query) - __glsl_version(460) - [__readNone] - uint CandidateInstanceIndex(); - - __target_intrinsic(glsl, "rayQueryGetIntersectionInstanceCustomIndexEXT($0, false)") - __glsl_extension(GL_EXT_ray_query) - __glsl_version(460) - [__readNone] - uint CandidateInstanceID(); - - __target_intrinsic(glsl, "rayQueryGetIntersectionGeometryIndexEXT($0, false)") - __glsl_extension(GL_EXT_ray_query) - __glsl_version(460) - [__readNone] - uint CandidateGeometryIndex(); - - __target_intrinsic(glsl, "rayQueryGetIntersectionPrimitiveIndexEXT($0, false)") - __glsl_extension(GL_EXT_ray_query) - __glsl_version(460) - [__readNone] - uint CandidatePrimitiveIndex(); - - __target_intrinsic(glsl, "rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT($0, false)") - __glsl_extension(GL_EXT_ray_query) - __glsl_version(460) - [__readNone] - uint CandidateInstanceContributionToHitGroupIndex(); - - // Access properties of the ray being traced - // in the object space of a candidate hit. - - __target_intrinsic(glsl, "rayQueryGetIntersectionObjectRayOriginEXT($0, false)") - __glsl_extension(GL_EXT_ray_query) - __glsl_version(460) - [__readNone] - float3 CandidateObjectRayOrigin(); - - __target_intrinsic(glsl, "rayQueryGetIntersectionObjectRayDirectionEXT($0, false)") - __glsl_extension(GL_EXT_ray_query) - __glsl_version(460) - [__readNone] - float3 CandidateObjectRayDirection(); - - // Access properties of a candidate procedural primitive hit. - - __target_intrinsic(glsl, "rayQueryGetIntersectionCandidateAABBOpaqueEXT($0, false)") - __glsl_extension(GL_EXT_ray_query) - __glsl_version(460) - [__readNone] - bool CandidateProceduralPrimitiveNonOpaque(); - - // Access properties of a candidate non-opaque triangle hit. - - __target_intrinsic(glsl, "rayQueryGetIntersectionFrontFaceEXT($0, false)") - __glsl_extension(GL_EXT_ray_query) - __glsl_version(460) - [__readNone] - bool CandidateTriangleFrontFace(); - - __target_intrinsic(glsl, "rayQueryGetIntersectionBarycentricsEXT($0, false)") - __glsl_extension(GL_EXT_ray_query) - __glsl_version(460) - [__readNone] - float2 CandidateTriangleBarycentrics(); - - __target_intrinsic(glsl, "rayQueryGetIntersectionTEXT($0, false)") - __glsl_extension(GL_EXT_ray_query) - __glsl_version(460) - [__readNone] - float CandidateTriangleRayT(); - - // Commit the current non-opaque triangle hit. - __target_intrinsic(glsl, rayQueryConfirmIntersectionEXT) - __glsl_extension(GL_EXT_ray_query) - __glsl_version(460) - [__NoSideEffect] - [mutating] - void CommitNonOpaqueTriangleHit(); - - // Commit the current procedural primitive hit, with hit time `t`. - __target_intrinsic(glsl, rayQueryGenerateIntersectionEXT) - __glsl_extension(GL_EXT_ray_query) - __glsl_version(460) - [__NoSideEffect] - [mutating] - void CommitProceduralPrimitiveHit(float t); - // Get the status of the committed (closest) hit, if any. __glsl_extension(GL_EXT_ray_query) __glsl_version(460) - [__readNone] + [__NoSideEffect] COMMITTED_STATUS CommittedStatus() { __target_switch @@ -8034,134 +7949,221 @@ struct RayQuery <let rayFlagsGeneric : RAY_FLAG = RAY_FLAG_NONE> } } - // Access properties of the committed hit. - // - __target_intrinsic(glsl, "transpose(rayQueryGetIntersectionObjectToWorldEXT($0, true))") __glsl_extension(GL_EXT_ray_query) __glsl_version(460) - [__readNone] - float3x4 CommittedObjectToWorld3x4(); - - __target_intrinsic(glsl, "rayQueryGetIntersectionObjectToWorldEXT($0, true)") - __glsl_extension(GL_EXT_ray_query) - __glsl_version(460) - [__readNone] - float4x3 CommittedObjectToWorld4x3(); - - __target_intrinsic(glsl, "transpose(rayQueryGetIntersectionWorldToObjectEXT($0, true))") - __glsl_extension(GL_EXT_ray_query) - __glsl_version(460) - [__readNone] - float3x4 CommittedWorldToObject3x4(); + [__NoSideEffect] + bool CandidateProceduralPrimitiveNonOpaque() + { + __target_switch + { + case hlsl: __intrinsic_asm ".CandidateProceduralPrimitiveNonOpaque"; + case glsl: __intrinsic_asm "(!rayQueryGetIntersectionCandidateAABBOpaqueEXT($0, false))"; + case spirv: + uint iCandidateOrCommitted = 0; + return spirv_asm + { + %rr:$$bool = OpRayQueryGetIntersectionCandidateAABBOpaqueKHR &this $iCandidateOrCommitted; + result:$$bool = OpLogicalNot %rr; + }; + } + } - __target_intrinsic(glsl, "rayQueryGetIntersectionWorldToObjectEXT($0, true)") __glsl_extension(GL_EXT_ray_query) __glsl_version(460) - [__readNone] - float4x3 CommittedWorldToObject4x3(); - + [__NoSideEffect] + float CandidateTriangleRayT() + { + __target_switch + { + case hlsl: __intrinsic_asm ".CandidateTriangleRayT"; + case glsl: __intrinsic_asm "rayQueryGetIntersectionTEXT($0, false)"; + case spirv: + uint iCandidateOrCommitted = 0; + return spirv_asm + { + result:$$float = OpRayQueryGetIntersectionTKHR &this $iCandidateOrCommitted; + }; + } + } __glsl_extension(GL_EXT_ray_query) __glsl_version(460) - [__readNone] + [__NoSideEffect] float CommittedRayT() { __target_switch { - case glsl: __intrinsic_asm "rayQueryGetIntersectionTEXT($0, true)"; case hlsl: __intrinsic_asm ".CommittedRayT"; + case glsl: __intrinsic_asm "rayQueryGetIntersectionTEXT($0, true)"; case spirv: - uint RayQueryCommittedIntersectionKHR = 1; + uint iCandidateOrCommitted = 1; return spirv_asm { - result:$$float = OpRayQueryGetIntersectionTKHR &this $RayQueryCommittedIntersectionKHR + result:$$float = OpRayQueryGetIntersectionTKHR &this $iCandidateOrCommitted; }; } } - __target_intrinsic(glsl, "rayQueryGetIntersectionInstanceIdEXT($0, true)") - __glsl_extension(GL_EXT_ray_query) - __glsl_version(460) - [__readNone] - uint CommittedInstanceIndex(); - - __target_intrinsic(glsl, "rayQueryGetIntersectionInstanceCustomIndexEXT($0, true)") - __glsl_extension(GL_EXT_ray_query) - __glsl_version(460) - [__readNone] - uint CommittedInstanceID(); - - __target_intrinsic(glsl, "rayQueryGetIntersectionGeometryIndexEXT($0, true)") - __glsl_extension(GL_EXT_ray_query) - __glsl_version(460) - [__readNone] - uint CommittedGeometryIndex(); - - __target_intrinsic(glsl, "rayQueryGetIntersectionPrimitiveIndexEXT($0, true)") - __glsl_extension(GL_EXT_ray_query) - __glsl_version(460) - [__readNone] - uint CommittedPrimitiveIndex(); +${{{{ + const char* kCandidateCommitted[] = {"Candidate", "Committed"}; - __target_intrinsic(glsl, "rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT($0, true)") - __glsl_extension(GL_EXT_ray_query) - __glsl_version(460) - [__readNone] - uint CommittedInstanceContributionToHitGroupIndex(); + // Access Candidate and Committed Matrices. + for (uint32_t candidateOrCommitted = 0; candidateOrCommitted < 2; candidateOrCommitted++) + { + auto ccName = kCandidateCommitted[candidateOrCommitted]; + auto ccTF = candidateOrCommitted == 0 ? "false" : "true"; +}}}} - // Access properties of the ray being traced - // in the object space of a committed hit. + // CandidateObjectToWorld3x4, CandidateWorldToObject4x3 + // CommittedObjectToWorld3x4, CommittedObjectToWorld4x3 + ${{{{ + const char* kRayQueryMatrixNames[] = {"ObjectToWorld", "WorldToObject"}; + for (auto matName : kRayQueryMatrixNames) { + }}}} - __target_intrinsic(glsl, "rayQueryGetIntersectionObjectRayOriginEXT($0, true)") __glsl_extension(GL_EXT_ray_query) __glsl_version(460) - [__readNone] - float3 CommittedObjectRayOrigin(); + [__NoSideEffect] + float3x4 $(ccName)$(matName)3x4() + { + __target_switch + { + case glsl: __intrinsic_asm "transpose(rayQueryGetIntersection$(matName)EXT($0, $(ccTF)))"; + case hlsl: __intrinsic_asm ".$(ccName)$(matName)3x4"; + case spirv: + uint iCandidateOrCommitted = $(candidateOrCommitted); + return spirv_asm { + %m:$$float4x3 = OpRayQueryGetIntersection$(matName)KHR &this $iCandidateOrCommitted; + result:$$float3x4 = OpTranspose %m; + }; + } + } - __target_intrinsic(glsl, "rayQueryGetIntersectionObjectRayDirectionEXT($0, true)") __glsl_extension(GL_EXT_ray_query) __glsl_version(460) [__readNone] - float3 CommittedObjectRayDirection(); + float4x3 $(ccName)$(matName)4x3() + { + __target_switch + { + case glsl: __intrinsic_asm "rayQueryGetIntersection$(matName)EXT($0, $(ccTF))"; + case hlsl: __intrinsic_asm ".$(ccName)$(matName)4x3"; + case spirv: + uint iCandidateOrCommitted = $(candidateOrCommitted); + return spirv_asm { + result:$$float4x3 = OpRayQueryGetIntersection$(matName)KHR &this $iCandidateOrCommitted; + }; + } + } - // Access properties of a committed triangle hit. +${{{{ + } // ObjectToWorld/WorldToObject. - __target_intrinsic(glsl, "rayQueryGetIntersectionFrontFaceEXT($0, true)") - __glsl_extension(GL_EXT_ray_query) - __glsl_version(460) - [__readNone] - bool CommittedTriangleFrontFace(); + // Access Candidate and Committed properties. + struct RayQueryMethodEntry + { + const char* type; + const char* hlslName; + const char* glslName; + }; + const RayQueryMethodEntry rayQueryMethods[] = { + {"uint", "InstanceIndex", "InstanceId"}, + {"uint", "InstanceID", "InstanceCustomIndex"}, + {"uint", "PrimitiveIndex", "PrimitiveIndex"}, + {"uint", "InstanceContributionToHitGroupIndex", "InstanceShaderBindingTableRecordOffset"}, + {"float3", "ObjectRayOrigin", "ObjectRayOrigin"}, + {"float3", "ObjectRayDirection", "ObjectRayDirection"}, + {"bool", "TriangleFrontFace", "FrontFace"}, + {"float2", "TriangleBarycentrics", "Barycentrics"}, + }; + for (auto method : rayQueryMethods) { +}}}} - __target_intrinsic(glsl, "rayQueryGetIntersectionBarycentricsEXT($0, true)") __glsl_extension(GL_EXT_ray_query) __glsl_version(460) - [__readNone] - float2 CommittedTriangleBarycentrics(); + [__NoSideEffect] + $(method.type) $(ccName)$(method.hlslName)() + { + __target_switch + { + case hlsl: __intrinsic_asm ".$(ccName)$(method.hlslName)"; + case glsl: __intrinsic_asm "rayQueryGetIntersection$(method.glslName)EXT($0, $(ccTF))"; + case spirv: + uint iCandidateOrCommitted = $(candidateOrCommitted); + return spirv_asm { + result:$$$(method.type) = OpRayQueryGetIntersection$(method.glslName)KHR &this $iCandidateOrCommitted; + }; + } + } +${{{{ + } // Candidate/Committed properties. + } // for ("Candidate", "Committed") +}}}} // Access properties of the ray being traced. - __target_intrinsic(glsl, rayQueryGetRayFlagsEXT) __glsl_extension(GL_EXT_ray_query) __glsl_version(460) - [__readNone] - uint RayFlags(); + [__NoSideEffect] + uint RayFlags() + { + __target_switch + { + case hlsl: __intrinsic_asm ".RayFlags"; + case glsl: __intrinsic_asm "rayQueryGetRayFlagsEXT"; + case spirv: + return spirv_asm { + result:$$uint = OpRayQueryGetRayFlagsKHR &this; + }; + } + } - __target_intrinsic(glsl, rayQueryGetWorldRayOriginEXT) __glsl_extension(GL_EXT_ray_query) __glsl_version(460) - [__readNone] - float3 WorldRayOrigin(); + [__NoSideEffect] + float3 WorldRayOrigin() + { + __target_switch + { + case hlsl: __intrinsic_asm ".WorldRayOrigin"; + case glsl: __intrinsic_asm "rayQueryGetWorldRayOriginEXT"; + case spirv: + return spirv_asm { + result:$$float3 = OpRayQueryGetWorldRayOriginKHR &this; + }; + } + } - __target_intrinsic(glsl, rayQueryGetWorldRayDirectionEXT) __glsl_extension(GL_EXT_ray_query) __glsl_version(460) - [__readNone] - float3 WorldRayDirection(); + [__NoSideEffect] + float3 WorldRayDirection() + { + __target_switch + { + case hlsl: __intrinsic_asm ".WorldRayDirection"; + case glsl: __intrinsic_asm "rayQueryGetWorldRayDirectionEXT"; + case spirv: + return spirv_asm { + result:$$float3 = OpRayQueryGetWorldRayDirectionKHR &this; + }; + } + } - __target_intrinsic(glsl, rayQueryGetRayTMinEXT) __glsl_extension(GL_EXT_ray_query) __glsl_version(460) - [__readNone] - float RayTMin(); + [__NoSideEffect] + float RayTMin() + { + __target_switch + { + case hlsl: __intrinsic_asm ".RayTMin"; + case glsl: __intrinsic_asm "rayQueryGetRayTMinEXT"; + case spirv: + return spirv_asm { + result:$$float = OpRayQueryGetRayTMinKHR &this; + }; + } + }; } // diff --git a/source/slang/slang-artifact-output-util.cpp b/source/slang/slang-artifact-output-util.cpp index 32aff9f43..2c560e236 100644 --- a/source/slang/slang-artifact-output-util.cpp +++ b/source/slang/slang-artifact-output-util.cpp @@ -75,7 +75,6 @@ SlangResult ArtifactOutputUtil::maybeDisassemble(Session* session, IArtifact* ar auto toDesc = desc; toDesc.kind = ArtifactKind::Assembly; - // If this likes a playsible disassebly conversion if (ArtifactDescUtil::isDisassembly(desc, toDesc)) { diff --git a/source/slang/slang-ir-spirv-legalize.cpp b/source/slang/slang-ir-spirv-legalize.cpp index 8d785bceb..54cacf4a6 100644 --- a/source/slang/slang-ir-spirv-legalize.cpp +++ b/source/slang/slang-ir-spirv-legalize.cpp @@ -202,6 +202,8 @@ struct SPIRVLegalizationContext : public SourceEmitterBase i->removeAndDeallocate(); } + // Returns true if the given type that should be decorated as in `UniformConstant` address space. + // These are typically opaque resource handles that can't be marked as `Uniform`. bool isSpirvUniformConstantType(IRType* type) { if (as<IRTextureTypeBase>(type)) @@ -250,7 +252,7 @@ struct SPIRVLegalizationContext : public SourceEmitterBase } } - // Textures and Samplers can't be in Uniform for Vulkan, if they are + // Opaque resource handles can't be in Uniform for Vulkan, if they are // placed here then put them in UniformConstant instead if (storageClass == SpvStorageClassUniform && isSpirvUniformConstantType(inst->getDataType())) diff --git a/source/slang/slang-language-server.cpp b/source/slang/slang-language-server.cpp index 54da4120c..ad88ab5ac 100644 --- a/source/slang/slang-language-server.cpp +++ b/source/slang/slang-language-server.cpp @@ -910,6 +910,8 @@ SlangResult LanguageServer::completion( // Always create a new workspace version for the completion request since we // will use a modified source. auto version = m_workspace->createVersionForCompletion(); + SLANG_AST_BUILDER_RAII(version->linkage->getASTBuilder()); + auto moduleName = getMangledNameFromNameString(canonicalPath.getUnownedSlice()); version->linkage->contentAssistInfo.cursorLine = utf8Line; version->linkage->contentAssistInfo.cursorCol = utf8Col; @@ -1007,6 +1009,7 @@ SlangResult LanguageServer::completionResolve( m_connection->sendResult(&resolvedItem, responseId); return SLANG_OK; } + SLANG_AST_BUILDER_RAII(version->linkage->getASTBuilder()); auto& candidateItems = version->linkage->contentAssistInfo.completionSuggestions.candidateItems; if (itemId >= 0 && itemId < candidateItems.getCount()) { diff --git a/source/slang/slang-lookup.cpp b/source/slang/slang-lookup.cpp index 89d3380e4..b32236019 100644 --- a/source/slang/slang-lookup.cpp +++ b/source/slang/slang-lookup.cpp @@ -372,7 +372,7 @@ static void _lookUpMembersInSuperTypeDeclImpl( BreadcrumbInfo* inBreadcrumbs) { auto semantics = request.semantics; - if (!as<InterfaceDecl>(declRef.getDecl()) && name->text == "This") + if (!as<InterfaceDecl>(declRef.getDecl()) && getText(name) == "This") { // If we are looking for `This` in anything other than an InterfaceDecl, // we just need to return the declRef itself. @@ -471,7 +471,7 @@ static void _lookUpMembersInSuperTypeDeclImpl( parentDeclRef = _maybeSpecializeSuperTypeDeclRef( astBuilder, containerDeclRef, facet->getType(), facet->subtypeWitness) .as<ContainerDecl>(); - if (as<ThisTypeDecl>(parentDeclRef.getDecl()) && name->text == "This") + if (as<ThisTypeDecl>(parentDeclRef.getDecl()) && getText(name) == "This") { // If we are going looking for `This` in a `ThisType`, we just need to return the declRef itself. AddToLookupResult(ioResult, CreateLookupResultItem(parentDeclRef, inBreadcrumbs)); |
