@@ -1298,15 +1298,21 @@ const std::string ComputePSOTest_CS{R"(
12981298
12991299VK_IMAGE_FORMAT("rgba8") RWTexture2D</*format=rgba8*/ float4> g_tex2DUAV : register(u0);
13001300
1301+ cbuffer cbConstants
1302+ {
1303+ uint2 g_TexDim;
1304+ uint2 g_TileDim;
1305+ }
1306+
1307+ StructuredBuffer<float> g_CoordinateScaleBuffer;
1308+
13011309[numthreads(16, 16, 1)]
13021310void main(uint3 DTid : SV_DispatchThreadID)
13031311{
1304- uint2 ui2Dim;
1305- g_tex2DUAV.GetDimensions(ui2Dim.x, ui2Dim.y);
1306- if (DTid.x >= ui2Dim.x || DTid.y >= ui2Dim.y)
1312+ if (DTid.x >= g_TexDim.x || DTid.y >= g_TexDim.y)
13071313 return;
13081314
1309- g_tex2DUAV[DTid.xy] = float4(float2(DTid.xy % 256u ) / 256.0 , 0.0, 1.0);
1315+ g_tex2DUAV[DTid.xy] = float4(float2(DTid.xy % g_TileDim.xy ) / float2(g_CoordinateScaleBuffer[DTid.x], g_CoordinateScaleBuffer[DTid.y]) , 0.0, 1.0);
13101316}
13111317
13121318)" };
@@ -1391,6 +1397,8 @@ void TestComputePipeline(PSO_ARCHIVE_FLAGS ArchiveFlags, bool CompileAsync = fal
13911397 {
13921398 constexpr PipelineResourceDesc Resources[] = {
13931399 {SHADER_TYPE_COMPUTE, " g_tex2DUAV" , 1 , SHADER_RESOURCE_TYPE_TEXTURE_UAV, SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC, PIPELINE_RESOURCE_FLAG_NONE, {WEB_GPU_BINDING_TYPE_WRITE_ONLY_TEXTURE_UAV, RESOURCE_DIM_TEX_2D, TEX_FORMAT_RGBA8_UNORM}},
1400+ {SHADER_TYPE_COMPUTE, " cbConstants" , 1 , SHADER_RESOURCE_TYPE_CONSTANT_BUFFER, SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC},
1401+ {SHADER_TYPE_COMPUTE, " g_CoordinateScaleBuffer" , 1 , SHADER_RESOURCE_TYPE_BUFFER_SRV, SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC},
13941402 };
13951403
13961404 PipelineResourceSignatureDesc PRSDesc;
@@ -1405,6 +1413,34 @@ void TestComputePipeline(PSO_ARCHIVE_FLAGS ArchiveFlags, bool CompileAsync = fal
14051413 ASSERT_NE (pRefPRS, nullptr );
14061414 }
14071415
1416+ RefCntAutoPtr<IBuffer> pConstantsCB;
1417+ {
1418+ BufferDesc BuffDesc;
1419+ BuffDesc.Name = " TestComputePipeline - Constants CB" ;
1420+ uint4 Data{SCDesc.Width , SCDesc.Height , 256u , 256u };
1421+ BuffDesc.Size = sizeof (Data);
1422+ BuffDesc.BindFlags = BIND_UNIFORM_BUFFER;
1423+ BuffDesc.Usage = USAGE_IMMUTABLE;
1424+ BufferData InitialData{&Data, sizeof (Data)};
1425+ pDevice->CreateBuffer (BuffDesc, &InitialData, &pConstantsCB);
1426+ ASSERT_NE (pConstantsCB, nullptr );
1427+ }
1428+
1429+ RefCntAutoPtr<IBuffer> pCoordinateScaleBuffer;
1430+ {
1431+ BufferDesc BuffDesc;
1432+ BuffDesc.Name = " TestComputePipeline - Coordinate Scale Buffer" ;
1433+ std::vector<float > Data (std::max (SCDesc.Width , SCDesc.Height ), 256 .f );
1434+ BuffDesc.Size = static_cast <Uint32>(Data.size () * sizeof (float ));
1435+ BuffDesc.BindFlags = BIND_SHADER_RESOURCE;
1436+ BuffDesc.Usage = USAGE_IMMUTABLE;
1437+ BuffDesc.Mode = BUFFER_MODE_STRUCTURED;
1438+ BuffDesc.ElementByteStride = sizeof (float );
1439+ BufferData InitialData{Data.data (), BuffDesc.Size };
1440+ pDevice->CreateBuffer (BuffDesc, &InitialData, &pCoordinateScaleBuffer);
1441+ ASSERT_NE (pCoordinateScaleBuffer, nullptr );
1442+ }
1443+
14081444 RefCntAutoPtr<IPipelineState> pRefPSO;
14091445 {
14101446 RefCntAutoPtr<IArchiver> pArchiver;
@@ -1502,6 +1538,8 @@ void TestComputePipeline(PSO_ARCHIVE_FLAGS ArchiveFlags, bool CompileAsync = fal
15021538 const auto Dispatch = [&](IPipelineState* pPSO, ITextureView* pTextureUAV) //
15031539 {
15041540 pSRB->GetVariableByName (SHADER_TYPE_COMPUTE, " g_tex2DUAV" )->Set (pTextureUAV);
1541+ pSRB->GetVariableByName (SHADER_TYPE_COMPUTE, " cbConstants" )->Set (pConstantsCB);
1542+ pSRB->GetVariableByName (SHADER_TYPE_COMPUTE, " g_CoordinateScaleBuffer" )->Set (pCoordinateScaleBuffer->GetDefaultView (BUFFER_VIEW_SHADER_RESOURCE));
15051543
15061544 pContext->SetPipelineState (pPSO);
15071545 pContext->CommitShaderResources (pSRB, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
0 commit comments