diff options
| -rw-r--r-- | source/slang/emit.cpp | 35 | ||||
| -rw-r--r-- | tests/bugs/vk-image-atomics.slang | 12 | ||||
| -rw-r--r-- | tests/bugs/vk-image-atomics.slang.glsl | 18 |
3 files changed, 64 insertions, 1 deletions
diff --git a/source/slang/emit.cpp b/source/slang/emit.cpp index 9c7d61c51..1c02b64ef 100644 --- a/source/slang/emit.cpp +++ b/source/slang/emit.cpp @@ -3251,7 +3251,40 @@ struct EmitVisitor // Emit("("); emitIROperand(ctx, arg->getOperand(0), mode, kEOp_General); - Emit("), ("); + Emit("), "); + + // The coordinate argument will have been computed + // as a `vector<uint, N>` because that is how the + // HLSL image subscript operations are defined. + // In contrast, the GLSL `imageAtomic*` operations + // expect `vector<int, N>` coordinates, so we + // hill hackily insert the conversion here as + // part of the intrinsic op. + // + auto coords = arg->getOperand(1); + auto coordsType = coords->getDataType(); + + auto coordsVecType = as<IRVectorType>(coordsType); + IRIntegerValue elementCount = 1; + if(coordsVecType) + { + coordsType = coordsVecType->getElementType(); + elementCount = GetIntVal(coordsVecType->getElementCount()); + } + + SLANG_ASSERT(coordsType->op == kIROp_UIntType); + + if (elementCount > 1) + { + Emit("ivec"); + emit(elementCount); + } + else + { + Emit("int"); + } + + Emit("("); emitIROperand(ctx, arg->getOperand(1), mode, kEOp_General); Emit(")"); } diff --git a/tests/bugs/vk-image-atomics.slang b/tests/bugs/vk-image-atomics.slang new file mode 100644 index 000000000..f846606f9 --- /dev/null +++ b/tests/bugs/vk-image-atomics.slang @@ -0,0 +1,12 @@ +//TEST:CROSS_COMPILE: -profile ps_5_0 -entry main -target spirv-assembly + +// Ensure that we can lower to `imageAtomicAdd` correctly. + +RWTexture2D<uint> t; + +float4 main() : SV_Target +{ + uint u; + InterlockedAdd(t[uint2(0)], 1, u); + return u; +} diff --git a/tests/bugs/vk-image-atomics.slang.glsl b/tests/bugs/vk-image-atomics.slang.glsl new file mode 100644 index 000000000..383b396ed --- /dev/null +++ b/tests/bugs/vk-image-atomics.slang.glsl @@ -0,0 +1,18 @@ +#version 450 + +layout(r32ui) +layout(binding = 0) +uniform uimage2D t_0; + +layout(location = 0) +out vec4 _S1; + +void main() +{ + const uint _S2 = uint(1); + + uint _S3; + _S3 = imageAtomicAdd(t_0, ivec2(uvec2(0)), _S2); + _S1 = vec4(_S3); + return; +} |
