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/slang/lower.cpp | |
| 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/slang/lower.cpp')
| -rw-r--r-- | source/slang/lower.cpp | 33 |
1 files changed, 32 insertions, 1 deletions
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; |
