From fd85fc35f798c09d9df4a1f31d02c8497e93b5be Mon Sep 17 00:00:00 2001 From: Mirko Covizzi Date: Tue, 24 Dec 2024 15:37:00 +0100 Subject: [PATCH] Examples: ComputeSpriteBatch: add uniform buffer Adds a uniform buffer to the compute SpriteBatch example to showcase how to use uniform buffers together with storage buffers. Signed-off-by: Mirko Covizzi --- .../Compiled/DXIL/SpriteBatch.comp.dxil | Bin 3708 -> 4096 bytes .../Shaders/Compiled/MSL/SpriteBatch.comp.msl | 48 ++++++++++-------- .../Compiled/SPIRV/SpriteBatch.comp.spv | Bin 2884 -> 3140 bytes Content/Shaders/Source/SpriteBatch.comp.hlsl | 14 +++-- Examples/ComputeSpriteBatch.c | 7 ++- 5 files changed, 43 insertions(+), 26 deletions(-) diff --git a/Content/Shaders/Compiled/DXIL/SpriteBatch.comp.dxil b/Content/Shaders/Compiled/DXIL/SpriteBatch.comp.dxil index a787535797e216e5a1021093de8bc0c88743af47..285804d6adc3868c188f01e8426e530503b34f8d 100644 GIT binary patch literal 4096 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 UbcI$vrjiS0spuL__{IV7Z@ax0eER%+)Z!p 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 QWO%ICJaBlwwSo(>Kg9OH%K!iX literal 2884 zcmZ{lSx*!}6om^AP(cJ0#RVL|T^!uN1zANwMP+ecGl3x?L5B=YqEGtZAJAXxi;3s! zuH&>@kvnzoxus)}TN5&y;Kotznz|UyN#`+JY7mk;y0&j|IP&Mmg!Kruu<7uOV%o>7US$)tt6!y-k8=x z+?ZAlA?nDqrFg5aJiQmL-MK_fW2^BQ+3&Z_>BDCV}`p3974&ekG3A|r0n+$Uo=?#;q9rY?DO zkSBJ2Ry)uyMt?R1WAMRRWya79)}F)A16Ghxf2U?NanV@E{b0ah%nC8qrFcdsBBl;} z_p-*%FzfN&?qPm!`jX$9=gV*{_5x$CPVLIs3NmV+jqxt|499KqIro08+O4@DBZrR` zhPk{eu0?(i$?$pnfcSgmfpOLWsUY4bqlOK>bDi>u|CQSxap&{v4#ai&9A~B11sMaq z#0O>QaePR=^^-p=DJ77$Pehb5%d718PZExg(QNK?! z_1Ui{eQUCN48~scuUlE}8+W)zK4&2=$m5x#4Xh{Lt87heE%$|c#9HnJF>8-$W-S<6 zj%%hLXd!<>bDa!)ub3w__bPizGk%vir_)@vKWok?rY2g6&&C){!~-$rY$J-%&s}B> zF`9UH9iss~=5h{Vw%FF)N|%bGS0z!MV__v;IfPyYx^`0MNCtQ@tlVv#u?$!n=27R7a0A!8Zm2O z?KK%(20XCqGBE1R$9HfyJ#imq<#V?NW$X#}oBEBOJ2LX~?hD_j zN%frf<-Tl(jQ){l9@7m3r-ti2kWW3np`T;Dhw@p&H_r9u<+~nv*8``9>n+Hq9^YNp zTa-^dzLBoCB;WPOyB;_-ThZ01y~pyY$2ZpXp2&AS@~#I?4R`~ZpUTXm2LFfX z3pn3o^Pb5!kMo)b&Uf0p=Q$qdFb}*SGw+3b*F&Fq;JuN@b9*T>4}H8B=mY27r5?Oj hGV{=99(bPjI>$qwdEj~8n;Z{)=7Gcep__kI_7gjRu6+Oi diff --git a/Content/Shaders/Source/SpriteBatch.comp.hlsl b/Content/Shaders/Source/SpriteBatch.comp.hlsl index 9c70d49..42c56b5 100644 --- a/Content/Shaders/Source/SpriteBatch.comp.hlsl +++ b/Content/Shaders/Source/SpriteBatch.comp.hlsl @@ -13,6 +13,11 @@ struct SpriteVertex float4 color; }; +cbuffer UBO : register(b0, space2) +{ + float time : packoffset(c0); +}; + StructuredBuffer ComputeBuffer : register(t0, space0); RWStructuredBuffer VertexBuffer : register(u0, space1); @@ -64,8 +69,9 @@ void main(uint3 GlobalInvocationID : SV_DispatchThreadID) VertexBuffer[n * 4u + 2].texcoord = float2(0.0f, 1.0f); VertexBuffer[n * 4u + 3].texcoord = float2(1.0f, 1.0f); - VertexBuffer[n * 4u] .color = currentSpriteData.color; - VertexBuffer[n * 4u + 1].color = currentSpriteData.color; - VertexBuffer[n * 4u + 2].color = currentSpriteData.color; - VertexBuffer[n * 4u + 3].color = currentSpriteData.color; + float st = sin(time); + VertexBuffer[n * 4u] .color = currentSpriteData.color * st; + VertexBuffer[n * 4u + 1].color = currentSpriteData.color * st; + VertexBuffer[n * 4u + 2].color = currentSpriteData.color * st; + VertexBuffer[n * 4u + 3].color = currentSpriteData.color * st; } diff --git a/Examples/ComputeSpriteBatch.c b/Examples/ComputeSpriteBatch.c index d204a35..9d0d171 100644 --- a/Examples/ComputeSpriteBatch.c +++ b/Examples/ComputeSpriteBatch.c @@ -25,7 +25,9 @@ typedef struct ComputeSpriteInstance float r, g, b, a; } ComputeSpriteInstance; -const Uint32 SPRITE_COUNT = 8192; +const Uint32 SPRITE_COUNT = 819200; + +static float t; static int Init(Context* context) { @@ -131,6 +133,7 @@ static int Init(Context* context) &(SDL_GPUComputePipelineCreateInfo){ .num_readonly_storage_buffers = 1, .num_readwrite_storage_buffers = 1, + .num_uniform_buffers = 1, .threadcount_x = 64, .threadcount_y = 1, .threadcount_z = 1 @@ -292,6 +295,7 @@ static int Init(Context* context) static int Update(Context* context) { + t += 0.1f; return 0; } @@ -383,6 +387,7 @@ static int Draw(Context* context) }, 1 ); + SDL_PushGPUComputeUniformData(cmdBuf, 0, &t, sizeof(float)); SDL_DispatchGPUCompute(computePass, SPRITE_COUNT / 64, 1, 1); SDL_EndGPUComputePass(computePass);