From feb1569d972f294ce482ea8b1645da6cde4e982d Mon Sep 17 00:00:00 2001 From: "James Helferty (NVIDIA)" Date: Fri, 15 Aug 2025 06:02:01 -0700 Subject: Prohibit use of buffer.GetDimensions on metal (#8156) Fixes #7011 --- source/slang/hlsl.meta.slang | 15 ++++++++------- tests/metal/get-dimensions-error.slang | 35 ++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 7 deletions(-) create mode 100644 tests/metal/get-dimensions-error.slang diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index 740f48320..78f6a4eb8 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -65,24 +65,24 @@ struct GLSLShaderStorageBuffer {} __generic __intrinsic_op($(kIROp_StructuredBufferGetDimensions)) -[require(cpp_cuda_glsl_hlsl_metal_spirv, appendstructuredbuffer)] +[require(cpp_cuda_glsl_hlsl_spirv, appendstructuredbuffer)] uint2 __structuredBufferGetDimensions(AppendStructuredBuffer buffer); __generic __intrinsic_op($(kIROp_StructuredBufferGetDimensions)) -[require(cpp_cuda_glsl_hlsl_metal_spirv, consumestructuredbuffer)] +[require(cpp_cuda_glsl_hlsl_spirv, consumestructuredbuffer)] uint2 __structuredBufferGetDimensions(ConsumeStructuredBuffer buffer); __intrinsic_op($(kIROp_StructuredBufferGetDimensions)) -[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, structuredbuffer)] +[require(cpp_cuda_glsl_hlsl_spirv_wgsl, structuredbuffer)] uint2 __structuredBufferGetDimensions(StructuredBuffer buffer); __intrinsic_op($(kIROp_StructuredBufferGetDimensions)) -[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, structuredbuffer_rw)] +[require(cpp_cuda_glsl_hlsl_spirv_wgsl, structuredbuffer_rw)] uint2 __structuredBufferGetDimensions(RWStructuredBuffer buffer); __intrinsic_op($(kIROp_StructuredBufferGetDimensions)) -[require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, structuredbuffer_rw)] +[require(cpp_cuda_glsl_hlsl_spirv_wgsl, structuredbuffer_rw)] uint2 __structuredBufferGetDimensions(RasterizerOrderedStructuredBuffer buffer); //@public: @@ -150,7 +150,7 @@ struct ByteAddressBuffer ///@param[out] dim The number of bytes in the buffer. [__readNone] [ForceInline] - [require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, structuredbuffer)] + [require(cpp_cuda_glsl_hlsl_spirv_wgsl, structuredbuffer)] void GetDimensions(out uint dim) { __target_switch @@ -4852,6 +4852,7 @@ struct StructuredBuffer /// @param stride The stride, in bytes, of each structure element. [__readNone] [ForceInline] + [require(cpp_cuda_glsl_hlsl_spirv_wgsl, structuredbuffer)] void GetDimensions( out uint numStructs, out uint stride) @@ -6048,7 +6049,7 @@ struct $(item.name) /// @param stride The stride, in bytes, of each structure element. [__readNone] [ForceInline] - [require(cpp_cuda_glsl_hlsl_metal_spirv_wgsl, structuredbuffer_rw)] + [require(cpp_cuda_glsl_hlsl_spirv_wgsl, structuredbuffer_rw)] void GetDimensions( out uint numStructs, out uint stride) diff --git a/tests/metal/get-dimensions-error.slang b/tests/metal/get-dimensions-error.slang new file mode 100644 index 000000000..a632ece0b --- /dev/null +++ b/tests/metal/get-dimensions-error.slang @@ -0,0 +1,35 @@ +//DIAGNOSTIC_TEST:SIMPLE(filecheck=CHECK): -target metal -stage compute -entry cmain -DTEST=0 -DBUFFER_TYPE=StructuredBuffer +//DIAGNOSTIC_TEST:SIMPLE(filecheck=CHECK): -target metal -stage compute -entry cmain -DTEST=0 -DBUFFER_TYPE=RWStructuredBuffer +//DIAGNOSTIC_TEST:SIMPLE(filecheck=CHECK): -target metal -stage compute -entry cmain -DTEST=0 -DBUFFER_TYPE=AppendStructuredBuffer +//DIAGNOSTIC_TEST:SIMPLE(filecheck=CHECK): -target metal -stage compute -entry cmain -DTEST=0 -DBUFFER_TYPE=ConsumeStructuredBuffer +//DIAGNOSTIC_TEST:SIMPLE(filecheck=CHECK): -target metal -stage compute -entry cmain -DTEST=0 -DBUFFER_TYPE=RasterizerOrderedStructuredBuffer +//DIAGNOSTIC_TEST:SIMPLE(filecheck=CHECK): -target metal -stage compute -entry cmain -DTEST=1 -DBUFFER_TYPE=ByteAddressBuffer +//DIAGNOSTIC_TEST:SIMPLE(filecheck=CHECK): -target metal -stage compute -entry cmain -DTEST=1 -DBUFFER_TYPE=RWByteAddressBuffer +//DIAGNOSTIC_TEST:SIMPLE(filecheck=CHECK): -target metal -stage compute -entry cmain -DTEST=1 -DBUFFER_TYPE=RasterizerOrderedByteAddressBuffer + +//TEST_INPUT:ubuffer(data=[0 0], stride=4):out,name outputBuffer +RWStructuredBuffer outputBuffer; + +//TEST_INPUT:ubuffer(data=[7 2 9 53], stride=4):name buffer +#if TEST == 0 +BUFFER_TYPE buffer; +#elif TEST==1 +BUFFER_TYPE buffer; +#endif + +//CHECK: error 36107: +//CHECK: buffer.GetDimensions + +[shader("compute")] +[numthreads(1, 1, 1)] +void cmain(uint3 dispatchThreadID : SV_DispatchThreadID) +{ + uint count = 0, stride = 0; +#if TEST == 0 + buffer.GetDimensions(count, stride); +#elif TEST == 1 + buffer.GetDimensions(count); +#endif + outputBuffer[0] = count; + outputBuffer[1] = stride; +} -- cgit v1.2.3