summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEgor Yusov <egor.yusov@gmail.com>2019-12-11 17:36:53 +0000
committerEgor Yusov <egor.yusov@gmail.com>2019-12-11 17:36:53 +0000
commita096e64e82a73c91f36d166f4e15c80aa62a2ee8 (patch)
treee67d2f0b7b22d8398492f1314504feb01a87a117
parentAdded RWStructuredBuffer tests (diff)
downloadDiligentCore-a096e64e82a73c91f36d166f4e15c80aa62a2ee8.tar.gz
DiligentCore-a096e64e82a73c91f36d166f4e15c80aa62a2ee8.zip
Added RWTextures test
-rw-r--r--UnitTests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/RWTextures.hlsl39
-rw-r--r--UnitTests/DiligentCoreAPITest/src/ShaderResourceLayoutTest.cpp101
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)
{
}