diff options
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/emit.cpp | 32 | ||||
| -rw-r--r-- | source/slang/modifier-defs.h | 11 |
2 files changed, 39 insertions, 4 deletions
diff --git a/source/slang/emit.cpp b/source/slang/emit.cpp index 3a5acd024..f5b4a8b56 100644 --- a/source/slang/emit.cpp +++ b/source/slang/emit.cpp @@ -2556,6 +2556,35 @@ struct EmitVisitor Emit(";\n"); } + bool shouldSkipModifierForDecl( + Modifier* modifier, + Decl* decl) + { + switch(context->shared->target) + { + default: + break; + + case CodeGenTarget::GLSL: + { + // Don't emit interpolation mode modifiers on `struct` fields + // (only allowed on global or block `in`/`out`) + if (auto interpolationMod = dynamic_cast<InterpolationModeModifier*>(modifier)) + { + if (auto fieldDecl = dynamic_cast<StructField*>(decl)) + { + return true; + } + } + + } + break; + } + + + return false; + } + // Emit any modifiers that should go in front of a declaration void EmitModifiers(RefPtr<Decl> decl) { @@ -2587,6 +2616,9 @@ struct EmitVisitor for (auto mod = decl->modifiers.first; mod; mod = mod->next) { + if (shouldSkipModifierForDecl(mod, decl)) + continue; + advanceToSourceLocation(mod->Position); if (0) {} diff --git a/source/slang/modifier-defs.h b/source/slang/modifier-defs.h index c401b3353..2b5c77d86 100644 --- a/source/slang/modifier-defs.h +++ b/source/slang/modifier-defs.h @@ -208,17 +208,20 @@ SIMPLE_SYNTAX_CLASS(GLSLColumnMajorLayoutModifier, RowMajorLayoutModifier) // More HLSL Keyword +ABSTRACT_SYNTAX_CLASS(InterpolationModeModifier, Modifier) +END_SYNTAX_CLASS() + // HLSL `nointerpolation` modifier -SIMPLE_SYNTAX_CLASS(HLSLNoInterpolationModifier, Modifier) +SIMPLE_SYNTAX_CLASS(HLSLNoInterpolationModifier, InterpolationModeModifier) // HLSL `linear` modifier -SIMPLE_SYNTAX_CLASS(HLSLLinearModifier, Modifier) +SIMPLE_SYNTAX_CLASS(HLSLLinearModifier, InterpolationModeModifier) // HLSL `sample` modifier -SIMPLE_SYNTAX_CLASS(HLSLSampleModifier, Modifier) +SIMPLE_SYNTAX_CLASS(HLSLSampleModifier, InterpolationModeModifier) // HLSL `centroid` modifier -SIMPLE_SYNTAX_CLASS(HLSLCentroidModifier, Modifier) +SIMPLE_SYNTAX_CLASS(HLSLCentroidModifier, InterpolationModeModifier) // HLSL `precise` modifier SIMPLE_SYNTAX_CLASS(HLSLPreciseModifier, Modifier) |
