diff options
| author | Tim Foley <tfoley@nvidia.com> | 2017-07-17 10:51:18 -0700 |
|---|---|---|
| committer | Tim Foley <tfoley@nvidia.com> | 2017-07-17 10:54:05 -0700 |
| commit | dc0e9d7bca21d8a67ec9f044c0d390bda6ebfcbf (patch) | |
| tree | 2db423b4b6e8420e614cb49fe7534f2b7591078d /source | |
| parent | 0b4992fb69e359a7e566cca42331a196904556f5 (diff) | |
Pick correct GLSL version when `gl_Layer` used
`gl_Layer` as a fragment input requires at least version 4.30 of GLSL, so we try to track that information when we see the name used.
Note that this does *not* override a user-specified `#version` line.
This required re-ordering when lowering happens relative to emitting the `#version` directive, since this code works by actually modifying the chosen profile for the entry point.
Yes, that is kind of gross and we should do something cleaner in the long term.
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/emit.cpp | 10 | ||||
| -rw-r--r-- | source/slang/lower.cpp | 33 | ||||
| -rw-r--r-- | source/slang/profile.h | 5 |
3 files changed, 44 insertions, 4 deletions
diff --git a/source/slang/emit.cpp b/source/slang/emit.cpp index 8c6a46196..0eb371b88 100644 --- a/source/slang/emit.cpp +++ b/source/slang/emit.cpp @@ -3604,6 +3604,13 @@ String emitEntryPoint( auto translationUnitSyntax = translationUnit->SyntaxNode.Ptr(); + // We perform lowering of the program before emitting *anything*, + // because the lowering process might change how we emit some + // boilerplate at the start of the ouput for GLSL (e.g., what + // version we require). + auto lowered = lowerEntryPoint(entryPoint, programLayout, target); + sharedContext.program = lowered.program; + // There may be global-scope modifiers that we should emit now visitor.emitGLSLPreprocessorDirectives(translationUnitSyntax); @@ -3624,9 +3631,6 @@ String emitEntryPoint( break; } - auto lowered = lowerEntryPoint(entryPoint, programLayout, target); - - sharedContext.program = lowered.program; visitor.EmitDeclsInContainer(lowered.program.Ptr()); diff --git a/source/slang/lower.cpp b/source/slang/lower.cpp index 856da9b6c..98f6d8273 100644 --- a/source/slang/lower.cpp +++ b/source/slang/lower.cpp @@ -221,7 +221,8 @@ public: struct SharedLoweringContext { - CompileRequest* compileRequest; + CompileRequest* compileRequest; + EntryPointRequest* entryPointRequest; ProgramLayout* programLayout; EntryPointLayout* entryPointLayout; @@ -2329,6 +2330,31 @@ struct LoweringVisitor return false; } + void requireGLSLVersion(ProfileVersion version) + { + if (shared->target != CodeGenTarget::GLSL) + return; + + auto entryPoint = shared->entryPointRequest; + auto profile = entryPoint->profile; + auto currentVersion = profile.GetVersion(); + if (profile.getFamily() == ProfileFamily::GLSL) + { + // Check if this profile is newer + if ((UInt)version > (UInt)profile.GetVersion()) + { + profile.setVersion(version); + entryPoint->profile = profile; + } + } + else + { + // Non-GLSL target? Set it to a GLSL one. + profile.setVersion(version); + entryPoint->profile = profile; + } + } + void lowerSimpleShaderParameterToGLSLGlobal( VaryingParameterInfo const& info, RefPtr<ExpressionType> varType, @@ -2460,6 +2486,10 @@ struct LoweringVisitor } else if (ns == "sv_rendertargetarrayindex") { + if (info.direction == VaryingParameterDirection::Input) + { + requireGLSLVersion(ProfileVersion::GLSL_430); + } globalVarExpr = createGLSLBuiltinRef("gl_Layer"); } else if (ns == "sv_sampleindex") @@ -3040,6 +3070,7 @@ LoweredEntryPoint lowerEntryPoint( { SharedLoweringContext sharedContext; sharedContext.compileRequest = entryPoint->compileRequest; + sharedContext.entryPointRequest = entryPoint; sharedContext.programLayout = programLayout; sharedContext.target = target; diff --git a/source/slang/profile.h b/source/slang/profile.h index 6d55d3195..3b5242ada 100644 --- a/source/slang/profile.h +++ b/source/slang/profile.h @@ -70,6 +70,11 @@ namespace Slang ProfileVersion GetVersion() const { return ProfileVersion(uint32_t(raw) & 0xFFFF); } ProfileFamily getFamily() const { return getProfileFamily(GetVersion()); } + void setVersion(ProfileVersion version) + { + raw = (raw & ~0xFFFF) | uint32_t(version); + } + static Profile LookUp(char const* name); RawVal raw = Unknown; |
