HLSL: Fix #1163: treat buffers as references when calling functions.
This continues to prevent writing output buffers (out from a function),
but fixes the problem where the copy-in/out was not getting done.
Making everything work will require knowing both in/out-ness and bufferness,
but these are currently mutually exclusive, because both are storage
qualifiers.
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index c23aa92..34465f5 100755
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -2966,8 +2966,14 @@
}
// Does parameter need a place to keep writes, separate from the original?
+// Assumes called after originalParam(), which filters out block/buffer/opaque-based
+// qualifiers such that we should have only in/out/inout/constreadonly here.
bool TGlslangToSpvTraverser::writableParam(glslang::TStorageQualifier qualifier)
{
+ assert(qualifier == glslang::EvqIn ||
+ qualifier == glslang::EvqOut ||
+ qualifier == glslang::EvqInOut ||
+ qualifier == glslang::EvqConstReadOnly);
return qualifier != glslang::EvqConstReadOnly;
}
@@ -2978,7 +2984,7 @@
if (implicitThisParam) // implicit this
return true;
if (glslangIntermediate->getSource() == glslang::EShSourceHlsl)
- return false;
+ return paramType.getBasicType() == glslang::EbtBlock;
return paramType.containsOpaque() || // sampler, etc.
(paramType.getBasicType() == glslang::EbtBlock && qualifier == glslang::EvqBuffer); // SSBO
}
@@ -3609,8 +3615,8 @@
glslangArgs[a]->traverse(this);
argTypes.push_back(¶mType);
// keep outputs and pass-by-originals as l-values, evaluate others as r-values
- if (writableParam(qualifiers[a]) ||
- originalParam(qualifiers[a], paramType, function->hasImplicitThis() && a == 0)) {
+ if (originalParam(qualifiers[a], paramType, function->hasImplicitThis() && a == 0) ||
+ writableParam(qualifiers[a])) {
// save l-value
lValues.push_back(builder.getAccessChain());
} else {