mirror of
https://github.com/KhronosGroup/glslang
synced 2024-11-09 12:00:05 +00:00
Fix an issue of SPV generation for imageAtomicStore.
For GLSL function imageAtomicStore, it will be translated to OpImageTexelPointer + OpAtomicStore. The result type of OpImageTexelPointer must be the same as the sampled type of OpTypeImage. On translation, the result type is mistakenly fetched from operand list operands[2] while operands[2] corresponds to sampleNum whose type is always uint. This leads to an error if the image type is iimageXXX that is int image.
This commit is contained in:
parent
c12493ff69
commit
fb18b6df28
@ -4731,7 +4731,7 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
|
|||||||
// imageAtomicStore has a void return type so base the pointer type on
|
// imageAtomicStore has a void return type so base the pointer type on
|
||||||
// the type of the value operand.
|
// the type of the value operand.
|
||||||
if (node->getOp() == glslang::EOpImageAtomicStore) {
|
if (node->getOp() == glslang::EOpImageAtomicStore) {
|
||||||
resultTypeId = builder.makePointer(spv::StorageClassImage, builder.getTypeId(operands[2].word));
|
resultTypeId = builder.makePointer(spv::StorageClassImage, builder.getTypeId(*opIt));
|
||||||
} else {
|
} else {
|
||||||
resultTypeId = builder.makePointer(spv::StorageClassImage, resultType());
|
resultTypeId = builder.makePointer(spv::StorageClassImage, resultType());
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
spv.memoryScopeSemantics.comp
|
spv.memoryScopeSemantics.comp
|
||||||
// Module Version 10300
|
// Module Version 10300
|
||||||
// Generated by (magic number): 80008
|
// Generated by (magic number): 80008
|
||||||
// Id's are bound by 167
|
// Id's are bound by 169
|
||||||
|
|
||||||
Capability Shader
|
Capability Shader
|
||||||
Capability Int64
|
Capability Int64
|
||||||
@ -181,6 +181,7 @@ spv.memoryScopeSemantics.comp
|
|||||||
163: TypeImage 6(int) 2D multi-sampled nonsampled format:R32i
|
163: TypeImage 6(int) 2D multi-sampled nonsampled format:R32i
|
||||||
164: TypePointer UniformConstant 163
|
164: TypePointer UniformConstant 163
|
||||||
165(imageMS): 164(ptr) Variable UniformConstant
|
165(imageMS): 164(ptr) Variable UniformConstant
|
||||||
|
167: 6(int) Constant 4294967289
|
||||||
4(main): 2 Function None 3
|
4(main): 2 Function None 3
|
||||||
5: Label
|
5: Label
|
||||||
8(origi): 7(ptr) Variable Function
|
8(origi): 7(ptr) Variable Function
|
||||||
@ -280,5 +281,7 @@ spv.memoryScopeSemantics.comp
|
|||||||
162: 15(int) AtomicIAdd 160 12 42 16
|
162: 15(int) AtomicIAdd 160 12 42 16
|
||||||
166: 40(ptr) ImageTexelPointer 165(imageMS) 39 12
|
166: 40(ptr) ImageTexelPointer 165(imageMS) 39 12
|
||||||
AtomicStore 166 12 33 14
|
AtomicStore 166 12 33 14
|
||||||
|
168: 40(ptr) ImageTexelPointer 36(imagei) 39 17
|
||||||
|
AtomicStore 168 12 33 167
|
||||||
Return
|
Return
|
||||||
FunctionEnd
|
FunctionEnd
|
||||||
|
@ -69,5 +69,6 @@ void main()
|
|||||||
atomicAdd(bufferu.x, 5u, gl_ScopeDevice, 0, gl_SemanticsVolatile);
|
atomicAdd(bufferu.x, 5u, gl_ScopeDevice, 0, gl_SemanticsVolatile);
|
||||||
|
|
||||||
imageAtomicStore(imageMS, ivec2(0,0), 1, 4, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelease);
|
imageAtomicStore(imageMS, ivec2(0,0), 1, 4, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelease);
|
||||||
|
imageAtomicStore(imagei, ivec2(0,0), -7, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelease);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user