diff options
| author | Tim Foley <tfoleyNV@users.noreply.github.com> | 2017-07-22 14:07:19 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-07-22 14:07:19 -0700 |
| commit | 376e61abe84ed386df7aa28867c1aeb5f52881ca (patch) | |
| tree | ebf5575829ef9bedc9d43821cd556fe596bf2724 /source | |
| parent | 30fbf640cd4cd6936e177fdfadb76e8814cffffc (diff) | |
| parent | edf8cafe6d3799f58a92ccc83ba70dd41c461f6a (diff) | |
Merge pull request #136 from tfoleyNV/explicit-sampler-fix
Make the "hack" sampler explicit for now
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/emit.cpp | 5 | ||||
| -rw-r--r-- | source/slang/parameter-binding.cpp | 58 | ||||
| -rw-r--r-- | source/slang/type-layout.h | 5 |
3 files changed, 67 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; |
