diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index 4c7c17c1e7feb0085c8f98ce0395ecd1637cf62d..0240dea096a503de30ad5e30f19f9e5d52e4e99f 100755 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -530,12 +530,12 @@ bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::T // evaluate the right builder.clearAccessChain(); node->getRight()->traverse(this); - spv::Id rValue = builder.accessChainLoad(TranslatePrecisionDecoration(node->getRight()->getType())); + spv::Id rValue = builder.accessChainLoad(convertGlslangToSpvType(node->getRight()->getType())); if (node->getOp() != glslang::EOpAssign) { // the left is also an r-value builder.setAccessChain(lValue); - spv::Id leftRValue = builder.accessChainLoad(TranslatePrecisionDecoration(node->getLeft()->getType())); + spv::Id leftRValue = builder.accessChainLoad(convertGlslangToSpvType(node->getLeft()->getType())); // do the operation rValue = createBinaryOperation(node->getOp(), TranslatePrecisionDecoration(node->getType()), @@ -587,10 +587,10 @@ bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::T // so short circuit the access-chain stuff with a swizzle. std::vector<unsigned> swizzle; swizzle.push_back(node->getRight()->getAsConstantUnion()->getConstArray()[0].getIConst()); - builder.accessChainPushSwizzle(swizzle); + builder.accessChainPushSwizzle(swizzle, convertGlslangToSpvType(node->getLeft()->getType())); } else { // normal case for indexing array or structure or block - builder.accessChainPush(builder.makeIntConstant(index), convertGlslangToSpvType(node->getType())); + builder.accessChainPush(builder.makeIntConstant(index)); } } return false; @@ -611,15 +611,15 @@ bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::T // compute the next index in the chain builder.clearAccessChain(); node->getRight()->traverse(this); - spv::Id index = builder.accessChainLoad(TranslatePrecisionDecoration(node->getRight()->getType())); + spv::Id index = builder.accessChainLoad(convertGlslangToSpvType(node->getRight()->getType())); // restore the saved access chain builder.setAccessChain(partial); if (! node->getLeft()->getType().isArray() && node->getLeft()->getType().isVector()) - builder.accessChainPushComponent(index); + builder.accessChainPushComponent(index, convertGlslangToSpvType(node->getLeft()->getType())); else - builder.accessChainPush(index, convertGlslangToSpvType(node->getType())); + builder.accessChainPush(index); } return false; case glslang::EOpVectorSwizzle: @@ -629,7 +629,7 @@ bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::T std::vector<unsigned> swizzle; for (int i = 0; i < (int)swizzleSequence.size(); ++i) swizzle.push_back(swizzleSequence[i]->getAsConstantUnion()->getConstArray()[0].getIConst()); - builder.accessChainPushSwizzle(swizzle); + builder.accessChainPushSwizzle(swizzle, convertGlslangToSpvType(node->getLeft()->getType())); } return false; default: @@ -641,11 +641,11 @@ bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::T // Get the operands builder.clearAccessChain(); node->getLeft()->traverse(this); - spv::Id left = builder.accessChainLoad(TranslatePrecisionDecoration(node->getLeft()->getType())); + spv::Id left = builder.accessChainLoad(convertGlslangToSpvType(node->getLeft()->getType())); builder.clearAccessChain(); node->getRight()->traverse(this); - spv::Id right = builder.accessChainLoad(TranslatePrecisionDecoration(node->getRight()->getType())); + spv::Id right = builder.accessChainLoad(convertGlslangToSpvType(node->getRight()->getType())); spv::Id result; spv::Decoration precision = TranslatePrecisionDecoration(node->getType()); @@ -702,7 +702,7 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI builder.clearAccessChain(); node->getOperand()->traverse(this); - spv::Id operand = builder.accessChainLoad(TranslatePrecisionDecoration(node->getOperand()->getType())); + spv::Id operand = builder.accessChainLoad(convertGlslangToSpvType(node->getOperand()->getType())); spv::Decoration precision = TranslatePrecisionDecoration(node->getType()); @@ -1038,11 +1038,11 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt builder.clearAccessChain(); left->traverse(this); - spv::Id leftId = builder.accessChainLoad(TranslatePrecisionDecoration(left->getType())); + spv::Id leftId = builder.accessChainLoad(convertGlslangToSpvType(left->getType())); builder.clearAccessChain(); right->traverse(this); - spv::Id rightId = builder.accessChainLoad(TranslatePrecisionDecoration(right->getType())); + spv::Id rightId = builder.accessChainLoad(convertGlslangToSpvType(right->getType())); result = createBinaryOperation(binOp, precision, convertGlslangToSpvType(node->getType()), leftId, rightId, @@ -1084,7 +1084,7 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt if (lvalue) operands.push_back(builder.accessChainGetLValue()); else - operands.push_back(builder.accessChainLoad(TranslatePrecisionDecoration(glslangOperands[arg]->getAsTyped()->getType()))); + operands.push_back(builder.accessChainLoad(convertGlslangToSpvType(glslangOperands[arg]->getAsTyped()->getType()))); } if (atomic) { @@ -1134,13 +1134,13 @@ bool TGlslangToSpvTraverser::visitSelection(glslang::TVisit /* visit */, glslang node->getCondition()->traverse(this); // make an "if" based on the value created by the condition - spv::Builder::If ifBuilder(builder.accessChainLoad(spv::NoPrecision), builder); + spv::Builder::If ifBuilder(builder.accessChainLoad(convertGlslangToSpvType(node->getCondition()->getType())), builder); if (node->getTrueBlock()) { // emit the "then" statement node->getTrueBlock()->traverse(this); if (result) - builder.createStore(builder.accessChainLoad(TranslatePrecisionDecoration(node->getTrueBlock()->getAsTyped()->getType())), result); + builder.createStore(builder.accessChainLoad(convertGlslangToSpvType(node->getTrueBlock()->getAsTyped()->getType())), result); } if (node->getFalseBlock()) { @@ -1148,7 +1148,7 @@ bool TGlslangToSpvTraverser::visitSelection(glslang::TVisit /* visit */, glslang // emit the "else" statement node->getFalseBlock()->traverse(this); if (result) - builder.createStore(builder.accessChainLoad(TranslatePrecisionDecoration(node->getFalseBlock()->getAsTyped()->getType())), result); + builder.createStore(builder.accessChainLoad(convertGlslangToSpvType(node->getFalseBlock()->getAsTyped()->getType())), result); } ifBuilder.makeEndIf(); @@ -1169,7 +1169,7 @@ bool TGlslangToSpvTraverser::visitSwitch(glslang::TVisit /* visit */, glslang::T { // emit and get the condition before doing anything with switch node->getCondition()->traverse(this); - spv::Id selector = builder.accessChainLoad(TranslatePrecisionDecoration(node->getCondition()->getAsTyped()->getType())); + spv::Id selector = builder.accessChainLoad(convertGlslangToSpvType(node->getCondition()->getAsTyped()->getType())); // browse the children to sort out code segments int defaultSegment = -1; @@ -1233,7 +1233,7 @@ bool TGlslangToSpvTraverser::visitLoop(glslang::TVisit /* visit */, glslang::TIn if (node->getTest()) { node->getTest()->traverse(this); // the AST only contained the test computation, not the branch, we have to add it - spv::Id condition = builder.accessChainLoad(TranslatePrecisionDecoration(node->getTest()->getType())); + spv::Id condition = builder.accessChainLoad(convertGlslangToSpvType(node->getTest()->getType())); builder.createLoopTestBranch(condition); } else { builder.createBranchToBody(); @@ -1279,7 +1279,7 @@ bool TGlslangToSpvTraverser::visitBranch(glslang::TVisit /* visit */, glslang::T if (inMain) builder.makeMainReturn(); else if (node->getExpression()) - builder.makeReturn(false, builder.accessChainLoad(TranslatePrecisionDecoration(node->getExpression()->getType()))); + builder.makeReturn(false, builder.accessChainLoad(convertGlslangToSpvType(node->getExpression()->getType()))); else builder.makeReturn(); @@ -1664,7 +1664,7 @@ void TGlslangToSpvTraverser::translateArguments(const glslang::TIntermSequence& for (int i = 0; i < (int)glslangArguments.size(); ++i) { builder.clearAccessChain(); glslangArguments[i]->traverse(this); - arguments.push_back(builder.accessChainLoad(TranslatePrecisionDecoration(glslangArguments[i]->getAsTyped()->getType()))); + arguments.push_back(builder.accessChainLoad(convertGlslangToSpvType(glslangArguments[i]->getAsTyped()->getType()))); } } @@ -1672,7 +1672,7 @@ void TGlslangToSpvTraverser::translateArguments(glslang::TIntermUnary& node, std { builder.clearAccessChain(); node.getOperand()->traverse(this); - arguments.push_back(builder.accessChainLoad(TranslatePrecisionDecoration(node.getAsTyped()->getType()))); + arguments.push_back(builder.accessChainLoad(convertGlslangToSpvType(node.getOperand()->getType()))); } spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermOperator* node) @@ -1806,17 +1806,19 @@ spv::Id TGlslangToSpvTraverser::handleUserFunctionCall(const glslang::TIntermAgg // 1. Evaluate the arguments std::vector<spv::Builder::AccessChain> lValues; std::vector<spv::Id> rValues; + std::vector<spv::Id> argTypes; for (int a = 0; a < (int)glslangArgs.size(); ++a) { // build l-value builder.clearAccessChain(); glslangArgs[a]->traverse(this); + argTypes.push_back(convertGlslangToSpvType(glslangArgs[a]->getAsTyped()->getType())); // keep outputs as l-values, evaluate input-only as r-values if (qualifiers[a] != glslang::EvqConstReadOnly) { // save l-value lValues.push_back(builder.getAccessChain()); } else { // process r-value - rValues.push_back(builder.accessChainLoad(TranslatePrecisionDecoration(glslangArgs[a]->getAsTyped()->getType()))); + rValues.push_back(builder.accessChainLoad(argTypes.back())); } } @@ -1836,7 +1838,7 @@ spv::Id TGlslangToSpvTraverser::handleUserFunctionCall(const glslang::TIntermAgg if (qualifiers[a] == glslang::EvqIn || qualifiers[a] == glslang::EvqInOut) { // need to copy the input into output space builder.setAccessChain(lValues[lValueCount]); - spv::Id copy = builder.accessChainLoad(spv::NoPrecision); // TODO: get precision + spv::Id copy = builder.accessChainLoad(argTypes[a]); builder.createStore(copy, arg); } ++lValueCount; diff --git a/SPIRV/SpvBuilder.cpp b/SPIRV/SpvBuilder.cpp index 953b6046730ee024a6eaedbea7a3ce23c6ecaa34..9913b0b6e08b98c97e524b07f69a1cc9054ad224 100755 --- a/SPIRV/SpvBuilder.cpp +++ b/SPIRV/SpvBuilder.cpp @@ -1957,18 +1957,23 @@ void Builder::createBranchToLoopHeaderFromInside(const Loop& loop) void Builder::clearAccessChain() { - accessChain.base = 0; + accessChain.base = NoResult; accessChain.indexChain.clear(); - accessChain.instr = 0; + accessChain.instr = NoResult; accessChain.swizzle.clear(); - accessChain.component = 0; - accessChain.resultType = NoType; + accessChain.component = NoResult; + accessChain.preSwizzleBaseType = NoType; accessChain.isRValue = false; } // Comments in header -void Builder::accessChainPushSwizzle(std::vector<unsigned>& swizzle) +void Builder::accessChainPushSwizzle(std::vector<unsigned>& swizzle, Id preSwizzleBaseType) { + // swizzles can be stacked in GLSL, but simplified to a single + // one here; the base type doesn't change + if (accessChain.preSwizzleBaseType == NoType) + accessChain.preSwizzleBaseType = preSwizzleBaseType; + // if needed, propagate the swizzle for the current access chain if (accessChain.swizzle.size()) { std::vector<unsigned> oldSwizzle = accessChain.swizzle; @@ -1990,7 +1995,7 @@ void Builder::accessChainStore(Id rvalue) Id base = collapseAccessChain(); - if (accessChain.swizzle.size() && accessChain.component) + if (accessChain.swizzle.size() && accessChain.component != NoResult) MissingFunctionality("simultaneous l-value swizzle and dynamic component selection"); // If swizzle exists, it is out-of-order or not full, we must load the target vector, @@ -2002,7 +2007,7 @@ void Builder::accessChainStore(Id rvalue) } // dynamic component selection - if (accessChain.component) { + if (accessChain.component != NoResult) { Id tempBaseId = (source == NoResult) ? createLoad(base) : source; source = createVectorInsertDynamic(tempBaseId, getTypeId(tempBaseId), rvalue, accessChain.component); } @@ -2014,13 +2019,15 @@ void Builder::accessChainStore(Id rvalue) } // Comments in header -Id Builder::accessChainLoad(Decoration /*precision*/) +Id Builder::accessChainLoad(Id resultType) { Id id; if (accessChain.isRValue) { if (accessChain.indexChain.size() > 0) { mergeAccessChainSwizzle(); // TODO: optimization: look at applying this optimization more widely + Id swizzleBase = accessChain.preSwizzleBaseType != NoType ? accessChain.preSwizzleBaseType : resultType; + // if all the accesses are constants, we can use OpCompositeExtract std::vector<unsigned> indexes; bool constant = true; @@ -2034,7 +2041,7 @@ Id Builder::accessChainLoad(Decoration /*precision*/) } if (constant) - id = createCompositeExtract(accessChain.base, accessChain.resultType, indexes); + id = createCompositeExtract(accessChain.base, swizzleBase, indexes); else { // make a new function variable for this r-value Id lValue = createVariable(StorageClassFunction, getTypeId(accessChain.base), "indexable"); @@ -2057,24 +2064,22 @@ Id Builder::accessChainLoad(Decoration /*precision*/) } // Done, unless there are swizzles to do - if (accessChain.swizzle.size() == 0 && accessChain.component == 0) + if (accessChain.swizzle.size() == 0 && accessChain.component == NoResult) return id; - Id componentType = getScalarTypeId(accessChain.resultType); - // Do remaining swizzling // First, static swizzling if (accessChain.swizzle.size()) { // static swizzle - Id resultType = componentType; + Id swizzledType = getScalarTypeId(getTypeId(id)); if (accessChain.swizzle.size() > 1) - resultType = makeVectorType(componentType, (int)accessChain.swizzle.size()); - id = createRvalueSwizzle(resultType, id, accessChain.swizzle); + swizzledType = makeVectorType(swizzledType, (int)accessChain.swizzle.size()); + id = createRvalueSwizzle(swizzledType, id, accessChain.swizzle); } // dynamic single-component selection - if (accessChain.component) - id = createVectorExtractDynamic(id, componentType, accessChain.component); + if (accessChain.component != NoResult) + id = createVectorExtractDynamic(id, resultType, accessChain.component); return id; } @@ -2089,7 +2094,7 @@ Id Builder::accessChainGetLValue() // extract and insert elements to perform writeMask and/or swizzle. This does not // go with getting a direct l-value pointer. assert(accessChain.swizzle.size() == 0); - assert(accessChain.component == spv::NoResult); + assert(accessChain.component == NoResult); return lvalue; } @@ -2170,7 +2175,7 @@ void Builder::simplifyAccessChainSwizzle() { // If the swizzle has fewer components than the vector, it is subsetting, and must stay // to preserve that fact. - if (getNumTypeComponents(accessChain.resultType) > (int)accessChain.swizzle.size()) + if (getNumTypeComponents(accessChain.preSwizzleBaseType) > (int)accessChain.swizzle.size()) return; // if components are out of order, it is a swizzle @@ -2181,6 +2186,8 @@ void Builder::simplifyAccessChainSwizzle() // otherwise, there is no need to track this swizzle accessChain.swizzle.clear(); + if (accessChain.component == NoResult) + accessChain.preSwizzleBaseType = NoType; } // clear out swizzle if it can become part of the indexes @@ -2188,12 +2195,12 @@ void Builder::mergeAccessChainSwizzle() { // is there even a chance of doing something? Need a single-component swizzle if ((accessChain.swizzle.size() > 1) || - (accessChain.swizzle.size() == 0 && accessChain.component == 0)) + (accessChain.swizzle.size() == 0 && accessChain.component == NoResult)) return; // TODO: optimization: remove this, but for now confine this to non-dynamic accesses // (the above test is correct when this is removed.) - if (accessChain.component) + if (accessChain.component != NoResult) return; // move the swizzle over to the indexes @@ -2201,10 +2208,10 @@ void Builder::mergeAccessChainSwizzle() accessChain.indexChain.push_back(makeUintConstant(accessChain.swizzle.front())); else accessChain.indexChain.push_back(accessChain.component); - accessChain.resultType = getScalarTypeId(accessChain.resultType); // now there is no need to track this swizzle accessChain.component = NoResult; + accessChain.preSwizzleBaseType = NoType; accessChain.swizzle.clear(); } diff --git a/SPIRV/SpvBuilder.h b/SPIRV/SpvBuilder.h index 1ceb9c69e94636c13afde38a1b6fb3a3c1224429..f81f9ed2f3e92058ad5eadb7e3d79c65551ee97a 100755 --- a/SPIRV/SpvBuilder.h +++ b/SPIRV/SpvBuilder.h @@ -431,7 +431,7 @@ public: Id instr; // the instruction that generates this access chain std::vector<unsigned> swizzle; Id component; // a dynamic component index, can coexist with a swizzle, done after the swizzle - Id resultType; // dereferenced type, to be exclusive of swizzles + Id preSwizzleBaseType; // dereferenced type, before swizzle or component is applied; NoType unless a swizzle or component is present bool isRValue; }; @@ -452,7 +452,6 @@ public: { assert(isPointer(lValue)); accessChain.base = lValue; - accessChain.resultType = getContainedTypeId(getTypeId(lValue)); } // set new base value as an r-value @@ -460,27 +459,30 @@ public: { accessChain.isRValue = true; accessChain.base = rValue; - accessChain.resultType = getTypeId(rValue); } // push offset onto the end of the chain - void accessChainPush(Id offset, Id newType) + void accessChainPush(Id offset) { accessChain.indexChain.push_back(offset); - accessChain.resultType = newType; } // push new swizzle onto the end of any existing swizzle, merging into a single swizzle - void accessChainPushSwizzle(std::vector<unsigned>& swizzle); + void accessChainPushSwizzle(std::vector<unsigned>& swizzle, Id preSwizzleBaseType); // push a variable component selection onto the access chain; supporting only one, so unsided - void accessChainPushComponent(Id component) { accessChain.component = component; } + void accessChainPushComponent(Id component, Id preSwizzleBaseType) + { + accessChain.component = component; + if (accessChain.preSwizzleBaseType == NoType) + accessChain.preSwizzleBaseType = preSwizzleBaseType; + } // use accessChain and swizzle to store value void accessChainStore(Id rvalue); // use accessChain and swizzle to load an r-value - Id accessChainLoad(Decoration precision); + Id accessChainLoad(Id ResultType); // get the direct pointer for an l-value Id accessChainGetLValue(); diff --git a/Test/baseResults/spv.310.comp.out b/Test/baseResults/spv.310.comp.out index 9fbb2d58ae301b283dcae753fd4676dbf57a57aa..b8c7b8845fb9be6895dce8f822eef3807b827484 100644 --- a/Test/baseResults/spv.310.comp.out +++ b/Test/baseResults/spv.310.comp.out @@ -7,7 +7,7 @@ Linked compute stage: // Module Version 99 // Generated by (magic number): 51a00bb -// Id's are bound by 72 +// Id's are bound by 68 Source ESSL 310 Capability Shader @@ -26,21 +26,21 @@ Linked compute stage: MemberName 25(outbna) 0 "k" MemberName 25(outbna) 1 "na" Name 27 "outbnamena" - Name 47 "i" - Name 53 "outs" - MemberName 53(outs) 0 "s" - MemberName 53(outs) 1 "va" - Name 55 "outnames" - Name 59 "gl_LocalInvocationID" + Name 44 "i" + Name 50 "outs" + MemberName 50(outs) 0 "s" + MemberName 50(outs) 1 "va" + Name 52 "outnames" + Name 55 "gl_LocalInvocationID" Decorate 14(outb) GLSLShared Decorate 14(outb) BufferBlock Decorate 25(outbna) GLSLShared Decorate 25(outbna) BufferBlock - Decorate 53(outs) GLSLShared - Decorate 53(outs) BufferBlock - Decorate 59(gl_LocalInvocationID) BuiltIn LocalInvocationId - Decorate 71 BuiltIn WorkgroupSize - Decorate 71 NoStaticUse + Decorate 50(outs) GLSLShared + Decorate 50(outs) BufferBlock + Decorate 55(gl_LocalInvocationID) BuiltIn LocalInvocationId + Decorate 67 BuiltIn WorkgroupSize + Decorate 67 NoStaticUse 2: TypeVoid 3: TypeFunction 2 7: TypeInt 32 0 @@ -64,30 +64,26 @@ Linked compute stage: 27(outbnamena): 26(ptr) Variable Uniform 28: 17(int) Constant 1 31: TypePointer Uniform 24(fvec4) - 33: TypeRuntimeArray 12(fvec3) - 34: 17(int) Constant 3 - 35: 17(int) Constant 18 - 36: TypePointer Uniform 12(fvec3) - 40: TypeRuntimeArray 12(fvec3) - 41: 17(int) Constant 17 - 42: 11(float) Constant 1077936128 - 43: 12(fvec3) ConstantComposite 42 42 42 - 45: TypeRuntimeArray 12(fvec3) - 46: TypePointer WorkgroupLocal 17(int) - 47(i): 46(ptr) Variable WorkgroupLocal - 52: TypeRuntimeArray 24(fvec4) - 53(outs): TypeStruct 17(int) 52 - 54: TypePointer Uniform 53(outs) - 55(outnames): 54(ptr) Variable Uniform - 56: TypeRuntimeArray 24(fvec4) - 57: TypeVector 7(int) 3 - 58: TypePointer Input 57(ivec3) -59(gl_LocalInvocationID): 58(ptr) Variable Input - 66: TypePointer Uniform 17(int) - 68: 7(int) Constant 16 - 69: 7(int) Constant 32 - 70: 7(int) Constant 4 - 71: 57(ivec3) ConstantComposite 68 69 70 + 33: 17(int) Constant 3 + 34: 17(int) Constant 18 + 35: TypePointer Uniform 12(fvec3) + 39: 17(int) Constant 17 + 40: 11(float) Constant 1077936128 + 41: 12(fvec3) ConstantComposite 40 40 40 + 43: TypePointer WorkgroupLocal 17(int) + 44(i): 43(ptr) Variable WorkgroupLocal + 49: TypeRuntimeArray 24(fvec4) + 50(outs): TypeStruct 17(int) 49 + 51: TypePointer Uniform 50(outs) + 52(outnames): 51(ptr) Variable Uniform + 53: TypeVector 7(int) 3 + 54: TypePointer Input 53(ivec3) +55(gl_LocalInvocationID): 54(ptr) Variable Input + 62: TypePointer Uniform 17(int) + 64: 7(int) Constant 16 + 65: 7(int) Constant 32 + 66: 7(int) Constant 4 + 67: 53(ivec3) ConstantComposite 64 65 66 4(main): 2 Function None 3 5: Label MemoryBarrier 8 9 @@ -99,26 +95,26 @@ Linked compute stage: 30: 24(fvec4) CompositeConstruct 29 29 29 29 32: 31(ptr) AccessChain 27(outbnamena) 28 Store 32 30 - 37: 36(ptr) AccessChain 16(outbname) 34 35 - 38: 12(fvec3) Load 37 - 39: 11(float) CompositeExtract 38 0 - Store 20(s) 39 - 44: 36(ptr) AccessChain 16(outbname) 34 41 - Store 44 43 - 48: 17(int) Load 47(i) - 49: 11(float) Load 20(s) - 50: 12(fvec3) CompositeConstruct 49 49 49 - 51: 36(ptr) AccessChain 16(outbname) 34 48 - Store 51 50 - 60: 57(ivec3) Load 59(gl_LocalInvocationID) - 61: 7(int) CompositeExtract 60 0 - 62: 11(float) Load 20(s) - 63: 24(fvec4) CompositeConstruct 62 62 62 62 - 64: 31(ptr) AccessChain 55(outnames) 28 61 - Store 64 63 - 65: 17(int) ArrayLength 16(outbname) - 67: 66(ptr) AccessChain 55(outnames) 18 - Store 67 65 + 36: 35(ptr) AccessChain 16(outbname) 33 34 + 37: 12(fvec3) Load 36 + 38: 11(float) CompositeExtract 37 0 + Store 20(s) 38 + 42: 35(ptr) AccessChain 16(outbname) 33 39 + Store 42 41 + 45: 17(int) Load 44(i) + 46: 11(float) Load 20(s) + 47: 12(fvec3) CompositeConstruct 46 46 46 + 48: 35(ptr) AccessChain 16(outbname) 33 45 + Store 48 47 + 56: 53(ivec3) Load 55(gl_LocalInvocationID) + 57: 7(int) CompositeExtract 56 0 + 58: 11(float) Load 20(s) + 59: 24(fvec4) CompositeConstruct 58 58 58 58 + 60: 31(ptr) AccessChain 52(outnames) 28 57 + Store 60 59 + 61: 17(int) ArrayLength 16(outbname) + 63: 62(ptr) AccessChain 52(outnames) 18 + Store 63 61 Branch 6 6: Label Return diff --git a/Test/baseResults/spv.Operations.frag.out b/Test/baseResults/spv.Operations.frag.out index 9858f85f812a0f0c86da3422591403bdad82b598..909bb23d60f619c1faa0b0a56f7026eec6326aa4 100755 --- a/Test/baseResults/spv.Operations.frag.out +++ b/Test/baseResults/spv.Operations.frag.out @@ -51,7 +51,7 @@ Linked fragment stage: 292: 19(int) Constant 2 299: 19(int) Constant 1 301: TypePointer Function 7(float) - 332: TypeVector 7(float) 3 + 331: TypeVector 7(float) 3 347: 7(float) Constant 1073741824 354: 7(float) Constant 1065353216 359: 19(int) Constant 66 @@ -434,11 +434,11 @@ Linked fragment stage: 329: 7(float) Load 302(f) 330: 7(float) FAdd 329 328 Store 302(f) 330 - 331: 8(fvec4) Load 10(v) - 333: 332(fvec3) VectorShuffle 331 331 0 1 2 + 332: 8(fvec4) Load 10(v) + 333: 331(fvec3) VectorShuffle 332 332 0 1 2 334: 8(fvec4) Load 10(v) - 335: 332(fvec3) VectorShuffle 334 334 0 1 2 - 336: 332(fvec3) ExtInst 1(GLSL.std.450) 67(Cross) 333 335 + 335: 331(fvec3) VectorShuffle 334 334 0 1 2 + 336: 331(fvec3) ExtInst 1(GLSL.std.450) 67(Cross) 333 335 337: 7(float) CompositeExtract 336 0 338: 7(float) Load 302(f) 339: 7(float) FAdd 338 337 diff --git a/Test/baseResults/spv.accessChain.frag.out b/Test/baseResults/spv.accessChain.frag.out index f45cc34356d6faeff731986c735557435660480d..c280bffd863f13d555de972ce4c07df387474a12 100755 --- a/Test/baseResults/spv.accessChain.frag.out +++ b/Test/baseResults/spv.accessChain.frag.out @@ -86,7 +86,7 @@ Linked fragment stage: 67: 14(int) Constant 0 68: TypeInt 32 0 69: 68(int) Constant 0 - 97: TypeVector 7(float) 2 + 96: TypeVector 7(float) 2 110: 68(int) Constant 2 142: 7(float) Constant 0 143: 8(fvec3) ConstantComposite 142 142 142 @@ -227,8 +227,8 @@ Linked fragment stage: 34(comp): 15(ptr) FunctionParameter 36: Label 95: 14(int) Load 34(comp) - 96: 8(fvec3) CompositeExtract 33(i) 0 - 98: 97(fvec2) VectorShuffle 96 96 1 0 + 97: 8(fvec3) CompositeExtract 33(i) 0 + 98: 96(fvec2) VectorShuffle 97 97 1 0 99: 7(float) VectorExtractDynamic 98 95 100: 8(fvec3) Load 66(OutColor) 101: 8(fvec3) CompositeConstruct 99 99 99 @@ -241,10 +241,10 @@ Linked fragment stage: 38(comp): 15(ptr) FunctionParameter 40: Label 103: 8(fvec3) CompositeExtract 37(i) 0 - 104: 97(fvec2) VectorShuffle 103 103 0 1 + 104: 96(fvec2) VectorShuffle 103 103 0 1 105: 8(fvec3) Load 66(OutColor) - 106: 97(fvec2) VectorShuffle 105 105 0 1 - 107: 97(fvec2) FAdd 106 104 + 106: 96(fvec2) VectorShuffle 105 105 0 1 + 107: 96(fvec2) FAdd 106 104 108: 8(fvec3) Load 66(OutColor) 109: 8(fvec3) VectorShuffle 108 107 3 4 2 Store 66(OutColor) 109 @@ -279,10 +279,10 @@ Linked fragment stage: 50(comp): 15(ptr) FunctionParameter 52: Label 121: 8(fvec3) CompositeExtract 49(i) 0 - 122: 97(fvec2) VectorShuffle 121 121 0 1 + 122: 96(fvec2) VectorShuffle 121 121 0 1 123: 8(fvec3) Load 66(OutColor) - 124: 97(fvec2) VectorShuffle 123 123 2 1 - 125: 97(fvec2) FAdd 124 122 + 124: 96(fvec2) VectorShuffle 123 123 2 1 + 125: 96(fvec2) FAdd 124 122 126: 8(fvec3) Load 66(OutColor) 127: 8(fvec3) VectorShuffle 126 125 0 4 3 Store 66(OutColor) 127 @@ -293,10 +293,10 @@ Linked fragment stage: 54(comp): 15(ptr) FunctionParameter 56: Label 128: 8(fvec3) CompositeExtract 53(i) 0 - 129: 97(fvec2) VectorShuffle 128 128 0 1 + 129: 96(fvec2) VectorShuffle 128 128 0 1 130: 8(fvec3) Load 66(OutColor) - 131: 97(fvec2) VectorShuffle 130 130 0 2 - 132: 97(fvec2) FAdd 131 129 + 131: 96(fvec2) VectorShuffle 130 130 0 2 + 132: 96(fvec2) FAdd 131 129 133: 8(fvec3) Load 66(OutColor) 134: 8(fvec3) VectorShuffle 133 132 3 1 4 Store 66(OutColor) 134 diff --git a/Test/baseResults/spv.double.comp.out b/Test/baseResults/spv.double.comp.out index 3f2ca156f176e906f64839a4bebf7deb687385f8..d77bc0c067fb79e2488700f0d9fe7b37177f0b6f 100755 --- a/Test/baseResults/spv.double.comp.out +++ b/Test/baseResults/spv.double.comp.out @@ -57,7 +57,7 @@ Linked compute stage: 25: TypeVector 24(int) 3 26: TypePointer Input 25(ivec3) 27(gl_GlobalInvocationID): 26(ptr) Variable Input - 29: TypeVector 24(int) 2 + 28: TypeVector 24(int) 2 32: TypePointer Function 8(float) 34(gl_LocalInvocationID): 26(ptr) Variable Input 38: 12(int) Constant 8 @@ -86,12 +86,12 @@ Linked compute stage: Store 16 14 20: 19(ptr) AccessChain 11(bufInst) 17 Store 20 18 - 28: 25(ivec3) Load 27(gl_GlobalInvocationID) - 30: 29(ivec2) VectorShuffle 28 28 0 1 + 29: 25(ivec3) Load 27(gl_GlobalInvocationID) + 30: 28(ivec2) VectorShuffle 29 29 0 1 31: 21(ivec2) Bitcast 30 Store 23(storePos) 31 35: 25(ivec3) Load 34(gl_LocalInvocationID) - 36: 29(ivec2) VectorShuffle 35 35 0 1 + 36: 28(ivec2) VectorShuffle 35 35 0 1 37: 21(ivec2) Bitcast 36 39: 21(ivec2) CompositeConstruct 38 38 40: 21(ivec2) ISub 37 39 diff --git a/Test/baseResults/spv.forLoop.frag.out b/Test/baseResults/spv.forLoop.frag.out index 972ecead41ccff2a6ab32992202437dc8f0a224c..75949a041212000cdac295fa3cd3421a126a4d27 100755 --- a/Test/baseResults/spv.forLoop.frag.out +++ b/Test/baseResults/spv.forLoop.frag.out @@ -58,7 +58,7 @@ Linked fragment stage: 50: TypePointer UniformConstant 49(ivec4) 51(v4): 50(ptr) Variable UniformConstant 71: 48(int) Constant 4 - 86: TypeVector 7(float) 3 + 85: TypeVector 7(float) 3 97: TypePointer Input 7(float) 98(f): 97(ptr) Variable Input 116: 14(int) Constant 16 @@ -145,8 +145,8 @@ Linked fragment stage: 82: 8(fvec4) Load 36(gl_FragColor) 83: 8(fvec4) FAdd 82 81 Store 36(gl_FragColor) 83 - 85: 8(fvec4) Load 12(BaseColor) - 87: 86(fvec3) VectorShuffle 85 85 0 1 2 + 86: 8(fvec4) Load 12(BaseColor) + 87: 85(fvec3) VectorShuffle 86 86 0 1 2 88: 8(fvec4) Load 84(r) 89: 8(fvec4) VectorShuffle 88 87 4 5 6 3 Store 84(r) 89 @@ -169,10 +169,10 @@ Linked fragment stage: Branch 91 92: Label 104: 8(fvec4) Load 84(r) - 105: 86(fvec3) VectorShuffle 104 104 0 1 2 + 105: 85(fvec3) VectorShuffle 104 104 0 1 2 106: 8(fvec4) Load 36(gl_FragColor) - 107: 86(fvec3) VectorShuffle 106 106 0 1 2 - 108: 86(fvec3) FAdd 107 105 + 107: 85(fvec3) VectorShuffle 106 106 0 1 2 + 108: 85(fvec3) FAdd 107 105 109: 8(fvec4) Load 36(gl_FragColor) 110: 8(fvec4) VectorShuffle 109 108 4 5 6 3 Store 36(gl_FragColor) 110