summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Foley <tfoleyNV@users.noreply.github.com>2017-07-22 14:07:19 -0700
committerGitHub <noreply@github.com>2017-07-22 14:07:19 -0700
commit376e61abe84ed386df7aa28867c1aeb5f52881ca (patch)
treeebf5575829ef9bedc9d43821cd556fe596bf2724
parent30fbf640cd4cd6936e177fdfadb76e8814cffffc (diff)
parentedf8cafe6d3799f58a92ccc83ba70dd41c461f6a (diff)
Merge pull request #136 from tfoleyNV/explicit-sampler-fix
Make the "hack" sampler explicit for now
-rw-r--r--source/slang/emit.cpp5
-rw-r--r--source/slang/parameter-binding.cpp58
-rw-r--r--source/slang/type-layout.h5
-rw-r--r--tests/reflection/cross-compile.slang.expected7
4 files changed, 74 insertions, 1 deletions
diff --git a/source/slang/emit.cpp b/source/slang/emit.cpp
index 61e473c7d..5a59674f5 100644
--- a/source/slang/emit.cpp
+++ b/source/slang/emit.cpp
@@ -3848,7 +3848,10 @@ String emitEntryPoint(
if (sharedContext.needHackSamplerForTexelFetch)
{
- finalResultBuilder << "layout(set = 0, binding = 0) uniform sampler SLANG_hack_samplerForTexelFetch;\n";
+ finalResultBuilder
+ << "layout(set = 0, binding = "
+ << programLayout->bindingForHackSampler
+ << ") uniform sampler SLANG_hack_samplerForTexelFetch;\n";
}
finalResultBuilder << code;
diff --git a/source/slang/parameter-binding.cpp b/source/slang/parameter-binding.cpp
index 2f2bbec05..6128261c7 100644
--- a/source/slang/parameter-binding.cpp
+++ b/source/slang/parameter-binding.cpp
@@ -1501,6 +1501,31 @@ static void collectParameters(
}
}
+static bool isGLSLCrossCompilerNeeded(CompileRequest* request)
+{
+ switch (request->Target)
+ {
+ default:
+ return false;
+
+ case CodeGenTarget::GLSL:
+ case CodeGenTarget::SPIRV:
+ case CodeGenTarget::SPIRVAssembly:
+ break;
+ }
+
+ if (request->loadedModulesList.Count() != 0)
+ return true;
+
+ for (auto tu : request->translationUnits)
+ {
+ if (tu->sourceLanguage != SourceLanguage::GLSL)
+ return true;
+ }
+
+ return false;
+}
+
void generateParameterBindings(
CompileRequest* request)
{
@@ -1649,6 +1674,39 @@ void generateParameterBindings(
globalScopeLayout = globalConstantBufferLayout;
}
+ // Final final step: pick a binding for the "hack sampler", if needed...
+ //
+ // 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))
+ {
+ UInt space = 0;
+ auto hackSamplerUsedRanges = findUsedRangeSetForSpace(&context, space);
+
+ UInt binding = hackSamplerUsedRanges->usedResourceRanges[(int)LayoutResourceKind::DescriptorTableSlot].Allocate(nullptr, 1);
+
+ programLayout->bindingForHackSampler = (int)binding;
+
+ RefPtr<Variable> var = new Variable();
+ var->Name.Content = "SLANG_hack_samplerForTexelFetch";
+ var->Type.type = new SamplerStateType();
+
+ auto typeLayout = new TypeLayout();
+ typeLayout->type = var->Type.type;
+ typeLayout->addResourceUsage(LayoutResourceKind::DescriptorTableSlot, 1);
+
+ auto varLayout = new VarLayout();
+ varLayout->varDecl = makeDeclRef(var.Ptr());
+ varLayout->typeLayout = typeLayout;
+ auto resInfo = varLayout->AddResourceInfo(LayoutResourceKind::DescriptorTableSlot);
+ resInfo->index = binding;
+ resInfo->space = space;
+
+ programLayout->hackSamplerVar = var;
+
+ globalScopeStructLayout->fields.Add(varLayout);
+ }
+
// We now have a bunch of layout information, which we should
// record into a suitable object that represents the program
programLayout->globalScopeLayout = globalScopeLayout;
diff --git a/source/slang/type-layout.h b/source/slang/type-layout.h
index 81ca1350c..7be1c595f 100644
--- a/source/slang/type-layout.h
+++ b/source/slang/type-layout.h
@@ -383,6 +383,11 @@ public:
// and any entry-point-specific parameter data
// will (eventually) belong there...
List<RefPtr<EntryPointLayout>> entryPoints;
+
+ // HACK: binding to use when we have to create
+ // a dummy sampler just to appease glslang
+ int bindingForHackSampler = 0;
+ RefPtr<VarDeclBase> hackSamplerVar;
};
struct LayoutRulesFamilyImpl;
diff --git a/tests/reflection/cross-compile.slang.expected b/tests/reflection/cross-compile.slang.expected
index 3bb730f66..3a8bea41e 100644
--- a/tests/reflection/cross-compile.slang.expected
+++ b/tests/reflection/cross-compile.slang.expected
@@ -42,6 +42,13 @@ standard output = {
]
}
}
+ },
+ {
+ "name": "SLANG_hack_samplerForTexelFetch",
+ "binding": {"kind": "descriptorTableSlot", "index": 3},
+ "type": {
+ "kind": "samplerState"
+ }
}
]
}