glslang -> SPV: swap arguments as needed for OpVectorTimesScalar and OpMatrixTimesScalar, and check for correct types for those as well as OpMatrixTimesVector, OpVectorTimesMatrix, and OpMatrixTimesMatrix.

git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@31486 e7fa87d3-cd2b-0410-9028-fcbf551c1848
This commit is contained in:
John Kessenich 2015-06-13 00:48:48 +00:00
Родитель 8d64d44c3f
Коммит e5e0f6e37a
8 изменённых файлов: 23 добавлений и 10 удалений

Просмотреть файл

@ -1684,9 +1684,10 @@ spv::Id TGlslangToSpvTraverser::handleUserFunctionCall(const glslang::TIntermAgg
return result; return result;
} }
// Translate AST operation to SPV operation, already having SPV-based operands/types.
spv::Id TGlslangToSpvTraverser::createBinaryOperation(glslang::TOperator op, spv::Decoration precision, spv::Id TGlslangToSpvTraverser::createBinaryOperation(glslang::TOperator op, spv::Decoration precision,
spv::Id typeId, spv::Id left, spv::Id right, spv::Id typeId, spv::Id left, spv::Id right,
glslang::TBasicType typeProxy, bool reduceComparison) glslang::TBasicType typeProxy, bool reduceComparison)
{ {
bool isUnsigned = typeProxy == glslang::EbtUint; bool isUnsigned = typeProxy == glslang::EbtUint;
bool isFloat = typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble; bool isFloat = typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble;
@ -1719,22 +1720,34 @@ spv::Id TGlslangToSpvTraverser::createBinaryOperation(glslang::TOperator op, spv
break; break;
case glslang::EOpVectorTimesScalar: case glslang::EOpVectorTimesScalar:
case glslang::EOpVectorTimesScalarAssign: case glslang::EOpVectorTimesScalarAssign:
if (builder.isVector(right))
std::swap(left, right);
assert(builder.isScalar(right));
binOp = spv::OpVectorTimesScalar; binOp = spv::OpVectorTimesScalar;
needsPromotion = false; needsPromotion = false;
break; break;
case glslang::EOpVectorTimesMatrix: case glslang::EOpVectorTimesMatrix:
case glslang::EOpVectorTimesMatrixAssign: case glslang::EOpVectorTimesMatrixAssign:
assert(builder.isVector(left));
assert(builder.isMatrix(right));
binOp = spv::OpVectorTimesMatrix; binOp = spv::OpVectorTimesMatrix;
break; break;
case glslang::EOpMatrixTimesVector: case glslang::EOpMatrixTimesVector:
assert(builder.isMatrix(left));
assert(builder.isVector(right));
binOp = spv::OpMatrixTimesVector; binOp = spv::OpMatrixTimesVector;
break; break;
case glslang::EOpMatrixTimesScalar: case glslang::EOpMatrixTimesScalar:
case glslang::EOpMatrixTimesScalarAssign: case glslang::EOpMatrixTimesScalarAssign:
if (builder.isMatrix(right))
std::swap(left, right);
assert(builder.isScalar(right));
binOp = spv::OpMatrixTimesScalar; binOp = spv::OpMatrixTimesScalar;
break; break;
case glslang::EOpMatrixTimesMatrix: case glslang::EOpMatrixTimesMatrix:
case glslang::EOpMatrixTimesMatrixAssign: case glslang::EOpMatrixTimesMatrixAssign:
assert(builder.isMatrix(left));
assert(builder.isMatrix(right));
binOp = spv::OpMatrixTimesMatrix; binOp = spv::OpMatrixTimesMatrix;
break; break;
case glslang::EOpOuterProduct: case glslang::EOpOuterProduct:

Просмотреть файл

@ -73,7 +73,7 @@ Linked fragment stage:
39: 16(int) Load 18(z) 39: 16(int) Load 18(z)
40: 7(float) ConvertSToF 39 40: 7(float) ConvertSToF 39
41: 35(fvec4) CompositeConstruct 40 40 40 40 41: 35(fvec4) CompositeConstruct 40 40 40 40
42: 35(fvec4) VectorTimesScalar 38 41 42: 35(fvec4) VectorTimesScalar 41 38
43: 7(float) FunctionCall 9(foo() 43: 7(float) FunctionCall 9(foo()
44: 35(fvec4) CompositeConstruct 43 43 43 43 44: 35(fvec4) CompositeConstruct 43 43 43 43
45: 35(fvec4) FAdd 42 44 45: 35(fvec4) FAdd 42 44

Просмотреть файл

@ -127,12 +127,12 @@ Linked geometry stage:
EmitVertex EmitVertex
55: 20(ptr) AccessChain 19(fromV) 13 13 55: 20(ptr) AccessChain 19(fromV) 13 13
56: 8(fvec3) Load 55 56: 8(fvec3) Load 55
57: 8(fvec3) VectorTimesScalar 54 56 57: 8(fvec3) VectorTimesScalar 56 54
58: 23(ptr) AccessChain 11 13 58: 23(ptr) AccessChain 11 13
Store 58 57 Store 58 57
59: 35(ptr) AccessChain 34(gl_in) 13 13 59: 35(ptr) AccessChain 34(gl_in) 13 13
60: 25(fvec4) Load 59 60: 25(fvec4) Load 59
61: 25(fvec4) VectorTimesScalar 54 60 61: 25(fvec4) VectorTimesScalar 60 54
62: 38(ptr) AccessChain 30 13 62: 38(ptr) AccessChain 30 13
Store 62 61 Store 62 61
63: 42(ptr) AccessChain 34(gl_in) 41 40 63: 42(ptr) AccessChain 34(gl_in) 41 40

Просмотреть файл

@ -145,7 +145,7 @@ Linked fragment stage:
Store 74(v) 91 Store 74(v) 91
94: 11(float) Load 67(z) 94: 11(float) Load 67(z)
95: 72(fvec4) Load 74(v) 95: 72(fvec4) Load 74(v)
96: 72(fvec4) VectorTimesScalar 94 95 96: 72(fvec4) VectorTimesScalar 95 94
Store 93(gl_FragColor) 96 Store 93(gl_FragColor) 96
Branch 6 Branch 6
6: Label 6: Label

Просмотреть файл

@ -90,7 +90,7 @@ Linked fragment stage:
41: 38 Load 40(sampler) 41: 38 Load 40(sampler)
45: 42(fvec2) Load 44(coord) 45: 42(fvec2) Load 44(coord)
46: 30(fvec4) TextureSample 41 45 46: 30(fvec4) TextureSample 41 45
47: 30(fvec4) VectorTimesScalar 37 46 47: 30(fvec4) VectorTimesScalar 46 37
Store 32(gl_FragColor) 47 Store 32(gl_FragColor) 47
Branch 6 Branch 6
6: Label 6: Label

Просмотреть файл

@ -185,7 +185,7 @@ Linked fragment stage:
114: 111 Load 113(sampler) 114: 111 Load 113(sampler)
115: 60(fvec2) Load 62(coord) 115: 60(fvec2) Load 62(coord)
116: 95(fvec4) TextureSample 114 115 116: 95(fvec4) TextureSample 114 115
117: 95(fvec4) VectorTimesScalar 110 116 117: 95(fvec4) VectorTimesScalar 116 110
Store 97(gl_FragColor) 117 Store 97(gl_FragColor) 117
Branch 6 Branch 6
6: Label 6: Label

Просмотреть файл

@ -97,7 +97,7 @@ Linked fragment stage:
52: 49 Load 51(sampler) 52: 49 Load 51(sampler)
56: 53(fvec2) Load 55(coord) 56: 53(fvec2) Load 55(coord)
57: 17(fvec4) TextureSample 52 56 57: 17(fvec4) TextureSample 52 56
58: 17(fvec4) VectorTimesScalar 48 57 58: 17(fvec4) VectorTimesScalar 57 48
Store 47(gl_FragColor) 58 Store 47(gl_FragColor) 58
Branch 6 Branch 6
6: Label 6: Label

Просмотреть файл

@ -118,7 +118,7 @@ Linked fragment stage:
60: 57 Load 59(sampler) 60: 57 Load 59(sampler)
64: 61(fvec2) Load 63(coord) 64: 61(fvec2) Load 63(coord)
65: 53(fvec4) TextureSample 60 64 65: 53(fvec4) TextureSample 60 64
66: 53(fvec4) VectorTimesScalar 56 65 66: 53(fvec4) VectorTimesScalar 65 56
Store 55(gl_FragColor) 66 Store 55(gl_FragColor) 66
70: 61(fvec2) Load 63(coord) 70: 61(fvec2) Load 63(coord)
71: 13(float) Load 31(scale) 71: 13(float) Load 31(scale)