diff options
| author | Tim Foley <tfoley@nvidia.com> | 2017-07-12 14:21:52 -0700 |
|---|---|---|
| committer | Tim Foley <tfoley@nvidia.com> | 2017-07-12 14:21:52 -0700 |
| commit | 02f77bbf12981abe376b2d5987684224a50ae4b2 (patch) | |
| tree | 156c36903426a4f18f0e4c857d9d9eb987459789 /source/slang/emit.cpp | |
| parent | d43ee03c6101ce76331135cebdc57711cb3a2020 (diff) | |
Add ability for intrinsics to require GLSL extensions
When cross-compiling, we need to detect when an intrinsic is used that required non-default GLSL capabilities and emit an appropriate `#extension ... : require` line.
I'm handling this by attaching a custom modifier to declarations that require an extension in order to be callable.
Diffstat (limited to 'source/slang/emit.cpp')
| -rw-r--r-- | source/slang/emit.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/source/slang/emit.cpp b/source/slang/emit.cpp index f5b4a8b56..6905a8a76 100644 --- a/source/slang/emit.cpp +++ b/source/slang/emit.cpp @@ -52,6 +52,10 @@ struct SharedEmitContext ProgramSyntaxNode* program; bool needHackSamplerForTexelFetch = false; + + // Record the GLSL extnsions we have already emitted a `#extension` for + HashSet<String> glslExtensionsRequired; + StringBuilder glslExtensionRequireLines; }; struct EmitContext @@ -1594,6 +1598,19 @@ struct EmitVisitor } } + void requireGLSLExtension(String const& name) + { + if (context->shared->glslExtensionsRequired.Contains(name)) + return; + + StringBuilder& sb = context->shared->glslExtensionRequireLines; + + sb.append("#extension "); + sb.append(name); + sb.append(" : require\n"); + + context->shared->glslExtensionsRequired.Add(name); + } void visitInvokeExpressionSyntaxNode( RefPtr<InvokeExpressionSyntaxNode> callExpr, @@ -1708,6 +1725,17 @@ struct EmitVisitor } else if(auto targetIntrinsicModifier = findTargetIntrinsicModifier(funcDecl)) { + if (context->shared->target == CodeGenTarget::GLSL) + { + // Does this intrinsic requie a particular GLSL extension that wouldn't be available by default? + if (auto requiredGLSLExtensionModifier = funcDecl->FindModifier<RequiredGLSLExtensionModifier>()) + { + // If so, we had better request the extension. + requireGLSLExtension(requiredGLSLExtensionModifier->extensionNameToken.Content); + } + } + + if(targetIntrinsicModifier->definitionToken.Type != TokenType::Unknown) { auto name = getStringOrIdentifierTokenValue(targetIntrinsicModifier->definitionToken); @@ -3550,6 +3578,8 @@ String emitEntryPoint( StringBuilder finalResultBuilder; finalResultBuilder << prefix; + finalResultBuilder << sharedContext.glslExtensionRequireLines.ProduceString(); + if (sharedContext.needHackSamplerForTexelFetch) { finalResultBuilder << "layout(set = 0, binding = 0) uniform sampler SLANG_hack_samplerForTexelFetch;\n"; |
