diff options
| author | Darren Wihandi <65404740+fairywreath@users.noreply.github.com> | 2025-05-16 13:42:59 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-05-16 10:42:59 -0700 |
| commit | 8683b85c0494db99feb08b6efcdc26dfe006729f (patch) | |
| tree | 6822d8fabc336409b286c854617fd525bd90fcf2 | |
| parent | 9dfd5244ad2953753535e82acd05e72e5ab2bc5f (diff) | |
Fix HLSL ByteAddressBuffer Load* parameter integer type (#7117)
* Fix HLSL ByteAddressBuffer Load* parameter integer type
* Fix tests
* Fix load with alignment function signature clash
* Fix LoadAligned tests
| -rw-r--r-- | source/slang/hlsl.meta.slang | 74 | ||||
| -rw-r--r-- | tests/compute/byte-address-buffer-align-error.slang | 2 | ||||
| -rw-r--r-- | tests/compute/byte-address-buffer-aligned.slang | 40 | ||||
| -rw-r--r-- | tests/compute/byte-address-buffer-array.slang | 20 | ||||
| -rw-r--r-- | tests/compute/byte-address-buffer.slang | 17 | ||||
| -rw-r--r-- | tests/metal/byte-address-buffer.slang | 8 | ||||
| -rw-r--r-- | tests/metal/system-val-conversion.slang | 2 |
7 files changed, 85 insertions, 78 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index 6fb3af7fd..99f83776e 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -180,7 +180,7 @@ struct ByteAddressBuffer { case hlsl: __intrinsic_asm ".Load"; default: - return __byteAddressBufferLoad<uint>(this, location, 0); + return __byteAddressBufferLoad<uint>(this, uint(location), 0); } } @@ -213,7 +213,7 @@ struct ByteAddressBuffer [__readNone] [ForceInline] [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer)] - uint2 Load2(int location) + uint2 Load2(uint location) { __target_switch { @@ -226,7 +226,7 @@ struct ByteAddressBuffer [__readNone] [ForceInline] [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer)] - uint2 Load2(int location, int alignment) + uint2 Load2Aligned(uint location, uint alignment) { __target_switch { @@ -239,7 +239,7 @@ struct ByteAddressBuffer [__readNone] [ForceInline] [require(hlsl, byteaddressbuffer)] - uint2 Load2(int location, out uint status) + uint2 Load2(uint location, out uint status) { __target_switch { @@ -255,7 +255,7 @@ struct ByteAddressBuffer [__readNone] [ForceInline] [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer)] - uint2 Load2Aligned(int location) + uint2 Load2Aligned(uint location) { __target_switch { @@ -282,7 +282,7 @@ struct ByteAddressBuffer [__readNone] [ForceInline] [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer)] - uint3 Load3(int location) + uint3 Load3(uint location) { __target_switch { @@ -295,7 +295,7 @@ struct ByteAddressBuffer [__readNone] [ForceInline] [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer)] - uint3 Load3(int location, int alignment) + uint3 Load3Aligned(uint location, uint alignment) { __target_switch { @@ -308,7 +308,7 @@ struct ByteAddressBuffer [__readNone] [ForceInline] [require(hlsl, byteaddressbuffer)] - uint3 Load3(int location, out uint status) + uint3 Load3(uint location, out uint status) { __target_switch { @@ -323,7 +323,7 @@ struct ByteAddressBuffer [__readNone] [ForceInline] [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer)] - uint3 Load3Aligned(int location) + uint3 Load3Aligned(uint location) { __target_switch { @@ -349,7 +349,7 @@ struct ByteAddressBuffer [__readNone] [ForceInline] [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer)] - uint4 Load4(int location) + uint4 Load4(uint location) { __target_switch { @@ -362,7 +362,7 @@ struct ByteAddressBuffer [__readNone] [ForceInline] [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer)] - uint4 Load4(int location, int alignment) + uint4 Load4Aligned(uint location, uint alignment) { __target_switch { @@ -375,7 +375,7 @@ struct ByteAddressBuffer [__readNone] [ForceInline] [require(hlsl, byteaddressbuffer)] - uint4 Load4(int location, out uint status) + uint4 Load4(uint location, out uint status) { __target_switch { @@ -390,7 +390,7 @@ struct ByteAddressBuffer [__readNone] [ForceInline] [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer)] - uint4 Load4Aligned(int location) + uint4 Load4Aligned(uint location) { __target_switch { @@ -402,14 +402,14 @@ struct ByteAddressBuffer [__readNone] [ForceInline] - T Load<T>(int location) + T Load<T>(uint location) { return __byteAddressBufferLoad<T>(this, location, 0); } [__readNone] [ForceInline] - T Load<T>(int location, int alignment) + T LoadAligned<T>(uint location, uint alignment) { return __byteAddressBufferLoad<T>(this, location, alignment); } @@ -421,7 +421,7 @@ struct ByteAddressBuffer ///Currently, this function only supports when `T` is scalar, vector or matrix type. [__readNone] [ForceInline] - T LoadAligned<T>(int location) + T LoadAligned<T>(uint location) { return __byteAddressBufferLoad<T>(this, location, __naturalStrideOf<T>()); } @@ -4785,23 +4785,23 @@ uint64_t __asuint64(uint2 i) __intrinsic_op($(kIROp_ByteAddressBufferLoad)) [require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, byteaddressbuffer)] -T __byteAddressBufferLoad<T>(ByteAddressBuffer buffer, int offset, int alignment); +T __byteAddressBufferLoad<T>(ByteAddressBuffer buffer, uint offset, uint alignment); __intrinsic_op($(kIROp_ByteAddressBufferLoad)) [require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, byteaddressbuffer_rw)] -T __byteAddressBufferLoad<T>(RWByteAddressBuffer buffer, int offset, int alignment); +T __byteAddressBufferLoad<T>(RWByteAddressBuffer buffer, uint offset, uint alignment); __intrinsic_op($(kIROp_ByteAddressBufferLoad)) [require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, byteaddressbuffer_rw)] -T __byteAddressBufferLoad<T>(RasterizerOrderedByteAddressBuffer buffer, int offset, int alignment); +T __byteAddressBufferLoad<T>(RasterizerOrderedByteAddressBuffer buffer, uint offset, uint alignment); __intrinsic_op($(kIROp_ByteAddressBufferStore)) [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)] -void __byteAddressBufferStore<T>(RWByteAddressBuffer buffer, int offset, int alignment, T value); +void __byteAddressBufferStore<T>(RWByteAddressBuffer buffer, uint offset, uint alignment, T value); __intrinsic_op($(kIROp_ByteAddressBufferStore)) [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)] -void __byteAddressBufferStore<T>(RasterizerOrderedByteAddressBuffer buffer, int offset, int alignment, T value); +void __byteAddressBufferStore<T>(RasterizerOrderedByteAddressBuffer buffer, uint offset, uint alignment, T value); __intrinsic_op($(kIROp_GetUntypedBufferPtr)) [require(spirv, byteaddressbuffer)] @@ -5053,7 +5053,7 @@ struct $(item.name) { case hlsl: __intrinsic_asm ".Load"; default: - return __byteAddressBufferLoad<uint>(this, location, 0); + return __byteAddressBufferLoad<uint>(this, uint(location), 0); } } @@ -5086,7 +5086,7 @@ struct $(item.name) [__NoSideEffect] [ForceInline] [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)] - uint2 Load2(int location) + uint2 Load2(uint location) { __target_switch { @@ -5099,7 +5099,7 @@ struct $(item.name) [__NoSideEffect] [ForceInline] [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)] - uint2 Load2(int location, int alignment) + uint2 Load2Aligned(uint location, uint alignment) { __target_switch { @@ -5116,7 +5116,7 @@ struct $(item.name) [__NoSideEffect] [ForceInline] [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)] - uint2 Load2Aligned(int location) + uint2 Load2Aligned(uint location) { __target_switch { @@ -5129,7 +5129,7 @@ struct $(item.name) [__NoSideEffect] [ForceInline] [require(hlsl, byteaddressbuffer_rw)] - uint2 Load2(int location, out uint status) + uint2 Load2(uint location, out uint status) { __target_switch { @@ -5154,7 +5154,7 @@ struct $(item.name) [__NoSideEffect] [ForceInline] [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)] - uint3 Load3(int location) + uint3 Load3(uint location) { __target_switch { @@ -5167,7 +5167,7 @@ struct $(item.name) [__NoSideEffect] [ForceInline] [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)] - uint3 Load3(int location, int alignment) + uint3 Load3Aligned(uint location, uint alignment) { __target_switch { @@ -5184,7 +5184,7 @@ struct $(item.name) [__NoSideEffect] [ForceInline] [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)] - uint3 Load3Aligned(int location) + uint3 Load3Aligned(uint location) { __target_switch { @@ -5197,7 +5197,7 @@ struct $(item.name) [__NoSideEffect] [ForceInline] [require(hlsl, byteaddressbuffer_rw)] - uint3 Load3(int location, out uint status) + uint3 Load3(uint location, out uint status) { __target_switch { @@ -5221,7 +5221,7 @@ struct $(item.name) [__NoSideEffect] [ForceInline] [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)] - uint4 Load4(int location) + uint4 Load4(uint location) { __target_switch { @@ -5234,7 +5234,7 @@ struct $(item.name) [__NoSideEffect] [ForceInline] [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)] - uint4 Load4(int location, int alignment) + uint4 Load4Aligned(uint location, uint alignment) { __target_switch { @@ -5251,7 +5251,7 @@ struct $(item.name) [__NoSideEffect] [ForceInline] [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)] - uint4 Load4Aligned(int location) + uint4 Load4Aligned(uint location) { __target_switch { @@ -5264,7 +5264,7 @@ struct $(item.name) [__NoSideEffect] [ForceInline] [require(hlsl, byteaddressbuffer_rw)] - uint4 Load4(int location, out uint status) + uint4 Load4(uint location, out uint status) { __target_switch { @@ -5275,7 +5275,7 @@ struct $(item.name) [__NoSideEffect] [ForceInline] [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)] - T Load<T>(int location) + T Load<T>(uint location) { return __byteAddressBufferLoad<T>(this, location, 0); } @@ -5283,7 +5283,7 @@ struct $(item.name) [__NoSideEffect] [ForceInline] [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)] - T Load<T>(int location, int alignment) + T LoadAligned<T>(uint location, uint alignment) { return __byteAddressBufferLoad<T>(this, location, alignment); } @@ -5296,7 +5296,7 @@ struct $(item.name) [__NoSideEffect] [ForceInline] [require(cpp_cuda_glsl_hlsl_metal_spirv, byteaddressbuffer_rw)] - T LoadAligned<T>(int location) + T LoadAligned<T>(uint location) { return __byteAddressBufferLoad<T>(this, location, __naturalStrideOf<T>()); } diff --git a/tests/compute/byte-address-buffer-align-error.slang b/tests/compute/byte-address-buffer-align-error.slang index 34300d7c3..11efa561c 100644 --- a/tests/compute/byte-address-buffer-align-error.slang +++ b/tests/compute/byte-address-buffer-align-error.slang @@ -17,7 +17,7 @@ void computeMain(uint3 threadId : SV_DispatchThreadID) { // CHECK: error 41300: invalid alignment `{{.*}}` specified for the byte address buffer resource with the element size of `{{.*}}` // CHECK: error 41300: invalid alignment `{{.*}}` specified for the byte address buffer resource with the element size of `{{.*}}` - buffer.Store<Block>(0, buffer.Load<Block>(1, 5)); + buffer.Store<Block>(0, buffer.LoadAligned<Block>(1, 5)); buffer.Store<Block>(1, buffer.Load<Block>(0), 3); } diff --git a/tests/compute/byte-address-buffer-aligned.slang b/tests/compute/byte-address-buffer-aligned.slang index 0e848b75c..a65444ec2 100644 --- a/tests/compute/byte-address-buffer-aligned.slang +++ b/tests/compute/byte-address-buffer-aligned.slang @@ -33,26 +33,26 @@ void computeMain(uint3 threadId : SV_DispatchThreadID) // CHECK1: float {{.*}} = buffer0_{{.*}}.{{.*}} = {{.*}}; // CHECK1: float {{.*}} = buffer0_{{.*}}.{{.*}} = {{.*}}; - // CHECK2: float4 {{.*}} = (buffer0_0).Load<float4 >(int(32)); - // CHECK2: buffer0_0.Store(int(32),{{.*}}); - // CHECK2: float {{.*}} = (buffer0_0).Load<float >(int(8)); - // CHECK2: float {{.*}} = (buffer0_0).Load<float >(int(12)); - // CHECK2: float {{.*}} = (buffer0_0).Load<float >(int(16)); - // CHECK2: float {{.*}} = (buffer0_0).Load<float >(int(20)); - // CHECK2: buffer0_0.Store(int(32),float4({{.*}}, {{.*}}, {{.*}}, {{.*}})); - // CHECK2: float4 {{.*}} = (buffer0_0).Load<float4 >(int(32)); - // CHECK2: buffer0_0.Store(int(8),{{.*}}[int(0)]); - // CHECK2: buffer0_0.Store(int(12),{{.*}}[int(1)]); - // CHECK2: buffer0_0.Store(int(16),{{.*}}[int(2)]); - // CHECK2: buffer0_0.Store(int(20),{{.*}}[int(3)]); - // CHECK2: float {{.*}} = (buffer0_0).Load<float >(int(8)); - // CHECK2: float {{.*}} = (buffer0_0).Load<float >(int(12)); - // CHECK2: float {{.*}} = (buffer0_0).Load<float >(int(16)); - // CHECK2: float {{.*}} = (buffer0_0).Load<float >(int(20)); - // CHECK2: buffer0_0.Store(int(8),{{.*}}); - // CHECK2: buffer0_0.Store(int(12),{{.*}}); - // CHECK2: buffer0_0.Store(int(16),{{.*}}); - // CHECK2: buffer0_0.Store(int(20),{{.*}}); + // CHECK2: float4 {{.*}} = (buffer0_0).Load<float4 >(32U); + // CHECK2: buffer0_0.Store(32U,{{.*}}); + // CHECK2: float {{.*}} = (buffer0_0).Load<float >(8U); + // CHECK2: float {{.*}} = (buffer0_0).Load<float >(12U); + // CHECK2: float {{.*}} = (buffer0_0).Load<float >(16U); + // CHECK2: float {{.*}} = (buffer0_0).Load<float >(20U); + // CHECK2: buffer0_0.Store(32U,float4({{.*}}, {{.*}}, {{.*}}, {{.*}})); + // CHECK2: float4 {{.*}} = (buffer0_0).Load<float4 >(32U); + // CHECK2: buffer0_0.Store(8U,{{.*}}[int(0)]); + // CHECK2: buffer0_0.Store(12U,{{.*}}[int(1)]); + // CHECK2: buffer0_0.Store(16U,{{.*}}[int(2)]); + // CHECK2: buffer0_0.Store(20U,{{.*}}[int(3)]); + // CHECK2: float {{.*}} = (buffer0_0).Load<float >(8U); + // CHECK2: float {{.*}} = (buffer0_0).Load<float >(12U); + // CHECK2: float {{.*}} = (buffer0_0).Load<float >(16U); + // CHECK2: float {{.*}} = (buffer0_0).Load<float >(20U); + // CHECK2: buffer0_0.Store(8U,{{.*}}); + // CHECK2: buffer0_0.Store(12U,{{.*}}); + // CHECK2: buffer0_0.Store(16U,{{.*}}); + // CHECK2: buffer0_0.Store(20U,{{.*}}); // CHECK3-DAG: %[[v4f:[a-zA-Z0-9_]+]] = OpTypeVector %float 4 // CHECK3-DAG: %[[SBv4f:[a-zA-Z0-9_]+]] = OpTypePointer StorageBuffer %[[v4f]] diff --git a/tests/compute/byte-address-buffer-array.slang b/tests/compute/byte-address-buffer-array.slang index 429d24072..0231919e5 100644 --- a/tests/compute/byte-address-buffer-array.slang +++ b/tests/compute/byte-address-buffer-array.slang @@ -19,21 +19,21 @@ void computeMain(uint3 threadId : SV_DispatchThreadID) { // CHECK-NOT: warning - // CHECK2: float4 {{.*}}[int(2)] = (buffer_0).Load<float4 [int(2)] >(int(0)); - // CHECK2: buffer_0.Store(int(0),{{.*}}); - // CHECK2: float {{.*}} = (buffer_0).Load<float >(int(4)); - // CHECK2: float {{.*}} = (buffer_0).Load<float >(int(8)); - // CHECK2: float {{.*}} = (buffer_0).Load<float >(int(12)); - // CHECK2: float {{.*}} = (buffer_0).Load<float >(int(16)); + // CHECK2: float4 {{.*}}[int(2)] = (buffer_0).Load<float4 [int(2)] >(0U); + // CHECK2: buffer_0.Store(0U,{{.*}}); + // CHECK2: float {{.*}} = (buffer_0).Load<float >(4U); + // CHECK2: float {{.*}} = (buffer_0).Load<float >(8U); + // CHECK2: float {{.*}} = (buffer_0).Load<float >(12U); + // CHECK2: float {{.*}} = (buffer_0).Load<float >(16U); // CHECK2: float4 {{.*}} = float4({{.*}}, {{.*}}, {{.*}}, {{.*}}); - // CHECK2: float4 {{.*}} = (buffer_0).Load<float4 >(int(20)); - // CHECK2: buffer_0.Store(int(16),{{.*}}); - // CHECK2: buffer_0.Store(int(32),{{.*}}); + // CHECK2: float4 {{.*}} = (buffer_0).Load<float4 >(20U); + // CHECK2: buffer_0.Store(16U,{{.*}}); + // CHECK2: buffer_0.Store(32U,{{.*}}); // CHECK3: OpAccessChain // CHECK3: OpLoad %v4float // CHECK3: OpStore buffer.Store(0, buffer.LoadAligned<Block>(0)); - buffer.StoreAligned(16, buffer.Load<Block>(4, 16)); + buffer.StoreAligned(16, buffer.LoadAligned<Block>(4, 16)); } diff --git a/tests/compute/byte-address-buffer.slang b/tests/compute/byte-address-buffer.slang index 65356ec22..3bf811945 100644 --- a/tests/compute/byte-address-buffer.slang +++ b/tests/compute/byte-address-buffer.slang @@ -5,6 +5,8 @@ //TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj //TEST(compute):COMPARE_COMPUTE_EX:-d3d12 -compute -shaderobj +//TEST:SIMPLE(filecheck=SPV):-target spirv -entry computeMain -stage compute -emit-spirv-directly + // Confirm cross-compilation of `(RW)ByteAddressBuffer` // // TODO: I'm only using `RWByteAddressBuffer` for now because I don't @@ -16,26 +18,31 @@ RWByteAddressBuffer inputBuffer; //TEST_INPUT:ubuffer(data=[0 0 0 0]):out,name=outputBuffer RWByteAddressBuffer outputBuffer; -void test(int val) +// Make sure arithmetic ops are properly performed on unsigned types. +// SPV-NOT: OpSDiv +// SPV: OpUDiv + +void test(uint val) { uint tmp = val; - tmp = inputBuffer.Load(int(tmp * 4)); + tmp = inputBuffer.Load(uint(tmp * 4)); - uint2 pair = inputBuffer.Load2(int(tmp * 4)); + uint2 pair = inputBuffer.Load2(uint(tmp * 4)); tmp = (pair.x + pair.y) & 0xF; - uint4 quad = inputBuffer.Load4(int(tmp * 4)); + uint4 quad = inputBuffer.Load4(uint(tmp * 4)); tmp = (quad.x + quad.y + quad.z + quad.w) & 0xF; outputBuffer.Store(val*4, tmp); } [numthreads(4, 1, 1)] +[shader("compute")] void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID) { uint tid = dispatchThreadID.x; - int val = int(tid); + uint val = uint(tid); test(val); } diff --git a/tests/metal/byte-address-buffer.slang b/tests/metal/byte-address-buffer.slang index cf704f170..53c0e0ac5 100644 --- a/tests/metal/byte-address-buffer.slang +++ b/tests/metal/byte-address-buffer.slang @@ -19,12 +19,12 @@ struct TestStruct [numthreads(1,1,1)] void main_kernel(uint3 tid: SV_DispatchThreadID) { - // CHECK: uint [[WORD0:[a-zA-Z0-9_]+]] = as_type<uint>({{.*}}[(int(0))>>2]); + // CHECK: uint [[WORD0:[a-zA-Z0-9_]+]] = as_type<uint>({{.*}}[(0U)>>2]); // CHECK: uint8_t [[A:[a-zA-Z0-9_]+]] = uint8_t(([[WORD0]] >> 0U) & 255U); - // CHECK: uint [[WORD1:[a-zA-Z0-9_]+]] = as_type<uint>({{.*}}[(int(0))>>2]); + // CHECK: uint [[WORD1:[a-zA-Z0-9_]+]] = as_type<uint>({{.*}}[(0U)>>2]); // CHECK: half [[H:[a-zA-Z0-9_]+]] = as_type<half>(ushort(([[WORD1]] >> 16U) & 65535U)); - // CHECK: {{.*}}[(int(128))>>2] = as_type<uint32_t>(({{.*}} & 4294967040U) | (uint([[A]]) << 0U)); - // CHECK: {{.*}}[(int(128))>>2] = as_type<uint32_t>(({{.*}} & 65535U) | (uint(as_type<ushort>([[H]])) << 16U)); + // CHECK: {{.*}}[(128U)>>2] = as_type<uint32_t>(({{.*}} & 4294967040U) | (uint([[A]]) << 0U)); + // CHECK: {{.*}}[(128U)>>2] = as_type<uint32_t>(({{.*}} & 65535U) | (uint(as_type<ushort>([[H]])) << 16U)); buffer.Store(128, buffer.Load<TestStruct>(0)); } diff --git a/tests/metal/system-val-conversion.slang b/tests/metal/system-val-conversion.slang index 5a208086d..dd8e103ae 100644 --- a/tests/metal/system-val-conversion.slang +++ b/tests/metal/system-val-conversion.slang @@ -20,7 +20,7 @@ struct TestStruct } // CHECK: void main_kernel(uint3 tid{{.*}} -// CHECK: int tid{{.*}} = int(tid{{.*}}.x); +// CHECK: uint(int(tid{{.*}}.x)) [numthreads(1,1,1)] void main_kernel(int tid: SV_DispatchThreadID) |
