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.cpp78
1 files changed, 77 insertions, 1 deletions
diff --git a/source/slang/slang-parser.cpp b/source/slang/slang-parser.cpp
index f7a0376ce..5b8a1af4f 100644
--- a/source/slang/slang-parser.cpp
+++ b/source/slang/slang-parser.cpp
@@ -7843,6 +7843,70 @@ namespace Slang
parser->sink->diagnose(token, Diagnostics::invalidCUDASMVersion);
return nullptr;
}
+ static NodeBase* parseVolatileModifier(Parser* parser, void* /*userData*/)
+ {
+ ModifierListBuilder listBuilder;
+
+ auto hlslMod = parser->astBuilder->create<HLSLVolatileModifier>();
+ hlslMod->keywordName = getName(parser, "volatile");
+ hlslMod->loc = parser->tokenReader.peekLoc();
+ listBuilder.add(hlslMod);
+
+ auto glslMod = parser->astBuilder->create<GLSLVolatileModifier>();
+ glslMod->keywordName = getName(parser, "volatile");
+ glslMod->loc = parser->tokenReader.peekLoc();
+ listBuilder.add(glslMod);
+
+ return listBuilder.getFirst();
+ }
+
+ static NodeBase* parseCoherentModifier(Parser* parser, void* /*userData*/)
+ {
+ ModifierListBuilder listBuilder;
+
+ auto glslMod = parser->astBuilder->create<GloballyCoherentModifier>();
+ glslMod->keywordName = getName(parser, "coherent");
+ glslMod->loc = parser->tokenReader.peekLoc();
+ listBuilder.add(glslMod);
+
+ return listBuilder.getFirst();
+ }
+
+ static NodeBase* parseRestrictModifier(Parser* parser, void* /*userData*/)
+ {
+ ModifierListBuilder listBuilder;
+
+ auto glslMod = parser->astBuilder->create<GLSLRestrictModifier>();
+ glslMod->keywordName = getName(parser, "restrict");
+ glslMod->loc = parser->tokenReader.peekLoc();
+ listBuilder.add(glslMod);
+
+ return listBuilder.getFirst();
+ }
+
+ static NodeBase* parseReadonlyModifier(Parser* parser, void* /*userData*/)
+ {
+ ModifierListBuilder listBuilder;
+
+ auto glslMod = parser->astBuilder->create<GLSLReadOnlyModifier>();
+ glslMod->keywordName = getName(parser, "readonly");
+ glslMod->loc = parser->tokenReader.peekLoc();
+ listBuilder.add(glslMod);
+
+ return listBuilder.getFirst();
+ }
+
+ static NodeBase* parseWriteonlyModifier(Parser* parser, void* /*userData*/)
+ {
+ ModifierListBuilder listBuilder;
+
+ auto glslMod = parser->astBuilder->create<GLSLWriteOnlyModifier>();
+ glslMod->keywordName = getName(parser, "writeonly");
+ glslMod->loc = parser->tokenReader.peekLoc();
+ listBuilder.add(glslMod);
+
+ return listBuilder.getFirst();
+ }
static NodeBase* parseLayoutModifier(Parser* parser, void* /*userData*/)
{
@@ -7850,6 +7914,8 @@ namespace Slang
GLSLLayoutLocalSizeAttribute* numThreadsAttrib = nullptr;
+ ImageFormat format;
+
listBuilder.add(parser->astBuilder->create<GLSLLayoutModifierGroupBegin>());
parser->ReadToken(TokenType::LParent);
@@ -7923,6 +7989,12 @@ namespace Slang
}
}
}
+ else if(findImageFormatByName(nameText.getUnownedSlice(), &format))
+ {
+ auto attr = parser->astBuilder->create<FormatAttribute>();
+ attr->format = format;
+ listBuilder.add(attr);
+ }
else
{
Modifier* modifier = nullptr;
@@ -8208,7 +8280,11 @@ namespace Slang
_makeParseModifier("groupshared", HLSLGroupSharedModifier::kReflectClassInfo),
_makeParseModifier("static", HLSLStaticModifier::kReflectClassInfo),
_makeParseModifier("uniform", HLSLUniformModifier::kReflectClassInfo),
- _makeParseModifier("volatile", HLSLVolatileModifier::kReflectClassInfo),
+ _makeParseModifier("volatile", parseVolatileModifier),
+ _makeParseModifier("coherent", parseCoherentModifier),
+ _makeParseModifier("restrict", parseRestrictModifier),
+ _makeParseModifier("readonly", parseReadonlyModifier),
+ _makeParseModifier("writeonly", parseWriteonlyModifier),
_makeParseModifier("export", HLSLExportModifier::kReflectClassInfo),
_makeParseModifier("dynamic_uniform", DynamicUniformModifier::kReflectClassInfo),