From af61737e7ba107e9e92164bf39ce6ab34e05ce82 Mon Sep 17 00:00:00 2001 From: Yong He Date: Thu, 28 Sep 2023 18:08:06 -0700 Subject: [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 --- source/slang/slang-emit-glsl.cpp | 38 ++++++++++++++++---------------------- 1 file changed, 16 insertions(+), 22 deletions(-) (limited to 'source/slang/slang-emit-glsl.cpp') 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(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")); -- cgit v1.2.3