summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-parser.cpp')
-rw-r--r--source/slang/slang-parser.cpp47
1 files changed, 46 insertions, 1 deletions
diff --git a/source/slang/slang-parser.cpp b/source/slang/slang-parser.cpp
index cc87a3daa..e1dce5731 100644
--- a/source/slang/slang-parser.cpp
+++ b/source/slang/slang-parser.cpp
@@ -7102,6 +7102,30 @@ namespace Slang
{
return SPIRVAsmOperand{ SPIRVAsmOperand::NonSemanticDebugPrintfExtSet, parser->ReadToken() };
}
+ else if (AdvanceIf(parser, "__rayPayloadFromLocation"))
+ {
+ // reference a magic number to a layout(location) for late compiler resolution of rayPayload objects
+ parser->ReadToken(TokenType::LParent);
+ auto operand = SPIRVAsmOperand{ SPIRVAsmOperand::RayPayloadFromLocation, Token{}, parseAtomicExpr(parser) };
+ parser->ReadToken(TokenType::RParent);
+ return operand;
+ }
+ else if (AdvanceIf(parser, "__rayAttributeFromLocation"))
+ {
+ // works similar to __rayPayloadFromLocation
+ parser->ReadToken(TokenType::LParent);
+ auto operand = SPIRVAsmOperand{ SPIRVAsmOperand::RayAttributeFromLocation, Token{}, parseAtomicExpr(parser) };
+ parser->ReadToken(TokenType::RParent);
+ return operand;
+ }
+ else if (AdvanceIf(parser, "__rayCallableFromLocation"))
+ {
+ // works similar to __rayPayloadFromLocation
+ parser->ReadToken(TokenType::LParent);
+ auto operand = SPIRVAsmOperand{ SPIRVAsmOperand::RayCallableFromLocation, Token{}, parseAtomicExpr(parser) };
+ parser->ReadToken(TokenType::RParent);
+ return operand;
+ }
// A regular identifier
else if(parser->LookAheadToken(TokenType::Identifier))
{
@@ -7846,6 +7870,7 @@ namespace Slang
#define CASE(key, type) if (nameText == #key) { modifier = parser->astBuilder->create<type>(); } else
CASE(push_constant, PushConstantAttribute)
CASE(shaderRecordNV, ShaderRecordAttribute)
+ CASE(shaderRecordEXT, ShaderRecordAttribute)
CASE(constant_id, GLSLConstantIDLayoutModifier)
CASE(std140, GLSLStd140Modifier)
CASE(std430, GLSLStd430Modifier)
@@ -7893,6 +7918,20 @@ namespace Slang
parser->ReadToken(TokenType::Comma);
}
+#define CASE(key, type) if (AdvanceIf(parser, #key)) { auto modifier = parser->astBuilder->create<type>(); \
+ modifier->location = int(getIntegerLiteralValue(listBuilder.find<GLSLLayoutModifier>()->valToken)); listBuilder.add(modifier); } else
+
+ CASE(rayPayloadEXT, VulkanRayPayloadAttribute)
+ CASE(rayPayloadNV, VulkanRayPayloadAttribute)
+ CASE(rayPayloadInEXT, VulkanRayPayloadInAttribute)
+ CASE(rayPayloadInNV, VulkanRayPayloadInAttribute)
+ CASE(hitObjectAttributeNV, VulkanHitObjectAttributesAttribute)
+ CASE(callableDataEXT, VulkanCallablePayloadAttribute)
+ CASE(callableDataInEXT, VulkanCallablePayloadInAttribute)
+ {}
+
+#undef CASE
+
if (numThreadsAttrib)
{
listBuilder.add(numThreadsAttrib);
@@ -7903,6 +7942,12 @@ namespace Slang
return listBuilder.getFirst();
}
+ static NodeBase* parseHitAttributeEXTModifier(Parser* parser, void* /*userData*/)
+ {
+ VulkanHitAttributesAttribute* modifier = parser->astBuilder->create<VulkanHitAttributesAttribute>();
+ return modifier;
+ }
+
static NodeBase* parseBuiltinTypeModifier(Parser* parser, void* /*userData*/)
{
BuiltinTypeModifier* modifier = parser->astBuilder->create<BuiltinTypeModifier>();
@@ -8131,7 +8176,7 @@ namespace Slang
// or expect more tokens after the initial keyword.
_makeParseModifier("layout", parseLayoutModifier),
-
+ _makeParseModifier("hitAttributeEXT", parseHitAttributeEXTModifier),
_makeParseModifier("__intrinsic_op", parseIntrinsicOpModifier),
_makeParseModifier("__target_intrinsic", parseTargetIntrinsicModifier),
_makeParseModifier("__specialized_for_target", parseSpecializedForTargetModifier),