Skip to content

Commit 3104c66

Browse files
ShaderResourceLayout: added CS variant of CopyStaticResources test
1 parent c5ffe02 commit 3104c66

File tree

3 files changed

+253
-0
lines changed

3 files changed

+253
-0
lines changed
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
layout(std140, binding = 0) buffer g_RWBuff_0
2+
{
3+
vec4 data[4];
4+
}g_StorageBuff_0;
5+
6+
layout(std140, binding = 1) buffer g_RWBuff_1
7+
{
8+
vec4 data[4];
9+
}g_StorageBuff_1;
10+
11+
12+
layout(std140, binding = 2) buffer g_RWBuff_2
13+
{
14+
vec4 data[4];
15+
}g_StorageBuff_2;
16+
17+
layout(rgba8, binding = 3) uniform image2D g_RWTex2D_0;
18+
layout(rgba8, binding = 4) uniform image2D g_RWTex2D_1;
19+
layout(rgba8, binding = 5) uniform image2D g_RWTex2D_2;
20+
21+
vec4 CheckValue(vec4 Val, vec4 Expected)
22+
{
23+
return vec4(Val.x == Expected.x ? 1.0 : 0.0,
24+
Val.y == Expected.y ? 1.0 : 0.0,
25+
Val.z == Expected.z ? 1.0 : 0.0,
26+
Val.w == Expected.w ? 1.0 : 0.0);
27+
}
28+
29+
vec4 VerifyResources()
30+
{
31+
vec4 AllCorrect = vec4(1.0, 1.0, 1.0, 1.0);
32+
33+
// Read from elements 1,2,3
34+
AllCorrect *= CheckValue(g_StorageBuff_0.data[1], Buff_0_Ref);
35+
AllCorrect *= CheckValue(g_StorageBuff_1.data[2], Buff_1_Ref);
36+
AllCorrect *= CheckValue(g_StorageBuff_2.data[3], Buff_2_Ref);
37+
38+
// Write to 0-th element
39+
vec4 Data = vec4(1.0, 2.0, 3.0, 4.0);
40+
g_StorageBuff_0.data[0] = Data;
41+
g_StorageBuff_1.data[0] = Data;
42+
g_StorageBuff_2.data[0] = Data;
43+
44+
AllCorrect *= CheckValue(imageLoad(g_RWTex2D_0, ivec2(10, 12)), RWTex2D_0_Ref);
45+
AllCorrect *= CheckValue(imageLoad(g_RWTex2D_1, ivec2(14, 17)), RWTex2D_1_Ref);
46+
AllCorrect *= CheckValue(imageLoad(g_RWTex2D_2, ivec2(31, 24)), RWTex2D_2_Ref);
47+
48+
imageStore(g_RWTex2D_0, ivec2(0, 0), vec4(1.0, 2.0, 3.0, 4.0));
49+
imageStore(g_RWTex2D_1, ivec2(0, 0), vec4(1.0, 2.0, 3.0, 4.0));
50+
imageStore(g_RWTex2D_2, ivec2(0, 0), vec4(1.0, 2.0, 3.0, 4.0));
51+
52+
return AllCorrect;
53+
}
54+
55+
layout(rgba8, binding = 0) uniform writeonly image2D g_tex2DUAV;
56+
57+
layout (local_size_x = 16, local_size_y = 16, local_size_z = 1) in;
58+
59+
void main()
60+
{
61+
ivec2 Dim = imageSize(g_tex2DUAV);
62+
if (gl_GlobalInvocationID.x >= uint(Dim.x) || gl_GlobalInvocationID.y >= uint(Dim.y))
63+
return;
64+
65+
imageStore(g_tex2DUAV, ivec2(gl_GlobalInvocationID.xy), vec4(vec2(gl_GlobalInvocationID.xy % 256u) / 256.0, 0.0, 1.0) * VerifyResources());
66+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
RWTexture2D<unorm float4 /*format=rgba8*/> g_RWTex2D_0;
2+
RWTexture2D<unorm float4 /*format=rgba8*/> g_RWTex2D_1;
3+
RWTexture2D<unorm float4 /*format=rgba8*/> g_RWTex2D_2;
4+
5+
struct BufferData
6+
{
7+
float4 data;
8+
};
9+
10+
RWStructuredBuffer<BufferData> g_RWBuff_0;
11+
RWStructuredBuffer<BufferData> g_RWBuff_1;
12+
RWStructuredBuffer<BufferData> g_RWBuff_2;
13+
14+
float4 CheckValue(float4 Val, float4 Expected)
15+
{
16+
return float4(Val.x == Expected.x ? 1.0 : 0.0,
17+
Val.y == Expected.y ? 1.0 : 0.0,
18+
Val.z == Expected.z ? 1.0 : 0.0,
19+
Val.w == Expected.w ? 1.0 : 0.0);
20+
}
21+
22+
float4 VerifyResources()
23+
{
24+
float4 AllCorrect = float4(1.0, 1.0, 1.0, 1.0);
25+
26+
// Read from elements 1,2,3
27+
AllCorrect *= CheckValue(g_RWBuff_0[1].data, Buff_0_Ref);
28+
AllCorrect *= CheckValue(g_RWBuff_1[2].data, Buff_1_Ref);
29+
AllCorrect *= CheckValue(g_RWBuff_2[3].data, Buff_2_Ref);
30+
31+
// Write to 0-th element
32+
float4 f4Data = float4(1.0, 2.0, 3.0, 4.0);
33+
g_RWBuff_0[0].data = f4Data;
34+
g_RWBuff_1[0].data = f4Data;
35+
g_RWBuff_2[0].data = f4Data;
36+
37+
AllCorrect *= CheckValue(g_RWTex2D_0[int2(10, 12)], RWTex2D_0_Ref);
38+
AllCorrect *= CheckValue(g_RWTex2D_1[int2(14, 17)], RWTex2D_1_Ref);
39+
AllCorrect *= CheckValue(g_RWTex2D_2[int2(31, 24)], RWTex2D_2_Ref);
40+
41+
float4 f4Color = float4(1.0, 2.0, 3.0, 4.0);
42+
g_RWTex2D_0[int2(0,0)] = f4Color;
43+
g_RWTex2D_1[int2(0,0)] = f4Color;
44+
g_RWTex2D_2[int2(0,0)] = f4Color;
45+
46+
return AllCorrect;
47+
}
48+
49+
RWTexture2D</*format=rgba8*/ float4> g_tex2DUAV;
50+
51+
[numthreads(16, 16, 1)]
52+
void main(uint3 DTid : SV_DispatchThreadID)
53+
{
54+
uint2 ui2Dim;
55+
g_tex2DUAV.GetDimensions(ui2Dim.x, ui2Dim.y);
56+
if (DTid.x >= ui2Dim.x || DTid.y >= ui2Dim.y)
57+
return;
58+
59+
g_tex2DUAV[DTid.xy] = float4(float2(DTid.xy % 256u) / 256.0, 0.0, 1.0) * VerifyResources();
60+
}

Tests/DiligentCoreAPITest/src/ShaderResourceLayoutTest.cpp

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1812,4 +1812,131 @@ TEST_F(ShaderResourceLayoutTest, CopyStaticResources)
18121812
pSwapChain->Present();
18131813
}
18141814

1815+
TEST_F(ShaderResourceLayoutTest, CopyStaticResourcesCS)
1816+
{
1817+
GPUTestingEnvironment::ScopedReset EnvironmentAutoReset;
1818+
1819+
auto* const pEnv = GPUTestingEnvironment::GetInstance();
1820+
auto* const pDevice = pEnv->GetDevice();
1821+
auto* const pSwapChain = pEnv->GetSwapChain();
1822+
auto* const pContext = pEnv->GetDeviceContext();
1823+
1824+
ComputeShaderReference(pSwapChain);
1825+
1826+
const auto& DeviceInfo = pDevice->GetDeviceInfo();
1827+
1828+
// Prepare buffers with reference values
1829+
ReferenceBuffers RefBuffers{
1830+
3,
1831+
USAGE_DEFAULT,
1832+
BIND_UNORDERED_ACCESS,
1833+
BUFFER_VIEW_UNORDERED_ACCESS,
1834+
BUFFER_MODE_STRUCTURED //
1835+
};
1836+
1837+
ReferenceTextures RefTextures{
1838+
3,
1839+
128, 128,
1840+
USAGE_DEFAULT,
1841+
BIND_UNORDERED_ACCESS,
1842+
TEXTURE_VIEW_UNORDERED_ACCESS //
1843+
};
1844+
1845+
// clang-format off
1846+
ShaderResourceDesc Resources[] =
1847+
{
1848+
{"g_tex2DUAV", SHADER_RESOURCE_TYPE_TEXTURE_UAV, 1},
1849+
{"g_RWTex2D_0", SHADER_RESOURCE_TYPE_TEXTURE_UAV, 1},
1850+
{"g_RWTex2D_1", SHADER_RESOURCE_TYPE_TEXTURE_UAV, 1},
1851+
{"g_RWTex2D_2", SHADER_RESOURCE_TYPE_TEXTURE_UAV, 1},
1852+
{"g_RWBuff_0", SHADER_RESOURCE_TYPE_BUFFER_UAV, 1},
1853+
{"g_RWBuff_1", SHADER_RESOURCE_TYPE_BUFFER_UAV, 1},
1854+
{"g_RWBuff_2", SHADER_RESOURCE_TYPE_BUFFER_UAV, 1}
1855+
};
1856+
// clang-format on
1857+
1858+
const char* ShaderFileName = nullptr;
1859+
SHADER_SOURCE_LANGUAGE SrcLang = SHADER_SOURCE_LANGUAGE_DEFAULT;
1860+
if (pDevice->GetDeviceInfo().IsD3DDevice())
1861+
{
1862+
ShaderFileName = "CopyStaticResourcesCS.hlsl";
1863+
SrcLang = SHADER_SOURCE_LANGUAGE_HLSL;
1864+
}
1865+
else if (DeviceInfo.IsVulkanDevice() || DeviceInfo.IsGLDevice() || DeviceInfo.IsMetalDevice())
1866+
{
1867+
ShaderFileName = "CopyStaticResourcesCS.glsl";
1868+
SrcLang = SHADER_SOURCE_LANGUAGE_GLSL;
1869+
}
1870+
else
1871+
{
1872+
GTEST_FAIL() << "Unexpected device type";
1873+
}
1874+
1875+
ShaderMacroHelper Macros;
1876+
if (SrcLang == SHADER_SOURCE_LANGUAGE_GLSL)
1877+
Macros.AddShaderMacro("float4", "vec4");
1878+
1879+
// Add macros that define reference colors
1880+
Macros.AddShaderMacro("Buff_0_Ref", RefBuffers.GetValue(0));
1881+
Macros.AddShaderMacro("Buff_1_Ref", RefBuffers.GetValue(1));
1882+
Macros.AddShaderMacro("Buff_2_Ref", RefBuffers.GetValue(2));
1883+
Macros.AddShaderMacro("RWTex2D_0_Ref", RefTextures.GetColor(0));
1884+
Macros.AddShaderMacro("RWTex2D_1_Ref", RefTextures.GetColor(1));
1885+
Macros.AddShaderMacro("RWTex2D_2_Ref", RefTextures.GetColor(2));
1886+
1887+
auto ModifyShaderCI = [pEnv](ShaderCreateInfo& ShaderCI) {
1888+
if (pEnv->NeedWARPResourceArrayIndexingBugWorkaround())
1889+
{
1890+
// Due to bug in D3D12 WARP, we have to use SM5.0 with old compiler
1891+
ShaderCI.ShaderCompiler = SHADER_COMPILER_DEFAULT;
1892+
ShaderCI.HLSLVersion = ShaderVersion{5, 0};
1893+
}
1894+
};
1895+
1896+
auto pCS = CreateShader("ShaderResourceLayoutTest.CopyStaticResourcesCS",
1897+
ShaderFileName, "main",
1898+
SHADER_TYPE_COMPUTE, SrcLang, Macros,
1899+
Resources, _countof(Resources), ModifyShaderCI);
1900+
ASSERT_NE(pCS, nullptr);
1901+
1902+
PipelineResourceLayoutDesc ResourceLayout;
1903+
ResourceLayout.DefaultVariableType = SHADER_RESOURCE_VARIABLE_TYPE_STATIC;
1904+
1905+
RefCntAutoPtr<IPipelineState> pPSO1;
1906+
RefCntAutoPtr<IShaderResourceBinding> pSRB1;
1907+
CreateComputePSO(pCS, ResourceLayout, pPSO1, pSRB1);
1908+
ASSERT_NE(pPSO1, nullptr);
1909+
ASSERT_NE(pSRB1, nullptr);
1910+
1911+
RefCntAutoPtr<ITestingSwapChain> pTestingSwapChain{pSwapChain, IID_TestingSwapChain};
1912+
ASSERT_TRUE(pTestingSwapChain);
1913+
SET_STATIC_VAR(pPSO1, SHADER_TYPE_COMPUTE, "g_tex2DUAV", Set, pTestingSwapChain->GetCurrentBackBufferUAV());
1914+
SET_STATIC_VAR(pPSO1, SHADER_TYPE_COMPUTE, "g_RWBuff_0", Set, RefBuffers.GetView(0));
1915+
SET_STATIC_VAR(pPSO1, SHADER_TYPE_COMPUTE, "g_RWTex2D_0", Set, RefTextures.GetView(0));
1916+
1917+
RefCntAutoPtr<IPipelineState> pPSO2;
1918+
RefCntAutoPtr<IShaderResourceBinding> pSRB2;
1919+
CreateComputePSO(pCS, ResourceLayout, pPSO2, pSRB2);
1920+
ASSERT_NE(pPSO2, nullptr);
1921+
ASSERT_NE(pSRB2, nullptr);
1922+
1923+
SET_STATIC_VAR(pPSO2, SHADER_TYPE_COMPUTE, "g_RWBuff_1", Set, RefBuffers.GetView(1));
1924+
SET_STATIC_VAR(pPSO2, SHADER_TYPE_COMPUTE, "g_RWTex2D_1", Set, RefTextures.GetView(1));
1925+
pPSO1->CopyStaticResources(pPSO2);
1926+
SET_STATIC_VAR(pPSO2, SHADER_TYPE_COMPUTE, "g_RWBuff_2", Set, RefBuffers.GetView(2));
1927+
SET_STATIC_VAR(pPSO2, SHADER_TYPE_COMPUTE, "g_RWTex2D_2", Set, RefTextures.GetView(2));
1928+
1929+
pPSO2->InitializeStaticSRBResources(pSRB2);
1930+
1931+
pContext->SetPipelineState(pPSO2);
1932+
pContext->CommitShaderResources(pSRB2, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
1933+
1934+
const auto& SCDesc = pSwapChain->GetDesc();
1935+
DispatchComputeAttribs DispatchAttribs((SCDesc.Width + 15) / 16, (SCDesc.Height + 15) / 16, 1);
1936+
pContext->CommitShaderResources(pSRB2, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
1937+
pContext->DispatchCompute(DispatchAttribs);
1938+
1939+
pSwapChain->Present();
1940+
}
1941+
18151942
} // namespace

0 commit comments

Comments
 (0)