@@ -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