return spv::StorageClassInput;
else if (type.getQualifier().isPipeOutput())
return spv::StorageClassOutput;
- else if (type.getBasicType() == glslang::EbtSampler)
- return spv::StorageClassUniformConstant;
else if (type.getBasicType() == glslang::EbtAtomicUint)
return spv::StorageClassAtomicCounter;
+ else if (type.containsOpaque())
+ return spv::StorageClassUniformConstant;
else if (type.getQualifier().isUniformOrBuffer()) {
if (type.getQualifier().layoutPushConstant)
return spv::StorageClassPushConstant;
return spv::StorageClassUniform;
else
return spv::StorageClassUniformConstant;
- // TODO: how are we distinguishing between default and non-default non-writable uniforms? Do default uniforms even exist?
} else {
switch (type.getQualifier().storage) {
case glslang::EvqShared: return spv::StorageClassWorkgroup; break;
for (int p = 0; p < (int)parameters.size(); ++p) {
const glslang::TType& paramType = parameters[p]->getAsTyped()->getType();
spv::Id typeId = convertGlslangToSpvType(paramType);
- if (paramType.isOpaque())
+ if (paramType.containsOpaque())
typeId = builder.makePointer(TranslateStorageClass(paramType), typeId);
else if (paramType.getQualifier().storage != glslang::EvqConstReadOnly)
typeId = builder.makePointer(spv::StorageClassFunction, typeId);
glslangArgs[a]->traverse(this);
argTypes.push_back(¶mType);
// keep outputs and opaque objects as l-values, evaluate input-only as r-values
- if (qualifiers[a] != glslang::EvqConstReadOnly || paramType.isOpaque()) {
+ if (qualifiers[a] != glslang::EvqConstReadOnly || paramType.containsOpaque()) {
// save l-value
lValues.push_back(builder.getAccessChain());
} else {
for (int a = 0; a < (int)glslangArgs.size(); ++a) {
const glslang::TType& paramType = glslangArgs[a]->getAsTyped()->getType();
spv::Id arg;
- if (paramType.isOpaque()) {
+ if (paramType.containsOpaque()) {
builder.setAccessChain(lValues[lValueCount]);
arg = builder.accessChainGetLValue();
++lValueCount;
--- /dev/null
+spv.functionNestedOpaque.vert
+Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 39
+
+ Capability Shader
+ 1: ExtInstImport "GLSL.std.450"
+ MemoryModel Logical GLSL450
+ EntryPoint Vertex 4 "main"
+ Source GLSL 450
+ Name 4 "main"
+ Name 12 "foo(s21;"
+ Name 11 "t"
+ Name 14 "S"
+ MemberName 14(S) 0 "s"
+ Name 18 "barc(struct-S-s211;"
+ Name 17 "p"
+ Name 21 "bar(struct-S-s211;"
+ Name 20 "p"
+ Name 36 "si"
+ 2: TypeVoid
+ 3: TypeFunction 2
+ 6: TypeFloat 32
+ 7: TypeImage 6(float) 2D sampled format:Unknown
+ 8: TypeSampledImage 7
+ 9: TypePointer UniformConstant 8
+ 10: TypeFunction 2 9(ptr)
+ 14(S): TypeStruct 8
+ 15: TypePointer UniformConstant 14(S)
+ 16: TypeFunction 2 15(ptr)
+ 24: TypeVector 6(float) 2
+ 25: 6(float) Constant 1056964608
+ 26: 24(fvec2) ConstantComposite 25 25
+ 27: TypeVector 6(float) 4
+ 28: 6(float) Constant 0
+ 30: TypeInt 32 1
+ 31: 30(int) Constant 0
+ 36(si): 15(ptr) Variable UniformConstant
+ 4(main): 2 Function None 3
+ 5: Label
+ 37: 2 FunctionCall 18(barc(struct-S-s211;) 36(si)
+ 38: 2 FunctionCall 21(bar(struct-S-s211;) 36(si)
+ Return
+ FunctionEnd
+ 12(foo(s21;): 2 Function None 10
+ 11(t): 9(ptr) FunctionParameter
+ 13: Label
+ 23: 8 Load 11(t)
+ 29: 27(fvec4) ImageSampleExplicitLod 23 26 Lod 28
+ Return
+ FunctionEnd
+18(barc(struct-S-s211;): 2 Function None 16
+ 17(p): 15(ptr) FunctionParameter
+ 19: Label
+ 32: 9(ptr) AccessChain 17(p) 31
+ 33: 2 FunctionCall 12(foo(s21;) 32
+ Return
+ FunctionEnd
+21(bar(struct-S-s211;): 2 Function None 16
+ 20(p): 15(ptr) FunctionParameter
+ 22: Label
+ 34: 9(ptr) AccessChain 20(p) 31
+ 35: 2 FunctionCall 12(foo(s21;) 34
+ Return
+ FunctionEnd
--- /dev/null
+#version 450\r
+\r
+uniform struct S {\r
+ sampler2D s;\r
+} si;\r
+\r
+void foo(sampler2D t)\r
+{\r
+ texture(t, vec2(0.5));\r
+}\r
+\r
+void barc(const S p)\r
+{\r
+ foo(p.s);\r
+}\r
+\r
+void bar(S p)\r
+{\r
+ foo(p.s);\r
+}\r
+\r
+void main()\r
+{\r
+ barc(si);\r
+ bar(si);\r
+}\r
// For the version, it uses the latest git tag followed by the number of commits.
// For the date, it uses the current date (when then script is run).
-#define GLSLANG_REVISION "Overload400-PrecQual.1843"
-#define GLSLANG_DATE "18-Feb-2017"
+#define GLSLANG_REVISION "Overload400-PrecQual.1845"
+#define GLSLANG_DATE "24-Feb-2017"
"spv.forLoop.frag",
"spv.forwardFun.frag",
"spv.functionCall.frag",
+ "spv.functionNestedOpaque.vert",
"spv.functionSemantics.frag",
"spv.interpOps.frag",
"spv.int64.frag",