Commit fdf6347f by John Kessenich

HLSL: Add EOpMatrixSwizzle, selectively decomposed to other ops, for issue #670.

Since EOpMatrixSwizzle is a new op, existing back-ends only work when the front end first decomposes it to other operations. So far, this is only being done for simple assignment into matrix swizzles.
parent 001dfa1c
...@@ -1115,6 +1115,9 @@ bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::T ...@@ -1115,6 +1115,9 @@ bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::T
builder.accessChainPushSwizzle(swizzle, convertGlslangToSpvType(node->getLeft()->getType())); builder.accessChainPushSwizzle(swizzle, convertGlslangToSpvType(node->getLeft()->getType()));
} }
return false; return false;
case glslang::EOpMatrixSwizzle:
logger->missingFunctionality("matrix swizzle");
return true;
case glslang::EOpLogicalOr: case glslang::EOpLogicalOr:
case glslang::EOpLogicalAnd: case glslang::EOpLogicalAnd:
{ {
......
...@@ -5,46 +5,325 @@ Shader version: 450 ...@@ -5,46 +5,325 @@ Shader version: 450
0:2 Function Parameters: 0:2 Function Parameters:
0:2 'inf' (layout(location=0 ) in float) 0:2 'inf' (layout(location=0 ) in float)
0:? Sequence 0:? Sequence
0:5 move second child to first child (temp float) 0:7 move second child to first child (temp float)
0:5 direct index (temp float) 0:7 direct index (temp float)
0:5 direct index (temp 4-component vector of float) 0:7 direct index (temp 4-component vector of float)
0:5 'm' (temp 3X4 matrix of float) 0:7 'm' (temp 3X4 matrix of float)
0:5 Constant: 0:7 Constant:
0:5 2 (const int) 0:7 2 (const int)
0:5 Constant: 0:7 Constant:
0:5 3 (const int) 0:7 3 (const int)
0:5 Constant: 0:7 Constant:
0:5 1.000000 0:7 1.000000
0:6 move second child to first child (temp float) 0:8 move second child to first child (temp float)
0:6 direct index (temp float) 0:8 direct index (temp float)
0:6 direct index (temp 4-component vector of float) 0:8 direct index (temp 4-component vector of float)
0:6 'm' (temp 3X4 matrix of float) 0:8 'm' (temp 3X4 matrix of float)
0:6 Constant: 0:8 Constant:
0:6 2 (const int) 0:8 2 (const int)
0:6 Constant:
0:6 3 (const int)
0:6 Constant:
0:6 2.000000
0:8 move second child to first child (temp 4-component vector of float)
0:8 direct index (temp 4-component vector of float)
0:8 'm' (temp 3X4 matrix of float)
0:8 Constant: 0:8 Constant:
0:8 0 (const int) 0:8 3 (const int)
0:8 Constant: 0:8 Constant:
0:8 3.000000 0:8 2.000000
0:8 3.000000 0:9 move second child to first child (temp float)
0:8 3.000000 0:9 direct index (temp float)
0:8 3.000000 0:9 direct index (temp 4-component vector of float)
0:9 move second child to first child (temp 4-component vector of float) 0:9 'm' (temp 3X4 matrix of float)
0:9 direct index (temp 4-component vector of float) 0:9 Constant:
0:9 'm' (temp 3X4 matrix of float) 0:9 2 (const int)
0:9 Constant: 0:9 Constant:
0:9 1 (const int) 0:9 3 (const int)
0:9 Constant: 0:9 Constant:
0:9 3.000000 0:9 2.000000
0:9 3.000000 0:11 move second child to first child (temp 4-component vector of float)
0:9 3.000000 0:11 direct index (temp 4-component vector of float)
0:9 3.000000 0:11 'm' (temp 3X4 matrix of float)
0:11 Constant:
0:11 0 (const int)
0:11 Constant:
0:11 3.000000
0:11 3.000000
0:11 3.000000
0:11 3.000000
0:12 move second child to first child (temp 4-component vector of float)
0:12 direct index (temp 4-component vector of float)
0:12 'm' (temp 3X4 matrix of float)
0:12 Constant:
0:12 1 (const int)
0:12 Constant:
0:12 3.000000
0:12 3.000000
0:12 3.000000
0:12 3.000000
0:13 move second child to first child (temp 4-component vector of float)
0:13 direct index (temp 4-component vector of float)
0:13 'm' (temp 3X4 matrix of float)
0:13 Constant:
0:13 1 (const int)
0:13 Constant:
0:13 3.000000
0:13 3.000000
0:13 3.000000
0:13 3.000000
0:? Sequence
0:18 move second child to first child (temp float)
0:18 direct index (temp float)
0:18 direct index (temp 4-component vector of float)
0:18 'm' (temp 3X4 matrix of float)
0:18 Constant:
0:18 0 (const int)
0:18 Constant:
0:18 0 (const int)
0:18 direct index (temp float)
0:18 'f3' (temp 3-component vector of float)
0:18 Constant:
0:18 0 (const int)
0:18 move second child to first child (temp float)
0:18 direct index (temp float)
0:18 direct index (temp 4-component vector of float)
0:18 'm' (temp 3X4 matrix of float)
0:18 Constant:
0:18 1 (const int)
0:18 Constant:
0:18 1 (const int)
0:18 direct index (temp float)
0:18 'f3' (temp 3-component vector of float)
0:18 Constant:
0:18 1 (const int)
0:18 move second child to first child (temp float)
0:18 direct index (temp float)
0:18 direct index (temp 4-component vector of float)
0:18 'm' (temp 3X4 matrix of float)
0:18 Constant:
0:18 1 (const int)
0:18 Constant:
0:18 2 (const int)
0:18 direct index (temp float)
0:18 'f3' (temp 3-component vector of float)
0:18 Constant:
0:18 2 (const int)
0:19 Sequence
0:19 move second child to first child (temp 3-component vector of float)
0:19 'intermVec' (temp 3-component vector of float)
0:19 Constant:
0:19 5.000000
0:19 5.000000
0:19 5.000000
0:19 move second child to first child (temp float)
0:19 direct index (temp float)
0:19 direct index (temp 4-component vector of float)
0:19 'm' (temp 3X4 matrix of float)
0:19 Constant:
0:19 1 (const int)
0:19 Constant:
0:19 0 (const int)
0:19 direct index (temp float)
0:19 'intermVec' (temp 3-component vector of float)
0:19 Constant:
0:19 0 (const int)
0:19 move second child to first child (temp float)
0:19 direct index (temp float)
0:19 direct index (temp 4-component vector of float)
0:19 'm' (temp 3X4 matrix of float)
0:19 Constant:
0:19 0 (const int)
0:19 Constant:
0:19 1 (const int)
0:19 direct index (temp float)
0:19 'intermVec' (temp 3-component vector of float)
0:19 Constant:
0:19 1 (const int)
0:19 move second child to first child (temp float)
0:19 direct index (temp float)
0:19 direct index (temp 4-component vector of float)
0:19 'm' (temp 3X4 matrix of float)
0:19 Constant:
0:19 2 (const int)
0:19 Constant:
0:19 0 (const int)
0:19 direct index (temp float)
0:19 'intermVec' (temp 3-component vector of float)
0:19 Constant:
0:19 2 (const int)
0:20 Sequence
0:20 move second child to first child (temp 3-component vector of float)
0:20 'intermVec' (temp 3-component vector of float)
0:20 vector-scale (temp 3-component vector of float)
0:20 Constant:
0:20 2.000000
0:20 'f3' (temp 3-component vector of float)
0:20 move second child to first child (temp float)
0:20 direct index (temp float)
0:20 direct index (temp 4-component vector of float)
0:20 'm' (temp 3X4 matrix of float)
0:20 Constant:
0:20 0 (const int)
0:20 Constant:
0:20 0 (const int)
0:20 direct index (temp float)
0:20 'intermVec' (temp 3-component vector of float)
0:20 Constant:
0:20 0 (const int)
0:20 move second child to first child (temp float)
0:20 direct index (temp float)
0:20 direct index (temp 4-component vector of float)
0:20 'm' (temp 3X4 matrix of float)
0:20 Constant:
0:20 0 (const int)
0:20 Constant:
0:20 1 (const int)
0:20 direct index (temp float)
0:20 'intermVec' (temp 3-component vector of float)
0:20 Constant:
0:20 1 (const int)
0:20 move second child to first child (temp float)
0:20 direct index (temp float)
0:20 direct index (temp 4-component vector of float)
0:20 'm' (temp 3X4 matrix of float)
0:20 Constant:
0:20 1 (const int)
0:20 Constant:
0:20 0 (const int)
0:20 direct index (temp float)
0:20 'intermVec' (temp 3-component vector of float)
0:20 Constant:
0:20 2 (const int)
0:23 move second child to first child (temp 3-component vector of float)
0:23 'f3' (temp 3-component vector of float)
0:23 matrix swizzle (temp 3-component vector of float)
0:23 'm' (temp 3X4 matrix of float)
0:23 Sequence
0:23 Constant:
0:23 1 (const int)
0:23 Constant:
0:23 0 (const int)
0:23 Constant:
0:23 0 (const int)
0:23 Constant:
0:23 1 (const int)
0:23 Constant:
0:23 2 (const int)
0:23 Constant:
0:23 0 (const int)
0:27 Function Definition: createMat3x3(vf3;vf3;vf3; (temp 3X3 matrix of float)
0:27 Function Parameters:
0:27 'a' (in 3-component vector of float)
0:27 'b' (in 3-component vector of float)
0:27 'c' (in 3-component vector of float)
0:? Sequence
0:? Sequence
0:29 move second child to first child (temp float)
0:29 direct index (temp float)
0:29 direct index (temp 3-component vector of float)
0:29 'm' (temp 3X3 matrix of float)
0:29 Constant:
0:29 0 (const int)
0:29 Constant:
0:29 0 (const int)
0:29 direct index (temp float)
0:29 'a' (in 3-component vector of float)
0:29 Constant:
0:29 0 (const int)
0:29 move second child to first child (temp float)
0:29 direct index (temp float)
0:29 direct index (temp 3-component vector of float)
0:29 'm' (temp 3X3 matrix of float)
0:29 Constant:
0:29 1 (const int)
0:29 Constant:
0:29 0 (const int)
0:29 direct index (temp float)
0:29 'a' (in 3-component vector of float)
0:29 Constant:
0:29 1 (const int)
0:29 move second child to first child (temp float)
0:29 direct index (temp float)
0:29 direct index (temp 3-component vector of float)
0:29 'm' (temp 3X3 matrix of float)
0:29 Constant:
0:29 2 (const int)
0:29 Constant:
0:29 0 (const int)
0:29 direct index (temp float)
0:29 'a' (in 3-component vector of float)
0:29 Constant:
0:29 2 (const int)
0:? Sequence
0:30 move second child to first child (temp float)
0:30 direct index (temp float)
0:30 direct index (temp 3-component vector of float)
0:30 'm' (temp 3X3 matrix of float)
0:30 Constant:
0:30 0 (const int)
0:30 Constant:
0:30 1 (const int)
0:30 direct index (temp float)
0:30 'b' (in 3-component vector of float)
0:30 Constant:
0:30 0 (const int)
0:30 move second child to first child (temp float)
0:30 direct index (temp float)
0:30 direct index (temp 3-component vector of float)
0:30 'm' (temp 3X3 matrix of float)
0:30 Constant:
0:30 1 (const int)
0:30 Constant:
0:30 1 (const int)
0:30 direct index (temp float)
0:30 'b' (in 3-component vector of float)
0:30 Constant:
0:30 1 (const int)
0:30 move second child to first child (temp float)
0:30 direct index (temp float)
0:30 direct index (temp 3-component vector of float)
0:30 'm' (temp 3X3 matrix of float)
0:30 Constant:
0:30 2 (const int)
0:30 Constant:
0:30 1 (const int)
0:30 direct index (temp float)
0:30 'b' (in 3-component vector of float)
0:30 Constant:
0:30 2 (const int)
0:? Sequence
0:31 move second child to first child (temp float)
0:31 direct index (temp float)
0:31 direct index (temp 3-component vector of float)
0:31 'm' (temp 3X3 matrix of float)
0:31 Constant:
0:31 0 (const int)
0:31 Constant:
0:31 2 (const int)
0:31 direct index (temp float)
0:31 'c' (in 3-component vector of float)
0:31 Constant:
0:31 0 (const int)
0:31 move second child to first child (temp float)
0:31 direct index (temp float)
0:31 direct index (temp 3-component vector of float)
0:31 'm' (temp 3X3 matrix of float)
0:31 Constant:
0:31 1 (const int)
0:31 Constant:
0:31 2 (const int)
0:31 direct index (temp float)
0:31 'c' (in 3-component vector of float)
0:31 Constant:
0:31 1 (const int)
0:31 move second child to first child (temp float)
0:31 direct index (temp float)
0:31 direct index (temp 3-component vector of float)
0:31 'm' (temp 3X3 matrix of float)
0:31 Constant:
0:31 2 (const int)
0:31 Constant:
0:31 2 (const int)
0:31 direct index (temp float)
0:31 'c' (in 3-component vector of float)
0:31 Constant:
0:31 2 (const int)
0:32 Branch: Return with expression
0:32 'm' (temp 3X3 matrix of float)
0:? Linker Objects 0:? Linker Objects
0:? 'inf' (layout(location=0 ) in float) 0:? 'inf' (layout(location=0 ) in float)
...@@ -58,91 +337,482 @@ Shader version: 450 ...@@ -58,91 +337,482 @@ Shader version: 450
0:2 Function Parameters: 0:2 Function Parameters:
0:2 'inf' (layout(location=0 ) in float) 0:2 'inf' (layout(location=0 ) in float)
0:? Sequence 0:? Sequence
0:5 move second child to first child (temp float) 0:7 move second child to first child (temp float)
0:5 direct index (temp float) 0:7 direct index (temp float)
0:5 direct index (temp 4-component vector of float) 0:7 direct index (temp 4-component vector of float)
0:5 'm' (temp 3X4 matrix of float) 0:7 'm' (temp 3X4 matrix of float)
0:5 Constant: 0:7 Constant:
0:5 2 (const int) 0:7 2 (const int)
0:5 Constant: 0:7 Constant:
0:5 3 (const int) 0:7 3 (const int)
0:5 Constant: 0:7 Constant:
0:5 1.000000 0:7 1.000000
0:6 move second child to first child (temp float) 0:8 move second child to first child (temp float)
0:6 direct index (temp float) 0:8 direct index (temp float)
0:6 direct index (temp 4-component vector of float) 0:8 direct index (temp 4-component vector of float)
0:6 'm' (temp 3X4 matrix of float) 0:8 'm' (temp 3X4 matrix of float)
0:6 Constant: 0:8 Constant:
0:6 2 (const int) 0:8 2 (const int)
0:6 Constant:
0:6 3 (const int)
0:6 Constant:
0:6 2.000000
0:8 move second child to first child (temp 4-component vector of float)
0:8 direct index (temp 4-component vector of float)
0:8 'm' (temp 3X4 matrix of float)
0:8 Constant: 0:8 Constant:
0:8 0 (const int) 0:8 3 (const int)
0:8 Constant: 0:8 Constant:
0:8 3.000000 0:8 2.000000
0:8 3.000000 0:9 move second child to first child (temp float)
0:8 3.000000 0:9 direct index (temp float)
0:8 3.000000 0:9 direct index (temp 4-component vector of float)
0:9 move second child to first child (temp 4-component vector of float) 0:9 'm' (temp 3X4 matrix of float)
0:9 direct index (temp 4-component vector of float) 0:9 Constant:
0:9 'm' (temp 3X4 matrix of float) 0:9 2 (const int)
0:9 Constant: 0:9 Constant:
0:9 1 (const int) 0:9 3 (const int)
0:9 Constant: 0:9 Constant:
0:9 3.000000 0:9 2.000000
0:9 3.000000 0:11 move second child to first child (temp 4-component vector of float)
0:9 3.000000 0:11 direct index (temp 4-component vector of float)
0:9 3.000000 0:11 'm' (temp 3X4 matrix of float)
0:11 Constant:
0:11 0 (const int)
0:11 Constant:
0:11 3.000000
0:11 3.000000
0:11 3.000000
0:11 3.000000
0:12 move second child to first child (temp 4-component vector of float)
0:12 direct index (temp 4-component vector of float)
0:12 'm' (temp 3X4 matrix of float)
0:12 Constant:
0:12 1 (const int)
0:12 Constant:
0:12 3.000000
0:12 3.000000
0:12 3.000000
0:12 3.000000
0:13 move second child to first child (temp 4-component vector of float)
0:13 direct index (temp 4-component vector of float)
0:13 'm' (temp 3X4 matrix of float)
0:13 Constant:
0:13 1 (const int)
0:13 Constant:
0:13 3.000000
0:13 3.000000
0:13 3.000000
0:13 3.000000
0:? Sequence
0:18 move second child to first child (temp float)
0:18 direct index (temp float)
0:18 direct index (temp 4-component vector of float)
0:18 'm' (temp 3X4 matrix of float)
0:18 Constant:
0:18 0 (const int)
0:18 Constant:
0:18 0 (const int)
0:18 direct index (temp float)
0:18 'f3' (temp 3-component vector of float)
0:18 Constant:
0:18 0 (const int)
0:18 move second child to first child (temp float)
0:18 direct index (temp float)
0:18 direct index (temp 4-component vector of float)
0:18 'm' (temp 3X4 matrix of float)
0:18 Constant:
0:18 1 (const int)
0:18 Constant:
0:18 1 (const int)
0:18 direct index (temp float)
0:18 'f3' (temp 3-component vector of float)
0:18 Constant:
0:18 1 (const int)
0:18 move second child to first child (temp float)
0:18 direct index (temp float)
0:18 direct index (temp 4-component vector of float)
0:18 'm' (temp 3X4 matrix of float)
0:18 Constant:
0:18 1 (const int)
0:18 Constant:
0:18 2 (const int)
0:18 direct index (temp float)
0:18 'f3' (temp 3-component vector of float)
0:18 Constant:
0:18 2 (const int)
0:19 Sequence
0:19 move second child to first child (temp 3-component vector of float)
0:19 'intermVec' (temp 3-component vector of float)
0:19 Constant:
0:19 5.000000
0:19 5.000000
0:19 5.000000
0:19 move second child to first child (temp float)
0:19 direct index (temp float)
0:19 direct index (temp 4-component vector of float)
0:19 'm' (temp 3X4 matrix of float)
0:19 Constant:
0:19 1 (const int)
0:19 Constant:
0:19 0 (const int)
0:19 direct index (temp float)
0:19 'intermVec' (temp 3-component vector of float)
0:19 Constant:
0:19 0 (const int)
0:19 move second child to first child (temp float)
0:19 direct index (temp float)
0:19 direct index (temp 4-component vector of float)
0:19 'm' (temp 3X4 matrix of float)
0:19 Constant:
0:19 0 (const int)
0:19 Constant:
0:19 1 (const int)
0:19 direct index (temp float)
0:19 'intermVec' (temp 3-component vector of float)
0:19 Constant:
0:19 1 (const int)
0:19 move second child to first child (temp float)
0:19 direct index (temp float)
0:19 direct index (temp 4-component vector of float)
0:19 'm' (temp 3X4 matrix of float)
0:19 Constant:
0:19 2 (const int)
0:19 Constant:
0:19 0 (const int)
0:19 direct index (temp float)
0:19 'intermVec' (temp 3-component vector of float)
0:19 Constant:
0:19 2 (const int)
0:20 Sequence
0:20 move second child to first child (temp 3-component vector of float)
0:20 'intermVec' (temp 3-component vector of float)
0:20 vector-scale (temp 3-component vector of float)
0:20 Constant:
0:20 2.000000
0:20 'f3' (temp 3-component vector of float)
0:20 move second child to first child (temp float)
0:20 direct index (temp float)
0:20 direct index (temp 4-component vector of float)
0:20 'm' (temp 3X4 matrix of float)
0:20 Constant:
0:20 0 (const int)
0:20 Constant:
0:20 0 (const int)
0:20 direct index (temp float)
0:20 'intermVec' (temp 3-component vector of float)
0:20 Constant:
0:20 0 (const int)
0:20 move second child to first child (temp float)
0:20 direct index (temp float)
0:20 direct index (temp 4-component vector of float)
0:20 'm' (temp 3X4 matrix of float)
0:20 Constant:
0:20 0 (const int)
0:20 Constant:
0:20 1 (const int)
0:20 direct index (temp float)
0:20 'intermVec' (temp 3-component vector of float)
0:20 Constant:
0:20 1 (const int)
0:20 move second child to first child (temp float)
0:20 direct index (temp float)
0:20 direct index (temp 4-component vector of float)
0:20 'm' (temp 3X4 matrix of float)
0:20 Constant:
0:20 1 (const int)
0:20 Constant:
0:20 0 (const int)
0:20 direct index (temp float)
0:20 'intermVec' (temp 3-component vector of float)
0:20 Constant:
0:20 2 (const int)
0:23 move second child to first child (temp 3-component vector of float)
0:23 'f3' (temp 3-component vector of float)
0:23 matrix swizzle (temp 3-component vector of float)
0:23 'm' (temp 3X4 matrix of float)
0:23 Sequence
0:23 Constant:
0:23 1 (const int)
0:23 Constant:
0:23 0 (const int)
0:23 Constant:
0:23 0 (const int)
0:23 Constant:
0:23 1 (const int)
0:23 Constant:
0:23 2 (const int)
0:23 Constant:
0:23 0 (const int)
0:27 Function Definition: createMat3x3(vf3;vf3;vf3; (temp 3X3 matrix of float)
0:27 Function Parameters:
0:27 'a' (in 3-component vector of float)
0:27 'b' (in 3-component vector of float)
0:27 'c' (in 3-component vector of float)
0:? Sequence
0:? Sequence
0:29 move second child to first child (temp float)
0:29 direct index (temp float)
0:29 direct index (temp 3-component vector of float)
0:29 'm' (temp 3X3 matrix of float)
0:29 Constant:
0:29 0 (const int)
0:29 Constant:
0:29 0 (const int)
0:29 direct index (temp float)
0:29 'a' (in 3-component vector of float)
0:29 Constant:
0:29 0 (const int)
0:29 move second child to first child (temp float)
0:29 direct index (temp float)
0:29 direct index (temp 3-component vector of float)
0:29 'm' (temp 3X3 matrix of float)
0:29 Constant:
0:29 1 (const int)
0:29 Constant:
0:29 0 (const int)
0:29 direct index (temp float)
0:29 'a' (in 3-component vector of float)
0:29 Constant:
0:29 1 (const int)
0:29 move second child to first child (temp float)
0:29 direct index (temp float)
0:29 direct index (temp 3-component vector of float)
0:29 'm' (temp 3X3 matrix of float)
0:29 Constant:
0:29 2 (const int)
0:29 Constant:
0:29 0 (const int)
0:29 direct index (temp float)
0:29 'a' (in 3-component vector of float)
0:29 Constant:
0:29 2 (const int)
0:? Sequence
0:30 move second child to first child (temp float)
0:30 direct index (temp float)
0:30 direct index (temp 3-component vector of float)
0:30 'm' (temp 3X3 matrix of float)
0:30 Constant:
0:30 0 (const int)
0:30 Constant:
0:30 1 (const int)
0:30 direct index (temp float)
0:30 'b' (in 3-component vector of float)
0:30 Constant:
0:30 0 (const int)
0:30 move second child to first child (temp float)
0:30 direct index (temp float)
0:30 direct index (temp 3-component vector of float)
0:30 'm' (temp 3X3 matrix of float)
0:30 Constant:
0:30 1 (const int)
0:30 Constant:
0:30 1 (const int)
0:30 direct index (temp float)
0:30 'b' (in 3-component vector of float)
0:30 Constant:
0:30 1 (const int)
0:30 move second child to first child (temp float)
0:30 direct index (temp float)
0:30 direct index (temp 3-component vector of float)
0:30 'm' (temp 3X3 matrix of float)
0:30 Constant:
0:30 2 (const int)
0:30 Constant:
0:30 1 (const int)
0:30 direct index (temp float)
0:30 'b' (in 3-component vector of float)
0:30 Constant:
0:30 2 (const int)
0:? Sequence
0:31 move second child to first child (temp float)
0:31 direct index (temp float)
0:31 direct index (temp 3-component vector of float)
0:31 'm' (temp 3X3 matrix of float)
0:31 Constant:
0:31 0 (const int)
0:31 Constant:
0:31 2 (const int)
0:31 direct index (temp float)
0:31 'c' (in 3-component vector of float)
0:31 Constant:
0:31 0 (const int)
0:31 move second child to first child (temp float)
0:31 direct index (temp float)
0:31 direct index (temp 3-component vector of float)
0:31 'm' (temp 3X3 matrix of float)
0:31 Constant:
0:31 1 (const int)
0:31 Constant:
0:31 2 (const int)
0:31 direct index (temp float)
0:31 'c' (in 3-component vector of float)
0:31 Constant:
0:31 1 (const int)
0:31 move second child to first child (temp float)
0:31 direct index (temp float)
0:31 direct index (temp 3-component vector of float)
0:31 'm' (temp 3X3 matrix of float)
0:31 Constant:
0:31 2 (const int)
0:31 Constant:
0:31 2 (const int)
0:31 direct index (temp float)
0:31 'c' (in 3-component vector of float)
0:31 Constant:
0:31 2 (const int)
0:32 Branch: Return with expression
0:32 'm' (temp 3X3 matrix of float)
0:? Linker Objects 0:? Linker Objects
0:? 'inf' (layout(location=0 ) in float) 0:? 'inf' (layout(location=0 ) in float)
Missing functionality: matrix swizzle
// Module Version 10000 // Module Version 10000
// Generated by (magic number): 80001 // Generated by (magic number): 80001
// Id's are bound by 29 // Id's are bound by 109
Capability Shader Capability Shader
1: ExtInstImport "GLSL.std.450" 1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450 MemoryModel Logical GLSL450
EntryPoint Vertex 4 "ShaderFunction" 28 EntryPoint Vertex 4 "ShaderFunction" 108
Name 4 "ShaderFunction" Name 4 "ShaderFunction"
Name 10 "m" Name 14 "createMat3x3(vf3;vf3;vf3;"
Name 28 "inf" Name 11 "a"
Decorate 28(inf) Location 0 Name 12 "b"
Name 13 "c"
Name 19 "m"
Name 38 "f3"
Name 51 "intermVec"
Name 63 "intermVec"
Name 76 "m"
Name 108 "inf"
Decorate 108(inf) Location 0
2: TypeVoid 2: TypeVoid
3: TypeFunction 2 3: TypeFunction 2
6: TypeFloat 32 6: TypeFloat 32
7: TypeVector 6(float) 4 7: TypeVector 6(float) 3
8: TypeMatrix 7(fvec4) 3 8: TypePointer Function 7(fvec3)
9: TypePointer Function 8 9: TypeMatrix 7(fvec3) 3
11: TypeInt 32 1 10: TypeFunction 9 8(ptr) 8(ptr) 8(ptr)
12: 11(int) Constant 2 16: TypeVector 6(float) 4
13: 6(float) Constant 1065353216 17: TypeMatrix 16(fvec4) 3
14: TypeInt 32 0 18: TypePointer Function 17
15: 14(int) Constant 3 20: TypeInt 32 1
16: TypePointer Function 6(float) 21: 20(int) Constant 2
18: 6(float) Constant 1073741824 22: 6(float) Constant 1065353216
20: 11(int) Constant 0 23: TypeInt 32 0
21: 6(float) Constant 1077936128 24: 23(int) Constant 3
22: 7(fvec4) ConstantComposite 21 21 21 21 25: TypePointer Function 6(float)
23: TypePointer Function 7(fvec4) 27: 6(float) Constant 1073741824
25: 11(int) Constant 1 30: 20(int) Constant 0
27: TypePointer Input 6(float) 31: 6(float) Constant 1077936128
28(inf): 27(ptr) Variable Input 32: 16(fvec4) ConstantComposite 31 31 31 31
33: TypePointer Function 16(fvec4)
35: 20(int) Constant 1
39: 23(int) Constant 0
43: 23(int) Constant 1
47: 23(int) Constant 2
52: 6(float) Constant 1084227584
53: 7(fvec3) ConstantComposite 52 52 52
75: TypePointer Function 9
107: TypePointer Input 6(float)
108(inf): 107(ptr) Variable Input
4(ShaderFunction): 2 Function None 3 4(ShaderFunction): 2 Function None 3
5: Label 5: Label
10(m): 9(ptr) Variable Function 19(m): 18(ptr) Variable Function
17: 16(ptr) AccessChain 10(m) 12 15 38(f3): 8(ptr) Variable Function
Store 17 13 51(intermVec): 8(ptr) Variable Function
19: 16(ptr) AccessChain 10(m) 12 15 63(intermVec): 8(ptr) Variable Function
Store 19 18 26: 25(ptr) AccessChain 19(m) 21 24
24: 23(ptr) AccessChain 10(m) 20
Store 24 22
26: 23(ptr) AccessChain 10(m) 25
Store 26 22 Store 26 22
28: 25(ptr) AccessChain 19(m) 21 24
Store 28 27
29: 25(ptr) AccessChain 19(m) 21 24
Store 29 27
34: 33(ptr) AccessChain 19(m) 30
Store 34 32
36: 33(ptr) AccessChain 19(m) 35
Store 36 32
37: 33(ptr) AccessChain 19(m) 35
Store 37 32
40: 25(ptr) AccessChain 38(f3) 39
41: 6(float) Load 40
42: 25(ptr) AccessChain 19(m) 30 39
Store 42 41
44: 25(ptr) AccessChain 38(f3) 43
45: 6(float) Load 44
46: 25(ptr) AccessChain 19(m) 35 43
Store 46 45
48: 25(ptr) AccessChain 38(f3) 47
49: 6(float) Load 48
50: 25(ptr) AccessChain 19(m) 35 47
Store 50 49
Store 51(intermVec) 53
54: 25(ptr) AccessChain 51(intermVec) 39
55: 6(float) Load 54
56: 25(ptr) AccessChain 19(m) 35 39
Store 56 55
57: 25(ptr) AccessChain 51(intermVec) 43
58: 6(float) Load 57
59: 25(ptr) AccessChain 19(m) 30 43
Store 59 58
60: 25(ptr) AccessChain 51(intermVec) 47
61: 6(float) Load 60
62: 25(ptr) AccessChain 19(m) 21 39
Store 62 61
64: 7(fvec3) Load 38(f3)
65: 7(fvec3) VectorTimesScalar 64 27
Store 63(intermVec) 65
66: 25(ptr) AccessChain 63(intermVec) 39
67: 6(float) Load 66
68: 25(ptr) AccessChain 19(m) 30 39
Store 68 67
69: 25(ptr) AccessChain 63(intermVec) 43
70: 6(float) Load 69
71: 25(ptr) AccessChain 19(m) 30 43
Store 71 70
72: 25(ptr) AccessChain 63(intermVec) 47
73: 6(float) Load 72
74: 25(ptr) AccessChain 19(m) 35 39
Store 74 73
Store 38(f3) 30
Return Return
FunctionEnd FunctionEnd
14(createMat3x3(vf3;vf3;vf3;): 9 Function None 10
11(a): 8(ptr) FunctionParameter
12(b): 8(ptr) FunctionParameter
13(c): 8(ptr) FunctionParameter
15: Label
76(m): 75(ptr) Variable Function
77: 25(ptr) AccessChain 11(a) 39
78: 6(float) Load 77
79: 25(ptr) AccessChain 76(m) 30 39
Store 79 78
80: 25(ptr) AccessChain 11(a) 43
81: 6(float) Load 80
82: 25(ptr) AccessChain 76(m) 35 39
Store 82 81
83: 25(ptr) AccessChain 11(a) 47
84: 6(float) Load 83
85: 25(ptr) AccessChain 76(m) 21 39
Store 85 84
86: 25(ptr) AccessChain 12(b) 39
87: 6(float) Load 86
88: 25(ptr) AccessChain 76(m) 30 43
Store 88 87
89: 25(ptr) AccessChain 12(b) 43
90: 6(float) Load 89
91: 25(ptr) AccessChain 76(m) 35 43
Store 91 90
92: 25(ptr) AccessChain 12(b) 47
93: 6(float) Load 92
94: 25(ptr) AccessChain 76(m) 21 43
Store 94 93
95: 25(ptr) AccessChain 13(c) 39
96: 6(float) Load 95
97: 25(ptr) AccessChain 76(m) 30 47
Store 97 96
98: 25(ptr) AccessChain 13(c) 43
99: 6(float) Load 98
100: 25(ptr) AccessChain 76(m) 35 47
Store 100 99
101: 25(ptr) AccessChain 13(c) 47
102: 6(float) Load 101
103: 25(ptr) AccessChain 76(m) 21 47
Store 103 102
104: 9 Load 76(m)
ReturnValue 104
FunctionEnd
...@@ -2,9 +2,32 @@ void ShaderFunction(float inf) : COLOR0 ...@@ -2,9 +2,32 @@ void ShaderFunction(float inf) : COLOR0
{ {
float3x4 m; float3x4 m;
// tests that convert to non-matrix swizzles
m._34 = 1.0; // AST should have a normal component select m._34 = 1.0; // AST should have a normal component select
m._m23 = 2.0; // same code m._m23 = 2.0; // same code
m[2][3] = 2.0; // same code
m._11_12_13_14 = float4(3.0); // AST should have normal column selection (first row) m._11_12_13_14 = float4(3.0); // AST should have normal column selection (first row)
m._m10_m11_m12_m13 = float4(3.0); // AST should have normal column selection (second row) m._m10_m11_m12_m13 = float4(3.0); // AST should have normal column selection (second row)
m[1] = float4(3.0); // same code
// tests that stay as matrix swizzles
float3 f3;
m._11_22_23 = f3;
m._21_12_31 = float3(5.0);
m._11_12_21 = 2 * f3;
// r-value
f3 = m._21_12_31;
}
float3x3 createMat3x3(float3 a, float3 b, float3 c)
{
float3x3 m;
m._11_21_31 = a;
m._12_22_32 = b;
m._13_23_33 = c;
return m;
} }
...@@ -626,6 +626,9 @@ enum TOperator { ...@@ -626,6 +626,9 @@ enum TOperator {
// geometry methods // geometry methods
EOpMethodAppend, // Geometry shader methods EOpMethodAppend, // Geometry shader methods
EOpMethodRestartStrip, // ... EOpMethodRestartStrip, // ...
// matrix
EOpMatrixSwizzle, // select multiple matrix components (non-column)
}; };
class TIntermTraverser; class TIntermTraverser;
......
...@@ -2,5 +2,5 @@ ...@@ -2,5 +2,5 @@
// For the version, it uses the latest git tag followed by the number of commits. // 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). // For the date, it uses the current date (when then script is run).
#define GLSLANG_REVISION "Overload400-PrecQual.1764" #define GLSLANG_REVISION "Overload400-PrecQual.1766"
#define GLSLANG_DATE "12-Jan-2017" #define GLSLANG_DATE "13-Jan-2017"
...@@ -1408,6 +1408,26 @@ TIntermTyped* TIntermediate::addSwizzle(TVectorFields& fields, const TSourceLoc& ...@@ -1408,6 +1408,26 @@ TIntermTyped* TIntermediate::addSwizzle(TVectorFields& fields, const TSourceLoc&
return node; return node;
} }
// A matrix swizzle is a sequence of nodes, 2N long, where N is the
// number of components in the swizzle, alternating col,row, col,row, ...
TIntermTyped* TIntermediate::addSwizzle(TMatrixComponents& comps, const TSourceLoc& loc)
{
TIntermAggregate* node = new TIntermAggregate(EOpSequence);
node->setLoc(loc);
TIntermConstantUnion* constIntNode;
TIntermSequence &sequenceVector = node->getSequence();
for (int i = 0; i < comps.size(); i++) {
constIntNode = addConstantUnion(comps.get(i).coord1, loc);
sequenceVector.push_back(constIntNode);
constIntNode = addConstantUnion(comps.get(i).coord2, loc);
sequenceVector.push_back(constIntNode);
}
return node;
}
// //
// Follow the left branches down to the root of an l-value // Follow the left branches down to the root of an l-value
// expression (just "." and []). // expression (just "." and []).
...@@ -1425,10 +1445,10 @@ const TIntermTyped* TIntermediate::findLValueBase(const TIntermTyped* node, bool ...@@ -1425,10 +1445,10 @@ const TIntermTyped* TIntermediate::findLValueBase(const TIntermTyped* node, bool
if (binary == nullptr) if (binary == nullptr)
return node; return node;
TOperator op = binary->getOp(); TOperator op = binary->getOp();
if (op != EOpIndexDirect && op != EOpIndexIndirect && op != EOpIndexDirectStruct && op != EOpVectorSwizzle) if (op != EOpIndexDirect && op != EOpIndexIndirect && op != EOpIndexDirectStruct && op != EOpVectorSwizzle && op != EOpMatrixSwizzle)
return nullptr; return nullptr;
if (! swizzleOkay) { if (! swizzleOkay) {
if (op == EOpVectorSwizzle) if (op == EOpVectorSwizzle || op == EOpMatrixSwizzle)
return nullptr; return nullptr;
if ((op == EOpIndexDirect || op == EOpIndexIndirect) && if ((op == EOpIndexDirect || op == EOpIndexIndirect) &&
(binary->getLeft()->getType().isVector() || binary->getLeft()->getType().isScalar()) && (binary->getLeft()->getType().isVector() || binary->getLeft()->getType().isScalar()) &&
......
...@@ -129,6 +129,7 @@ bool TParseContextBase::lValueErrorCheck(const TSourceLoc& loc, const char* op, ...@@ -129,6 +129,7 @@ bool TParseContextBase::lValueErrorCheck(const TSourceLoc& loc, const char* op,
case EOpIndexIndirect: // fall through case EOpIndexIndirect: // fall through
case EOpIndexDirectStruct: // fall through case EOpIndexDirectStruct: // fall through
case EOpVectorSwizzle: case EOpVectorSwizzle:
case EOpMatrixSwizzle:
return lValueErrorCheck(loc, op, binaryNode->getLeft()); return lValueErrorCheck(loc, op, binaryNode->getLeft());
default: default:
break; break;
...@@ -208,6 +209,7 @@ void TParseContextBase::rValueErrorCheck(const TSourceLoc& loc, const char* op, ...@@ -208,6 +209,7 @@ void TParseContextBase::rValueErrorCheck(const TSourceLoc& loc, const char* op,
case EOpIndexIndirect: case EOpIndexIndirect:
case EOpIndexDirectStruct: case EOpIndexDirectStruct:
case EOpVectorSwizzle: case EOpVectorSwizzle:
case EOpMatrixSwizzle:
rValueErrorCheck(loc, op, binaryNode->getLeft()); rValueErrorCheck(loc, op, binaryNode->getLeft());
default: default:
break; break;
......
...@@ -146,6 +146,7 @@ bool TOutputTraverser::visitBinary(TVisit /* visit */, TIntermBinary* node) ...@@ -146,6 +146,7 @@ bool TOutputTraverser::visitBinary(TVisit /* visit */, TIntermBinary* node)
out.debug << (*node->getLeft()->getType().getStruct())[node->getRight()->getAsConstantUnion()->getConstArray()[0].getIConst()].type->getFieldName(); out.debug << (*node->getLeft()->getType().getStruct())[node->getRight()->getAsConstantUnion()->getConstArray()[0].getIConst()].type->getFieldName();
out.debug << ": direct index for structure"; break; out.debug << ": direct index for structure"; break;
case EOpVectorSwizzle: out.debug << "vector swizzle"; break; case EOpVectorSwizzle: out.debug << "vector swizzle"; break;
case EOpMatrixSwizzle: out.debug << "matrix swizzle"; break;
case EOpAdd: out.debug << "add"; break; case EOpAdd: out.debug << "add"; break;
case EOpSub: out.debug << "subtract"; break; case EOpSub: out.debug << "subtract"; break;
......
...@@ -275,6 +275,7 @@ public: ...@@ -275,6 +275,7 @@ public:
TIntermBranch* addBranch(TOperator, const TSourceLoc&); TIntermBranch* addBranch(TOperator, const TSourceLoc&);
TIntermBranch* addBranch(TOperator, TIntermTyped*, const TSourceLoc&); TIntermBranch* addBranch(TOperator, TIntermTyped*, const TSourceLoc&);
TIntermTyped* addSwizzle(TVectorFields&, const TSourceLoc&); TIntermTyped* addSwizzle(TVectorFields&, const TSourceLoc&);
TIntermTyped* addSwizzle(TMatrixComponents&, const TSourceLoc&);
// Low level functions to add nodes (no conversions or other higher level transformations) // Low level functions to add nodes (no conversions or other higher level transformations)
// If a type is provided, the node's type will be set to it. // If a type is provided, the node's type will be set to it.
......
...@@ -90,6 +90,7 @@ bool isDereferenceOperation(glslang::TOperator op) ...@@ -90,6 +90,7 @@ bool isDereferenceOperation(glslang::TOperator op)
case glslang::EOpIndexDirectStruct: case glslang::EOpIndexDirectStruct:
case glslang::EOpIndexIndirect: case glslang::EOpIndexIndirect:
case glslang::EOpVectorSwizzle: case glslang::EOpVectorSwizzle:
case glslang::EOpMatrixSwizzle:
return true; return true;
default: default:
return false; return false;
......
...@@ -966,10 +966,9 @@ TIntermTyped* HlslParseContext::handleDotDereference(const TSourceLoc& loc, TInt ...@@ -966,10 +966,9 @@ TIntermTyped* HlslParseContext::handleDotDereference(const TSourceLoc& loc, TInt
result = intermediate.addIndex(EOpIndexDirect, base, index, loc); result = intermediate.addIndex(EOpIndexDirect, base, index, loc);
result->setType(TType(base->getBasicType(), EvqTemporary)); result->setType(TType(base->getBasicType(), EvqTemporary));
} else { } else {
TString vectorString = field;
TIntermTyped* index = intermediate.addSwizzle(fields, loc); TIntermTyped* index = intermediate.addSwizzle(fields, loc);
result = intermediate.addIndex(EOpVectorSwizzle, base, index, loc); result = intermediate.addIndex(EOpVectorSwizzle, base, index, loc);
result->setType(TType(base->getBasicType(), EvqTemporary, base->getType().getQualifier().precision, (int)vectorString.size())); result->setType(TType(base->getBasicType(), EvqTemporary, base->getType().getQualifier().precision, fields.num));
} }
} }
} else if (base->isMatrix()) { } else if (base->isMatrix()) {
...@@ -979,7 +978,7 @@ TIntermTyped* HlslParseContext::handleDotDereference(const TSourceLoc& loc, TInt ...@@ -979,7 +978,7 @@ TIntermTyped* HlslParseContext::handleDotDereference(const TSourceLoc& loc, TInt
if (comps.size() == 1) { if (comps.size() == 1) {
// Representable by m[c][r] // Representable by m[c][r]
if (base->getType().getQualifier().storage == EvqConst) { if (base->getType().getQualifier().isFrontEndConstant()) {
result = intermediate.foldDereference(base, comps.get(0).coord1, loc); result = intermediate.foldDereference(base, comps.get(0).coord1, loc);
result = intermediate.foldDereference(result, comps.get(1).coord2, loc); result = intermediate.foldDereference(result, comps.get(1).coord2, loc);
} else { } else {
...@@ -994,7 +993,7 @@ TIntermTyped* HlslParseContext::handleDotDereference(const TSourceLoc& loc, TInt ...@@ -994,7 +993,7 @@ TIntermTyped* HlslParseContext::handleDotDereference(const TSourceLoc& loc, TInt
int column = getMatrixComponentsColumn(base->getMatrixRows(), comps); int column = getMatrixComponentsColumn(base->getMatrixRows(), comps);
if (column >= 0) { if (column >= 0) {
// Representable by m[c] // Representable by m[c]
if (base->getType().getQualifier().storage == EvqConst) if (base->getType().getQualifier().isFrontEndConstant())
result = intermediate.foldDereference(base, column, loc); result = intermediate.foldDereference(base, column, loc);
else { else {
result = intermediate.addIndex(EOpIndexDirect, base, intermediate.addConstantUnion(column, loc), loc); result = intermediate.addIndex(EOpIndexDirect, base, intermediate.addConstantUnion(column, loc), loc);
...@@ -1003,8 +1002,10 @@ TIntermTyped* HlslParseContext::handleDotDereference(const TSourceLoc& loc, TInt ...@@ -1003,8 +1002,10 @@ TIntermTyped* HlslParseContext::handleDotDereference(const TSourceLoc& loc, TInt
} }
} else { } else {
// general case, not a column, not a single component // general case, not a column, not a single component
error(loc, "arbitrary matrix component selection not supported", field.c_str(), ""); TIntermTyped* index = intermediate.addSwizzle(comps, loc);
} result = intermediate.addIndex(EOpMatrixSwizzle, base, index, loc);
result->setType(TType(base->getBasicType(), EvqTemporary, base->getType().getQualifier().precision, comps.size()));
}
} }
} else if (base->getBasicType() == EbtStruct || base->getBasicType() == EbtBlock) { } else if (base->getBasicType() == EbtStruct || base->getBasicType() == EbtBlock) {
const TTypeList* fields = base->getType().getStruct(); const TTypeList* fields = base->getType().getStruct();
...@@ -1888,13 +1889,19 @@ void HlslParseContext::handleFunctionArgument(TFunction* function, ...@@ -1888,13 +1889,19 @@ void HlslParseContext::handleFunctionArgument(TFunction* function,
} }
// Some simple source assignments need to be flattened to a sequence // Some simple source assignments need to be flattened to a sequence
// of AST assignments. Catch these and flatten, otherwise, pass through // of AST assignments. Catch these and flatten, otherwise, pass through
// to intermediate.addAssign(). // to intermediate.addAssign().
TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op, TIntermTyped* left, TIntermTyped* right) const //
// Also, assignment to matrix swizzles requires multiple component assignments,
// intercept those as well.
TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op, TIntermTyped* left, TIntermTyped* right)
{ {
if (left == nullptr || right == nullptr) if (left == nullptr || right == nullptr)
return nullptr; return nullptr;
if (left->getAsOperator() && left->getAsOperator()->getOp() == EOpMatrixSwizzle)
return handleAssignToMatrixSwizzle(loc, op, left, right);
const bool isSplitLeft = wasSplit(left); const bool isSplitLeft = wasSplit(left);
const bool isSplitRight = wasSplit(right); const bool isSplitRight = wasSplit(right);
...@@ -1902,7 +1909,7 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op ...@@ -1902,7 +1909,7 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op
const bool isFlattenRight = wasFlattened(right); const bool isFlattenRight = wasFlattened(right);
// OK to do a single assign if both are split, or both are unsplit. But if one is and the other // OK to do a single assign if both are split, or both are unsplit. But if one is and the other
// isn't, we fall back to a memberwise copy. // isn't, we fall back to a member-wise copy.
if (! isFlattenLeft && ! isFlattenRight && !isSplitLeft && !isSplitRight) if (! isFlattenLeft && ! isFlattenRight && !isSplitLeft && !isSplitRight)
return intermediate.addAssign(op, left, right, loc); return intermediate.addAssign(op, left, right, loc);
...@@ -2079,6 +2086,65 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op ...@@ -2079,6 +2086,65 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op
return assignList; return assignList;
} }
// An assignment to matrix swizzle must be decomposed into individual assignments.
// These must be selected component-wise from the RHS and stored component-wise
// into the LHS.
TIntermTyped* HlslParseContext::handleAssignToMatrixSwizzle(const TSourceLoc& loc, TOperator op, TIntermTyped* left, TIntermTyped* right)
{
assert(left->getAsOperator() && left->getAsOperator()->getOp() == EOpMatrixSwizzle);
if (op != EOpAssign)
error(loc, "only simple assignment to non-simple matrix swizzle is supported", "assign", "");
// isolate the matrix and swizzle nodes
TIntermTyped* matrix = left->getAsBinaryNode()->getLeft()->getAsTyped();
const TIntermSequence& swizzle = left->getAsBinaryNode()->getRight()->getAsAggregate()->getSequence();
// if the RHS isn't already a simple vector, let's store into one
TIntermSymbol* vector = right->getAsSymbolNode();
TIntermTyped* vectorAssign = nullptr;
if (vector == nullptr) {
// create a new intermediate vector variable to assign to
TType vectorType(matrix->getBasicType(), EvqTemporary, matrix->getQualifier().precision, swizzle.size()/2);
vector = intermediate.addSymbol(*makeInternalVariable("intermVec", vectorType), loc);
// assign the right to the new vector
vectorAssign = handleAssign(loc, op, vector, right);
}
// Assign the vector components to the matrix components.
// Store this as a sequence, so a single aggregate node represents this
// entire operation.
TIntermAggregate* result = intermediate.makeAggregate(vectorAssign);
TType columnType(matrix->getType(), 0);
TType componentType(columnType, 0);
TType indexType(EbtInt);
for (int i = 0; i < (int)swizzle.size(); i += 2) {
// the right component, single index into the RHS vector
TIntermTyped* rightComp = intermediate.addIndex(EOpIndexDirect, vector,
intermediate.addConstantUnion(i/2, loc), loc);
// the left component, double index into the LHS matrix
TIntermTyped* leftComp = intermediate.addIndex(EOpIndexDirect, matrix,
intermediate.addConstantUnion(swizzle[i]->getAsConstantUnion()->getConstArray(),
indexType, loc),
loc);
leftComp->setType(columnType);
leftComp = intermediate.addIndex(EOpIndexDirect, leftComp,
intermediate.addConstantUnion(swizzle[i+1]->getAsConstantUnion()->getConstArray(),
indexType, loc),
loc);
leftComp->setType(componentType);
// Add the assignment to the aggregate
result = intermediate.growAggregate(result, intermediate.addAssign(op, leftComp, rightComp, loc));
}
result->setOp(EOpSequence);
return result;
}
// //
// HLSL atomic operations have slightly different arguments than // HLSL atomic operations have slightly different arguments than
// GLSL/AST/SPIRV. The semantics are converted below in decomposeIntrinsic. // GLSL/AST/SPIRV. The semantics are converted below in decomposeIntrinsic.
......
...@@ -78,7 +78,8 @@ public: ...@@ -78,7 +78,8 @@ public:
void remapNonEntryPointIO(TFunction& function); void remapNonEntryPointIO(TFunction& function);
TIntermNode* handleReturnValue(const TSourceLoc&, TIntermTyped*); TIntermNode* handleReturnValue(const TSourceLoc&, TIntermTyped*);
void handleFunctionArgument(TFunction*, TIntermTyped*& arguments, TIntermTyped* newArg); void handleFunctionArgument(TFunction*, TIntermTyped*& arguments, TIntermTyped* newArg);
TIntermTyped* handleAssign(const TSourceLoc&, TOperator, TIntermTyped* left, TIntermTyped* right) const; TIntermTyped* handleAssign(const TSourceLoc&, TOperator, TIntermTyped* left, TIntermTyped* right);
TIntermTyped* handleAssignToMatrixSwizzle(const TSourceLoc&, TOperator, TIntermTyped* left, TIntermTyped* right);
TIntermTyped* handleFunctionCall(const TSourceLoc&, TFunction*, TIntermTyped*); TIntermTyped* handleFunctionCall(const TSourceLoc&, TFunction*, TIntermTyped*);
void decomposeIntrinsic(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments); void decomposeIntrinsic(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments);
void decomposeSampleMethods(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments); void decomposeSampleMethods(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment