From bd01bd3f4b8eecbfb924b8eb4090694e44e8166c Mon Sep 17 00:00:00 2001 From: kaizhangNV <149626564+kaizhangNV@users.noreply.github.com> Date: Mon, 1 Jul 2024 20:06:58 -0700 Subject: [PATCH] Fix the type error in kIROp_RWStructuredBufferLoad (#4523) * Fix the type error in kIROp_RWStructuredBufferLoad In StructuredBuffer::Load(), we allow any type of integer as the input. However, when emitting glsl code, StructuredBuffer::Load(index) will be translated to the subscript index of the buffer, e.g. buffer[index], however, glsl doesn't allow 64bit integer as the subscript. So the easiest fix is to convert the index to uint when emitting glsl. * Add commit --- source/slang/slang-emit-glsl.cpp | 3 +++ tests/compute/byte-address-buffer-array.slang | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/source/slang/slang-emit-glsl.cpp b/source/slang/slang-emit-glsl.cpp index 7cf478c362..eea672938f 100644 --- a/source/slang/slang-emit-glsl.cpp +++ b/source/slang/slang-emit-glsl.cpp @@ -2068,7 +2068,10 @@ bool GLSLSourceEmitter::tryEmitInstExprImpl(IRInst* inst, const EmitOpInfo& inOu emitOperand(inst->getOperand(0), leftSide(outerPrec, prec)); m_writer->emit("._data["); + // glsl only support int/uint as array index + m_writer->emit("uint("); emitOperand(inst->getOperand(1), getInfo(EmitOp::General)); + m_writer->emit(")"); m_writer->emit("]"); maybeCloseParens(needClose); diff --git a/tests/compute/byte-address-buffer-array.slang b/tests/compute/byte-address-buffer-array.slang index 1a23821a10..4ac4a612a1 100644 --- a/tests/compute/byte-address-buffer-array.slang +++ b/tests/compute/byte-address-buffer-array.slang @@ -26,10 +26,10 @@ void computeMain(uint3 threadId : SV_DispatchThreadID) // CHECK1: {{.*}}[0] = {{.*}}.data_0[0]; // CHECK1: {{.*}}[1] = {{.*}}.data_0[1]; // CHECK1: vec4 {{.*}}[2]; - // CHECK1: unpackStorage_0(buffer_0._data[0], {{.*}}); + // CHECK1: unpackStorage_0(buffer_0._data[uint(0)], {{.*}}); // CHECK1: vec4 {{.*}}[2] = buffer_0._data[0] = packStorage_0({{.*}}); - // CHECK1: vec4 {{.*}} = buffer_2._data[1]; - // CHECK1: vec4 {{.*}} = buffer_2._data[1] = vec4(buffer_1._data[1], buffer_1._data[2], buffer_1._data[3], buffer_1._data[4]); + // CHECK1: vec4 {{.*}} = buffer_2._data[uint(1)]; + // CHECK1: vec4 {{.*}} = buffer_2._data[1] = vec4(buffer_1._data[uint(1)], buffer_1._data[uint(2)], buffer_1._data[uint(3)], buffer_1._data[uint(4)]); // CHECK2: float4 {{.*}}[int(2)] = (buffer_0).Load(int(0)); // CHECK2: buffer_0.Store(int(0),{{.*}});