From 7826afcaad78cc33c976bb3db3cdc9eada4c77e8 Mon Sep 17 00:00:00 2001 From: Ellie Hermaszewska Date: Wed, 18 Oct 2023 06:26:00 +0800 Subject: Type layouts for structured buffers with counters (#3269) * More tests for append structured buffer * Append and Consume structured buffer tests for DX12 * neaten * test wobble * Add counter layout information to append/consume structured buffers * add getRWStructuredBufferType * Correct definition of get size for append/consume structured buffers * tweak append structured buffer test * Allow initializing counter buffer in render test * vulkan test for consume structured buffer * Handle null counterVarLayout in getExplicitCounterBindingRangeOffset * remove dead code * Implement atomic counter increment/decrement for spirv * explicit spirv test * Add missing check on result * Hold on to counter resources --------- Co-authored-by: Yong He --- tests/hlsl/append-structured-buffer.slang | 71 +++++++++++++++--------------- tests/hlsl/consume-structured-buffer.slang | 50 ++++++++++----------- 2 files changed, 59 insertions(+), 62 deletions(-) (limited to 'tests') diff --git a/tests/hlsl/append-structured-buffer.slang b/tests/hlsl/append-structured-buffer.slang index 52c657b86..5ec7f844a 100644 --- a/tests/hlsl/append-structured-buffer.slang +++ b/tests/hlsl/append-structured-buffer.slang @@ -1,43 +1,42 @@ +//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-dx12 -use-dxil -compute -output-using-type +//TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-vk -compute -output-using-type +//TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-vk -compute -output-using-type -emit-spirv-directly -//TEST:SIMPLE(filecheck=GLSL):-target glsl -profile glsl_450 -stage compute -entry computeMain -fvk-u-shift 10 0 -//TEST:SIMPLE(filecheck=SPIRV):-target spirv -profile glsl_450 -stage compute -entry computeMain +// To check that our counter-initialization works correctly, set the initial +// counter to 1 instead of 0 +//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0], stride=4, counter=1):out,name=outputBuffer +AppendStructuredBuffer outputBuffer; -//DISABLED_TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -output-using-type -xslang -fvk-use-gl-layout +//TEST_INPUT:set inBuffer = ubuffer(data=[1 2 3 4], stride=4) +RWStructuredBuffer inBuffer; -//TEST_INPUT:ubuffer(data=[0], stride=4):out,name=outputBuffer -RWStructuredBuffer outputBuffer; - -AppendStructuredBuffer appendBuffer; - -// GLSL: layout(std430, binding = 11) buffer StructuredBuffer_float2_t -// GLSL: vec2 _data[]; -// GLSL: } appendBuffer_elements_0 - -// GLSL: layout(std430, binding = 12) buffer StructuredBuffer_int_t -// GLSL: int _data[]; -// GLSL: } appendBuffer_counter - -// GLSL: void AppendStructuredBuffer_Append_0(vec2 [[PARAM:[A-Za-z0-9_]+]]) -// GLSL: int [[COUNTER:[A-Za-z0-9_]+]] = atomicAdd(appendBuffer_counter_0._data[0], 1); -// GLSL: appendBuffer_elements_0._data{{\[}}[[COUNTER]]{{\]}} = [[PARAM]]; - -// GLSL: uvec2 StructuredBuffer_GetDimensions_0() -// GLSL: { -// GLSL: return uvec2(uint(appendBuffer_counter_0._data[0]), 8U); -// GLSL: } - -// SPIRV: OpEntryPoint - -//TEST_INPUT:set inBuffer = ubuffer(data=[1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0], stride=4) -RWByteAddressBuffer inBuffer; - -[numthreads(1, 1, 1)] -void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID) +[numthreads(4, 1, 1)] +void computeMain(uint i : SV_GroupIndex) { - var g = inBuffer.Load(4); - appendBuffer.Append(g.xy); + int g = inBuffer[i]; + outputBuffer.Append(g); + + GroupMemoryBarrier(); uint numStructs, stride; - appendBuffer.GetDimensions(numStructs, stride); - outputBuffer[dispatchThreadID.x] = numStructs; // expect 1.0 + outputBuffer.GetDimensions(numStructs, stride); + if(i == 0) + outputBuffer.Append(int(numStructs)); + + // BUF: type: int32_t + // Never assigned, as we set the initial counter to 1 + // BUF: 0 + + // The values from inBuffer in any order + // BUF-DAG: 1 + // BUF-DAG: 3 + // BUF-DAG: 2 + // BUF-DAG: 4 + + // The total size of the AppendStructuredBuffer (from GetDimensions) + // BUF: 8 + + // Never assigned + // BUF: 0 + // BUF: 0 } diff --git a/tests/hlsl/consume-structured-buffer.slang b/tests/hlsl/consume-structured-buffer.slang index 3027b4184..352fd6dac 100644 --- a/tests/hlsl/consume-structured-buffer.slang +++ b/tests/hlsl/consume-structured-buffer.slang @@ -1,35 +1,33 @@ +//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-dx12 -use-dxil -compute -output-using-type +//TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-vk -compute -output-using-type +//TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-vk -compute -output-using-type -emit-spirv-directly -//TEST:SIMPLE(filecheck=GLSL):-target glsl -profile glsl_450 -stage compute -entry computeMain -//TEST:SIMPLE(filecheck=SPIRV):-target spirv -profile glsl_450 -stage compute -entry computeMain - -//DISABLED_TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -output-using-type -xslang -fvk-use-gl-layout - -//TEST_INPUT:ubuffer(data=[0], stride=4):out,name=outputBuffer +//TEST_INPUT:ubuffer(data=[0 0 0 0 0], stride=4):out,name=outputBuffer RWStructuredBuffer outputBuffer; -ConsumeStructuredBuffer consumeBuffer; +// To check that our counter-initialization works correctly, set the initial +// counter to 6 instead of 8, so we'll start reading from 6.0 downwards +//TEST_INPUT:set consumeBuffer = ubuffer(data=[1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0], stride=4, counter=6) +ConsumeStructuredBuffer consumeBuffer; -// GLSL: layout(std430, binding = 1) buffer StructuredBuffer_float2_t -// GLSL: vec2 _data[]; -// GLSL: } consumeBuffer_elements_0 +[numthreads(4, 1, 1)] +void computeMain(uint i : SV_GroupIndex) +{ + uint size, stride; + consumeBuffer.GetDimensions(size, stride); -// GLSL: layout(std430, binding = 2) buffer StructuredBuffer_int_t -// GLSL: int _data[]; -// GLSL: } consumeBuffer_counter + if(i == 0) + outputBuffer[0] = size; -// GLSL: vec2 ConsumeStructuredBuffer_Consume_0() -// GLSL: int [[COUNTER:[A-Za-z0-9_]+]] = atomicAdd(consumeBuffer_counter_0._data[0], -1); -// GLSL: int [[COUNTER1:[A-Za-z0-9_]+]] = [[COUNTER]] - 1; -// GLSL: if{{\s?}}([[COUNTER1]] >= 0) -// GLSL: return consumeBuffer_elements_0._data{{\[}}[[COUNTER1]]{{\]}}; -// GLSL: else -// GLSL: return vec2(0.0); + outputBuffer[i+1] = consumeBuffer.Consume(); -// SPIRV: OpEntryPoint + // BUF: type: float + // The total size of the ConsumeStructuredBuffer (from GetDimensions) + // BUF: 8.0 -[numthreads(1, 1, 1)] -void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID) -{ - var v = consumeBuffer.Consume(); - outputBuffer[dispatchThreadID.x] = v.x; // expect 1.0 + // The values from consumeBuffer in any order + // BUF-DAG: 6.0 + // BUF-DAG: 4.0 + // BUF-DAG: 5.0 + // BUF-DAG: 3.0 } -- cgit v1.2.3