From 725735a87b9d223c2afc83bbd049055b1e44a976 Mon Sep 17 00:00:00 2001 From: Yong He Date: Thu, 16 May 2024 10:43:49 -0700 Subject: RasterizerOrder resource for spirv and metal. (#4175) * RasterizerOrder resource for spirv and metal. Also fixes the byte address buffer logic for metal. * Fix. * Delete commented lines. --------- Co-authored-by: Jay Kwak <82421531+jkwak-work@users.noreply.github.com> --- tests/hlsl/raster-order-resource.slang | 50 ++++++++++++++++++++++++++++++++++ tests/metal/byte-address-buffer.slang | 30 ++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 tests/hlsl/raster-order-resource.slang create mode 100644 tests/metal/byte-address-buffer.slang (limited to 'tests') diff --git a/tests/hlsl/raster-order-resource.slang b/tests/hlsl/raster-order-resource.slang new file mode 100644 index 000000000..2db9f31dc --- /dev/null +++ b/tests/hlsl/raster-order-resource.slang @@ -0,0 +1,50 @@ +//TEST:SIMPLE(filecheck=SPIRV): -target spirv -fvk-use-entrypoint-name +//TEST:SIMPLE(filecheck=METAL): -target metal +//TEST:SIMPLE(filecheck=METALASM): -target metallib + + +// METAL-DAG: {{.*}}{{\[\[}}raster_order_group(0){{\]\]}} {{\[\[}}buffer(0) +// METAL-DAG: {{.*}}{{\[\[}}raster_order_group(0){{\]\]}} {{\[\[}}texture(0) +// METAL-DAG: {{.*}}{{\[\[}}raster_order_group(0){{\]\]}} {{\[\[}}buffer(1) + +// METALASM: @fragMain + +RasterizerOrderedByteAddressBuffer buffer; + +[shader("fragment")] +float4 fragMain() : SV_Target +{ + // SPIRV: %fragMain_0 = OpFunction + // SPIRV: OpBeginInvocationInterlockEXT + // SPIRV: OpEndInvocationInterlockEXT + + buffer.Store(0, 0x12345678); + return float4(1, 0, 0, 1); +} + +RasterizerOrderedTexture2D tex; + +[shader("fragment")] +float4 fragMain2() : SV_Target +{ + // SPIRV: %fragMain2_0 = OpFunction + // SPIRV: OpBeginInvocationInterlockEXT + // SPIRV: OpEndInvocationInterlockEXT + + tex[uint2(0, 0)] = float4(1, 0, 0, 1); + return float4(1, 0, 0, 1); +} + +RasterizerOrderedStructuredBuffer buffer2; + +[shader("fragment")] +float4 fragMain3() : SV_Target +{ + // SPIRV: %fragMain3_0 = OpFunction + // SPIRV: OpBeginInvocationInterlockEXT + // SPIRV: OpEndInvocationInterlockEXT + + buffer2[0] = 1; + return float4(1, 0, 0, 1); +} + diff --git a/tests/metal/byte-address-buffer.slang b/tests/metal/byte-address-buffer.slang new file mode 100644 index 000000000..f3169ebf4 --- /dev/null +++ b/tests/metal/byte-address-buffer.slang @@ -0,0 +1,30 @@ +//TEST:SIMPLE(filecheck=CHECK): -target metal +//TEST:SIMPLE(filecheck=CHECK-ASM): -target metallib + +uniform RWStructuredBuffer outputBuffer; + +RWByteAddressBuffer buffer; + +// CHECK-ASM: define void @main_kernel + +struct TestStruct +{ + uint8_t a; + float16_t h; + float b; + float4 c; + float4x3 d; +} + +[numthreads(1,1,1)] +void main_kernel(uint3 tid: SV_DispatchThreadID) +{ + // CHECK: uint [[WORD0:[a-zA-Z0-9_]+]] = as_type({{.*}}[(int(0))>>2]); + // CHECK: uint8_t [[A:[a-zA-Z0-9_]+]] = uint8_t([[WORD0]] >> int(0) & 255U); + // CHECK: uint [[WORD1:[a-zA-Z0-9_]+]] = as_type({{.*}}[(int(0))>>2]); + // CHECK: half [[H:[a-zA-Z0-9_]+]] = as_type(uint16_t([[WORD1]] >> int(16) & 65535U)); + + // CHECK: {{.*}}[(int(128))>>2] = as_type(({{.*}} & 4294967040U) | uint([[A]]) << int(0)); + // CHECK: {{.*}}[(int(128))>>2] = as_type(({{.*}} & 65535U) | uint(as_type([[H]])) << int(16)); + buffer.Store(128, buffer.Load(0)); +} -- cgit v1.2.3