summaryrefslogtreecommitdiff
path: root/source/slang/slang-emit-glsl.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-09-28 18:08:06 -0700
committerGitHub <noreply@github.com>2023-09-28 18:08:06 -0700
commitaf61737e7ba107e9e92164bf39ce6ab34e05ce82 (patch)
tree37747b26fb951548256669124adb83c0246a8f32 /source/slang/slang-emit-glsl.cpp
parentb7d318f48db2cb83a41d665f1727ae93fc555124 (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.cpp38
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"));