summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorTim Foley <tfoley@nvidia.com>2017-07-17 10:51:18 -0700
committerTim Foley <tfoley@nvidia.com>2017-07-17 10:54:05 -0700
commitdc0e9d7bca21d8a67ec9f044c0d390bda6ebfcbf (patch)
tree2db423b4b6e8420e614cb49fe7534f2b7591078d /source
parent0b4992fb69e359a7e566cca42331a196904556f5 (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.cpp10
-rw-r--r--source/slang/lower.cpp33
-rw-r--r--source/slang/profile.h5
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;