SPV 1.4: Add support for OpCopyLogical, careful of Boolean differences.
This commit is contained in:
parent
1f4d04687b
commit
fbb6bdf046
@ -3656,6 +3656,20 @@ void TGlslangToSpvTraverser::multiTypeStore(const glslang::TType& type, spv::Id
|
|||||||
// where the two types were the same type in GLSL. This requires member
|
// where the two types were the same type in GLSL. This requires member
|
||||||
// by member copy, recursively.
|
// by member copy, recursively.
|
||||||
|
|
||||||
|
// SPIR-V 1.4 added an instruction to do help do this.
|
||||||
|
if (glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_4) {
|
||||||
|
// However, bool in uniform space is changed to int, so
|
||||||
|
// OpCopyLogical does not work for that.
|
||||||
|
// TODO: It would be more robust to do a full recursive verification of the types satisfying SPIR-V rules.
|
||||||
|
bool rBool = builder.containsType(builder.getTypeId(rValue), spv::OpTypeBool, 0);
|
||||||
|
bool lBool = builder.containsType(lType, spv::OpTypeBool, 0);
|
||||||
|
if (lBool == rBool) {
|
||||||
|
spv::Id logicalCopy = builder.createUnaryOp(spv::OpCopyLogical, lType, rValue);
|
||||||
|
accessChainStore(type, logicalCopy);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// If an array, copy element by element.
|
// If an array, copy element by element.
|
||||||
if (type.isArray()) {
|
if (type.isArray()) {
|
||||||
glslang::TType glslangElementType(type, 0);
|
glslang::TType glslangElementType(type, 0);
|
||||||
|
@ -1031,6 +1031,7 @@ const char* OpcodeString(int op)
|
|||||||
case 82: return "OpCompositeInsert";
|
case 82: return "OpCompositeInsert";
|
||||||
case 83: return "OpCopyObject";
|
case 83: return "OpCopyObject";
|
||||||
case 84: return "OpTranspose";
|
case 84: return "OpTranspose";
|
||||||
|
case OpCopyLogical: return "OpCopyLogical";
|
||||||
case 85: return "Bad";
|
case 85: return "Bad";
|
||||||
case 86: return "OpSampledImage";
|
case 86: return "OpSampledImage";
|
||||||
case 87: return "OpImageSampleImplicitLod";
|
case 87: return "OpImageSampleImplicitLod";
|
||||||
@ -1938,6 +1939,8 @@ void Parameterize()
|
|||||||
|
|
||||||
InstructionDesc[OpTranspose].operands.push(OperandId, "'Matrix'");
|
InstructionDesc[OpTranspose].operands.push(OperandId, "'Matrix'");
|
||||||
|
|
||||||
|
InstructionDesc[OpCopyLogical].operands.push(OperandId, "'Operand'");
|
||||||
|
|
||||||
InstructionDesc[OpIsNan].operands.push(OperandId, "'x'");
|
InstructionDesc[OpIsNan].operands.push(OperandId, "'x'");
|
||||||
|
|
||||||
InstructionDesc[OpIsInf].operands.push(OperandId, "'x'");
|
InstructionDesc[OpIsInf].operands.push(OperandId, "'x'");
|
||||||
|
151
Test/baseResults/spv.1.4.OpCopyLogical.comp.out
Normal file
151
Test/baseResults/spv.1.4.OpCopyLogical.comp.out
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
spv.1.4.OpCopyLogical.comp
|
||||||
|
Validation failed
|
||||||
|
// Module Version 10400
|
||||||
|
// Generated by (magic number): 80007
|
||||||
|
// Id's are bound by 65
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint GLCompute 4 "main" 19 27 35 51 60
|
||||||
|
ExecutionMode 4 LocalSize 1 1 1
|
||||||
|
Source GLSL 450
|
||||||
|
Name 4 "main"
|
||||||
|
Name 12 "MyStruct"
|
||||||
|
MemberName 12(MyStruct) 0 "foo"
|
||||||
|
MemberName 12(MyStruct) 1 "sb"
|
||||||
|
Name 14 "t"
|
||||||
|
Name 16 "MyStruct"
|
||||||
|
MemberName 16(MyStruct) 0 "foo"
|
||||||
|
MemberName 16(MyStruct) 1 "sb"
|
||||||
|
Name 17 "SSBO0"
|
||||||
|
MemberName 17(SSBO0) 0 "a"
|
||||||
|
Name 19 "inBuf"
|
||||||
|
Name 25 "SSBO1"
|
||||||
|
MemberName 25(SSBO1) 0 "b"
|
||||||
|
Name 27 "outBuf"
|
||||||
|
Name 32 "MyStruct"
|
||||||
|
MemberName 32(MyStruct) 0 "foo"
|
||||||
|
MemberName 32(MyStruct) 1 "sb"
|
||||||
|
Name 33 "UBO"
|
||||||
|
MemberName 33(UBO) 0 "c"
|
||||||
|
Name 35 "uBuf"
|
||||||
|
Name 44 "Nested"
|
||||||
|
MemberName 44(Nested) 0 "f"
|
||||||
|
MemberName 44(Nested) 1 "S"
|
||||||
|
Name 46 "n"
|
||||||
|
Name 48 "Nested"
|
||||||
|
MemberName 48(Nested) 0 "f"
|
||||||
|
MemberName 48(Nested) 1 "S"
|
||||||
|
Name 49 "UBON"
|
||||||
|
MemberName 49(UBON) 0 "N1"
|
||||||
|
Name 51 "uBufN"
|
||||||
|
Name 57 "Nested"
|
||||||
|
MemberName 57(Nested) 0 "f"
|
||||||
|
MemberName 57(Nested) 1 "S"
|
||||||
|
Name 58 "SSBO1N"
|
||||||
|
MemberName 58(SSBO1N) 0 "N2"
|
||||||
|
Name 60 "outBufN"
|
||||||
|
Decorate 15 ArrayStride 8
|
||||||
|
MemberDecorate 16(MyStruct) 0 Offset 0
|
||||||
|
MemberDecorate 16(MyStruct) 1 Offset 16
|
||||||
|
MemberDecorate 17(SSBO0) 0 Offset 0
|
||||||
|
Decorate 17(SSBO0) Block
|
||||||
|
Decorate 19(inBuf) DescriptorSet 0
|
||||||
|
Decorate 19(inBuf) Binding 0
|
||||||
|
MemberDecorate 25(SSBO1) 0 Offset 0
|
||||||
|
Decorate 25(SSBO1) Block
|
||||||
|
Decorate 27(outBuf) DescriptorSet 0
|
||||||
|
Decorate 27(outBuf) Binding 1
|
||||||
|
Decorate 31 ArrayStride 16
|
||||||
|
MemberDecorate 32(MyStruct) 0 Offset 0
|
||||||
|
MemberDecorate 32(MyStruct) 1 Offset 32
|
||||||
|
MemberDecorate 33(UBO) 0 Offset 0
|
||||||
|
Decorate 33(UBO) Block
|
||||||
|
Decorate 35(uBuf) DescriptorSet 0
|
||||||
|
Decorate 35(uBuf) Binding 2
|
||||||
|
Decorate 47 ArrayStride 48
|
||||||
|
MemberDecorate 48(Nested) 0 Offset 0
|
||||||
|
MemberDecorate 48(Nested) 1 Offset 16
|
||||||
|
MemberDecorate 49(UBON) 0 Offset 0
|
||||||
|
Decorate 49(UBON) Block
|
||||||
|
Decorate 51(uBufN) DescriptorSet 0
|
||||||
|
Decorate 51(uBufN) Binding 2
|
||||||
|
Decorate 56 ArrayStride 24
|
||||||
|
MemberDecorate 57(Nested) 0 Offset 0
|
||||||
|
MemberDecorate 57(Nested) 1 Offset 8
|
||||||
|
MemberDecorate 58(SSBO1N) 0 Offset 0
|
||||||
|
Decorate 58(SSBO1N) Block
|
||||||
|
Decorate 60(outBufN) DescriptorSet 0
|
||||||
|
Decorate 60(outBufN) Binding 1
|
||||||
|
2: TypeVoid
|
||||||
|
3: TypeFunction 2
|
||||||
|
6: TypeFloat 32
|
||||||
|
7: TypeVector 6(float) 2
|
||||||
|
8: TypeInt 32 0
|
||||||
|
9: 8(int) Constant 2
|
||||||
|
10: TypeArray 7(fvec2) 9
|
||||||
|
11: TypeInt 32 1
|
||||||
|
12(MyStruct): TypeStruct 10 11(int)
|
||||||
|
13: TypePointer Function 12(MyStruct)
|
||||||
|
15: TypeArray 7(fvec2) 9
|
||||||
|
16(MyStruct): TypeStruct 15 11(int)
|
||||||
|
17(SSBO0): TypeStruct 16(MyStruct)
|
||||||
|
18: TypePointer StorageBuffer 17(SSBO0)
|
||||||
|
19(inBuf): 18(ptr) Variable StorageBuffer
|
||||||
|
20: 11(int) Constant 0
|
||||||
|
21: TypePointer StorageBuffer 16(MyStruct)
|
||||||
|
25(SSBO1): TypeStruct 16(MyStruct)
|
||||||
|
26: TypePointer StorageBuffer 25(SSBO1)
|
||||||
|
27(outBuf): 26(ptr) Variable StorageBuffer
|
||||||
|
31: TypeArray 7(fvec2) 9
|
||||||
|
32(MyStruct): TypeStruct 31 11(int)
|
||||||
|
33(UBO): TypeStruct 32(MyStruct)
|
||||||
|
34: TypePointer Uniform 33(UBO)
|
||||||
|
35(uBuf): 34(ptr) Variable Uniform
|
||||||
|
36: TypePointer Uniform 32(MyStruct)
|
||||||
|
43: TypeArray 12(MyStruct) 9
|
||||||
|
44(Nested): TypeStruct 6(float) 43
|
||||||
|
45: TypePointer Function 44(Nested)
|
||||||
|
47: TypeArray 32(MyStruct) 9
|
||||||
|
48(Nested): TypeStruct 6(float) 47
|
||||||
|
49(UBON): TypeStruct 48(Nested)
|
||||||
|
50: TypePointer Uniform 49(UBON)
|
||||||
|
51(uBufN): 50(ptr) Variable Uniform
|
||||||
|
52: TypePointer Uniform 48(Nested)
|
||||||
|
56: TypeArray 16(MyStruct) 9
|
||||||
|
57(Nested): TypeStruct 6(float) 56
|
||||||
|
58(SSBO1N): TypeStruct 57(Nested)
|
||||||
|
59: TypePointer StorageBuffer 58(SSBO1N)
|
||||||
|
60(outBufN): 59(ptr) Variable StorageBuffer
|
||||||
|
62: TypePointer StorageBuffer 57(Nested)
|
||||||
|
4(main): 2 Function None 3
|
||||||
|
5: Label
|
||||||
|
14(t): 13(ptr) Variable Function
|
||||||
|
46(n): 45(ptr) Variable Function
|
||||||
|
22: 21(ptr) AccessChain 19(inBuf) 20
|
||||||
|
23:16(MyStruct) Load 22
|
||||||
|
24:12(MyStruct) CopyLogical 23
|
||||||
|
Store 14(t) 24
|
||||||
|
28:12(MyStruct) Load 14(t)
|
||||||
|
29: 21(ptr) AccessChain 27(outBuf) 20
|
||||||
|
30:16(MyStruct) CopyLogical 28
|
||||||
|
Store 29 30
|
||||||
|
37: 36(ptr) AccessChain 35(uBuf) 20
|
||||||
|
38:32(MyStruct) Load 37
|
||||||
|
39:12(MyStruct) CopyLogical 38
|
||||||
|
Store 14(t) 39
|
||||||
|
40:12(MyStruct) Load 14(t)
|
||||||
|
41: 21(ptr) AccessChain 27(outBuf) 20
|
||||||
|
42:16(MyStruct) CopyLogical 40
|
||||||
|
Store 41 42
|
||||||
|
53: 52(ptr) AccessChain 51(uBufN) 20
|
||||||
|
54: 48(Nested) Load 53
|
||||||
|
55: 44(Nested) CopyLogical 54
|
||||||
|
Store 46(n) 55
|
||||||
|
61: 44(Nested) Load 46(n)
|
||||||
|
63: 62(ptr) AccessChain 60(outBufN) 20
|
||||||
|
64: 57(Nested) CopyLogical 61
|
||||||
|
Store 63 64
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
115
Test/baseResults/spv.1.4.OpCopyLogical.funcall.frag.out
Normal file
115
Test/baseResults/spv.1.4.OpCopyLogical.funcall.frag.out
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
spv.1.4.OpCopyLogical.funcall.frag
|
||||||
|
Validation failed
|
||||||
|
// Module Version 10400
|
||||||
|
// Generated by (magic number): 80007
|
||||||
|
// Id's are bound by 60
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint Fragment 4 "main" 25 37
|
||||||
|
ExecutionMode 4 OriginUpperLeft
|
||||||
|
Source GLSL 450
|
||||||
|
Name 4 "main"
|
||||||
|
Name 9 "S"
|
||||||
|
MemberName 9(S) 0 "m"
|
||||||
|
Name 12 "fooConst(struct-S-mf441;"
|
||||||
|
Name 11 "s"
|
||||||
|
Name 17 "foo(struct-S-mf441;"
|
||||||
|
Name 16 "s"
|
||||||
|
Name 20 "fooOut(struct-S-mf441;"
|
||||||
|
Name 19 "s"
|
||||||
|
Name 22 "S"
|
||||||
|
MemberName 22(S) 0 "m"
|
||||||
|
Name 23 "blockName"
|
||||||
|
MemberName 23(blockName) 0 "s1"
|
||||||
|
Name 25 ""
|
||||||
|
Name 31 "S"
|
||||||
|
MemberName 31(S) 0 "m"
|
||||||
|
Name 32 "arg"
|
||||||
|
Name 37 "s2"
|
||||||
|
Name 40 "param"
|
||||||
|
Name 45 "param"
|
||||||
|
Name 48 "param"
|
||||||
|
Name 56 "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) Block
|
||||||
|
Decorate 25 DescriptorSet 0
|
||||||
|
Decorate 25 Binding 0
|
||||||
|
MemberDecorate 31(S) 0 ColMajor
|
||||||
|
2: TypeVoid
|
||||||
|
3: TypeFunction 2
|
||||||
|
6: TypeFloat 32
|
||||||
|
7: TypeVector 6(float) 4
|
||||||
|
8: TypeMatrix 7(fvec4) 4
|
||||||
|
9(S): TypeStruct 8
|
||||||
|
10: TypeFunction 2 9(S)
|
||||||
|
14: TypePointer Function 9(S)
|
||||||
|
15: TypeFunction 2 14(ptr)
|
||||||
|
22(S): TypeStruct 8
|
||||||
|
23(blockName): TypeStruct 22(S)
|
||||||
|
24: TypePointer StorageBuffer 23(blockName)
|
||||||
|
25: 24(ptr) Variable StorageBuffer
|
||||||
|
26: TypeInt 32 1
|
||||||
|
27: 26(int) Constant 0
|
||||||
|
28: TypePointer StorageBuffer 22(S)
|
||||||
|
31(S): TypeStruct 8
|
||||||
|
36: TypePointer Private 9(S)
|
||||||
|
37(s2): 36(ptr) Variable Private
|
||||||
|
4(main): 2 Function None 3
|
||||||
|
5: Label
|
||||||
|
32(arg): 14(ptr) Variable Function
|
||||||
|
40(param): 14(ptr) Variable Function
|
||||||
|
45(param): 14(ptr) Variable Function
|
||||||
|
48(param): 14(ptr) Variable Function
|
||||||
|
56(param): 14(ptr) Variable Function
|
||||||
|
29: 28(ptr) AccessChain 25 27
|
||||||
|
30: 22(S) Load 29
|
||||||
|
33: 9(S) CopyLogical 30
|
||||||
|
Store 32(arg) 33
|
||||||
|
34: 9(S) Load 32(arg)
|
||||||
|
35: 2 FunctionCall 12(fooConst(struct-S-mf441;) 34
|
||||||
|
38: 9(S) Load 37(s2)
|
||||||
|
39: 2 FunctionCall 12(fooConst(struct-S-mf441;) 38
|
||||||
|
41: 28(ptr) AccessChain 25 27
|
||||||
|
42: 22(S) Load 41
|
||||||
|
43: 9(S) CopyLogical 42
|
||||||
|
Store 40(param) 43
|
||||||
|
44: 2 FunctionCall 17(foo(struct-S-mf441;) 40(param)
|
||||||
|
46: 9(S) Load 37(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: 9(S) CopyLogical 50
|
||||||
|
Store 48(param) 51
|
||||||
|
52: 2 FunctionCall 20(fooOut(struct-S-mf441;) 48(param)
|
||||||
|
53: 9(S) Load 48(param)
|
||||||
|
54: 28(ptr) AccessChain 25 27
|
||||||
|
55: 22(S) CopyLogical 53
|
||||||
|
Store 54 55
|
||||||
|
57: 9(S) Load 37(s2)
|
||||||
|
Store 56(param) 57
|
||||||
|
58: 2 FunctionCall 20(fooOut(struct-S-mf441;) 56(param)
|
||||||
|
59: 9(S) Load 56(param)
|
||||||
|
Store 37(s2) 59
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
||||||
|
12(fooConst(struct-S-mf441;): 2 Function None 10
|
||||||
|
11(s): 9(S) FunctionParameter
|
||||||
|
13: Label
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
||||||
|
17(foo(struct-S-mf441;): 2 Function None 15
|
||||||
|
16(s): 14(ptr) FunctionParameter
|
||||||
|
18: Label
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
||||||
|
20(fooOut(struct-S-mf441;): 2 Function None 15
|
||||||
|
19(s): 14(ptr) FunctionParameter
|
||||||
|
21: Label
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
233
Test/baseResults/spv.1.4.OpCopyLogicalBool.comp.out
Normal file
233
Test/baseResults/spv.1.4.OpCopyLogicalBool.comp.out
Normal file
@ -0,0 +1,233 @@
|
|||||||
|
spv.1.4.OpCopyLogicalBool.comp
|
||||||
|
Validation failed
|
||||||
|
// Module Version 10400
|
||||||
|
// Generated by (magic number): 80007
|
||||||
|
// Id's are bound by 135
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint GLCompute 4 "main" 19 37 53 79 109
|
||||||
|
ExecutionMode 4 LocalSize 1 1 1
|
||||||
|
Source GLSL 450
|
||||||
|
Name 4 "main"
|
||||||
|
Name 12 "MyStruct"
|
||||||
|
MemberName 12(MyStruct) 0 "foo"
|
||||||
|
MemberName 12(MyStruct) 1 "sb"
|
||||||
|
Name 14 "t"
|
||||||
|
Name 16 "MyStruct"
|
||||||
|
MemberName 16(MyStruct) 0 "foo"
|
||||||
|
MemberName 16(MyStruct) 1 "sb"
|
||||||
|
Name 17 "SSBO0"
|
||||||
|
MemberName 17(SSBO0) 0 "a"
|
||||||
|
Name 19 "inBuf"
|
||||||
|
Name 35 "SSBO1"
|
||||||
|
MemberName 35(SSBO1) 0 "b"
|
||||||
|
Name 37 "outBuf"
|
||||||
|
Name 50 "MyStruct"
|
||||||
|
MemberName 50(MyStruct) 0 "foo"
|
||||||
|
MemberName 50(MyStruct) 1 "sb"
|
||||||
|
Name 51 "UBO"
|
||||||
|
MemberName 51(UBO) 0 "c"
|
||||||
|
Name 53 "uBuf"
|
||||||
|
Name 72 "Nested"
|
||||||
|
MemberName 72(Nested) 0 "b"
|
||||||
|
MemberName 72(Nested) 1 "S"
|
||||||
|
Name 74 "n"
|
||||||
|
Name 76 "Nested"
|
||||||
|
MemberName 76(Nested) 0 "b"
|
||||||
|
MemberName 76(Nested) 1 "S"
|
||||||
|
Name 77 "UBON"
|
||||||
|
MemberName 77(UBON) 0 "N1"
|
||||||
|
Name 79 "uBufN"
|
||||||
|
Name 106 "Nested"
|
||||||
|
MemberName 106(Nested) 0 "b"
|
||||||
|
MemberName 106(Nested) 1 "S"
|
||||||
|
Name 107 "SSBO1N"
|
||||||
|
MemberName 107(SSBO1N) 0 "N2"
|
||||||
|
Name 109 "outBufN"
|
||||||
|
Decorate 15 ArrayStride 8
|
||||||
|
MemberDecorate 16(MyStruct) 0 Offset 0
|
||||||
|
MemberDecorate 16(MyStruct) 1 Offset 16
|
||||||
|
MemberDecorate 17(SSBO0) 0 Offset 0
|
||||||
|
Decorate 17(SSBO0) Block
|
||||||
|
Decorate 19(inBuf) DescriptorSet 0
|
||||||
|
Decorate 19(inBuf) Binding 0
|
||||||
|
MemberDecorate 35(SSBO1) 0 Offset 0
|
||||||
|
Decorate 35(SSBO1) Block
|
||||||
|
Decorate 37(outBuf) DescriptorSet 0
|
||||||
|
Decorate 37(outBuf) Binding 1
|
||||||
|
Decorate 49 ArrayStride 16
|
||||||
|
MemberDecorate 50(MyStruct) 0 Offset 0
|
||||||
|
MemberDecorate 50(MyStruct) 1 Offset 32
|
||||||
|
MemberDecorate 51(UBO) 0 Offset 0
|
||||||
|
Decorate 51(UBO) Block
|
||||||
|
Decorate 53(uBuf) DescriptorSet 0
|
||||||
|
Decorate 53(uBuf) Binding 2
|
||||||
|
Decorate 75 ArrayStride 48
|
||||||
|
MemberDecorate 76(Nested) 0 Offset 0
|
||||||
|
MemberDecorate 76(Nested) 1 Offset 16
|
||||||
|
MemberDecorate 77(UBON) 0 Offset 0
|
||||||
|
Decorate 77(UBON) Block
|
||||||
|
Decorate 79(uBufN) DescriptorSet 0
|
||||||
|
Decorate 79(uBufN) Binding 2
|
||||||
|
Decorate 105 ArrayStride 24
|
||||||
|
MemberDecorate 106(Nested) 0 Offset 0
|
||||||
|
MemberDecorate 106(Nested) 1 Offset 8
|
||||||
|
MemberDecorate 107(SSBO1N) 0 Offset 0
|
||||||
|
Decorate 107(SSBO1N) Block
|
||||||
|
Decorate 109(outBufN) DescriptorSet 0
|
||||||
|
Decorate 109(outBufN) Binding 1
|
||||||
|
2: TypeVoid
|
||||||
|
3: TypeFunction 2
|
||||||
|
6: TypeFloat 32
|
||||||
|
7: TypeVector 6(float) 2
|
||||||
|
8: TypeInt 32 0
|
||||||
|
9: 8(int) Constant 2
|
||||||
|
10: TypeArray 7(fvec2) 9
|
||||||
|
11: TypeBool
|
||||||
|
12(MyStruct): TypeStruct 10 11(bool)
|
||||||
|
13: TypePointer Function 12(MyStruct)
|
||||||
|
15: TypeArray 7(fvec2) 9
|
||||||
|
16(MyStruct): TypeStruct 15 8(int)
|
||||||
|
17(SSBO0): TypeStruct 16(MyStruct)
|
||||||
|
18: TypePointer StorageBuffer 17(SSBO0)
|
||||||
|
19(inBuf): 18(ptr) Variable StorageBuffer
|
||||||
|
20: TypeInt 32 1
|
||||||
|
21: 20(int) Constant 0
|
||||||
|
22: TypePointer StorageBuffer 16(MyStruct)
|
||||||
|
26: TypePointer Function 10
|
||||||
|
30: 20(int) Constant 1
|
||||||
|
31: 8(int) Constant 0
|
||||||
|
33: TypePointer Function 11(bool)
|
||||||
|
35(SSBO1): TypeStruct 16(MyStruct)
|
||||||
|
36: TypePointer StorageBuffer 35(SSBO1)
|
||||||
|
37(outBuf): 36(ptr) Variable StorageBuffer
|
||||||
|
41: TypePointer StorageBuffer 15
|
||||||
|
45: 8(int) Constant 1
|
||||||
|
47: TypePointer StorageBuffer 8(int)
|
||||||
|
49: TypeArray 7(fvec2) 9
|
||||||
|
50(MyStruct): TypeStruct 49 8(int)
|
||||||
|
51(UBO): TypeStruct 50(MyStruct)
|
||||||
|
52: TypePointer Uniform 51(UBO)
|
||||||
|
53(uBuf): 52(ptr) Variable Uniform
|
||||||
|
54: TypePointer Uniform 50(MyStruct)
|
||||||
|
71: TypeArray 12(MyStruct) 9
|
||||||
|
72(Nested): TypeStruct 11(bool) 71
|
||||||
|
73: TypePointer Function 72(Nested)
|
||||||
|
75: TypeArray 50(MyStruct) 9
|
||||||
|
76(Nested): TypeStruct 8(int) 75
|
||||||
|
77(UBON): TypeStruct 76(Nested)
|
||||||
|
78: TypePointer Uniform 77(UBON)
|
||||||
|
79(uBufN): 78(ptr) Variable Uniform
|
||||||
|
80: TypePointer Uniform 76(Nested)
|
||||||
|
87: TypePointer Function 71
|
||||||
|
105: TypeArray 16(MyStruct) 9
|
||||||
|
106(Nested): TypeStruct 8(int) 105
|
||||||
|
107(SSBO1N): TypeStruct 106(Nested)
|
||||||
|
108: TypePointer StorageBuffer 107(SSBO1N)
|
||||||
|
109(outBufN): 108(ptr) Variable StorageBuffer
|
||||||
|
111: TypePointer StorageBuffer 106(Nested)
|
||||||
|
117: TypePointer StorageBuffer 105
|
||||||
|
4(main): 2 Function None 3
|
||||||
|
5: Label
|
||||||
|
14(t): 13(ptr) Variable Function
|
||||||
|
74(n): 73(ptr) Variable Function
|
||||||
|
23: 22(ptr) AccessChain 19(inBuf) 21
|
||||||
|
24:16(MyStruct) Load 23
|
||||||
|
25: 15 CompositeExtract 24 0
|
||||||
|
27: 26(ptr) AccessChain 14(t) 21
|
||||||
|
28: 10 CopyLogical 25
|
||||||
|
Store 27 28
|
||||||
|
29: 8(int) CompositeExtract 24 1
|
||||||
|
32: 11(bool) INotEqual 29 31
|
||||||
|
34: 33(ptr) AccessChain 14(t) 30
|
||||||
|
Store 34 32
|
||||||
|
38:12(MyStruct) Load 14(t)
|
||||||
|
39: 22(ptr) AccessChain 37(outBuf) 21
|
||||||
|
40: 10 CompositeExtract 38 0
|
||||||
|
42: 41(ptr) AccessChain 39 21
|
||||||
|
43: 15 CopyLogical 40
|
||||||
|
Store 42 43
|
||||||
|
44: 11(bool) CompositeExtract 38 1
|
||||||
|
46: 8(int) Select 44 45 31
|
||||||
|
48: 47(ptr) AccessChain 39 30
|
||||||
|
Store 48 46
|
||||||
|
55: 54(ptr) AccessChain 53(uBuf) 21
|
||||||
|
56:50(MyStruct) Load 55
|
||||||
|
57: 49 CompositeExtract 56 0
|
||||||
|
58: 26(ptr) AccessChain 14(t) 21
|
||||||
|
59: 10 CopyLogical 57
|
||||||
|
Store 58 59
|
||||||
|
60: 8(int) CompositeExtract 56 1
|
||||||
|
61: 11(bool) INotEqual 60 31
|
||||||
|
62: 33(ptr) AccessChain 14(t) 30
|
||||||
|
Store 62 61
|
||||||
|
63:12(MyStruct) Load 14(t)
|
||||||
|
64: 22(ptr) AccessChain 37(outBuf) 21
|
||||||
|
65: 10 CompositeExtract 63 0
|
||||||
|
66: 41(ptr) AccessChain 64 21
|
||||||
|
67: 15 CopyLogical 65
|
||||||
|
Store 66 67
|
||||||
|
68: 11(bool) CompositeExtract 63 1
|
||||||
|
69: 8(int) Select 68 45 31
|
||||||
|
70: 47(ptr) AccessChain 64 30
|
||||||
|
Store 70 69
|
||||||
|
81: 80(ptr) AccessChain 79(uBufN) 21
|
||||||
|
82: 76(Nested) Load 81
|
||||||
|
83: 8(int) CompositeExtract 82 0
|
||||||
|
84: 11(bool) INotEqual 83 31
|
||||||
|
85: 33(ptr) AccessChain 74(n) 21
|
||||||
|
Store 85 84
|
||||||
|
86: 75 CompositeExtract 82 1
|
||||||
|
88: 87(ptr) AccessChain 74(n) 30
|
||||||
|
89:50(MyStruct) CompositeExtract 86 0
|
||||||
|
90: 13(ptr) AccessChain 88 21
|
||||||
|
91: 49 CompositeExtract 89 0
|
||||||
|
92: 26(ptr) AccessChain 90 21
|
||||||
|
93: 10 CopyLogical 91
|
||||||
|
Store 92 93
|
||||||
|
94: 8(int) CompositeExtract 89 1
|
||||||
|
95: 11(bool) INotEqual 94 31
|
||||||
|
96: 33(ptr) AccessChain 90 30
|
||||||
|
Store 96 95
|
||||||
|
97:50(MyStruct) CompositeExtract 86 1
|
||||||
|
98: 13(ptr) AccessChain 88 30
|
||||||
|
99: 49 CompositeExtract 97 0
|
||||||
|
100: 26(ptr) AccessChain 98 21
|
||||||
|
101: 10 CopyLogical 99
|
||||||
|
Store 100 101
|
||||||
|
102: 8(int) CompositeExtract 97 1
|
||||||
|
103: 11(bool) INotEqual 102 31
|
||||||
|
104: 33(ptr) AccessChain 98 30
|
||||||
|
Store 104 103
|
||||||
|
110: 72(Nested) Load 74(n)
|
||||||
|
112: 111(ptr) AccessChain 109(outBufN) 21
|
||||||
|
113: 11(bool) CompositeExtract 110 0
|
||||||
|
114: 8(int) Select 113 45 31
|
||||||
|
115: 47(ptr) AccessChain 112 21
|
||||||
|
Store 115 114
|
||||||
|
116: 71 CompositeExtract 110 1
|
||||||
|
118: 117(ptr) AccessChain 112 30
|
||||||
|
119:12(MyStruct) CompositeExtract 116 0
|
||||||
|
120: 22(ptr) AccessChain 118 21
|
||||||
|
121: 10 CompositeExtract 119 0
|
||||||
|
122: 41(ptr) AccessChain 120 21
|
||||||
|
123: 15 CopyLogical 121
|
||||||
|
Store 122 123
|
||||||
|
124: 11(bool) CompositeExtract 119 1
|
||||||
|
125: 8(int) Select 124 45 31
|
||||||
|
126: 47(ptr) AccessChain 120 30
|
||||||
|
Store 126 125
|
||||||
|
127:12(MyStruct) CompositeExtract 116 1
|
||||||
|
128: 22(ptr) AccessChain 118 30
|
||||||
|
129: 10 CompositeExtract 127 0
|
||||||
|
130: 41(ptr) AccessChain 128 21
|
||||||
|
131: 15 CopyLogical 129
|
||||||
|
Store 130 131
|
||||||
|
132: 11(bool) CompositeExtract 127 1
|
||||||
|
133: 8(int) Select 132 45 31
|
||||||
|
134: 47(ptr) AccessChain 128 30
|
||||||
|
Store 134 133
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
48
Test/spv.1.4.OpCopyLogical.comp
Normal file
48
Test/spv.1.4.OpCopyLogical.comp
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
#version 450 core
|
||||||
|
|
||||||
|
struct MyStruct
|
||||||
|
{
|
||||||
|
vec2 foo[2];
|
||||||
|
int sb;
|
||||||
|
};
|
||||||
|
|
||||||
|
layout(binding = 0, std430) buffer SSBO0
|
||||||
|
{
|
||||||
|
MyStruct a;
|
||||||
|
} inBuf;
|
||||||
|
|
||||||
|
layout(binding = 1, std430) buffer SSBO1
|
||||||
|
{
|
||||||
|
MyStruct b;
|
||||||
|
} outBuf;
|
||||||
|
|
||||||
|
layout(binding = 2, std140) uniform UBO
|
||||||
|
{
|
||||||
|
MyStruct c;
|
||||||
|
} uBuf;
|
||||||
|
|
||||||
|
struct Nested {
|
||||||
|
float f;
|
||||||
|
MyStruct S[2];
|
||||||
|
};
|
||||||
|
|
||||||
|
layout(binding = 2, std140) uniform UBON
|
||||||
|
{
|
||||||
|
Nested N1;
|
||||||
|
} uBufN;
|
||||||
|
|
||||||
|
layout(binding = 1, std430) buffer SSBO1N
|
||||||
|
{
|
||||||
|
Nested N2;
|
||||||
|
} outBufN;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
MyStruct t = inBuf.a;
|
||||||
|
outBuf.b = t;
|
||||||
|
t = uBuf.c;
|
||||||
|
outBuf.b = t;
|
||||||
|
|
||||||
|
Nested n = uBufN.N1;
|
||||||
|
outBufN.N2 = n;
|
||||||
|
}
|
21
Test/spv.1.4.OpCopyLogical.funcall.frag
Normal file
21
Test/spv.1.4.OpCopyLogical.funcall.frag
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#version 450
|
||||||
|
|
||||||
|
struct S { mat4 m; };
|
||||||
|
buffer blockName { S s1; }; // need an S with decoration
|
||||||
|
S s2; // no decorations on S
|
||||||
|
|
||||||
|
void fooConst(const in S s) { }
|
||||||
|
void foo(in S s) { }
|
||||||
|
void fooOut(inout S s) { }
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
fooConst(s1);
|
||||||
|
fooConst(s2);
|
||||||
|
|
||||||
|
foo(s1);
|
||||||
|
foo(s2);
|
||||||
|
|
||||||
|
fooOut(s1);
|
||||||
|
fooOut(s2);
|
||||||
|
}
|
48
Test/spv.1.4.OpCopyLogicalBool.comp
Normal file
48
Test/spv.1.4.OpCopyLogicalBool.comp
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
#version 450 core
|
||||||
|
|
||||||
|
struct MyStruct
|
||||||
|
{
|
||||||
|
vec2 foo[2];
|
||||||
|
bool sb;
|
||||||
|
};
|
||||||
|
|
||||||
|
layout(binding = 0, std430) buffer SSBO0
|
||||||
|
{
|
||||||
|
MyStruct a;
|
||||||
|
} inBuf;
|
||||||
|
|
||||||
|
layout(binding = 1, std430) buffer SSBO1
|
||||||
|
{
|
||||||
|
MyStruct b;
|
||||||
|
} outBuf;
|
||||||
|
|
||||||
|
layout(binding = 2, std140) uniform UBO
|
||||||
|
{
|
||||||
|
MyStruct c;
|
||||||
|
} uBuf;
|
||||||
|
|
||||||
|
struct Nested {
|
||||||
|
bool b;
|
||||||
|
MyStruct S[2];
|
||||||
|
};
|
||||||
|
|
||||||
|
layout(binding = 2, std140) uniform UBON
|
||||||
|
{
|
||||||
|
Nested N1;
|
||||||
|
} uBufN;
|
||||||
|
|
||||||
|
layout(binding = 1, std430) buffer SSBO1N
|
||||||
|
{
|
||||||
|
Nested N2;
|
||||||
|
} outBufN;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
MyStruct t = inBuf.a;
|
||||||
|
outBuf.b = t;
|
||||||
|
t = uBuf.c;
|
||||||
|
outBuf.b = t;
|
||||||
|
|
||||||
|
Nested n = uBufN.N1;
|
||||||
|
outBufN.N2 = n;
|
||||||
|
}
|
@ -468,6 +468,9 @@ INSTANTIATE_TEST_CASE_P(
|
|||||||
"spv.1.4.OpEntryPoint.frag",
|
"spv.1.4.OpEntryPoint.frag",
|
||||||
"spv.1.4.OpSelect.frag",
|
"spv.1.4.OpSelect.frag",
|
||||||
"spv.1.4.LoopControl.frag",
|
"spv.1.4.LoopControl.frag",
|
||||||
|
"spv.1.4.OpCopyLogical.comp",
|
||||||
|
"spv.1.4.OpCopyLogicalBool.comp",
|
||||||
|
"spv.1.4.OpCopyLogical.funcall.frag",
|
||||||
})),
|
})),
|
||||||
FileNameAsCustomTestSuffix
|
FileNameAsCustomTestSuffix
|
||||||
);
|
);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user