summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorassiduous <assiduous@diligentgraphics.com>2021-02-02 07:09:07 +0000
committerassiduous <assiduous@diligentgraphics.com>2021-02-02 07:09:07 +0000
commit5936a3e40b7a2da33e52e2aa3baee7fc57f9fdca (patch)
treea0395f09159e6bed0819478c35878eba4a26c5db
parentFixed DiligentCoreAPITest on Linux when OpenGL backend is disabled (diff)
downloadDiligentCore-5936a3e40b7a2da33e52e2aa3baee7fc57f9fdca.tar.gz
DiligentCore-5936a3e40b7a2da33e52e2aa3baee7fc57f9fdca.zip
Reworked ShaderResourceLayoutTest.FormattedBuffers and ShaderResourceLayoutTest.StructuredBuffers to make them more robust
-rw-r--r--Graphics/GraphicsTools/interface/ShaderMacroHelper.hpp9
-rw-r--r--Tests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/FormattedBuffers.hlsl32
-rw-r--r--Tests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/StructuredBuffers.glsl33
-rw-r--r--Tests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/StructuredBuffers.hlsl33
-rw-r--r--Tests/DiligentCoreAPITest/src/ShaderResourceLayoutTest.cpp194
5 files changed, 132 insertions, 169 deletions
diff --git a/Graphics/GraphicsTools/interface/ShaderMacroHelper.hpp b/Graphics/GraphicsTools/interface/ShaderMacroHelper.hpp
index 207d9020..ed1a48ff 100644
--- a/Graphics/GraphicsTools/interface/ShaderMacroHelper.hpp
+++ b/Graphics/GraphicsTools/interface/ShaderMacroHelper.hpp
@@ -73,6 +73,15 @@ public:
AddShaderMacro<const Char*>(Name, ss.str().c_str());
}
+ ShaderMacroHelper() = default;
+
+ // NB: string pointers in m_Macros may become invalid after the
+ // copy or move due to short string optimization in std::string
+ ShaderMacroHelper(const ShaderMacroHelper&) = delete;
+ ShaderMacroHelper(ShaderMacroHelper&&) = delete;
+ ShaderMacroHelper& operator=(const ShaderMacroHelper&) = delete;
+ ShaderMacroHelper& operator=(ShaderMacroHelper&&) = delete;
+
void Finalize()
{
if (!m_bIsFinalized)
diff --git a/Tests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/FormattedBuffers.hlsl b/Tests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/FormattedBuffers.hlsl
index c6081f43..3468bdbe 100644
--- a/Tests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/FormattedBuffers.hlsl
+++ b/Tests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/FormattedBuffers.hlsl
@@ -6,38 +6,6 @@ Buffer g_BuffArr_Static[STATIC_BUFF_ARRAY_SIZE]; // 4
Buffer g_BuffArr_Mut [MUTABLE_BUFF_ARRAY_SIZE]; // 3
Buffer g_BuffArr_Dyn [DYNAMIC_BUFF_ARRAY_SIZE]; // 2
-#ifdef VERTEX_SHADER
-# define Buff_Static_Ref float4(1, 0, 0, 0)
-# define Buff_Mut_Ref float4(0, 1, 0, 0)
-# define Buff_Dyn_Ref float4(0, 0, 1, 0)
-
-# define BuffArr_Mut_Ref0 float4(1, 0, 0, 0)
-# define BuffArr_Mut_Ref1 float4(0, 1, 0, 0)
-# define BuffArr_Mut_Ref2 float4(0, 0, 1, 0)
-
-# define BuffArr_Dyn_Ref0 float4(0, 1, 0, 0)
-# define BuffArr_Dyn_Ref1 float4(0, 0, 1, 0)
-#endif
-
-#ifdef PIXEL_SHADER
-# define Buff_Static_Ref float4(0, 0, 1, 0)
-# define Buff_Mut_Ref float4(0, 0, 0, 1)
-# define Buff_Dyn_Ref float4(0, 1, 0, 0)
-
-# define BuffArr_Mut_Ref0 float4(0, 1, 0, 0)
-# define BuffArr_Mut_Ref1 float4(0, 0, 1, 0)
-# define BuffArr_Mut_Ref2 float4(0, 0, 0, 1)
-
-# define BuffArr_Dyn_Ref0 float4(0, 0, 1, 0)
-# define BuffArr_Dyn_Ref1 float4(0, 0, 0, 1)
-#endif
-
-
-#define BuffArr_Static_Ref0 float4(1, 0, 0, 0)
-#define BuffArr_Static_Ref1 float4(0, 1, 0, 0)
-#define BuffArr_Static_Ref2 float4(0, 0, 1, 0)
-#define BuffArr_Static_Ref3 float4(0, 0, 0, 1)
-
float4 CheckValue(float4 Val, float4 Expected)
{
return float4(Val.x == Expected.x ? 1.0 : 0.0,
diff --git a/Tests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/StructuredBuffers.glsl b/Tests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/StructuredBuffers.glsl
index 4a20dd50..50a014eb 100644
--- a/Tests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/StructuredBuffers.glsl
+++ b/Tests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/StructuredBuffers.glsl
@@ -33,39 +33,6 @@ layout(std140) readonly buffer g_BuffArr_Dyn
}g_StorageBuffArr_Dyn[DYNAMIC_BUFF_ARRAY_SIZE]; // 2
#endif
-
-#ifdef VERTEX_SHADER
-# define Buff_Static_Ref vec4(1, 0, 0, 0)
-# define Buff_Mut_Ref vec4(0, 1, 0, 0)
-# define Buff_Dyn_Ref vec4(0, 0, 1, 0)
-
-# define BuffArr_Mut_Ref0 vec4(1, 0, 0, 0)
-# define BuffArr_Mut_Ref1 vec4(0, 1, 0, 0)
-# define BuffArr_Mut_Ref2 vec4(0, 0, 1, 0)
-
-# define BuffArr_Dyn_Ref0 vec4(0, 1, 0, 0)
-# define BuffArr_Dyn_Ref1 vec4(0, 0, 1, 0)
-#endif
-
-#ifdef PIXEL_SHADER
-# define Buff_Static_Ref vec4(0, 0, 1, 0)
-# define Buff_Mut_Ref vec4(0, 0, 0, 1)
-# define Buff_Dyn_Ref vec4(0, 1, 0, 0)
-
-# define BuffArr_Mut_Ref0 vec4(0, 1, 0, 0)
-# define BuffArr_Mut_Ref1 vec4(0, 0, 1, 0)
-# define BuffArr_Mut_Ref2 vec4(0, 0, 0, 1)
-
-# define BuffArr_Dyn_Ref0 vec4(0, 0, 1, 0)
-# define BuffArr_Dyn_Ref1 vec4(0, 0, 0, 1)
-#endif
-
-
-#define BuffArr_Static_Ref0 vec4(1, 0, 0, 0)
-#define BuffArr_Static_Ref1 vec4(0, 1, 0, 0)
-#define BuffArr_Static_Ref2 vec4(0, 0, 1, 0)
-#define BuffArr_Static_Ref3 vec4(0, 0, 0, 1)
-
vec4 CheckValue(vec4 Val, vec4 Expected)
{
return vec4(Val.x == Expected.x ? 1.0 : 0.0,
diff --git a/Tests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/StructuredBuffers.hlsl b/Tests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/StructuredBuffers.hlsl
index 86b2a1e2..e4e74ba3 100644
--- a/Tests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/StructuredBuffers.hlsl
+++ b/Tests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/StructuredBuffers.hlsl
@@ -11,39 +11,6 @@ StructuredBuffer<BufferData> g_BuffArr_Static[STATIC_BUFF_ARRAY_SIZE]; // 4
StructuredBuffer<BufferData> g_BuffArr_Mut [MUTABLE_BUFF_ARRAY_SIZE]; // 3
StructuredBuffer<BufferData> g_BuffArr_Dyn [DYNAMIC_BUFF_ARRAY_SIZE]; // 2
-
-#ifdef VERTEX_SHADER
-# define Buff_Static_Ref float4(1, 0, 0, 0)
-# define Buff_Mut_Ref float4(0, 1, 0, 0)
-# define Buff_Dyn_Ref float4(0, 0, 1, 0)
-
-# define BuffArr_Mut_Ref0 float4(1, 0, 0, 0)
-# define BuffArr_Mut_Ref1 float4(0, 1, 0, 0)
-# define BuffArr_Mut_Ref2 float4(0, 0, 1, 0)
-
-# define BuffArr_Dyn_Ref0 float4(0, 1, 0, 0)
-# define BuffArr_Dyn_Ref1 float4(0, 0, 1, 0)
-#endif
-
-#ifdef PIXEL_SHADER
-# define Buff_Static_Ref float4(0, 0, 1, 0)
-# define Buff_Mut_Ref float4(0, 0, 0, 1)
-# define Buff_Dyn_Ref float4(0, 1, 0, 0)
-
-# define BuffArr_Mut_Ref0 float4(0, 1, 0, 0)
-# define BuffArr_Mut_Ref1 float4(0, 0, 1, 0)
-# define BuffArr_Mut_Ref2 float4(0, 0, 0, 1)
-
-# define BuffArr_Dyn_Ref0 float4(0, 0, 1, 0)
-# define BuffArr_Dyn_Ref1 float4(0, 0, 0, 1)
-#endif
-
-
-#define BuffArr_Static_Ref0 float4(1, 0, 0, 0)
-#define BuffArr_Static_Ref1 float4(0, 1, 0, 0)
-#define BuffArr_Static_Ref2 float4(0, 0, 1, 0)
-#define BuffArr_Static_Ref3 float4(0, 0, 0, 1)
-
float4 CheckValue(float4 Val, float4 Expected)
{
return float4(Val.x == Expected.x ? 1.0 : 0.0,
diff --git a/Tests/DiligentCoreAPITest/src/ShaderResourceLayoutTest.cpp b/Tests/DiligentCoreAPITest/src/ShaderResourceLayoutTest.cpp
index fb0ee56b..1209bcb3 100644
--- a/Tests/DiligentCoreAPITest/src/ShaderResourceLayoutTest.cpp
+++ b/Tests/DiligentCoreAPITest/src/ShaderResourceLayoutTest.cpp
@@ -341,13 +341,13 @@ void ShaderResourceLayoutTest::TestTexturesAndImtblSamplers(bool TestImtblSample
static constexpr Uint32 DynamicTexArraySize = 3;
// Texture indices for vertex/shader bindings
- static constexpr Uint32 Tex2D_StaticIdx[] = {2, 7};
- static constexpr Uint32 Tex2D_MutIdx[] = {0, 8};
- static constexpr Uint32 Tex2D_DynIdx[] = {1, 6};
+ static constexpr size_t Tex2D_StaticIdx[] = {2, 7};
+ static constexpr size_t Tex2D_MutIdx[] = {0, 8};
+ static constexpr size_t Tex2D_DynIdx[] = {1, 6};
- static constexpr Uint32 Tex2DArr_StaticIdx[] = {7, 0};
- static constexpr Uint32 Tex2DArr_MutIdx[] = {3, 5};
- static constexpr Uint32 Tex2DArr_DynIdx[] = {5, 2};
+ static constexpr size_t Tex2DArr_StaticIdx[] = {7, 0};
+ static constexpr size_t Tex2DArr_MutIdx[] = {3, 5};
+ static constexpr size_t Tex2DArr_DynIdx[] = {5, 2};
// clang-format off
@@ -379,24 +379,29 @@ void ShaderResourceLayoutTest::TestTexturesAndImtblSamplers(bool TestImtblSample
// clang-format on
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));
- // Add macros that define reference colors
- auto AddReferenceColorMacros = [&](Uint32 s) {
- Macros.UpdateMacro("Tex2D_Static_Ref", RGBA8Unorm_To_F4Color(RefColors[Tex2D_StaticIdx[s]]));
- Macros.UpdateMacro("Tex2D_Mut_Ref", RGBA8Unorm_To_F4Color(RefColors[Tex2D_MutIdx[s]]));
- Macros.UpdateMacro("Tex2D_Dyn_Ref", RGBA8Unorm_To_F4Color(RefColors[Tex2D_DynIdx[s]]));
+ auto PrepareMacros = [&](Uint32 s) {
+ Macros.Clear();
+
+ 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));
+
+ // Add macros that define reference colors
+ Macros.AddShaderMacro("Tex2D_Static_Ref", RGBA8Unorm_To_F4Color(RefColors[Tex2D_StaticIdx[s]]));
+ Macros.AddShaderMacro("Tex2D_Mut_Ref", RGBA8Unorm_To_F4Color(RefColors[Tex2D_MutIdx[s]]));
+ Macros.AddShaderMacro("Tex2D_Dyn_Ref", RGBA8Unorm_To_F4Color(RefColors[Tex2D_DynIdx[s]]));
for (Uint32 i = 0; i < StaticTexArraySize; ++i)
- Macros.UpdateMacro((std::string("Tex2DArr_Static_Ref") + std::to_string(i)).c_str(), RGBA8Unorm_To_F4Color(RefColors[Tex2DArr_StaticIdx[s] + i]));
+ Macros.AddShaderMacro((std::string{"Tex2DArr_Static_Ref"} + std::to_string(i)).c_str(), RGBA8Unorm_To_F4Color(RefColors[Tex2DArr_StaticIdx[s] + i]));
for (Uint32 i = 0; i < MutableTexArraySize; ++i)
- Macros.UpdateMacro((std::string("Tex2DArr_Mut_Ref") + std::to_string(i)).c_str(), RGBA8Unorm_To_F4Color(RefColors[Tex2DArr_MutIdx[s] + i]));
+ Macros.AddShaderMacro((std::string{"Tex2DArr_Mut_Ref"} + std::to_string(i)).c_str(), RGBA8Unorm_To_F4Color(RefColors[Tex2DArr_MutIdx[s] + i]));
for (Uint32 i = 0; i < DynamicTexArraySize; ++i)
- Macros.UpdateMacro((std::string("Tex2DArr_Dyn_Ref") + std::to_string(i)).c_str(), RGBA8Unorm_To_F4Color(RefColors[Tex2DArr_DynIdx[s] + i]));
+ Macros.AddShaderMacro((std::string{"Tex2DArr_Dyn_Ref"} + std::to_string(i)).c_str(), RGBA8Unorm_To_F4Color(RefColors[Tex2DArr_DynIdx[s] + i]));
+
+ return static_cast<const ShaderMacro*>(Macros);
};
auto ModifyShaderCI = [TestImtblSamplers](ShaderCreateInfo& ShaderCI) {
@@ -409,19 +414,17 @@ void ShaderResourceLayoutTest::TestTexturesAndImtblSamplers(bool TestImtblSample
}
};
- AddReferenceColorMacros(0);
auto pVS = CreateShader(TestImtblSamplers ? "ShaderResourceLayoutTest.ImtblSamplers - VS" : "ShaderResourceLayoutTest.Textures - VS",
TestImtblSamplers ? "ImmutableSamplers.hlsl" : "Textures.hlsl",
"VSMain",
- SHADER_TYPE_VERTEX, SHADER_SOURCE_LANGUAGE_HLSL, Macros,
+ SHADER_TYPE_VERTEX, SHADER_SOURCE_LANGUAGE_HLSL, PrepareMacros(0),
Resources.data(), static_cast<Uint32>(Resources.size()),
ModifyShaderCI);
- AddReferenceColorMacros(1);
auto pPS = CreateShader(TestImtblSamplers ? "ShaderResourceLayoutTest.ImtblSamplers - PS" : "ShaderResourceLayoutTest.Textures - PS",
TestImtblSamplers ? "ImmutableSamplers.hlsl" : "Textures.hlsl",
"PSMain",
- SHADER_TYPE_PIXEL, SHADER_SOURCE_LANGUAGE_HLSL, Macros,
+ SHADER_TYPE_PIXEL, SHADER_SOURCE_LANGUAGE_HLSL, PrepareMacros(1),
Resources.data(), static_cast<Uint32>(Resources.size()),
ModifyShaderCI);
ASSERT_NE(pVS, nullptr);
@@ -489,6 +492,8 @@ void ShaderResourceLayoutTest::TestTexturesAndImtblSamplers(bool TestImtblSample
ITextureView* ppRTVs[] = {pRTV};
pContext->SetRenderTargets(1, ppRTVs, nullptr, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
+ float Zero[] = {0, 0, 0, 0};
+ pContext->ClearRenderTarget(pRTV, Zero, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
pContext->SetPipelineState(pPSO);
pContext->CommitShaderResources(pSRB, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
@@ -526,14 +531,65 @@ void ShaderResourceLayoutTest::TestStructuredOrFormattedBuffer(bool IsFormatted)
{
TestingEnvironment::ScopedReset EnvironmentAutoReset;
+ // Prepare buffers with reference values
+
+ constexpr size_t NumReferenceBuffers = 12;
+
+ std::array<RefCntAutoPtr<IBufferView>, NumReferenceBuffers> pBufferViews;
+ std::array<IDeviceObject*, NumReferenceBuffers> pBuffSRVs;
+ std::array<float4, NumReferenceBuffers> RefColors;
+
+ for (Uint32 i = 0; i < NumReferenceBuffers; ++i)
+ {
+ const float v = static_cast<float>(i * 4);
+ RefColors[i] = float4{v + 1, v + 2, v + 3, v + 4};
+ pBufferViews[i] = CreateResourceBufferView(IsFormatted ? BUFFER_MODE_FORMATTED : BUFFER_MODE_STRUCTURED, BUFFER_VIEW_SHADER_RESOURCE, RefColors[i]);
+ ASSERT_NE(pBufferViews[i], nullptr) << "Unable to formatted buffer view ";
+ pBuffSRVs[i] = pBufferViews[i];
+ }
+
+ // Buffer indices for vertex/shader bindings
+ static constexpr size_t Buff_StaticIdx[] = {2, 7};
+ static constexpr size_t Buff_MutIdx[] = {0, 8};
+ static constexpr size_t Buff_DynIdx[] = {1, 6};
+
+ static constexpr size_t BuffArr_StaticIdx[] = {8, 0};
+ static constexpr size_t BuffArr_MutIdx[] = {3, 4};
+ static constexpr size_t BuffArr_DynIdx[] = {6, 2};
+
+
static constexpr int StaticBuffArraySize = 4;
static constexpr int MutableBuffArraySize = 3;
static constexpr int DynamicBuffArraySize = 2;
- ShaderMacroHelper Macros;
- Macros.AddShaderMacro("STATIC_BUFF_ARRAY_SIZE", StaticBuffArraySize);
- Macros.AddShaderMacro("MUTABLE_BUFF_ARRAY_SIZE", MutableBuffArraySize);
- Macros.AddShaderMacro("DYNAMIC_BUFF_ARRAY_SIZE", DynamicBuffArraySize);
- Macros.AddShaderMacro("yes", float4{});
+
+ ShaderMacroHelper Macros;
+
+ auto PrepareMacros = [&](Uint32 s, SHADER_SOURCE_LANGUAGE Lang) {
+ Macros.Clear();
+
+ if (Lang == SHADER_SOURCE_LANGUAGE_GLSL)
+ Macros.AddShaderMacro("float4", "vec4");
+
+ Macros.AddShaderMacro("STATIC_BUFF_ARRAY_SIZE", StaticBuffArraySize);
+ Macros.AddShaderMacro("MUTABLE_BUFF_ARRAY_SIZE", MutableBuffArraySize);
+ Macros.AddShaderMacro("DYNAMIC_BUFF_ARRAY_SIZE", DynamicBuffArraySize);
+
+ // Add macros that define reference colors
+ Macros.AddShaderMacro("Buff_Static_Ref", RefColors[Buff_StaticIdx[s]]);
+ Macros.AddShaderMacro("Buff_Mut_Ref", RefColors[Buff_MutIdx[s]]);
+ Macros.AddShaderMacro("Buff_Dyn_Ref", RefColors[Buff_DynIdx[s]]);
+
+ for (Uint32 i = 0; i < StaticBuffArraySize; ++i)
+ Macros.AddShaderMacro((std::string{"BuffArr_Static_Ref"} + std::to_string(i)).c_str(), RefColors[BuffArr_StaticIdx[s] + i]);
+
+ for (Uint32 i = 0; i < MutableBuffArraySize; ++i)
+ Macros.AddShaderMacro((std::string{"BuffArr_Mut_Ref"} + std::to_string(i)).c_str(), RefColors[BuffArr_MutIdx[s] + i]);
+
+ for (Uint32 i = 0; i < DynamicBuffArraySize; ++i)
+ Macros.AddShaderMacro((std::string{"BuffArr_Dyn_Ref"} + std::to_string(i)).c_str(), RefColors[BuffArr_DynIdx[s] + i]);
+
+ return static_cast<const ShaderMacro*>(Macros);
+ };
auto* pEnv = TestingEnvironment::GetInstance();
auto* pDevice = pEnv->GetDevice();
@@ -580,17 +636,19 @@ void ShaderResourceLayoutTest::TestStructuredOrFormattedBuffer(bool IsFormatted)
{
GTEST_FAIL() << "Unexpected device type";
}
+
auto pVS = CreateShader(IsFormatted ? "ShaderResourceLayoutTest.FormattedBuffers - VS" : "ShaderResourceLayoutTest.StructuredBuffers - VS",
ShaderFileName, SrcLang == SHADER_SOURCE_LANGUAGE_HLSL ? "VSMain" : "main",
- SHADER_TYPE_VERTEX, SrcLang, Macros,
+ SHADER_TYPE_VERTEX, SrcLang, PrepareMacros(0, SrcLang),
Resources.data(), static_cast<Uint32>(Resources.size()));
if (UseArraysInPSOnly)
{
AddArrayResources();
}
+
auto pPS = CreateShader(IsFormatted ? "ShaderResourceLayoutTest.FormattedBuffers - PS" : "ShaderResourceLayoutTest.StructuredBuffers - PS",
ShaderFileName, SrcLang == SHADER_SOURCE_LANGUAGE_HLSL ? "PSMain" : "main",
- SHADER_TYPE_PIXEL, SrcLang, Macros,
+ SHADER_TYPE_PIXEL, SrcLang, PrepareMacros(1, SrcLang),
Resources.data(), static_cast<Uint32>(Resources.size()));
ASSERT_NE(pVS, nullptr);
ASSERT_NE(pPS, nullptr);
@@ -620,49 +678,37 @@ void ShaderResourceLayoutTest::TestStructuredOrFormattedBuffer(bool IsFormatted)
ASSERT_NE(pPSO, nullptr);
ASSERT_NE(pSRB, nullptr);
- const auto MaxBuffers = std::max(std::max(StaticBuffArraySize, MutableBuffArraySize), DynamicBuffArraySize);
-
- std::vector<RefCntAutoPtr<IBufferView>> pBufferViews(MaxBuffers);
- std::vector<IDeviceObject*> pBuffSRVs(MaxBuffers);
+ auto BindResources = [&](SHADER_TYPE ShaderType) {
+ const auto id = ShaderType == SHADER_TYPE_VERTEX ? 0 : 1;
- std::array<float4, MaxBuffers> BufferVal = {float4{1, 0, 0, 0}, float4{0, 1, 0, 0}, float4{0, 0, 1, 0}, float4{0, 0, 0, 1}};
- for (Uint32 i = 0; i < MaxBuffers; ++i)
- {
- pBufferViews[i] = CreateResourceBufferView(IsFormatted ? BUFFER_MODE_FORMATTED : BUFFER_MODE_STRUCTURED, BUFFER_VIEW_SHADER_RESOURCE, BufferVal[i]);
- ASSERT_NE(pBufferViews[i], nullptr) << "Unable to formatted buffer view ";
- pBuffSRVs[i] = pBufferViews[i];
- }
+ SET_STATIC_VAR(pPSO, ShaderType, "g_Buff_Static", Set, pBuffSRVs[Buff_StaticIdx[id]]);
- SET_STATIC_VAR(pPSO, SHADER_TYPE_VERTEX, "g_Buff_Static", Set, pBuffSRVs[0]);
- if (!UseArraysInPSOnly)
- {
- SET_STATIC_VAR(pPSO, SHADER_TYPE_VERTEX, "g_BuffArr_Static", SetArray, pBuffSRVs.data(), 0, StaticBuffArraySize);
- }
- else
- {
- EXPECT_EQ(pPSO->GetStaticVariableByName(SHADER_TYPE_VERTEX, "g_BuffArr_Static"), nullptr);
- }
- SET_STATIC_VAR(pPSO, SHADER_TYPE_PIXEL, "g_Buff_Static", Set, pBuffSRVs[2]);
- SET_STATIC_VAR(pPSO, SHADER_TYPE_PIXEL, "g_BuffArr_Static", SetArray, pBuffSRVs.data(), 0, StaticBuffArraySize);
+ if (ShaderType == SHADER_TYPE_PIXEL || !UseArraysInPSOnly)
+ {
+ SET_STATIC_VAR(pPSO, ShaderType, "g_BuffArr_Static", SetArray, &pBuffSRVs[BuffArr_StaticIdx[id]], 0, StaticBuffArraySize);
+ }
+ else
+ {
+ EXPECT_EQ(pPSO->GetStaticVariableByName(ShaderType, "g_BuffArr_Static"), nullptr);
+ }
- SET_SRB_VAR(pSRB, SHADER_TYPE_VERTEX, "g_Buff_Mut", Set, pBuffSRVs[1]);
- SET_SRB_VAR(pSRB, SHADER_TYPE_VERTEX, "g_Buff_Dyn", Set, pBuffSRVs[0]);
- if (!UseArraysInPSOnly)
- {
- SET_SRB_VAR(pSRB, SHADER_TYPE_VERTEX, "g_BuffArr_Mut", SetArray, pBuffSRVs.data(), 0, MutableBuffArraySize);
- SET_SRB_VAR(pSRB, SHADER_TYPE_VERTEX, "g_BuffArr_Dyn", SetArray, pBuffSRVs.data(), 0, DynamicBuffArraySize);
- }
- else
- {
- EXPECT_EQ(pSRB->GetVariableByName(SHADER_TYPE_VERTEX, "g_BuffArr_Mut"), nullptr);
- EXPECT_EQ(pSRB->GetVariableByName(SHADER_TYPE_VERTEX, "g_BuffArr_Dyn"), nullptr);
- }
+ SET_SRB_VAR(pSRB, ShaderType, "g_Buff_Mut", Set, pBuffSRVs[Buff_MutIdx[id]]);
+ SET_SRB_VAR(pSRB, ShaderType, "g_Buff_Dyn", Set, pBuffSRVs[0]); // Will rebind for the second draw
- SET_SRB_VAR(pSRB, SHADER_TYPE_PIXEL, "g_Buff_Mut", Set, pBuffSRVs[3]);
- SET_SRB_VAR(pSRB, SHADER_TYPE_PIXEL, "g_Buff_Dyn", Set, pBuffSRVs[0]);
- SET_SRB_VAR(pSRB, SHADER_TYPE_PIXEL, "g_BuffArr_Mut", SetArray, pBuffSRVs.data() + 1, 0, MutableBuffArraySize);
- SET_SRB_VAR(pSRB, SHADER_TYPE_PIXEL, "g_BuffArr_Dyn", SetArray, pBuffSRVs.data(), 0, DynamicBuffArraySize);
+ if (ShaderType == SHADER_TYPE_PIXEL || !UseArraysInPSOnly)
+ {
+ SET_SRB_VAR(pSRB, ShaderType, "g_BuffArr_Mut", SetArray, &pBuffSRVs[BuffArr_MutIdx[id]], 0, MutableBuffArraySize);
+ SET_SRB_VAR(pSRB, ShaderType, "g_BuffArr_Dyn", SetArray, &pBuffSRVs[0], 0, DynamicBuffArraySize); // Will rebind for the second draw
+ }
+ else
+ {
+ EXPECT_EQ(pSRB->GetVariableByName(ShaderType, "g_BuffArr_Mut"), nullptr);
+ EXPECT_EQ(pSRB->GetVariableByName(ShaderType, "g_BuffArr_Dyn"), nullptr);
+ }
+ };
+ BindResources(SHADER_TYPE_VERTEX);
+ BindResources(SHADER_TYPE_PIXEL);
pSRB->InitializeStaticResources(pPSO);
@@ -670,6 +716,8 @@ void ShaderResourceLayoutTest::TestStructuredOrFormattedBuffer(bool IsFormatted)
ITextureView* ppRTVs[] = {pRTV};
pContext->SetRenderTargets(1, ppRTVs, nullptr, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
+ float Zero[] = {0, 0, 0, 0};
+ pContext->ClearRenderTarget(pRTV, Zero, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
pContext->SetPipelineState(pPSO);
pContext->CommitShaderResources(pSRB, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
@@ -677,15 +725,15 @@ void ShaderResourceLayoutTest::TestStructuredOrFormattedBuffer(bool IsFormatted)
DrawAttribs DrawAttrs{6, DRAW_FLAG_VERIFY_ALL};
pContext->Draw(DrawAttrs);
- SET_SRB_VAR(pSRB, SHADER_TYPE_VERTEX, "g_Buff_Dyn", Set, pBuffSRVs[2]);
+ SET_SRB_VAR(pSRB, SHADER_TYPE_VERTEX, "g_Buff_Dyn", Set, pBuffSRVs[Buff_DynIdx[0]]);
if (!UseArraysInPSOnly)
{
- SET_SRB_VAR(pSRB, SHADER_TYPE_VERTEX, "g_BuffArr_Dyn", SetArray, pBuffSRVs.data() + 1, 0, 1);
- SET_SRB_VAR(pSRB, SHADER_TYPE_VERTEX, "g_BuffArr_Dyn", SetArray, pBuffSRVs.data() + 2, 1, 1);
+ SET_SRB_VAR(pSRB, SHADER_TYPE_VERTEX, "g_BuffArr_Dyn", SetArray, &pBuffSRVs[BuffArr_DynIdx[0] + 0], 0, 1);
+ SET_SRB_VAR(pSRB, SHADER_TYPE_VERTEX, "g_BuffArr_Dyn", SetArray, &pBuffSRVs[BuffArr_DynIdx[0] + 1], 1, 1);
}
- SET_SRB_VAR(pSRB, SHADER_TYPE_PIXEL, "g_Buff_Dyn", Set, pBuffSRVs[1]);
- SET_SRB_VAR(pSRB, SHADER_TYPE_PIXEL, "g_BuffArr_Dyn", SetArray, pBuffSRVs.data() + 2, 0, DynamicBuffArraySize);
+ SET_SRB_VAR(pSRB, SHADER_TYPE_PIXEL, "g_Buff_Dyn", Set, pBuffSRVs[Buff_DynIdx[1]]);
+ SET_SRB_VAR(pSRB, SHADER_TYPE_PIXEL, "g_BuffArr_Dyn", SetArray, &pBuffSRVs[BuffArr_DynIdx[1]], 0, DynamicBuffArraySize);
pContext->CommitShaderResources(pSRB, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
@@ -1068,6 +1116,8 @@ TEST_F(ShaderResourceLayoutTest, ConstantBuffers)
ITextureView* ppRTVs[] = {pRTV};
pContext->SetRenderTargets(1, ppRTVs, nullptr, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
+ float Zero[] = {0, 0, 0, 0};
+ pContext->ClearRenderTarget(pRTV, Zero, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
pContext->SetPipelineState(pPSO);
pContext->CommitShaderResources(pSRB, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
@@ -1193,6 +1243,8 @@ TEST_F(ShaderResourceLayoutTest, Samplers)
ITextureView* ppRTVs[] = {pRTV};
pContext->SetRenderTargets(1, ppRTVs, nullptr, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
+ float Zero[] = {0, 0, 0, 0};
+ pContext->ClearRenderTarget(pRTV, Zero, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
pContext->SetPipelineState(pPSO);
pContext->CommitShaderResources(pSRB, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);