diff options
| author | Yong He <yonghe@outlook.com> | 2023-09-28 18:08:06 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-09-28 18:08:06 -0700 |
| commit | af61737e7ba107e9e92164bf39ce6ab34e05ce82 (patch) | |
| tree | 37747b26fb951548256669124adb83c0246a8f32 /source/slang/slang-emit-glsl.cpp | |
| parent | b7d318f48db2cb83a41d665f1727ae93fc555124 (diff) | |
[Direct SPIRV]: ray tracing pipeline intrinsics. (#3244)
* Use a dedicated inst opcode to retrieve ray payload locations.
* [Direct SPIRV]: ray tracing pipeline intrinsics.
* Fix.
---------
Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang/slang-emit-glsl.cpp')
| -rw-r--r-- | source/slang/slang-emit-glsl.cpp | 38 |
1 files changed, 16 insertions, 22 deletions
diff --git a/source/slang/slang-emit-glsl.cpp b/source/slang/slang-emit-glsl.cpp index ebcad1873..e9472bc96 100644 --- a/source/slang/slang-emit-glsl.cpp +++ b/source/slang/slang-emit-glsl.cpp @@ -2594,9 +2594,6 @@ void GLSLSourceEmitter::emitVarDecorationsImpl(IRInst* varDecl) for (auto decoration : varDecl->getDecorations()) { - typedef LocationTracker::Kind LocationKind; - - LocationKind locationKind = LocationKind::Invalid; UnownedStringSlice prefix; if (as<IRVulkanHitAttributesDecoration>(decoration)) { @@ -2604,37 +2601,34 @@ void GLSLSourceEmitter::emitVarDecorationsImpl(IRInst* varDecl) } else { - // Handle attributes that have location - const LocationKind decorationLocationKind = LocationTracker::getKindFromDecoration(decoration); - if (decorationLocationKind == LocationKind::Invalid) + IRIntegerValue locationValue = -1; + switch (decoration->getOp()) { - // Next decoration + case kIROp_VulkanCallablePayloadDecoration: + prefix = toSlice("callableData"); + locationValue = getIntVal(decoration->getOperand(0)); + break; + case kIROp_VulkanRayPayloadDecoration: + prefix = toSlice("rayPayload"); + locationValue = getIntVal(decoration->getOperand(0)); + break; + case kIROp_VulkanHitObjectAttributesDecoration: + prefix = toSlice("hitObjectAttribute"); + locationValue = getIntVal(decoration->getOperand(0)); + break; + default: continue; } - - locationKind = decorationLocationKind; - - // Get the location value - const auto locationValue = m_locationTracker.getValue(locationKind, varDecl, decoration); - m_writer->emit(toSlice("layout(location = ")); m_writer->emit(locationValue); m_writer->emit(toSlice(")\n")); - - switch (locationKind) - { - case LocationKind::CallablePayload: prefix = toSlice("callableData"); break; - case LocationKind::HitObjectAttribute: prefix = toSlice("hitObjectAttribute"); break; - case LocationKind::RayPayload: prefix = toSlice("rayPayload"); break; - default: break; - } } SLANG_ASSERT(prefix.getLength()); m_writer->emit(prefix); // Special case hitObjectAttribute as is only NV currently - if (locationKind == LocationKind::HitObjectAttribute || + if (decoration->getOp() == kIROp_VulkanHitObjectAttributesDecoration || getTargetCaps().implies(CapabilityAtom::GL_NV_ray_tracing)) { m_writer->emit(toSlice("NV")); |
