summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorassiduous <assiduous@diligentgraphics.com>2021-02-02 04:51:39 +0000
committerassiduous <assiduous@diligentgraphics.com>2021-02-02 04:51:39 +0000
commit299dc760c527d4e455c453946ee0ef348e2f6c2f (patch)
tree45229ad5878fa6b3ef9191a30a264c25e53e8d57
parentMathLib: added stream insreters for vector types (diff)
downloadDiligentCore-299dc760c527d4e455c453946ee0ef348e2f6c2f.tar.gz
DiligentCore-299dc760c527d4e455c453946ee0ef348e2f6c2f.zip
Reworked ShaderResourceLayoutTest.Textures and ShaderResourceLayoutTest.ImmutableSamplers to be more robust
-rw-r--r--Graphics/GraphicsTools/interface/ShaderMacroHelper.hpp11
-rw-r--r--Tests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/ImmutableSamplers.hlsl36
-rw-r--r--Tests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/Textures.hlsl36
-rw-r--r--Tests/DiligentCoreAPITest/src/ShaderResourceLayoutTest.cpp120
4 files changed, 87 insertions, 116 deletions
diff --git a/Graphics/GraphicsTools/interface/ShaderMacroHelper.hpp b/Graphics/GraphicsTools/interface/ShaderMacroHelper.hpp
index 8688ce46..207d9020 100644
--- a/Graphics/GraphicsTools/interface/ShaderMacroHelper.hpp
+++ b/Graphics/GraphicsTools/interface/ShaderMacroHelper.hpp
@@ -95,7 +95,7 @@ public:
void Clear()
{
m_Macros.clear();
- m_DefinitionsPool.clear();
+ m_StringPool.clear();
m_bIsFinalized = false;
}
@@ -132,7 +132,7 @@ public:
private:
std::vector<ShaderMacro> m_Macros;
- std::set<std::string> m_DefinitionsPool;
+ std::set<std::string> m_StringPool;
bool m_bIsFinalized = false;
};
@@ -140,14 +140,15 @@ template <>
inline void ShaderMacroHelper::AddShaderMacro(const Char* Name, const Char* Definition)
{
Reopen();
- auto* PooledDefinition = m_DefinitionsPool.insert(Definition).first->c_str();
- m_Macros.emplace_back(Name, PooledDefinition);
+ const auto* PooledDefinition = m_StringPool.insert(Definition).first->c_str();
+ const auto* PooledName = m_StringPool.insert(Name).first->c_str();
+ m_Macros.emplace_back(PooledName, PooledDefinition);
}
template <>
inline void ShaderMacroHelper::AddShaderMacro(const Char* Name, bool Definition)
{
- AddShaderMacro(Name, Definition ? "1" : "0");
+ AddShaderMacro<const Char*>(Name, Definition ? "1" : "0");
}
template <>
diff --git a/Tests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/ImmutableSamplers.hlsl b/Tests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/ImmutableSamplers.hlsl
index 664818cc..f8276f94 100644
--- a/Tests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/ImmutableSamplers.hlsl
+++ b/Tests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/ImmutableSamplers.hlsl
@@ -14,42 +14,6 @@ SamplerState g_Tex2DArr_Static_sampler;
SamplerState g_Tex2DArr_Mut_sampler [MUTABLE_TEX_ARRAY_SIZE];
SamplerState g_Tex2DArr_Dyn_sampler [DYNAMIC_TEX_ARRAY_SIZE];
-#ifdef VERTEX_SHADER
-
-# define Tex2D_Static_Ref float4(1, 0, 0, 0)
-# define Tex2D_Mut_Ref float4(0, 1, 0, 0)
-# define Tex2D_Dyn_Ref float4(0, 0, 1, 0)
-
-# define Tex2DArr_Static_Ref0 float4(1, 0, 0, 0)
-# define Tex2DArr_Static_Ref1 float4(0, 1, 0, 0)
-
-# define Tex2DArr_Dyn_Ref0 float4(1, 0, 0, 0)
-# define Tex2DArr_Dyn_Ref1 float4(0, 1, 0, 0)
-# define Tex2DArr_Dyn_Ref2 float4(0, 0, 1, 0)
-
-#endif
-
-#ifdef PIXEL_SHADER
-
-# define Tex2D_Static_Ref float4(0, 1, 0, 0)
-# define Tex2D_Mut_Ref float4(0, 0, 1, 0)
-# define Tex2D_Dyn_Ref float4(0, 0, 0, 1)
-
-# define Tex2DArr_Static_Ref0 float4(0, 0, 1, 0)
-# define Tex2DArr_Static_Ref1 float4(0, 0, 0, 1)
-
-# define Tex2DArr_Dyn_Ref0 float4(0, 1, 0, 0)
-# define Tex2DArr_Dyn_Ref1 float4(0, 0, 1, 0)
-# define Tex2DArr_Dyn_Ref2 float4(0, 0, 0, 1)
-
-#endif
-
-#define Tex2DArr_Mut_Ref0 float4(1, 0, 0, 0)
-#define Tex2DArr_Mut_Ref1 float4(0, 1, 0, 0)
-#define Tex2DArr_Mut_Ref2 float4(0, 0, 1, 0)
-#define Tex2DArr_Mut_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/Textures.hlsl b/Tests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/Textures.hlsl
index ba32c315..7a812462 100644
--- a/Tests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/Textures.hlsl
+++ b/Tests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/Textures.hlsl
@@ -8,42 +8,6 @@ Texture2D g_Tex2DArr_Dyn [DYNAMIC_TEX_ARRAY_SIZE]; // 3
SamplerState g_Sampler;
-#ifdef VERTEX_SHADER
-
-# define Tex2D_Static_Ref float4(1, 0, 0, 0)
-# define Tex2D_Mut_Ref float4(0, 1, 0, 0)
-# define Tex2D_Dyn_Ref float4(0, 0, 1, 0)
-
-# define Tex2DArr_Static_Ref0 float4(1, 0, 0, 0)
-# define Tex2DArr_Static_Ref1 float4(0, 1, 0, 0)
-
-# define Tex2DArr_Dyn_Ref0 float4(1, 0, 0, 0)
-# define Tex2DArr_Dyn_Ref1 float4(0, 1, 0, 0)
-# define Tex2DArr_Dyn_Ref2 float4(0, 0, 1, 0)
-
-#endif
-
-#ifdef PIXEL_SHADER
-
-# define Tex2D_Static_Ref float4(0, 1, 0, 0)
-# define Tex2D_Mut_Ref float4(0, 0, 1, 0)
-# define Tex2D_Dyn_Ref float4(0, 0, 0, 1)
-
-# define Tex2DArr_Static_Ref0 float4(0, 0, 1, 0)
-# define Tex2DArr_Static_Ref1 float4(0, 0, 0, 1)
-
-# define Tex2DArr_Dyn_Ref0 float4(0, 1, 0, 0)
-# define Tex2DArr_Dyn_Ref1 float4(0, 0, 1, 0)
-# define Tex2DArr_Dyn_Ref2 float4(0, 0, 0, 1)
-
-#endif
-
-#define Tex2DArr_Mut_Ref0 float4(1, 0, 0, 0)
-#define Tex2DArr_Mut_Ref1 float4(0, 1, 0, 0)
-#define Tex2DArr_Mut_Ref2 float4(0, 0, 1, 0)
-#define Tex2DArr_Mut_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 dbf49f43..fb0ee56b 100644
--- a/Tests/DiligentCoreAPITest/src/ShaderResourceLayoutTest.cpp
+++ b/Tests/DiligentCoreAPITest/src/ShaderResourceLayoutTest.cpp
@@ -309,13 +309,46 @@ void ShaderResourceLayoutTest::TestTexturesAndImtblSamplers(bool TestImtblSample
auto* pEnv = TestingEnvironment::GetInstance();
auto* pDevice = pEnv->GetDevice();
+ // Prepare reference textures filled with different colors
+
+ // Reference texture colors
+ static constexpr Uint32 RefColors[] = //
+ {
+ 0x000000FFu, 0x0000FF00u, 0x00FF0000u, 0xFF000000u,
+ 0x0000FFFFu, 0x00FF00FFu, 0xFF0000FFu, 0x00FFFF00u,
+ 0xFF00FF00u, 0xFFFF0000u, 0xFFFFFF00u, 0xFF00FFFFu //
+ };
+
+ static constexpr size_t NumRefTextures = _countof(RefColors);
+
+ std::array<RefCntAutoPtr<ITexture>, NumRefTextures> pTextures;
+ std::array<IDeviceObject*, NumRefTextures> pTexSRVs;
+
+ constexpr Uint32 TexWidth = 128;
+ constexpr Uint32 TexHeight = 128;
+
+ std::vector<Uint32> TexData(TexWidth * TexHeight);
+ for (Uint32 i = 0; i < NumRefTextures; ++i)
+ {
+ std::fill(TexData.begin(), TexData.end(), RefColors[i]);
+ pTextures[i] = pEnv->CreateTexture("Test texture", TEX_FORMAT_RGBA8_UNORM, BIND_SHADER_RESOURCE, TexWidth, TexHeight, TexData.data());
+ pTexSRVs[i] = pTextures[i]->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE);
+ }
+
+ // Texture array sizes in the shader
static constexpr Uint32 StaticTexArraySize = 2;
static constexpr Uint32 MutableTexArraySize = 4;
static constexpr Uint32 DynamicTexArraySize = 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));
+
+ // 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 Uint32 Tex2DArr_StaticIdx[] = {7, 0};
+ static constexpr Uint32 Tex2DArr_MutIdx[] = {3, 5};
+ static constexpr Uint32 Tex2DArr_DynIdx[] = {5, 2};
+
// clang-format off
std::vector<ShaderResourceDesc> Resources =
@@ -345,6 +378,27 @@ 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]]));
+
+ 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]));
+
+ 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]));
+
+ 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]));
+ };
+
auto ModifyShaderCI = [TestImtblSamplers](ShaderCreateInfo& ShaderCI) {
if (TestImtblSamplers)
{
@@ -354,12 +408,16 @@ void ShaderResourceLayoutTest::TestTexturesAndImtblSamplers(bool TestImtblSample
ShaderCI.HLSLVersion = ShaderVersion{5, 0};
}
};
+
+ 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,
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",
@@ -409,38 +467,21 @@ void ShaderResourceLayoutTest::TestTexturesAndImtblSamplers(bool TestImtblSample
ASSERT_NE(pPSO, nullptr);
ASSERT_NE(pSRB, nullptr);
- const auto MaxTextures = std::max(std::max(StaticTexArraySize, MutableTexArraySize), DynamicTexArraySize);
+ auto BindResources = [&](SHADER_TYPE ShaderType) {
+ const auto id = ShaderType == SHADER_TYPE_VERTEX ? 0 : 1;
- std::vector<RefCntAutoPtr<ITexture>> pTextures(MaxTextures);
- std::vector<IDeviceObject*> pTexSRVs(MaxTextures);
+ SET_STATIC_VAR(pPSO, ShaderType, "g_Tex2D_Static", Set, pTexSRVs[Tex2D_StaticIdx[id]]);
+ SET_STATIC_VAR(pPSO, ShaderType, "g_Tex2DArr_Static", SetArray, &pTexSRVs[Tex2DArr_StaticIdx[id]], 0, StaticTexArraySize);
- constexpr Uint32 TexWidth = 256;
- constexpr Uint32 TexHeight = 256;
+ SET_SRB_VAR(pSRB, ShaderType, "g_Tex2D_Mut", Set, pTexSRVs[Tex2D_MutIdx[id]]);
+ SET_SRB_VAR(pSRB, ShaderType, "g_Tex2DArr_Mut", SetArray, &pTexSRVs[Tex2DArr_MutIdx[id]], 0, MutableTexArraySize);
- std::vector<Uint32> TexData(TexWidth * TexHeight);
- std::array<Uint32, MaxTextures> TexColors = {0xFF, 0xFF00, 0xFF0000, 0xFF000000};
- for (Uint32 i = 0; i < MaxTextures; ++i)
- {
- std::fill(TexData.begin(), TexData.end(), TexColors[i]);
- pTextures[i] = pEnv->CreateTexture("Test texture", TEX_FORMAT_RGBA8_UNORM, BIND_SHADER_RESOURCE, TexWidth, TexHeight, TexData.data());
- pTexSRVs[i] = pTextures[i]->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE);
- }
-
- SET_STATIC_VAR(pPSO, SHADER_TYPE_VERTEX, "g_Tex2D_Static", Set, pTexSRVs[0]);
- SET_STATIC_VAR(pPSO, SHADER_TYPE_VERTEX, "g_Tex2DArr_Static", SetArray, pTexSRVs.data(), 0, StaticTexArraySize);
-
- SET_STATIC_VAR(pPSO, SHADER_TYPE_PIXEL, "g_Tex2D_Static", Set, pTexSRVs[1]);
- SET_STATIC_VAR(pPSO, SHADER_TYPE_PIXEL, "g_Tex2DArr_Static", SetArray, pTexSRVs.data() + 2, 0, StaticTexArraySize);
-
- SET_SRB_VAR(pSRB, SHADER_TYPE_VERTEX, "g_Tex2D_Mut", Set, pTexSRVs[1]);
- SET_SRB_VAR(pSRB, SHADER_TYPE_VERTEX, "g_Tex2D_Dyn", Set, pTexSRVs[0]);
- SET_SRB_VAR(pSRB, SHADER_TYPE_VERTEX, "g_Tex2DArr_Mut", SetArray, pTexSRVs.data(), 0, MutableTexArraySize);
- SET_SRB_VAR(pSRB, SHADER_TYPE_VERTEX, "g_Tex2DArr_Dyn", SetArray, pTexSRVs.data() + 1, 0, DynamicTexArraySize);
-
- SET_SRB_VAR(pSRB, SHADER_TYPE_PIXEL, "g_Tex2D_Mut", Set, pTexSRVs[2]);
- SET_SRB_VAR(pSRB, SHADER_TYPE_PIXEL, "g_Tex2D_Dyn", Set, pTexSRVs[0]);
- SET_SRB_VAR(pSRB, SHADER_TYPE_PIXEL, "g_Tex2DArr_Mut", SetArray, pTexSRVs.data(), 0, MutableTexArraySize);
- SET_SRB_VAR(pSRB, SHADER_TYPE_PIXEL, "g_Tex2DArr_Dyn", SetArray, pTexSRVs.data(), 0, DynamicTexArraySize);
+ // Bind 0 for dynamic resources - will rebind for the second draw
+ SET_SRB_VAR(pSRB, ShaderType, "g_Tex2D_Dyn", Set, pTexSRVs[0]);
+ SET_SRB_VAR(pSRB, ShaderType, "g_Tex2DArr_Dyn", SetArray, &pTexSRVs[0], 0, DynamicTexArraySize);
+ };
+ BindResources(SHADER_TYPE_VERTEX);
+ BindResources(SHADER_TYPE_PIXEL);
pSRB->InitializeStaticResources(pPSO);
@@ -455,13 +496,13 @@ void ShaderResourceLayoutTest::TestTexturesAndImtblSamplers(bool TestImtblSample
DrawAttribs DrawAttrs{6, DRAW_FLAG_VERIFY_ALL};
pContext->Draw(DrawAttrs);
- SET_SRB_VAR(pSRB, SHADER_TYPE_VERTEX, "g_Tex2D_Dyn", Set, pTexSRVs[2]);
- SET_SRB_VAR(pSRB, SHADER_TYPE_VERTEX, "g_Tex2DArr_Dyn", SetArray, pTexSRVs.data(), 0, 1);
- SET_SRB_VAR(pSRB, SHADER_TYPE_VERTEX, "g_Tex2DArr_Dyn", SetArray, pTexSRVs.data() + 1, 1, DynamicTexArraySize - 1);
+ SET_SRB_VAR(pSRB, SHADER_TYPE_VERTEX, "g_Tex2D_Dyn", Set, pTexSRVs[Tex2D_DynIdx[0]]);
+ SET_SRB_VAR(pSRB, SHADER_TYPE_VERTEX, "g_Tex2DArr_Dyn", SetArray, &pTexSRVs[Tex2DArr_DynIdx[0]], 0, 1);
+ SET_SRB_VAR(pSRB, SHADER_TYPE_VERTEX, "g_Tex2DArr_Dyn", SetArray, &pTexSRVs[Tex2DArr_DynIdx[0] + 1], 1, DynamicTexArraySize - 1);
- SET_SRB_VAR(pSRB, SHADER_TYPE_PIXEL, "g_Tex2D_Dyn", Set, pTexSRVs[3]);
- SET_SRB_VAR(pSRB, SHADER_TYPE_PIXEL, "g_Tex2DArr_Dyn", SetArray, pTexSRVs.data() + 1, 0, 1);
- SET_SRB_VAR(pSRB, SHADER_TYPE_PIXEL, "g_Tex2DArr_Dyn", SetArray, pTexSRVs.data() + 2, 1, DynamicTexArraySize - 1);
+ SET_SRB_VAR(pSRB, SHADER_TYPE_PIXEL, "g_Tex2D_Dyn", Set, pTexSRVs[Tex2D_DynIdx[1]]);
+ SET_SRB_VAR(pSRB, SHADER_TYPE_PIXEL, "g_Tex2DArr_Dyn", SetArray, &pTexSRVs[Tex2DArr_DynIdx[1]], 0, 1);
+ SET_SRB_VAR(pSRB, SHADER_TYPE_PIXEL, "g_Tex2DArr_Dyn", SetArray, &pTexSRVs[Tex2DArr_DynIdx[1] + 1], 1, DynamicTexArraySize - 1);
pContext->CommitShaderResources(pSRB, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
@@ -492,6 +533,7 @@ void ShaderResourceLayoutTest::TestStructuredOrFormattedBuffer(bool IsFormatted)
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{});
auto* pEnv = TestingEnvironment::GetInstance();
auto* pDevice = pEnv->GetDevice();