diff options
| author | Egor Yusov <egor.yusov@gmail.com> | 2019-12-11 17:36:53 +0000 |
|---|---|---|
| committer | Egor Yusov <egor.yusov@gmail.com> | 2019-12-11 17:36:53 +0000 |
| commit | a096e64e82a73c91f36d166f4e15c80aa62a2ee8 (patch) | |
| tree | e67d2f0b7b22d8398492f1314504feb01a87a117 /UnitTests | |
| parent | Added RWStructuredBuffer tests (diff) | |
| download | DiligentCore-a096e64e82a73c91f36d166f4e15c80aa62a2ee8.tar.gz DiligentCore-a096e64e82a73c91f36d166f4e15c80aa62a2ee8.zip | |
Added RWTextures test
Diffstat (limited to 'UnitTests')
| -rw-r--r-- | UnitTests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/RWTextures.hlsl | 39 | ||||
| -rw-r--r-- | UnitTests/DiligentCoreAPITest/src/ShaderResourceLayoutTest.cpp | 101 |
2 files changed, 137 insertions, 3 deletions
diff --git a/UnitTests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/RWTextures.hlsl b/UnitTests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/RWTextures.hlsl new file mode 100644 index 00000000..c2a90f30 --- /dev/null +++ b/UnitTests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/RWTextures.hlsl @@ -0,0 +1,39 @@ +RWTexture2D<float4> g_RWTex2D_Static; +RWTexture2D<float4> g_RWTex2D_Mut; +RWTexture2D<float4> g_RWTex2D_Dyn; + +RWTexture2D<float4> g_RWTex2DArr_Static[STATIC_TEX_ARRAY_SIZE]; // 2 +RWTexture2D<float4> g_RWTex2DArr_Mut [MUTABLE_TEX_ARRAY_SIZE]; // 4 or 2 in D3D11 +RWTexture2D<float4> g_RWTex2DArr_Dyn [DYNAMIC_TEX_ARRAY_SIZE]; // 3 or 1 in D3D11 + +void UseResources() +{ + float4 f4Color = float4(1.0, 2.0, 3.0, 4.0); + g_RWTex2D_Static[int2(0,0)] = f4Color; + g_RWTex2D_Mut [int2(0,0)] = f4Color; + g_RWTex2D_Dyn [int2(0,0)] = f4Color; + + // glslang is not smart enough to unroll the loops even when explicitly told to do so + + g_RWTex2DArr_Static[0][int2(0,0)] = f4Color; + g_RWTex2DArr_Static[1][int2(0,0)] = f4Color; + + g_RWTex2DArr_Mut[0][int2(0,0)] = f4Color; + g_RWTex2DArr_Mut[1][int2(0,0)] = f4Color; +#if (MUTABLE_TEX_ARRAY_SIZE == 4) + g_RWTex2DArr_Mut[2][int2(0,0)] = f4Color; + g_RWTex2DArr_Mut[3][int2(0,0)] = f4Color; +#endif + + g_RWTex2DArr_Dyn[0][int2(0,0)] = f4Color; +#if (DYNAMIC_TEX_ARRAY_SIZE == 3) + g_RWTex2DArr_Dyn[1][int2(0,0)] = f4Color; + g_RWTex2DArr_Dyn[2][int2(0,0)] = f4Color; +#endif +} + +[numthreads(1,1,1)] +void main() +{ + UseResources(); +} diff --git a/UnitTests/DiligentCoreAPITest/src/ShaderResourceLayoutTest.cpp b/UnitTests/DiligentCoreAPITest/src/ShaderResourceLayoutTest.cpp index 1aa7b1dc..5e1d2a48 100644 --- a/UnitTests/DiligentCoreAPITest/src/ShaderResourceLayoutTest.cpp +++ b/UnitTests/DiligentCoreAPITest/src/ShaderResourceLayoutTest.cpp @@ -672,12 +672,107 @@ TEST_F(ShaderResourceLayoutTest, StructuredRWBuffers) TestRWStructuredOrFormattedBuffer(false /*IsFormatted*/); } - -TEST_F(ShaderResourceLayoutTest, ConstantBuffers) +TEST_F(ShaderResourceLayoutTest, RWTextures) { + TestingEnvironment::ScopedReset AutoResetEnvironment; + + auto* pEnv = TestingEnvironment::GetInstance(); + auto* pDevice = pEnv->GetDevice(); + + auto deviceType = pDevice->GetDeviceCaps().DevType; + + const Uint32 StaticTexArraySize = 2; + const Uint32 MutableTexArraySize = deviceType == DeviceType::D3D11 ? 2 : 4; + const Uint32 DynamicTexArraySize = deviceType == DeviceType::D3D11 ? 1 : 3; + + ShaderMacroHelper Macros; + Macros.AddShaderMacro("STATIC_TEX_ARRAY_SIZE", static_cast<int>(StaticTexArraySize)); + Macros.AddShaderMacro("MUTABLE_TEX_ARRAY_SIZE", static_cast<int>(MutableTexArraySize)); + Macros.AddShaderMacro("DYNAMIC_TEX_ARRAY_SIZE", static_cast<int>(DynamicTexArraySize)); + + // clang-format off + ShaderResourceDesc Resources[] = + { + {"g_RWTex2D_Static", SHADER_RESOURCE_TYPE_TEXTURE_UAV, 1}, + {"g_RWTex2D_Mut", SHADER_RESOURCE_TYPE_TEXTURE_UAV, 1}, + {"g_RWTex2D_Dyn", SHADER_RESOURCE_TYPE_TEXTURE_UAV, 1}, + {"g_RWTex2DArr_Static", SHADER_RESOURCE_TYPE_TEXTURE_UAV, StaticTexArraySize }, + {"g_RWTex2DArr_Mut", SHADER_RESOURCE_TYPE_TEXTURE_UAV, MutableTexArraySize}, + {"g_RWTex2DArr_Dyn", SHADER_RESOURCE_TYPE_TEXTURE_UAV, DynamicTexArraySize} + }; + + auto pCS = CreateShader("ShaderResourceLayoutTest.RWTextures - CS", + "RWTextures.hlsl", "main", + SHADER_TYPE_COMPUTE, SHADER_SOURCE_LANGUAGE_HLSL, Macros, + Resources, _countof(Resources)); + ASSERT_NE(pCS, nullptr); + + // clang-format off + ShaderResourceVariableDesc Vars[] = + { + {SHADER_TYPE_COMPUTE, "g_RWTex2D_Static", SHADER_RESOURCE_VARIABLE_TYPE_STATIC}, + {SHADER_TYPE_COMPUTE, "g_RWTex2D_Mut", SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE}, + {SHADER_TYPE_COMPUTE, "g_RWTex2D_Dyn", SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC}, + + {SHADER_TYPE_COMPUTE, "g_RWTex2DArr_Static", SHADER_RESOURCE_VARIABLE_TYPE_STATIC}, + {SHADER_TYPE_COMPUTE, "g_RWTex2DArr_Mut", SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE}, + {SHADER_TYPE_COMPUTE, "g_RWTex2DArr_Dyn", SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC} + }; + // clang-format on + + PipelineResourceLayoutDesc ResourceLayout; + ResourceLayout.Variables = Vars; + ResourceLayout.NumVariables = _countof(Vars); + + RefCntAutoPtr<IPipelineState> pPSO; + RefCntAutoPtr<IShaderResourceBinding> pSRB; + + CreateComputePSO(pCS, ResourceLayout, pPSO, pSRB); + ASSERT_NE(pPSO, nullptr); + ASSERT_NE(pSRB, nullptr); + + const auto TotalTextures = StaticTexArraySize + MutableTexArraySize + DynamicTexArraySize + 3 + 2; + + std::vector<RefCntAutoPtr<ITexture>> pTextures(TotalTextures); + std::vector<IDeviceObject*> pUAVs(TotalTextures); + + for (Uint32 i = 0; i < TotalTextures; ++i) + { + pTextures[i] = pEnv->CreateTexture("Test RW texture", TEX_FORMAT_RGBA32_FLOAT, BIND_UNORDERED_ACCESS, 256, 256); + ASSERT_NE(pTextures[i], nullptr); + pUAVs[i] = pTextures[i]->GetDefaultView(TEXTURE_VIEW_UNORDERED_ACCESS); + ASSERT_NE(pUAVs[i], nullptr); + } + + Uint32 uav = 0; + SET_STATIC_VAR(pPSO, SHADER_TYPE_COMPUTE, "g_RWTex2D_Static", Set, pUAVs[uav++]); + SET_STATIC_VAR(pPSO, SHADER_TYPE_COMPUTE, "g_RWTex2DArr_Static", SetArray, &pUAVs[uav], 0, StaticTexArraySize); + uav += StaticTexArraySize; + + SET_SRB_VAR(pSRB, SHADER_TYPE_COMPUTE, "g_RWTex2D_Mut", Set, pUAVs[uav++]); + SET_SRB_VAR(pSRB, SHADER_TYPE_COMPUTE, "g_RWTex2D_Dyn", Set, pUAVs[uav++]); + SET_SRB_VAR(pSRB, SHADER_TYPE_COMPUTE, "g_RWTex2DArr_Mut", SetArray, &pUAVs[uav], 0, MutableTexArraySize); + uav += MutableTexArraySize; + SET_SRB_VAR(pSRB, SHADER_TYPE_COMPUTE, "g_RWTex2DArr_Dyn", SetArray, &pUAVs[uav], 0, DynamicTexArraySize); + uav += DynamicTexArraySize; + VERIFY_EXPR(uav + 2 == pUAVs.size()); + + pSRB->InitializeStaticResources(pPSO); + + auto* pContext = pEnv->GetDeviceContext(); + + pContext->SetPipelineState(pPSO); + pContext->CommitShaderResources(pSRB, RESOURCE_STATE_TRANSITION_MODE_TRANSITION); + + DispatchComputeAttribs DispatchAttribs(1, 1, 1); + pContext->DispatchCompute(DispatchAttribs); + + SET_SRB_VAR(pSRB, SHADER_TYPE_COMPUTE, "g_RWTex2D_Dyn", Set, pUAVs[uav++]); + SET_SRB_VAR(pSRB, SHADER_TYPE_COMPUTE, "g_RWTex2DArr_Dyn", SetArray, &pUAVs[uav++], 1, 1); + pContext->DispatchCompute(DispatchAttribs); } -TEST_F(ShaderResourceLayoutTest, RWTextures) +TEST_F(ShaderResourceLayoutTest, ConstantBuffers) { } |
