summaryrefslogtreecommitdiffstats
path: root/source/slang/parameter-binding.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/parameter-binding.cpp')
-rw-r--r--source/slang/parameter-binding.cpp69
1 files changed, 34 insertions, 35 deletions
diff --git a/source/slang/parameter-binding.cpp b/source/slang/parameter-binding.cpp
index 8cc93fdd2..4fbec5652 100644
--- a/source/slang/parameter-binding.cpp
+++ b/source/slang/parameter-binding.cpp
@@ -1298,30 +1298,14 @@ static RefPtr<TypeLayout> processEntryPointParameter(
static void collectEntryPointParameters(
ParameterBindingContext* context,
- EntryPointRequest* entryPoint,
- ModuleDecl* translationUnitSyntax)
+ EntryPointRequest* entryPoint)
{
- // First, look for the entry point with the specified name
-
- // Make sure we've got a query-able member dictionary
- buildMemberDictionary(translationUnitSyntax);
-
- Decl* entryPointDecl;
- if( !translationUnitSyntax->memberDictionary.TryGetValue(entryPoint->name, entryPointDecl) )
- {
- // No such entry point!
- return;
- }
- if( entryPointDecl->nextInContainerWithSameName )
- {
- // Not the only decl of that name!
- return;
- }
-
- FuncDecl* entryPointFuncDecl = dynamic_cast<FuncDecl*>(entryPointDecl);
- if( !entryPointFuncDecl )
+ FuncDecl* entryPointFuncDecl = entryPoint->decl;
+ if (!entryPointFuncDecl)
{
- // Not a function!
+ // Something must have failed earlier, so that
+ // we didn't find a declaration to match this
+ // entry point request.
return;
}
@@ -1504,7 +1488,7 @@ static void collectParameters(
for( auto& entryPoint : translationUnit->entryPoints )
{
context->stage = entryPoint->profile.GetStage();
- collectEntryPointParameters(context, entryPoint.Ptr(), translationUnit->SyntaxNode.Ptr());
+ collectEntryPointParameters(context, entryPoint.Ptr());
}
}
@@ -1515,9 +1499,14 @@ static void collectParameters(
}
}
-static bool isGLSLCrossCompilerNeeded(CompileRequest* request)
+static bool isGLSLCrossCompilerNeeded(
+ TargetRequest* targetReq)
{
- switch (request->Target)
+ auto compileReq = targetReq->compileRequest;
+
+ // We only need cross-compilation if we
+ // are targetting something GLSL-based.
+ switch (targetReq->target)
{
default:
return false;
@@ -1528,23 +1517,33 @@ static bool isGLSLCrossCompilerNeeded(CompileRequest* request)
break;
}
- if (request->loadedModulesList.Count() != 0)
+ // If we `import`ed any Slang code, then the
+ // cross compiler is definitely needed, to
+ // translate that Slang over to GLSL.
+ if (compileReq->loadedModulesList.Count() != 0)
return true;
- for (auto tu : request->translationUnits)
+ // If there are any non-GLSL translation units,
+ // then we need to cross compile those...
+ for (auto tu : compileReq->translationUnits)
{
if (tu->sourceLanguage != SourceLanguage::GLSL)
return true;
}
+ // If we get to this point, then we have plain vanilla
+ // GLSL input, with no `import` declarations, so we
+ // are able to output GLSL without cross compilation.
return false;
}
void generateParameterBindings(
- CompileRequest* request)
+ TargetRequest* targetReq)
{
+ CompileRequest* compileReq = targetReq->compileRequest;
+
// Try to find rules based on the selected code-generation target
- auto rules = GetLayoutRulesFamilyImpl(request->Target);
+ auto rules = GetLayoutRulesFamilyImpl(targetReq->target);
// If there was no target, or there are no rules for the target,
// then bail out here.
@@ -1556,7 +1555,7 @@ void generateParameterBindings(
// Create a context to hold shared state during the process
// of generating parameter bindings
SharedParameterBindingContext sharedContext;
- sharedContext.compileRequest = request;
+ sharedContext.compileRequest = compileReq;
sharedContext.defaultLayoutRules = rules;
sharedContext.programLayout = programLayout;
@@ -1568,7 +1567,7 @@ void generateParameterBindings(
context.layoutRules = sharedContext.defaultLayoutRules;
// Walk through AST to discover all the parameters
- collectParameters(&context, request);
+ collectParameters(&context, compileReq);
// Now walk through the parameters to generate initial binding information
for( auto& parameter : sharedContext.parameters )
@@ -1692,7 +1691,7 @@ void generateParameterBindings(
//
// We only want to do this if the GLSL cross-compilation support is
// being invoked, so that we don't gum up other shaders.
- if(isGLSLCrossCompilerNeeded(request))
+ if(isGLSLCrossCompilerNeeded(targetReq))
{
UInt space = 0;
auto hackSamplerUsedRanges = findUsedRangeSetForSpace(&context, space);
@@ -1702,8 +1701,8 @@ void generateParameterBindings(
programLayout->bindingForHackSampler = (int)binding;
RefPtr<Variable> var = new Variable();
- var->nameAndLoc.name = request->getNamePool()->getName("SLANG_hack_samplerForTexelFetch");
- var->type.type = getSamplerStateType(request->mSession);
+ var->nameAndLoc.name = compileReq->getNamePool()->getName("SLANG_hack_samplerForTexelFetch");
+ var->type.type = getSamplerStateType(compileReq->mSession);
auto typeLayout = new TypeLayout();
typeLayout->type = var->type.type;
@@ -1724,7 +1723,7 @@ void generateParameterBindings(
// We now have a bunch of layout information, which we should
// record into a suitable object that represents the program
programLayout->globalScopeLayout = globalScopeLayout;
- request->layout = programLayout;
+ targetReq->layout = programLayout;
}
}