Add new test case for image functions and fix issues caught by this test

This commit is contained in:
Rex Xu 2015-09-16 17:48:22 +08:00
parent bba5c80957
commit 6b86d496c2
14 changed files with 750 additions and 158 deletions

View File

@ -1757,11 +1757,10 @@ void TGlslangToSpvTraverser::translateArguments(const glslang::TIntermAggregate&
break;
}
if (lvalue) {
if (lvalue)
arguments.push_back(builder.accessChainGetLValue());
} else {
else
arguments.push_back(builder.accessChainLoad(convertGlslangToSpvType(glslangArguments[i]->getAsTyped()->getType())));
}
}
}
@ -1820,16 +1819,37 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
// Check for image functions other than queries
if (node->isImage()) {
if (node->getOp() == glslang::EOpImageLoad) {
return builder.createOp(spv::OpImageRead, convertGlslangToSpvType(node->getType()), arguments);
}
else if (node->getOp() == glslang::EOpImageStore) {
builder.createNoResultOp(spv::OpImageWrite, arguments);
return spv::NoResult;
}
else {
// Process image atomic operations. GLSL "IMAGE_PARAMS" will involve in constructing an image texel
// pointer and this pointer, as the first source operand, is required by SPIR-V atomic operations.
// Process image load/store
if (node->getOp() == glslang::EOpImageLoad ||
node->getOp() == glslang::EOpImageStore) {
std::vector<spv::Id> operands;
auto opIt = arguments.begin();
operands.push_back(*(opIt++));
operands.push_back(*(opIt++));
if (sampler.ms) {
// For MS, image operand mask has to be added to indicate the presence of "sample" operand.
spv::Id sample = *(opIt++);
for (; opIt != arguments.end(); ++opIt)
operands.push_back(*opIt);
operands.push_back(spv::ImageOperandsSampleMask);
operands.push_back(sample);
} else {
for (; opIt != arguments.end(); ++opIt)
operands.push_back(*opIt);
}
if (node->getOp() == glslang::EOpImageLoad)
return builder.createOp(spv::OpImageRead, convertGlslangToSpvType(node->getType()), operands);
else {
builder.createNoResultOp(spv::OpImageWrite, operands);
return spv::NoResult;
}
} else {
// Process image atomic operations
// GLSL "IMAGE_PARAMS" will involve in constructing an image texel pointer and this pointer,
// as the first source operand, is required by SPIR-V atomic operations.
std::vector<spv::Id> imageParams;
auto opIt = arguments.begin();
imageParams.push_back(*(opIt++));
@ -1885,8 +1905,8 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
if (cracked.lod) {
params.lod = arguments[2];
++extraArgs;
} else if (cracked.sample) {
params.sample = arguments[2]; // For MS, sample should be specified
} else if (sampler.ms) {
params.sample = arguments[2]; // For MS, "sample" should be specified
++extraArgs;
}
if (cracked.grad) {

View File

@ -159,8 +159,9 @@ public:
}
Id getImageType(Id resultId) const
{
assert(isSampledImageType(getTypeId(resultId)));
return module.getInstruction(getTypeId(resultId))->getIdOperand(0);
Id typeId = getTypeId(resultId);
assert(isImageType(typeId) || isSampledImageType(typeId));
return isSampledImageType(typeId) ? module.getInstruction(typeId)->getIdOperand(0) : typeId;
}
bool isArrayedImageType(Id typeId) const
{

View File

@ -1635,10 +1635,12 @@ void Parameterize()
InstructionDesc[OpImageRead].operands.push(OperandId, "'Image'");
InstructionDesc[OpImageRead].operands.push(OperandId, "'Coordinate'");
InstructionDesc[OpImageRead].operands.push(OperandOptionalImage, "");
InstructionDesc[OpImageWrite].operands.push(OperandId, "'Image'");
InstructionDesc[OpImageWrite].operands.push(OperandId, "'Coordinate'");
InstructionDesc[OpImageWrite].operands.push(OperandId, "'Texel'");
InstructionDesc[OpImageWrite].operands.push(OperandOptionalImage, "");
InstructionDesc[OpImageSampleImplicitLod].operands.push(OperandId, "'Sampled Image'");
InstructionDesc[OpImageSampleImplicitLod].operands.push(OperandId, "'Coordinate'");

View File

@ -8,7 +8,7 @@ Linked compute stage:
TBD functionality: Is atomic_uint an opaque handle in the uniform storage class, or an addresses in the atomic storage class?
// Module Version 99
// Generated by (magic number): 51a00bb
// Id's are bound by 74
// Id's are bound by 64
Source ESSL 310
Capability Shader
@ -19,108 +19,98 @@ TBD functionality: Is atomic_uint an opaque handle in the uniform storage class,
Name 10 "func(au1;"
Name 9 "c"
Name 12 "atoms("
Name 21 "counter"
Name 22 "param"
Name 25 "val"
Name 29 "countArr"
Name 38 "origi"
Name 40 "atomi"
Name 44 "origu"
Name 46 "atomu"
Name 48 "value"
Name 71 "arrX"
Name 72 "arrY"
Name 73 "arrZ"
Decorate 21(counter) Binding 0
Decorate 29(countArr) Binding 0
Decorate 71(arrX) NoStaticUse
Decorate 72(arrY) NoStaticUse
Decorate 73(arrZ) NoStaticUse
Name 20 "counter"
Name 21 "param"
Name 24 "val"
Name 28 "countArr"
Name 35 "origi"
Name 37 "atomi"
Name 40 "origu"
Name 42 "atomu"
Name 44 "value"
Name 61 "arrX"
Name 62 "arrY"
Name 63 "arrZ"
Decorate 20(counter) Binding 0
Decorate 28(countArr) Binding 0
Decorate 61(arrX) NoStaticUse
Decorate 62(arrY) NoStaticUse
Decorate 63(arrZ) NoStaticUse
2: TypeVoid
3: TypeFunction 2
6: TypeInt 32 0
7: TypePointer Function 6(int)
8: TypeFunction 6(int) 7(ptr)
15: 6(int) Constant 1
16: 6(int) Constant 0
19: 6(int) Constant 256
20: TypePointer UniformConstant 6(int)
21(counter): 20(ptr) Variable UniformConstant
26: 6(int) Constant 4
27: TypeArray 6(int) 26
28: TypePointer UniformConstant 27
29(countArr): 28(ptr) Variable UniformConstant
30: TypeInt 32 1
31: 30(int) Constant 2
37: TypePointer Function 30(int)
39: TypePointer WorkgroupLocal 30(int)
40(atomi): 39(ptr) Variable WorkgroupLocal
42: 30(int) Constant 3
45: TypePointer WorkgroupLocal 6(int)
46(atomu): 45(ptr) Variable WorkgroupLocal
48(value): 20(ptr) Variable UniformConstant
52: 6(int) Constant 7
60: 30(int) Constant 7
66: 6(int) Constant 10
69: TypeArray 30(int) 15
70: TypePointer PrivateGlobal 69
71(arrX): 70(ptr) Variable PrivateGlobal
72(arrY): 70(ptr) Variable PrivateGlobal
73(arrZ): 70(ptr) Variable PrivateGlobal
14: 6(int) Constant 1
15: 6(int) Constant 0
18: 6(int) Constant 256
19: TypePointer AtomicCounter 6(int)
20(counter): 19(ptr) Variable AtomicCounter
25: 6(int) Constant 4
26: TypeArray 6(int) 25
27: TypePointer AtomicCounter 26
28(countArr): 27(ptr) Variable AtomicCounter
29: TypeInt 32 1
30: 29(int) Constant 2
34: TypePointer Function 29(int)
36: TypePointer WorkgroupLocal 29(int)
37(atomi): 36(ptr) Variable WorkgroupLocal
38: 29(int) Constant 3
41: TypePointer WorkgroupLocal 6(int)
42(atomu): 41(ptr) Variable WorkgroupLocal
43: TypePointer UniformConstant 6(int)
44(value): 43(ptr) Variable UniformConstant
47: 6(int) Constant 7
52: 29(int) Constant 7
56: 6(int) Constant 10
59: TypeArray 29(int) 14
60: TypePointer PrivateGlobal 59
61(arrX): 60(ptr) Variable PrivateGlobal
62(arrY): 60(ptr) Variable PrivateGlobal
63(arrZ): 60(ptr) Variable PrivateGlobal
4(main): 2 Function None 3
5: Label
22(param): 7(ptr) Variable Function
25(val): 7(ptr) Variable Function
MemoryBarrier 15 19
23: 6(int) Load 21(counter)
Store 22(param) 23
24: 6(int) FunctionCall 10(func(au1;) 22(param)
32: 20(ptr) AccessChain 29(countArr) 31
33: 6(int) Load 32
34: 6(int) AtomicLoad 33 15 16
Store 25(val) 34
35: 6(int) Load 21(counter)
36: 6(int) AtomicIDecrement 35 15 16
21(param): 7(ptr) Variable Function
24(val): 7(ptr) Variable Function
MemoryBarrier 14 18
22: 6(int) Load 20(counter)
Store 21(param) 22
23: 6(int) FunctionCall 10(func(au1;) 21(param)
31: 19(ptr) AccessChain 28(countArr) 30
32: 6(int) AtomicLoad 31 14 15
Store 24(val) 32
33: 6(int) AtomicIDecrement 20(counter) 14 15
Return
FunctionEnd
10(func(au1;): 6(int) Function None 8
9(c): 7(ptr) FunctionParameter
11: Label
14: 6(int) Load 9(c)
17: 6(int) AtomicIIncrement 14 15 16
ReturnValue 17
16: 6(int) AtomicIIncrement 9(c) 14 15
ReturnValue 16
FunctionEnd
12(atoms(): 2 Function None 3
13: Label
38(origi): 37(ptr) Variable Function
44(origu): 7(ptr) Variable Function
41: 30(int) Load 40(atomi)
43: 30(int) AtomicIAdd 41 15 16 42
Store 38(origi) 43
47: 6(int) Load 46(atomu)
49: 6(int) Load 48(value)
50: 6(int) AtomicAnd 47 15 16 49
Store 44(origu) 50
51: 6(int) Load 46(atomu)
53: 6(int) AtomicOr 51 15 16 52
Store 44(origu) 53
54: 6(int) Load 46(atomu)
55: 6(int) AtomicXor 54 15 16 52
Store 44(origu) 55
56: 6(int) Load 46(atomu)
57: 6(int) Load 48(value)
58: 6(int) AtomicSMin 56 15 16 57
Store 44(origu) 58
59: 30(int) Load 40(atomi)
61: 30(int) AtomicSMax 59 15 16 60
Store 38(origi) 61
62: 30(int) Load 40(atomi)
63: 30(int) Load 38(origi)
64: 30(int) AtomicExchange 62 15 16 63
Store 38(origi) 64
65: 6(int) Load 46(atomu)
67: 6(int) Load 48(value)
68: 6(int) AtomicCompareExchange 65 15 16 16 67 66
Store 44(origu) 68
35(origi): 34(ptr) Variable Function
40(origu): 7(ptr) Variable Function
39: 29(int) AtomicIAdd 37(atomi) 14 15 38
Store 35(origi) 39
45: 6(int) Load 44(value)
46: 6(int) AtomicAnd 42(atomu) 14 15 45
Store 40(origu) 46
48: 6(int) AtomicOr 42(atomu) 14 15 47
Store 40(origu) 48
49: 6(int) AtomicXor 42(atomu) 14 15 47
Store 40(origu) 49
50: 6(int) Load 44(value)
51: 6(int) AtomicUMin 42(atomu) 14 15 50
Store 40(origu) 51
53: 29(int) AtomicSMax 37(atomi) 14 15 52
Store 35(origi) 53
54: 29(int) Load 35(origi)
55: 29(int) AtomicExchange 37(atomi) 14 15 54
Store 35(origi) 55
57: 6(int) Load 44(value)
58: 6(int) AtomicCompareExchange 42(atomu) 14 15 15 57 56
Store 40(origu) 58
Return
FunctionEnd

View File

@ -25,11 +25,11 @@ Linked vertex stage:
6: TypeInt 32 1
7: TypePointer Function 6(int)
9: 6(int) Constant 0
14: TypeBool
15: 14(bool) ConstantTrue
13: TypeBool
15: 13(bool) ConstantTrue
19: 6(int) Constant 10
23: 6(int) Constant 1
25: 14(bool) ConstantFalse
25: 13(bool) ConstantFalse
26: TypePointer Input 6(int)
27(gl_VertexID): 26(ptr) Variable Input
28(gl_InstanceID): 26(ptr) Variable Input
@ -39,15 +39,15 @@ Linked vertex stage:
Store 8(i) 9
Branch 10
10: Label
13: 14(bool) Phi 15 5 25 12
14: 13(bool) Phi 15 5 25 12
LoopMerge 11 None
Branch 16
16: Label
SelectionMerge 12 None
BranchConditional 13 12 17
BranchConditional 14 12 17
17: Label
18: 6(int) Load 8(i)
20: 14(bool) SLessThan 18 19
20: 13(bool) SLessThan 18 19
SelectionMerge 21 None
BranchConditional 20 21 11
21: Label

View File

@ -32,12 +32,12 @@ Linked vertex stage:
6: TypeInt 32 1
7: TypePointer Function 6(int)
9: 6(int) Constant 0
14: TypeBool
15: 14(bool) ConstantTrue
13: TypeBool
15: 13(bool) ConstantTrue
19: 6(int) Constant 1
21: 6(int) Constant 19
26: 6(int) Constant 2
31: 14(bool) ConstantFalse
31: 13(bool) ConstantFalse
35: 6(int) Constant 5
40: 6(int) Constant 3
43: 6(int) Constant 42
@ -59,17 +59,17 @@ Linked vertex stage:
Store 8(i) 9
Branch 10
10: Label
13: 14(bool) Phi 15 5 31 28 31 38
14: 13(bool) Phi 15 5 31 28 31 38
LoopMerge 11 None
Branch 16
16: Label
SelectionMerge 12 None
BranchConditional 13 12 17
BranchConditional 14 12 17
17: Label
18: 6(int) Load 8(i)
20: 6(int) IAdd 18 19
Store 8(i) 20
22: 14(bool) SLessThan 20 21
22: 13(bool) SLessThan 20 21
SelectionMerge 23 None
BranchConditional 22 23 11
23: Label
@ -77,7 +77,7 @@ Linked vertex stage:
12: Label
Store 24(A) 9
25: 6(int) Load 8(i)
27: 14(bool) IEqual 25 26
27: 13(bool) IEqual 25 26
SelectionMerge 29 None
BranchConditional 27 28 29
28: Label
@ -88,7 +88,7 @@ Linked vertex stage:
Branch 29
29: Label
34: 6(int) Load 8(i)
36: 14(bool) IEqual 34 35
36: 13(bool) IEqual 34 35
SelectionMerge 38 None
BranchConditional 36 37 38
37: Label

View File

@ -28,13 +28,13 @@ Linked fragment stage:
8: TypePointer Function 7(fvec4)
10: TypePointer Input 7(fvec4)
11(BaseColor): 10(ptr) Variable Input
17: TypeBool
18: 17(bool) ConstantTrue
16: TypeBool
18: 16(bool) ConstantTrue
23: TypePointer UniformConstant 6(float)
24(d): 23(ptr) Variable UniformConstant
28: TypePointer UniformConstant 7(fvec4)
29(bigColor): 28(ptr) Variable UniformConstant
33: 17(bool) ConstantFalse
33: 16(bool) ConstantFalse
34: TypePointer Output 7(fvec4)
35(gl_FragColor): 34(ptr) Variable Output
4(main): 2 Function None 3
@ -44,17 +44,17 @@ Linked fragment stage:
Store 9(color) 12
Branch 13
13: Label
16: 17(bool) Phi 18 5 33 15
17: 16(bool) Phi 18 5 33 15
LoopMerge 14 None
Branch 19
19: Label
SelectionMerge 15 None
BranchConditional 16 15 20
BranchConditional 17 15 20
20: Label
21: 7(fvec4) Load 9(color)
22: 6(float) CompositeExtract 21 0
25: 6(float) Load 24(d)
26: 17(bool) FOrdLessThan 22 25
26: 16(bool) FOrdLessThan 22 25
SelectionMerge 27 None
BranchConditional 26 27 14
27: Label

View File

@ -0,0 +1,497 @@
spv.image.frag
Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
Linked fragment stage:
// Module Version 99
// Generated by (magic number): 51a00bb
// Id's are bound by 383
Source GLSL 450
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Fragment 4 "main"
ExecutionMode 4 OriginLowerLeft
Name 4 "main"
Name 9 "iv"
Name 15 "i1D"
Name 25 "i2D"
Name 36 "i3D"
Name 43 "iCube"
Name 53 "iCubeArray"
Name 60 "i2DRect"
Name 70 "i1DArray"
Name 80 "i2DArray"
Name 87 "iBuffer"
Name 97 "i2DMS"
Name 107 "i2DMSArray"
Name 128 "v"
Name 133 "ic1D"
Name 143 "ic2D"
Name 153 "ic3D"
Name 172 "ic4D"
Name 234 "ui"
Name 238 "ii1D"
Name 252 "ui2D"
Name 255 "value"
Name 370 "fragData"
Decorate 15(i1D) Binding 0
Decorate 25(i2D) Binding 1
Decorate 36(i3D) Binding 2
Decorate 43(iCube) Binding 3
Decorate 53(iCubeArray) Binding 4
Decorate 60(i2DRect) Binding 5
Decorate 70(i1DArray) Binding 6
Decorate 80(i2DArray) Binding 7
Decorate 87(iBuffer) Binding 8
Decorate 97(i2DMS) Binding 9
Decorate 107(i2DMSArray) Binding 10
Decorate 238(ii1D) Binding 11
Decorate 252(ui2D) Binding 12
2: TypeVoid
3: TypeFunction 2
6: TypeInt 32 1
7: TypeVector 6(int) 3
8: TypePointer Function 7(ivec3)
10: 6(int) Constant 0
11: 7(ivec3) ConstantComposite 10 10 10
12: TypeFloat 32
13: TypeImage 12(float) 1D nonsampled format:Rgba32f
14: TypePointer UniformConstant 13
15(i1D): 14(ptr) Variable UniformConstant
23: TypeImage 12(float) 2D nonsampled format:Rgba32f
24: TypePointer UniformConstant 23
25(i2D): 24(ptr) Variable UniformConstant
27: TypeVector 6(int) 2
34: TypeImage 12(float) 3D nonsampled format:Rgba32f
35: TypePointer UniformConstant 34
36(i3D): 35(ptr) Variable UniformConstant
41: TypeImage 12(float) Cube nonsampled format:Rgba32f
42: TypePointer UniformConstant 41
43(iCube): 42(ptr) Variable UniformConstant
51: TypeImage 12(float) Cube array nonsampled format:Rgba32f
52: TypePointer UniformConstant 51
53(iCubeArray): 52(ptr) Variable UniformConstant
58: TypeImage 12(float) Rect nonsampled format:Rgba32f
59: TypePointer UniformConstant 58
60(i2DRect): 59(ptr) Variable UniformConstant
68: TypeImage 12(float) 1D array nonsampled format:Rgba32f
69: TypePointer UniformConstant 68
70(i1DArray): 69(ptr) Variable UniformConstant
78: TypeImage 12(float) 2D array nonsampled format:Rgba32f
79: TypePointer UniformConstant 78
80(i2DArray): 79(ptr) Variable UniformConstant
85: TypeImage 12(float) Buffer nonsampled format:Rgba32f
86: TypePointer UniformConstant 85
87(iBuffer): 86(ptr) Variable UniformConstant
95: TypeImage 12(float) 2D multi-sampled nonsampled format:Rgba32f
96: TypePointer UniformConstant 95
97(i2DMS): 96(ptr) Variable UniformConstant
105: TypeImage 12(float) 2D array multi-sampled nonsampled format:Rgba32f
106: TypePointer UniformConstant 105
107(i2DMSArray): 106(ptr) Variable UniformConstant
126: TypeVector 12(float) 4
127: TypePointer Function 126(fvec4)
129: 12(float) Constant 0
130: 126(fvec4) ConstantComposite 129 129 129 129
132: TypePointer UniformConstant 6(int)
133(ic1D): 132(ptr) Variable UniformConstant
142: TypePointer UniformConstant 27(ivec2)
143(ic2D): 142(ptr) Variable UniformConstant
152: TypePointer UniformConstant 7(ivec3)
153(ic3D): 152(ptr) Variable UniformConstant
170: TypeVector 6(int) 4
171: TypePointer UniformConstant 170(ivec4)
172(ic4D): 171(ptr) Variable UniformConstant
214: 6(int) Constant 1
220: 6(int) Constant 2
224: 6(int) Constant 3
230: 6(int) Constant 4
232: TypeInt 32 0
233: TypePointer Function 232(int)
235: 232(int) Constant 0
236: TypeImage 6(int) 1D nonsampled format:R32i
237: TypePointer UniformConstant 236
238(ii1D): 237(ptr) Variable UniformConstant
240: 6(int) Constant 10
241: TypePointer Image 6(int)
243: 232(int) Constant 1
250: TypeImage 232(int) 2D nonsampled format:R32ui
251: TypePointer UniformConstant 250
252(ui2D): 251(ptr) Variable UniformConstant
254: TypePointer UniformConstant 232(int)
255(value): 254(ptr) Variable UniformConstant
257: TypePointer Image 232(int)
263: 6(int) Constant 11
278: 6(int) Constant 12
293: 6(int) Constant 13
308: 6(int) Constant 14
323: 6(int) Constant 15
338: 6(int) Constant 16
353: 6(int) Constant 18
354: 6(int) Constant 17
363: 232(int) Constant 19
369: TypePointer Output 126(fvec4)
370(fragData): 369(ptr) Variable Output
376: TypeBool
4(main): 2 Function None 3
5: Label
9(iv): 8(ptr) Variable Function
128(v): 127(ptr) Variable Function
234(ui): 233(ptr) Variable Function
371: 127(ptr) Variable Function
Store 9(iv) 11
16: 13 Load 15(i1D)
17: 6(int) ImageQuerySize 16
18: 7(ivec3) Load 9(iv)
19: 6(int) CompositeExtract 18 0
20: 6(int) IAdd 19 17
21: 7(ivec3) Load 9(iv)
22: 7(ivec3) CompositeInsert 20 21 0
Store 9(iv) 22
26: 23 Load 25(i2D)
28: 27(ivec2) ImageQuerySize 26
29: 7(ivec3) Load 9(iv)
30: 27(ivec2) VectorShuffle 29 29 0 1
31: 27(ivec2) IAdd 30 28
32: 7(ivec3) Load 9(iv)
33: 7(ivec3) VectorShuffle 32 31 3 4 2
Store 9(iv) 33
37: 34 Load 36(i3D)
38: 7(ivec3) ImageQuerySize 37
39: 7(ivec3) Load 9(iv)
40: 7(ivec3) IAdd 39 38
Store 9(iv) 40
44: 41 Load 43(iCube)
45: 27(ivec2) ImageQuerySize 44
46: 7(ivec3) Load 9(iv)
47: 27(ivec2) VectorShuffle 46 46 0 1
48: 27(ivec2) IAdd 47 45
49: 7(ivec3) Load 9(iv)
50: 7(ivec3) VectorShuffle 49 48 3 4 2
Store 9(iv) 50
54: 51 Load 53(iCubeArray)
55: 7(ivec3) ImageQuerySize 54
56: 7(ivec3) Load 9(iv)
57: 7(ivec3) IAdd 56 55
Store 9(iv) 57
61: 58 Load 60(i2DRect)
62: 27(ivec2) ImageQuerySize 61
63: 7(ivec3) Load 9(iv)
64: 27(ivec2) VectorShuffle 63 63 0 1
65: 27(ivec2) IAdd 64 62
66: 7(ivec3) Load 9(iv)
67: 7(ivec3) VectorShuffle 66 65 3 4 2
Store 9(iv) 67
71: 68 Load 70(i1DArray)
72: 27(ivec2) ImageQuerySize 71
73: 7(ivec3) Load 9(iv)
74: 27(ivec2) VectorShuffle 73 73 0 1
75: 27(ivec2) IAdd 74 72
76: 7(ivec3) Load 9(iv)
77: 7(ivec3) VectorShuffle 76 75 3 4 2
Store 9(iv) 77
81: 78 Load 80(i2DArray)
82: 7(ivec3) ImageQuerySize 81
83: 7(ivec3) Load 9(iv)
84: 7(ivec3) IAdd 83 82
Store 9(iv) 84
88: 85 Load 87(iBuffer)
89: 6(int) ImageQuerySize 88
90: 7(ivec3) Load 9(iv)
91: 6(int) CompositeExtract 90 0
92: 6(int) IAdd 91 89
93: 7(ivec3) Load 9(iv)
94: 7(ivec3) CompositeInsert 92 93 0
Store 9(iv) 94
98: 95 Load 97(i2DMS)
99: 27(ivec2) ImageQuerySize 98
100: 7(ivec3) Load 9(iv)
101: 27(ivec2) VectorShuffle 100 100 0 1
102: 27(ivec2) IAdd 101 99
103: 7(ivec3) Load 9(iv)
104: 7(ivec3) VectorShuffle 103 102 3 4 2
Store 9(iv) 104
108: 105 Load 107(i2DMSArray)
109: 7(ivec3) ImageQuerySize 108
110: 7(ivec3) Load 9(iv)
111: 7(ivec3) IAdd 110 109
Store 9(iv) 111
112: 95 Load 97(i2DMS)
113: 6(int) ImageQuerySamples 112
114: 7(ivec3) Load 9(iv)
115: 6(int) CompositeExtract 114 0
116: 6(int) IAdd 115 113
117: 7(ivec3) Load 9(iv)
118: 7(ivec3) CompositeInsert 116 117 0
Store 9(iv) 118
119: 105 Load 107(i2DMSArray)
120: 6(int) ImageQuerySamples 119
121: 7(ivec3) Load 9(iv)
122: 6(int) CompositeExtract 121 0
123: 6(int) IAdd 122 120
124: 7(ivec3) Load 9(iv)
125: 7(ivec3) CompositeInsert 123 124 0
Store 9(iv) 125
Store 128(v) 130
131: 13 Load 15(i1D)
134: 6(int) Load 133(ic1D)
135: 126(fvec4) ImageRead 131 134
136: 126(fvec4) Load 128(v)
137: 126(fvec4) FAdd 136 135
Store 128(v) 137
138: 13 Load 15(i1D)
139: 6(int) Load 133(ic1D)
140: 126(fvec4) Load 128(v)
ImageWrite 138 139 140
141: 23 Load 25(i2D)
144: 27(ivec2) Load 143(ic2D)
145: 126(fvec4) ImageRead 141 144
146: 126(fvec4) Load 128(v)
147: 126(fvec4) FAdd 146 145
Store 128(v) 147
148: 23 Load 25(i2D)
149: 27(ivec2) Load 143(ic2D)
150: 126(fvec4) Load 128(v)
ImageWrite 148 149 150
151: 34 Load 36(i3D)
154: 7(ivec3) Load 153(ic3D)
155: 126(fvec4) ImageRead 151 154
156: 126(fvec4) Load 128(v)
157: 126(fvec4) FAdd 156 155
Store 128(v) 157
158: 34 Load 36(i3D)
159: 7(ivec3) Load 153(ic3D)
160: 126(fvec4) Load 128(v)
ImageWrite 158 159 160
161: 41 Load 43(iCube)
162: 7(ivec3) Load 153(ic3D)
163: 126(fvec4) ImageRead 161 162
164: 126(fvec4) Load 128(v)
165: 126(fvec4) FAdd 164 163
Store 128(v) 165
166: 41 Load 43(iCube)
167: 7(ivec3) Load 153(ic3D)
168: 126(fvec4) Load 128(v)
ImageWrite 166 167 168
169: 51 Load 53(iCubeArray)
173: 170(ivec4) Load 172(ic4D)
174: 126(fvec4) ImageRead 169 173
175: 126(fvec4) Load 128(v)
176: 126(fvec4) FAdd 175 174
Store 128(v) 176
177: 51 Load 53(iCubeArray)
178: 170(ivec4) Load 172(ic4D)
179: 126(fvec4) Load 128(v)
ImageWrite 177 178 179
180: 58 Load 60(i2DRect)
181: 27(ivec2) Load 143(ic2D)
182: 126(fvec4) ImageRead 180 181
183: 126(fvec4) Load 128(v)
184: 126(fvec4) FAdd 183 182
Store 128(v) 184
185: 58 Load 60(i2DRect)
186: 27(ivec2) Load 143(ic2D)
187: 126(fvec4) Load 128(v)
ImageWrite 185 186 187
188: 68 Load 70(i1DArray)
189: 27(ivec2) Load 143(ic2D)
190: 126(fvec4) ImageRead 188 189
191: 126(fvec4) Load 128(v)
192: 126(fvec4) FAdd 191 190
Store 128(v) 192
193: 68 Load 70(i1DArray)
194: 27(ivec2) Load 143(ic2D)
195: 126(fvec4) Load 128(v)
ImageWrite 193 194 195
196: 78 Load 80(i2DArray)
197: 7(ivec3) Load 153(ic3D)
198: 126(fvec4) ImageRead 196 197
199: 126(fvec4) Load 128(v)
200: 126(fvec4) FAdd 199 198
Store 128(v) 200
201: 78 Load 80(i2DArray)
202: 7(ivec3) Load 153(ic3D)
203: 126(fvec4) Load 128(v)
ImageWrite 201 202 203
204: 85 Load 87(iBuffer)
205: 6(int) Load 133(ic1D)
206: 126(fvec4) ImageRead 204 205
207: 126(fvec4) Load 128(v)
208: 126(fvec4) FAdd 207 206
Store 128(v) 208
209: 85 Load 87(iBuffer)
210: 6(int) Load 133(ic1D)
211: 126(fvec4) Load 128(v)
ImageWrite 209 210 211
212: 95 Load 97(i2DMS)
213: 27(ivec2) Load 143(ic2D)
215: 126(fvec4) ImageRead 212 213 214
216: 126(fvec4) Load 128(v)
217: 126(fvec4) FAdd 216 215
Store 128(v) 217
218: 95 Load 97(i2DMS)
219: 27(ivec2) Load 143(ic2D)
221: 126(fvec4) Load 128(v)
ImageWrite 218 219 221 220
222: 105 Load 107(i2DMSArray)
223: 7(ivec3) Load 153(ic3D)
225: 126(fvec4) ImageRead 222 223 224
226: 126(fvec4) Load 128(v)
227: 126(fvec4) FAdd 226 225
Store 128(v) 227
228: 105 Load 107(i2DMSArray)
229: 7(ivec3) Load 153(ic3D)
231: 126(fvec4) Load 128(v)
ImageWrite 228 229 231 230
Store 234(ui) 235
239: 6(int) Load 133(ic1D)
242: 241(ptr) ImageTexelPointer 238(ii1D) 239 0
244: 6(int) AtomicIAdd 242 243 235 240
245: 7(ivec3) Load 9(iv)
246: 6(int) CompositeExtract 245 0
247: 6(int) IAdd 246 244
248: 7(ivec3) Load 9(iv)
249: 7(ivec3) CompositeInsert 247 248 0
Store 9(iv) 249
253: 27(ivec2) Load 143(ic2D)
256: 232(int) Load 255(value)
258: 257(ptr) ImageTexelPointer 252(ui2D) 253 0
259: 232(int) AtomicIAdd 258 243 235 256
260: 232(int) Load 234(ui)
261: 232(int) IAdd 260 259
Store 234(ui) 261
262: 6(int) Load 133(ic1D)
264: 241(ptr) ImageTexelPointer 238(ii1D) 262 0
265: 6(int) AtomicSMin 264 243 235 263
266: 7(ivec3) Load 9(iv)
267: 6(int) CompositeExtract 266 0
268: 6(int) IAdd 267 265
269: 7(ivec3) Load 9(iv)
270: 7(ivec3) CompositeInsert 268 269 0
Store 9(iv) 270
271: 27(ivec2) Load 143(ic2D)
272: 232(int) Load 255(value)
273: 257(ptr) ImageTexelPointer 252(ui2D) 271 0
274: 232(int) AtomicUMin 273 243 235 272
275: 232(int) Load 234(ui)
276: 232(int) IAdd 275 274
Store 234(ui) 276
277: 6(int) Load 133(ic1D)
279: 241(ptr) ImageTexelPointer 238(ii1D) 277 0
280: 6(int) AtomicSMax 279 243 235 278
281: 7(ivec3) Load 9(iv)
282: 6(int) CompositeExtract 281 0
283: 6(int) IAdd 282 280
284: 7(ivec3) Load 9(iv)
285: 7(ivec3) CompositeInsert 283 284 0
Store 9(iv) 285
286: 27(ivec2) Load 143(ic2D)
287: 232(int) Load 255(value)
288: 257(ptr) ImageTexelPointer 252(ui2D) 286 0
289: 232(int) AtomicUMax 288 243 235 287
290: 232(int) Load 234(ui)
291: 232(int) IAdd 290 289
Store 234(ui) 291
292: 6(int) Load 133(ic1D)
294: 241(ptr) ImageTexelPointer 238(ii1D) 292 0
295: 6(int) AtomicAnd 294 243 235 293
296: 7(ivec3) Load 9(iv)
297: 6(int) CompositeExtract 296 0
298: 6(int) IAdd 297 295
299: 7(ivec3) Load 9(iv)
300: 7(ivec3) CompositeInsert 298 299 0
Store 9(iv) 300
301: 27(ivec2) Load 143(ic2D)
302: 232(int) Load 255(value)
303: 257(ptr) ImageTexelPointer 252(ui2D) 301 0
304: 232(int) AtomicAnd 303 243 235 302
305: 232(int) Load 234(ui)
306: 232(int) IAdd 305 304
Store 234(ui) 306
307: 6(int) Load 133(ic1D)
309: 241(ptr) ImageTexelPointer 238(ii1D) 307 0
310: 6(int) AtomicOr 309 243 235 308
311: 7(ivec3) Load 9(iv)
312: 6(int) CompositeExtract 311 0
313: 6(int) IAdd 312 310
314: 7(ivec3) Load 9(iv)
315: 7(ivec3) CompositeInsert 313 314 0
Store 9(iv) 315
316: 27(ivec2) Load 143(ic2D)
317: 232(int) Load 255(value)
318: 257(ptr) ImageTexelPointer 252(ui2D) 316 0
319: 232(int) AtomicOr 318 243 235 317
320: 232(int) Load 234(ui)
321: 232(int) IAdd 320 319
Store 234(ui) 321
322: 6(int) Load 133(ic1D)
324: 241(ptr) ImageTexelPointer 238(ii1D) 322 0
325: 6(int) AtomicXor 324 243 235 323
326: 7(ivec3) Load 9(iv)
327: 6(int) CompositeExtract 326 0
328: 6(int) IAdd 327 325
329: 7(ivec3) Load 9(iv)
330: 7(ivec3) CompositeInsert 328 329 0
Store 9(iv) 330
331: 27(ivec2) Load 143(ic2D)
332: 232(int) Load 255(value)
333: 257(ptr) ImageTexelPointer 252(ui2D) 331 0
334: 232(int) AtomicXor 333 243 235 332
335: 232(int) Load 234(ui)
336: 232(int) IAdd 335 334
Store 234(ui) 336
337: 6(int) Load 133(ic1D)
339: 241(ptr) ImageTexelPointer 238(ii1D) 337 0
340: 6(int) AtomicExchange 339 243 235 338
341: 7(ivec3) Load 9(iv)
342: 6(int) CompositeExtract 341 0
343: 6(int) IAdd 342 340
344: 7(ivec3) Load 9(iv)
345: 7(ivec3) CompositeInsert 343 344 0
Store 9(iv) 345
346: 27(ivec2) Load 143(ic2D)
347: 232(int) Load 255(value)
348: 257(ptr) ImageTexelPointer 252(ui2D) 346 0
349: 232(int) AtomicExchange 348 243 235 347
350: 232(int) Load 234(ui)
351: 232(int) IAdd 350 349
Store 234(ui) 351
352: 6(int) Load 133(ic1D)
355: 241(ptr) ImageTexelPointer 238(ii1D) 352 0
356: 6(int) AtomicCompareExchange 355 243 235 235 354 353
357: 7(ivec3) Load 9(iv)
358: 6(int) CompositeExtract 357 0
359: 6(int) IAdd 358 356
360: 7(ivec3) Load 9(iv)
361: 7(ivec3) CompositeInsert 359 360 0
Store 9(iv) 361
362: 27(ivec2) Load 143(ic2D)
364: 232(int) Load 255(value)
365: 257(ptr) ImageTexelPointer 252(ui2D) 362 0
366: 232(int) AtomicCompareExchange 365 243 235 235 364 363
367: 232(int) Load 234(ui)
368: 232(int) IAdd 367 366
Store 234(ui) 368
372: 232(int) Load 234(ui)
373: 7(ivec3) Load 9(iv)
374: 6(int) CompositeExtract 373 1
375: 232(int) Bitcast 374
377: 376(bool) INotEqual 372 375
SelectionMerge 379 None
BranchConditional 377 378 381
378: Label
380: 126(fvec4) Load 128(v)
Store 371 380
Branch 379
381: Label
Store 371 130
Branch 379
379: Label
382: 126(fvec4) Load 371
Store 370(fragData) 382
Return
FunctionEnd

View File

@ -117,15 +117,15 @@ Linked fragment stage:
8: TypePointer Function 7(fvec4)
10: TypePointer Input 7(fvec4)
11(BaseColor): 10(ptr) Variable Input
17: TypeBool
18: 17(bool) ConstantTrue
16: TypeBool
18: 16(bool) ConstantTrue
23: TypePointer UniformConstant 6(float)
24(d4): 23(ptr) Variable UniformConstant
28: TypePointer UniformConstant 7(fvec4)
29(bigColor4): 28(ptr) Variable UniformConstant
39: 6(float) Constant 1073741824
53: 6(float) Constant 1065353216
57: 17(bool) ConstantFalse
57: 16(bool) ConstantFalse
83(d13): 23(ptr) Variable UniformConstant
147: TypePointer Output 7(fvec4)
148(gl_FragColor): 147(ptr) Variable Output
@ -181,17 +181,17 @@ Linked fragment stage:
Store 9(color) 12
Branch 13
13: Label
16: 17(bool) Phi 18 5 57 49 57 64
17: 16(bool) Phi 18 5 57 49 57 64
LoopMerge 14 None
Branch 19
19: Label
SelectionMerge 15 None
BranchConditional 16 15 20
BranchConditional 17 15 20
20: Label
21: 7(fvec4) Load 9(color)
22: 6(float) CompositeExtract 21 2
25: 6(float) Load 24(d4)
26: 17(bool) FOrdLessThan 22 25
26: 16(bool) FOrdLessThan 22 25
SelectionMerge 27 None
BranchConditional 26 27 14
27: Label
@ -204,7 +204,7 @@ Linked fragment stage:
33: 7(fvec4) Load 9(color)
34: 6(float) CompositeExtract 33 0
35: 6(float) Load 24(d4)
36: 17(bool) FOrdLessThan 34 35
36: 16(bool) FOrdLessThan 34 35
SelectionMerge 38 None
BranchConditional 36 37 38
37: Label
@ -217,7 +217,7 @@ Linked fragment stage:
45: 7(fvec4) Load 9(color)
46: 6(float) CompositeExtract 45 2
47: 6(float) Load 24(d4)
48: 17(bool) FOrdLessThan 46 47
48: 16(bool) FOrdLessThan 46 47
SelectionMerge 50 None
BranchConditional 48 49 50
49: Label
@ -234,7 +234,7 @@ Linked fragment stage:
59: 7(fvec4) Load 9(color)
60: 6(float) CompositeExtract 59 1
61: 6(float) Load 24(d4)
62: 17(bool) FOrdLessThan 60 61
62: 16(bool) FOrdLessThan 60 61
SelectionMerge 64 None
BranchConditional 62 63 71
63: Label
@ -263,14 +263,14 @@ Linked fragment stage:
81: 7(fvec4) Load 9(color)
82: 6(float) CompositeExtract 81 3
84: 6(float) Load 83(d13)
85: 17(bool) FOrdLessThan 82 84
85: 16(bool) FOrdLessThan 82 84
LoopMerge 79 None
BranchConditional 85 80 79
80: Label
86: 7(fvec4) Load 9(color)
87: 6(float) CompositeExtract 86 2
88: 6(float) Load 83(d13)
89: 17(bool) FOrdLessThan 87 88
89: 16(bool) FOrdLessThan 87 88
SelectionMerge 91 None
BranchConditional 89 90 95
90: Label
@ -293,7 +293,7 @@ Linked fragment stage:
102: 7(fvec4) Load 9(color)
103: 6(float) CompositeExtract 102 0
104: 6(float) Load 24(d4)
105: 17(bool) FOrdLessThan 103 104
105: 16(bool) FOrdLessThan 103 104
SelectionMerge 107 None
BranchConditional 105 106 107
106: Label
@ -306,7 +306,7 @@ Linked fragment stage:
113: 7(fvec4) Load 9(color)
114: 6(float) CompositeExtract 113 2
115: 6(float) Load 24(d4)
116: 17(bool) FOrdLessThan 114 115
116: 16(bool) FOrdLessThan 114 115
SelectionMerge 118 None
BranchConditional 116 117 118
117: Label
@ -323,7 +323,7 @@ Linked fragment stage:
125: 7(fvec4) Load 9(color)
126: 6(float) CompositeExtract 125 1
127: 6(float) Load 24(d4)
128: 17(bool) FOrdLessThan 126 127
128: 16(bool) FOrdLessThan 126 127
SelectionMerge 130 None
BranchConditional 128 129 137
129: Label

View File

@ -196,13 +196,13 @@ Linked fragment stage:
64: 21 Load 23(s3D)
68: 65(ivec3) Load 67(ic3D)
71: 50(int) Load 70(ic1D)
72: 7(fvec4) ImageFetch 64 68
72: 7(fvec4) ImageFetch 64 68 71
73: 7(fvec4) Load 9(v)
74: 7(fvec4) FAdd 73 72
Store 9(v) 74
75: 11 Load 13(s2D)
78: 51(ivec2) Load 77(ic2D)
80: 7(fvec4) ImageFetch 75 78 79
80: 7(fvec4) ImageFetch 75 78 79 53
81: 7(fvec4) Load 9(v)
82: 7(fvec4) FAdd 81 80
Store 9(v) 82
@ -321,7 +321,7 @@ Linked fragment stage:
205: 202 Load 204(is2DArray)
206: 65(ivec3) Load 67(ic3D)
207: 50(int) Load 70(ic1D)
208: 139(ivec4) ImageFetch 205 206
208: 139(ivec4) ImageFetch 205 206 207
Store 141(iv) 208
209: 139(ivec4) Load 141(iv)
210: 7(fvec4) ConvertSToF 209

View File

@ -310,7 +310,7 @@ Linked fragment stage:
214: 70 Load 72(texSampler2D)
215: 205(ivec2) Load 207(iCoords2D)
216: 204(int) Load 212(iLod)
217: 22(fvec4) ImageFetch 214 215
217: 22(fvec4) ImageFetch 214 215 216
218: 22(fvec4) Load 26(color)
219: 22(fvec4) FAdd 218 217
Store 26(color) 219

89
Test/spv.image.frag Normal file
View File

@ -0,0 +1,89 @@
#version 450
layout(rgba32f, binding = 0) uniform image1D i1D;
layout(rgba32f, binding = 1) uniform image2D i2D;
layout(rgba32f, binding = 2) uniform image3D i3D;
layout(rgba32f, binding = 3) uniform imageCube iCube;
layout(rgba32f, binding = 4) uniform imageCubeArray iCubeArray;
layout(rgba32f, binding = 5) uniform image2DRect i2DRect;
layout(rgba32f, binding = 6) uniform image1DArray i1DArray;
layout(rgba32f, binding = 7) uniform image2DArray i2DArray;
layout(rgba32f, binding = 8) uniform imageBuffer iBuffer;
layout(rgba32f, binding = 9) uniform image2DMS i2DMS;
layout(rgba32f, binding = 10) uniform image2DMSArray i2DMSArray;
layout(r32i, binding = 11) uniform iimage1D ii1D;
layout(r32ui, binding = 12) uniform uimage2D ui2D;
uniform int ic1D;
uniform ivec2 ic2D;
uniform ivec3 ic3D;
uniform ivec4 ic4D;
uniform uint value;
out vec4 fragData;
void main()
{
ivec3 iv = ivec3(0);
iv.x += imageSize(i1D);
iv.xy += imageSize(i2D);
iv.xyz += imageSize(i3D);
iv.xy += imageSize(iCube);
iv.xyz += imageSize(iCubeArray);
iv.xy += imageSize(i2DRect);
iv.xy += imageSize(i1DArray);
iv.xyz += imageSize(i2DArray);
iv.x += imageSize(iBuffer);
iv.xy += imageSize(i2DMS);
iv.xyz += imageSize(i2DMSArray);
iv.x += imageSamples(i2DMS);
iv.x += imageSamples(i2DMSArray);
vec4 v = vec4(0.0);
v += imageLoad(i1D, ic1D);
imageStore(i1D, ic1D, v);
v += imageLoad(i2D, ic2D);
imageStore(i2D, ic2D, v);
v += imageLoad(i3D, ic3D);
imageStore(i3D, ic3D, v);
v += imageLoad(iCube, ic3D);
imageStore(iCube, ic3D, v);
v += imageLoad(iCubeArray, ic4D);
imageStore(iCubeArray, ic4D, v);
v += imageLoad(i2DRect, ic2D);
imageStore(i2DRect, ic2D, v);
v += imageLoad(i1DArray, ic2D);
imageStore(i1DArray, ic2D, v);
v += imageLoad(i2DArray, ic3D);
imageStore(i2DArray, ic3D, v);
v += imageLoad(iBuffer, ic1D);
imageStore(iBuffer, ic1D, v);
v += imageLoad(i2DMS, ic2D, 1);
imageStore(i2DMS, ic2D, 2, v);
v += imageLoad(i2DMSArray, ic3D, 3);
imageStore(i2DMSArray, ic3D, 4, v);
uint ui = 0;
iv.x += imageAtomicAdd(ii1D, ic1D, 10);
ui += imageAtomicAdd(ui2D, ic2D, value);
iv.x += imageAtomicMin(ii1D, ic1D, 11);
ui += imageAtomicMin(ui2D, ic2D, value);
iv.x += imageAtomicMax(ii1D, ic1D, 12);
ui += imageAtomicMax(ui2D, ic2D, value);
iv.x += imageAtomicAnd(ii1D, ic1D, 13);
ui += imageAtomicAnd(ui2D, ic2D, value);
iv.x += imageAtomicOr(ii1D, ic1D, 14);
ui += imageAtomicOr(ui2D, ic2D, value);
iv.x += imageAtomicXor(ii1D, ic1D, 15);
ui += imageAtomicXor(ui2D, ic2D, value);
iv.x += imageAtomicExchange(ii1D, ic1D, 16);
ui += imageAtomicExchange(ui2D, ic2D, value);
iv.x += imageAtomicCompSwap(ii1D, ic1D, 18, 17);
ui += imageAtomicCompSwap(ui2D, ic2D, 19u, value);
fragData = ui != iv.y ? v : vec4(0.0);
}

View File

@ -70,6 +70,7 @@ spv.test.frag
spv.test.vert
spv.texture.frag
spv.texture.vert
spv.image.frag
spv.types.frag
spv.uint.frag
spv.uniformArray.frag

View File

@ -617,7 +617,6 @@ struct TCrackedTextureOp {
bool query;
bool proj;
bool lod;
bool sample;
bool fetch;
bool offset;
bool offsets;
@ -645,7 +644,6 @@ public:
cracked.query = false;
cracked.proj = false;
cracked.lod = false;
cracked.sample = false;
cracked.fetch = false;
cracked.offset = false;
cracked.offsets = false;
@ -653,6 +651,8 @@ public:
cracked.grad = false;
switch (op) {
case EOpImageQuerySize:
case EOpImageQuerySamples:
case EOpTextureQuerySize:
case EOpTextureQueryLod:
case EOpTextureQueryLevels:
@ -672,22 +672,14 @@ public:
break;
case EOpTextureFetch:
cracked.fetch = true;
if (sampler.dim == Esd1D || sampler.dim == Esd2D || sampler.dim == Esd3D) {
if (sampler.ms)
cracked.sample = true;
else
cracked.lod = true;
}
if (sampler.dim == Esd1D || (sampler.dim == Esd2D && ! sampler.ms) || sampler.dim == Esd3D)
cracked.lod = true;
break;
case EOpTextureFetchOffset:
cracked.fetch = true;
cracked.offset = true;
if (sampler.dim == Esd1D || sampler.dim == Esd2D || sampler.dim == Esd3D) {
if (sampler.ms)
cracked.sample = true;
else
cracked.lod = true;
}
if (sampler.dim == Esd1D || (sampler.dim == Esd2D && ! sampler.ms) || sampler.dim == Esd3D)
cracked.lod = true;
break;
case EOpTextureProjOffset:
cracked.offset = true;