void declareUseOfStructMember(const glslang::TTypeList& members, int glslangMember);
bool isShaderEntryPoint(const glslang::TIntermAggregate* node);
- bool writableParam(glslang::TStorageQualifier);
+ bool writableParam(glslang::TStorageQualifier) const;
bool originalParam(glslang::TStorageQualifier, const glslang::TType&, bool implicitThisParam);
void makeFunctions(const glslang::TIntermSequence&);
void makeGlobalInitializers(const glslang::TIntermSequence&);
// 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)
+bool TGlslangToSpvTraverser::writableParam(glslang::TStorageQualifier qualifier) const
{
assert(qualifier == glslang::EvqIn ||
qualifier == glslang::EvqOut ||
// 3. Make the call
// 4. Copy back the results
- // 1. Evaluate the arguments
+ // 1. Evaluate the arguments and their types
std::vector<spv::Builder::AccessChain> lValues;
std::vector<spv::Id> rValues;
std::vector<const glslang::TType*> argTypes;
for (int a = 0; a < (int)glslangArgs.size(); ++a) {
- const glslang::TType& paramType = glslangArgs[a]->getAsTyped()->getType();
+ argTypes.push_back(&glslangArgs[a]->getAsTyped()->getType());
// build l-value
builder.clearAccessChain();
glslangArgs[a]->traverse(this);
- argTypes.push_back(¶mType);
// keep outputs and pass-by-originals as l-values, evaluate others as r-values
- if (originalParam(qualifiers[a], paramType, function->hasImplicitThis() && a == 0) ||
+ if (originalParam(qualifiers[a], *argTypes[a], function->hasImplicitThis() && a == 0) ||
writableParam(qualifiers[a])) {
// save l-value
lValues.push_back(builder.getAccessChain());
int rValueCount = 0;
std::vector<spv::Id> spvArgs;
for (int a = 0; a < (int)glslangArgs.size(); ++a) {
- const glslang::TType& paramType = glslangArgs[a]->getAsTyped()->getType();
spv::Id arg;
- if (originalParam(qualifiers[a], paramType, function->hasImplicitThis() && a == 0)) {
+ if (originalParam(qualifiers[a], *argTypes[a], function->hasImplicitThis() && a == 0)) {
builder.setAccessChain(lValues[lValueCount]);
arg = builder.accessChainGetLValue();
++lValueCount;
} else if (writableParam(qualifiers[a])) {
// need space to hold the copy
- arg = builder.createVariable(spv::StorageClassFunction, convertGlslangToSpvType(paramType), "param");
+ arg = builder.createVariable(spv::StorageClassFunction, builder.getContainedTypeId(function->getParamType(a)), "param");
if (qualifiers[a] == glslang::EvqIn || qualifiers[a] == glslang::EvqInOut) {
// need to copy the input into output space
builder.setAccessChain(lValues[lValueCount]);
spv::Id copy = accessChainLoad(*argTypes[a]);
builder.clearAccessChain();
builder.setAccessChainLValue(arg);
- multiTypeStore(paramType, copy);
+ multiTypeStore(*argTypes[a], copy);
}
++lValueCount;
} else {
- arg = rValues[rValueCount];
+ // process r-value, which involves a copy for a type mismatch
+ if (function->getParamType(a) != convertGlslangToSpvType(*argTypes[a])) {
+ spv::Id argCopy = builder.createVariable(spv::StorageClassFunction, function->getParamType(a), "arg");
+ builder.clearAccessChain();
+ builder.setAccessChainLValue(argCopy);
+ multiTypeStore(*argTypes[a], rValues[rValueCount]);
+ arg = builder.createLoad(argCopy);
+ } else
+ arg = rValues[rValueCount];
++rValueCount;
}
spvArgs.push_back(arg);
// 4. Copy back out an "out" arguments.
lValueCount = 0;
for (int a = 0; a < (int)glslangArgs.size(); ++a) {
- const glslang::TType& paramType = glslangArgs[a]->getAsTyped()->getType();
- if (originalParam(qualifiers[a], paramType, function->hasImplicitThis() && a == 0))
+ if (originalParam(qualifiers[a], *argTypes[a], function->hasImplicitThis() && a == 0))
++lValueCount;
else if (writableParam(qualifiers[a])) {
if (qualifiers[a] == glslang::EvqOut || qualifiers[a] == glslang::EvqInOut) {
spv::Id copy = builder.createLoad(spvArgs[a]);
builder.setAccessChain(lValues[lValueCount]);
- multiTypeStore(paramType, copy);
+ multiTypeStore(*argTypes[a], copy);
}
++lValueCount;
}
delete blocks[i];
}
Id getId() const { return functionInstruction.getResultId(); }
- Id getParamId(int p) { return parameterInstructions[p]->getResultId(); }
+ Id getParamId(int p) const { return parameterInstructions[p]->getResultId(); }
+ Id getParamType(int p) const { return parameterInstructions[p]->getTypeId(); }
void addBlock(Block* block) { blocks.push_back(block); }
void removeBlock(Block* block)
spv.debugInfo.frag
// Module Version 10300
// Generated by (magic number): 80006
-// Id's are bound by 126
+// Id's are bound by 124
Capability Shader
2: ExtInstImport "GLSL.std.450"
Name 54 "ubuf"
MemberName 54(ubuf) 0 "s"
Name 56 ""
- Name 57 "S"
- MemberName 57(S) 0 "a"
- Name 59 "param"
- Name 69 "s2d"
- Name 99 "i"
+ Name 57 "param"
+ Name 67 "s2d"
+ Name 97 "i"
ModuleProcessed "no-storage-format"
ModuleProcessed "resource-set-binding 3"
ModuleProcessed "auto-map-locations"
MemberDecorate 54(ubuf) 0 Offset 0
Decorate 54(ubuf) Block
Decorate 56 DescriptorSet 3
- Decorate 69(s2d) Location 0
- Decorate 69(s2d) DescriptorSet 3
+ Decorate 67(s2d) Location 0
+ Decorate 67(s2d) DescriptorSet 3
3: TypeVoid
4: TypeFunction 3
7: TypeInt 32 1
54(ubuf): TypeStruct 53(S)
55: TypePointer Uniform 54(ubuf)
56: 55(ptr) Variable Uniform
- 57(S): TypeStruct 7(int)
- 58: TypePointer Function 57(S)
- 60: TypePointer Uniform 53(S)
- 66: TypeImage 10(float) 2D sampled format:Unknown
- 67: TypeSampledImage 66
- 68: TypePointer UniformConstant 67
- 69(s2d): 68(ptr) Variable UniformConstant
- 71: TypeVector 10(float) 2
- 72: 10(float) Constant 1056964608
- 73: 71(fvec2) ConstantComposite 72 72
- 77: TypePointer Uniform 7(int)
- 106: 7(int) Constant 10
- 111: 7(int) Constant 1
- 113: TypePointer Output 10(float)
- 116: 10(float) Constant 1092616192
+ 58: TypePointer Uniform 53(S)
+ 64: TypeImage 10(float) 2D sampled format:Unknown
+ 65: TypeSampledImage 64
+ 66: TypePointer UniformConstant 65
+ 67(s2d): 66(ptr) Variable UniformConstant
+ 69: TypeVector 10(float) 2
+ 70: 10(float) Constant 1056964608
+ 71: 69(fvec2) ConstantComposite 70 70
+ 75: TypePointer Uniform 7(int)
+ 104: 7(int) Constant 10
+ 109: 7(int) Constant 1
+ 111: TypePointer Output 10(float)
+ 114: 10(float) Constant 1092616192
5(main): 3 Function None 4
6: Label
- 59(param): 58(ptr) Variable Function
- 99(i): 19(ptr) Variable Function
- 118: 16(ptr) Variable Function
+ 57(param): 9(ptr) Variable Function
+ 97(i): 19(ptr) Variable Function
+ 116: 16(ptr) Variable Function
Line 1 30 0
- 61: 60(ptr) AccessChain 56 18
- 62: 53(S) Load 61
- 63: 7(int) CompositeExtract 62 0
- 64: 19(ptr) AccessChain 59(param) 18
- Store 64 63
- 65: 11(fvec4) FunctionCall 14(foo(struct-S-i11;) 59(param)
- Store 52(outv) 65
+ 59: 58(ptr) AccessChain 56 18
+ 60: 53(S) Load 59
+ 61: 7(int) CompositeExtract 60 0
+ 62: 19(ptr) AccessChain 57(param) 18
+ Store 62 61
+ 63: 11(fvec4) FunctionCall 14(foo(struct-S-i11;) 57(param)
+ Store 52(outv) 63
Line 1 31 0
- 70: 67 Load 69(s2d)
- 74: 11(fvec4) ImageSampleImplicitLod 70 73
- 75: 11(fvec4) Load 52(outv)
- 76: 11(fvec4) FAdd 75 74
- Store 52(outv) 76
+ 68: 65 Load 67(s2d)
+ 72: 11(fvec4) ImageSampleImplicitLod 68 71
+ 73: 11(fvec4) Load 52(outv)
+ 74: 11(fvec4) FAdd 73 72
+ Store 52(outv) 74
Line 1 33 0
- 78: 77(ptr) AccessChain 56 18 18
- 79: 7(int) Load 78
- SelectionMerge 83 None
- Switch 79 82
- case 10: 80
- case 20: 81
- 82: Label
+ 76: 75(ptr) AccessChain 56 18 18
+ 77: 7(int) Load 76
+ SelectionMerge 81 None
+ Switch 77 80
+ case 10: 78
+ case 20: 79
+ 80: Label
Line 1 42 0
- 94: 11(fvec4) Load 52(outv)
- 95: 11(fvec4) CompositeConstruct 28 28 28 28
- 96: 11(fvec4) FSub 94 95
- Store 52(outv) 96
+ 92: 11(fvec4) Load 52(outv)
+ 93: 11(fvec4) CompositeConstruct 28 28 28 28
+ 94: 11(fvec4) FSub 92 93
+ Store 52(outv) 94
Line 1 43 0
- Branch 83
- 80: Label
+ Branch 81
+ 78: Label
Line 1 35 0
- 84: 11(fvec4) Load 52(outv)
- 85: 11(fvec4) CompositeConstruct 28 28 28 28
- 86: 11(fvec4) FAdd 84 85
- Store 52(outv) 86
+ 82: 11(fvec4) Load 52(outv)
+ 83: 11(fvec4) CompositeConstruct 28 28 28 28
+ 84: 11(fvec4) FAdd 82 83
+ Store 52(outv) 84
Line 1 36 0
- Branch 83
- 81: Label
+ Branch 81
+ 79: Label
Line 1 38 0
- 88: 11(fvec4) Load 52(outv)
- 89: 11(fvec4) VectorTimesScalar 88 45
- Store 52(outv) 89
+ 86: 11(fvec4) Load 52(outv)
+ 87: 11(fvec4) VectorTimesScalar 86 45
+ Store 52(outv) 87
Line 1 39 0
- 90: 11(fvec4) Load 52(outv)
- 91: 11(fvec4) CompositeConstruct 28 28 28 28
- 92: 11(fvec4) FAdd 90 91
- Store 52(outv) 92
+ 88: 11(fvec4) Load 52(outv)
+ 89: 11(fvec4) CompositeConstruct 28 28 28 28
+ 90: 11(fvec4) FAdd 88 89
+ Store 52(outv) 90
Line 1 40 0
- Branch 83
- 83: Label
+ Branch 81
+ 81: Label
Line 1 46 0
- Store 99(i) 18
- Branch 100
- 100: Label
- LoopMerge 102 103 None
- Branch 104
- 104: Label
- 105: 7(int) Load 99(i)
- 107: 37(bool) SLessThan 105 106
- BranchConditional 107 101 102
- 101: Label
+ Store 97(i) 18
+ Branch 98
+ 98: Label
+ LoopMerge 100 101 None
+ Branch 102
+ 102: Label
+ 103: 7(int) Load 97(i)
+ 105: 37(bool) SLessThan 103 104
+ BranchConditional 105 99 100
+ 99: Label
Line 1 47 0
- 108: 11(fvec4) Load 52(outv)
- 109: 11(fvec4) VectorTimesScalar 108 36
- Store 52(outv) 109
- Branch 103
- 103: Label
+ 106: 11(fvec4) Load 52(outv)
+ 107: 11(fvec4) VectorTimesScalar 106 36
+ Store 52(outv) 107
+ Branch 101
+ 101: Label
Line 1 46 0
- 110: 7(int) Load 99(i)
- 112: 7(int) IAdd 110 111
- Store 99(i) 112
- Branch 100
- 102: Label
+ 108: 7(int) Load 97(i)
+ 110: 7(int) IAdd 108 109
+ Store 97(i) 110
+ Branch 98
+ 100: Label
Line 1 49 0
- 114: 113(ptr) AccessChain 52(outv) 32
- 115: 10(float) Load 114
- 117: 37(bool) FOrdLessThan 115 116
- SelectionMerge 120 None
- BranchConditional 117 119 123
- 119: Label
+ 112: 111(ptr) AccessChain 52(outv) 32
+ 113: 10(float) Load 112
+ 115: 37(bool) FOrdLessThan 113 114
+ SelectionMerge 118 None
+ BranchConditional 115 117 121
+ 117: Label
Line 1 50 0
- 121: 11(fvec4) Load 52(outv)
- 122: 11(fvec4) ExtInst 2(GLSL.std.450) 13(Sin) 121
- Store 52(outv) 122
- Store 118 122
- Branch 120
- 123: Label
+ 119: 11(fvec4) Load 52(outv)
+ 120: 11(fvec4) ExtInst 2(GLSL.std.450) 13(Sin) 119
+ Store 52(outv) 120
+ Store 116 120
+ Branch 118
+ 121: Label
Line 1 51 0
- 124: 11(fvec4) Load 52(outv)
- 125: 11(fvec4) ExtInst 2(GLSL.std.450) 14(Cos) 124
- Store 52(outv) 125
- Store 118 125
- Branch 120
- 120: Label
+ 122: 11(fvec4) Load 52(outv)
+ 123: 11(fvec4) ExtInst 2(GLSL.std.450) 14(Cos) 122
+ Store 52(outv) 123
+ Store 116 123
+ Branch 118
+ 118: Label
Return
FunctionEnd
14(foo(struct-S-i11;): 11(fvec4) Function None 12
spv.debugInfo.frag
// Module Version 10000
// Generated by (magic number): 80006
-// Id's are bound by 126
+// Id's are bound by 124
Capability Shader
2: ExtInstImport "GLSL.std.450"
Name 54 "ubuf"
MemberName 54(ubuf) 0 "s"
Name 56 ""
- Name 57 "S"
- MemberName 57(S) 0 "a"
- Name 59 "param"
- Name 69 "s2d"
- Name 99 "i"
+ Name 57 "param"
+ Name 67 "s2d"
+ Name 97 "i"
Decorate 24(inv) Location 0
Decorate 52(outv) Location 0
MemberDecorate 53(S) 0 Offset 0
Decorate 54(ubuf) Block
Decorate 56 DescriptorSet 3
Decorate 56 Binding 0
- Decorate 69(s2d) Location 0
- Decorate 69(s2d) DescriptorSet 3
- Decorate 69(s2d) Binding 1
+ Decorate 67(s2d) Location 0
+ Decorate 67(s2d) DescriptorSet 3
+ Decorate 67(s2d) Binding 1
3: TypeVoid
4: TypeFunction 3
7: TypeInt 32 1
54(ubuf): TypeStruct 53(S)
55: TypePointer Uniform 54(ubuf)
56: 55(ptr) Variable Uniform
- 57(S): TypeStruct 7(int)
- 58: TypePointer Function 57(S)
- 60: TypePointer Uniform 53(S)
- 66: TypeImage 10(float) 2D sampled format:Unknown
- 67: TypeSampledImage 66
- 68: TypePointer UniformConstant 67
- 69(s2d): 68(ptr) Variable UniformConstant
- 71: TypeVector 10(float) 2
- 72: 10(float) Constant 1056964608
- 73: 71(fvec2) ConstantComposite 72 72
- 77: TypePointer Uniform 7(int)
- 106: 7(int) Constant 10
- 111: 7(int) Constant 1
- 113: TypePointer Output 10(float)
- 116: 10(float) Constant 1092616192
+ 58: TypePointer Uniform 53(S)
+ 64: TypeImage 10(float) 2D sampled format:Unknown
+ 65: TypeSampledImage 64
+ 66: TypePointer UniformConstant 65
+ 67(s2d): 66(ptr) Variable UniformConstant
+ 69: TypeVector 10(float) 2
+ 70: 10(float) Constant 1056964608
+ 71: 69(fvec2) ConstantComposite 70 70
+ 75: TypePointer Uniform 7(int)
+ 104: 7(int) Constant 10
+ 109: 7(int) Constant 1
+ 111: TypePointer Output 10(float)
+ 114: 10(float) Constant 1092616192
5(main): 3 Function None 4
6: Label
- 59(param): 58(ptr) Variable Function
- 99(i): 19(ptr) Variable Function
- 118: 16(ptr) Variable Function
+ 57(param): 9(ptr) Variable Function
+ 97(i): 19(ptr) Variable Function
+ 116: 16(ptr) Variable Function
Line 1 30 0
- 61: 60(ptr) AccessChain 56 18
- 62: 53(S) Load 61
- 63: 7(int) CompositeExtract 62 0
- 64: 19(ptr) AccessChain 59(param) 18
- Store 64 63
- 65: 11(fvec4) FunctionCall 14(foo(struct-S-i11;) 59(param)
- Store 52(outv) 65
+ 59: 58(ptr) AccessChain 56 18
+ 60: 53(S) Load 59
+ 61: 7(int) CompositeExtract 60 0
+ 62: 19(ptr) AccessChain 57(param) 18
+ Store 62 61
+ 63: 11(fvec4) FunctionCall 14(foo(struct-S-i11;) 57(param)
+ Store 52(outv) 63
Line 1 31 0
- 70: 67 Load 69(s2d)
- 74: 11(fvec4) ImageSampleImplicitLod 70 73
- 75: 11(fvec4) Load 52(outv)
- 76: 11(fvec4) FAdd 75 74
- Store 52(outv) 76
+ 68: 65 Load 67(s2d)
+ 72: 11(fvec4) ImageSampleImplicitLod 68 71
+ 73: 11(fvec4) Load 52(outv)
+ 74: 11(fvec4) FAdd 73 72
+ Store 52(outv) 74
Line 1 33 0
- 78: 77(ptr) AccessChain 56 18 18
- 79: 7(int) Load 78
- SelectionMerge 83 None
- Switch 79 82
- case 10: 80
- case 20: 81
- 82: Label
+ 76: 75(ptr) AccessChain 56 18 18
+ 77: 7(int) Load 76
+ SelectionMerge 81 None
+ Switch 77 80
+ case 10: 78
+ case 20: 79
+ 80: Label
Line 1 42 0
- 94: 11(fvec4) Load 52(outv)
- 95: 11(fvec4) CompositeConstruct 28 28 28 28
- 96: 11(fvec4) FSub 94 95
- Store 52(outv) 96
+ 92: 11(fvec4) Load 52(outv)
+ 93: 11(fvec4) CompositeConstruct 28 28 28 28
+ 94: 11(fvec4) FSub 92 93
+ Store 52(outv) 94
Line 1 43 0
- Branch 83
- 80: Label
+ Branch 81
+ 78: Label
Line 1 35 0
- 84: 11(fvec4) Load 52(outv)
- 85: 11(fvec4) CompositeConstruct 28 28 28 28
- 86: 11(fvec4) FAdd 84 85
- Store 52(outv) 86
+ 82: 11(fvec4) Load 52(outv)
+ 83: 11(fvec4) CompositeConstruct 28 28 28 28
+ 84: 11(fvec4) FAdd 82 83
+ Store 52(outv) 84
Line 1 36 0
- Branch 83
- 81: Label
+ Branch 81
+ 79: Label
Line 1 38 0
- 88: 11(fvec4) Load 52(outv)
- 89: 11(fvec4) VectorTimesScalar 88 45
- Store 52(outv) 89
+ 86: 11(fvec4) Load 52(outv)
+ 87: 11(fvec4) VectorTimesScalar 86 45
+ Store 52(outv) 87
Line 1 39 0
- 90: 11(fvec4) Load 52(outv)
- 91: 11(fvec4) CompositeConstruct 28 28 28 28
- 92: 11(fvec4) FAdd 90 91
- Store 52(outv) 92
+ 88: 11(fvec4) Load 52(outv)
+ 89: 11(fvec4) CompositeConstruct 28 28 28 28
+ 90: 11(fvec4) FAdd 88 89
+ Store 52(outv) 90
Line 1 40 0
- Branch 83
- 83: Label
+ Branch 81
+ 81: Label
Line 1 46 0
- Store 99(i) 18
- Branch 100
- 100: Label
- LoopMerge 102 103 None
- Branch 104
- 104: Label
- 105: 7(int) Load 99(i)
- 107: 37(bool) SLessThan 105 106
- BranchConditional 107 101 102
- 101: Label
+ Store 97(i) 18
+ Branch 98
+ 98: Label
+ LoopMerge 100 101 None
+ Branch 102
+ 102: Label
+ 103: 7(int) Load 97(i)
+ 105: 37(bool) SLessThan 103 104
+ BranchConditional 105 99 100
+ 99: Label
Line 1 47 0
- 108: 11(fvec4) Load 52(outv)
- 109: 11(fvec4) VectorTimesScalar 108 36
- Store 52(outv) 109
- Branch 103
- 103: Label
+ 106: 11(fvec4) Load 52(outv)
+ 107: 11(fvec4) VectorTimesScalar 106 36
+ Store 52(outv) 107
+ Branch 101
+ 101: Label
Line 1 46 0
- 110: 7(int) Load 99(i)
- 112: 7(int) IAdd 110 111
- Store 99(i) 112
- Branch 100
- 102: Label
+ 108: 7(int) Load 97(i)
+ 110: 7(int) IAdd 108 109
+ Store 97(i) 110
+ Branch 98
+ 100: Label
Line 1 49 0
- 114: 113(ptr) AccessChain 52(outv) 32
- 115: 10(float) Load 114
- 117: 37(bool) FOrdLessThan 115 116
- SelectionMerge 120 None
- BranchConditional 117 119 123
- 119: Label
+ 112: 111(ptr) AccessChain 52(outv) 32
+ 113: 10(float) Load 112
+ 115: 37(bool) FOrdLessThan 113 114
+ SelectionMerge 118 None
+ BranchConditional 115 117 121
+ 117: Label
Line 1 50 0
- 121: 11(fvec4) Load 52(outv)
- 122: 11(fvec4) ExtInst 2(GLSL.std.450) 13(Sin) 121
- Store 52(outv) 122
- Store 118 122
- Branch 120
- 123: Label
+ 119: 11(fvec4) Load 52(outv)
+ 120: 11(fvec4) ExtInst 2(GLSL.std.450) 13(Sin) 119
+ Store 52(outv) 120
+ Store 116 120
+ Branch 118
+ 121: Label
Line 1 51 0
- 124: 11(fvec4) Load 52(outv)
- 125: 11(fvec4) ExtInst 2(GLSL.std.450) 14(Cos) 124
- Store 52(outv) 125
- Store 118 125
- Branch 120
- 120: Label
+ 122: 11(fvec4) Load 52(outv)
+ 123: 11(fvec4) ExtInst 2(GLSL.std.450) 14(Cos) 122
+ Store 52(outv) 123
+ Store 116 123
+ Branch 118
+ 118: Label
Return
FunctionEnd
14(foo(struct-S-i11;): 11(fvec4) Function None 12
spv.multiStructFuncall.frag
// Module Version 10000
// Generated by (magic number): 80006
-// Id's are bound by 63
+// Id's are bound by 66
Capability Shader
1: ExtInstImport "GLSL.std.450"
Name 23 "blockName"
MemberName 23(blockName) 0 "s1"
Name 25 ""
- Name 33 "s2"
- Name 36 "S"
- MemberName 36(S) 0 "m"
- Name 38 "param"
- Name 45 "param"
+ Name 31 "S"
+ MemberName 31(S) 0 "m"
+ Name 32 "arg"
+ Name 39 "s2"
+ Name 42 "param"
Name 48 "param"
- Name 59 "param"
+ Name 51 "param"
+ Name 62 "param"
MemberDecorate 22(S) 0 ColMajor
MemberDecorate 22(S) 0 Offset 0
MemberDecorate 22(S) 0 MatrixStride 16
MemberDecorate 23(blockName) 0 Offset 0
Decorate 23(blockName) BufferBlock
Decorate 25 DescriptorSet 0
- MemberDecorate 36(S) 0 ColMajor
+ MemberDecorate 31(S) 0 ColMajor
2: TypeVoid
3: TypeFunction 2
6: TypeFloat 32
26: TypeInt 32 1
27: 26(int) Constant 0
28: TypePointer Uniform 22(S)
- 32: TypePointer Private 9(S)
- 33(s2): 32(ptr) Variable Private
- 36(S): TypeStruct 8
- 37: TypePointer Function 36(S)
- 42: TypePointer Function 8
- 57: TypePointer Uniform 8
+ 31(S): TypeStruct 8
+ 34: TypePointer Function 8
+ 38: TypePointer Private 9(S)
+ 39(s2): 38(ptr) Variable Private
+ 60: TypePointer Uniform 8
4(main): 2 Function None 3
5: Label
- 38(param): 37(ptr) Variable Function
- 45(param): 14(ptr) Variable Function
- 48(param): 37(ptr) Variable Function
- 59(param): 14(ptr) Variable Function
+ 32(arg): 14(ptr) Variable Function
+ 42(param): 14(ptr) Variable Function
+ 48(param): 14(ptr) Variable Function
+ 51(param): 14(ptr) Variable Function
+ 62(param): 14(ptr) Variable Function
29: 28(ptr) AccessChain 25 27
30: 22(S) Load 29
- 31: 2 FunctionCall 12(fooConst(struct-S-mf441;) 30
- 34: 9(S) Load 33(s2)
- 35: 2 FunctionCall 12(fooConst(struct-S-mf441;) 34
- 39: 28(ptr) AccessChain 25 27
- 40: 22(S) Load 39
- 41: 8 CompositeExtract 40 0
- 43: 42(ptr) AccessChain 38(param) 27
- Store 43 41
- 44: 2 FunctionCall 17(foo(struct-S-mf441;) 38(param)
- 46: 9(S) Load 33(s2)
- Store 45(param) 46
- 47: 2 FunctionCall 17(foo(struct-S-mf441;) 45(param)
- 49: 28(ptr) AccessChain 25 27
- 50: 22(S) Load 49
- 51: 8 CompositeExtract 50 0
- 52: 42(ptr) AccessChain 48(param) 27
- Store 52 51
- 53: 2 FunctionCall 20(fooOut(struct-S-mf441;) 48(param)
- 54: 36(S) Load 48(param)
- 55: 28(ptr) AccessChain 25 27
- 56: 8 CompositeExtract 54 0
- 58: 57(ptr) AccessChain 55 27
- Store 58 56
- 60: 9(S) Load 33(s2)
- Store 59(param) 60
- 61: 2 FunctionCall 20(fooOut(struct-S-mf441;) 59(param)
- 62: 9(S) Load 59(param)
- Store 33(s2) 62
+ 33: 8 CompositeExtract 30 0
+ 35: 34(ptr) AccessChain 32(arg) 27
+ Store 35 33
+ 36: 9(S) Load 32(arg)
+ 37: 2 FunctionCall 12(fooConst(struct-S-mf441;) 36
+ 40: 9(S) Load 39(s2)
+ 41: 2 FunctionCall 12(fooConst(struct-S-mf441;) 40
+ 43: 28(ptr) AccessChain 25 27
+ 44: 22(S) Load 43
+ 45: 8 CompositeExtract 44 0
+ 46: 34(ptr) AccessChain 42(param) 27
+ Store 46 45
+ 47: 2 FunctionCall 17(foo(struct-S-mf441;) 42(param)
+ 49: 9(S) Load 39(s2)
+ Store 48(param) 49
+ 50: 2 FunctionCall 17(foo(struct-S-mf441;) 48(param)
+ 52: 28(ptr) AccessChain 25 27
+ 53: 22(S) Load 52
+ 54: 8 CompositeExtract 53 0
+ 55: 34(ptr) AccessChain 51(param) 27
+ Store 55 54
+ 56: 2 FunctionCall 20(fooOut(struct-S-mf441;) 51(param)
+ 57: 9(S) Load 51(param)
+ 58: 28(ptr) AccessChain 25 27
+ 59: 8 CompositeExtract 57 0
+ 61: 60(ptr) AccessChain 58 27
+ Store 61 59
+ 63: 9(S) Load 39(s2)
+ Store 62(param) 63
+ 64: 2 FunctionCall 20(fooOut(struct-S-mf441;) 62(param)
+ 65: 9(S) Load 62(param)
+ Store 39(s2) 65
Return
FunctionEnd
12(fooConst(struct-S-mf441;): 2 Function None 10