summaryrefslogtreecommitdiffstats
path: root/UnitTests
diff options
context:
space:
mode:
authorEgor Yusov <egor.yusov@gmail.com>2019-12-11 03:25:45 +0000
committerEgor Yusov <egor.yusov@gmail.com>2019-12-11 03:25:45 +0000
commit4e5813cb36b2126fd426c203d6edd747ba07157f (patch)
tree2347f7f8eb634c777bc171580651e9ed6cd5434e /UnitTests
parentFixed formatting (diff)
downloadDiligentCore-4e5813cb36b2126fd426c203d6edd747ba07157f.tar.gz
DiligentCore-4e5813cb36b2126fd426c203d6edd747ba07157f.zip
Started refactoring ShaderResourceLayout test - added texture resource test
Diffstat (limited to 'UnitTests')
-rw-r--r--UnitTests/DiligentCoreAPITest/CMakeLists.txt2
-rw-r--r--UnitTests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/Textures.hlsl41
-rw-r--r--UnitTests/DiligentCoreAPITest/include/TestingEnvironment.h13
-rw-r--r--UnitTests/DiligentCoreAPITest/src/ShaderResourceArrayTest.cpp18
-rw-r--r--UnitTests/DiligentCoreAPITest/src/ShaderResourceLayoutTest.cpp537
-rw-r--r--UnitTests/DiligentCoreAPITest/src/TestingEnvironment.cpp18
6 files changed, 527 insertions, 102 deletions
diff --git a/UnitTests/DiligentCoreAPITest/CMakeLists.txt b/UnitTests/DiligentCoreAPITest/CMakeLists.txt
index f9e54289..87dc1ad9 100644
--- a/UnitTests/DiligentCoreAPITest/CMakeLists.txt
+++ b/UnitTests/DiligentCoreAPITest/CMakeLists.txt
@@ -4,7 +4,7 @@ project(DiligentCoreAPITest)
file(GLOB COMMON_SOURCE LIST_DIRECTORIES false src/*)
file(GLOB COMMON_INCLUDE LIST_DIRECTORIES false include/*)
-file(GLOB SHADERS LIST_DIRECTORIES false assets/shaders/*.*)
+file(GLOB_RECURSE SHADERS LIST_DIRECTORIES false assets/shaders/*.*)
set_source_files_properties(${SHADERS} PROPERTIES VS_TOOL_OVERRIDE "None")
diff --git a/UnitTests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/Textures.hlsl b/UnitTests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/Textures.hlsl
new file mode 100644
index 00000000..0a4b5ccc
--- /dev/null
+++ b/UnitTests/DiligentCoreAPITest/assets/shaders/ShaderResourceLayout/Textures.hlsl
@@ -0,0 +1,41 @@
+Texture2D g_Tex2D_Static;
+Texture2D g_Tex2D_Mut;
+Texture2D g_Tex2D_Dyn;
+
+Texture2D g_Tex2DArr_Static[STATIC_TEX_ARRAY_SIZE];
+Texture2D g_Tex2DArr_Mut [MUTABLE_TEX_ARRAY_SIZE];
+Texture2D g_Tex2DArr_Dyn [DYNAMIC_TEX_ARRAY_SIZE];
+
+SamplerState g_Sampler;
+
+float4 UseResources()
+{
+ float2 UV = float2(0.0, 0.0);
+ float4 f4Color = float4(0.0, 0.0, 0.0, 0.0);
+ f4Color += g_Tex2D_Static.SampleLevel(g_Sampler, UV.xy, 0.0);
+ f4Color += g_Tex2D_Mut. SampleLevel(g_Sampler, UV.xy, 0.0);
+ f4Color += g_Tex2D_Dyn. SampleLevel(g_Sampler, UV.xy, 0.0);
+
+ int i = 0;
+ for (i=0; i < STATIC_TEX_ARRAY_SIZE; ++i)
+ f4Color += g_Tex2DArr_Static[i].SampleLevel(g_Sampler, UV.xy, 0.0);
+ for (i=0; i < MUTABLE_TEX_ARRAY_SIZE; ++i)
+ f4Color += g_Tex2DArr_Mut[i].SampleLevel(g_Sampler, UV.xy, 0.0);
+ for (i=0; i < DYNAMIC_TEX_ARRAY_SIZE; ++i)
+ f4Color += g_Tex2DArr_Dyn[i].SampleLevel(g_Sampler, UV.xy, 0.0);
+
+ return f4Color;
+}
+
+void VSMain(out float4 f4Color : COLOR,
+ out float4 f4Position : SV_Position)
+{
+ f4Color = UseResources();
+ f4Position = float4(0.0, 0.0, 0.0, 1.0);
+}
+
+float4 PSMain(in float4 in_f4Color : COLOR,
+ in float4 f4Position : SV_Position) : SV_Target
+{
+ return in_f4Color + UseResources();
+}
diff --git a/UnitTests/DiligentCoreAPITest/include/TestingEnvironment.h b/UnitTests/DiligentCoreAPITest/include/TestingEnvironment.h
index 4537ee15..c8c2f23d 100644
--- a/UnitTests/DiligentCoreAPITest/include/TestingEnvironment.h
+++ b/UnitTests/DiligentCoreAPITest/include/TestingEnvironment.h
@@ -25,12 +25,23 @@
#include "DeviceContext.h"
#include "RefCntAutoPtr.h"
#include "SwapChain.h"
+#include "GraphicsAccessories.h"
#include "gtest/gtest.h"
namespace Diligent
{
+inline std::ostream& operator<<(std::ostream& os, const SHADER_RESOURCE_TYPE& ResType)
+{
+ return os << GetShaderResourceTypeLiteralName(ResType, true);
+}
+
+} // namespace Diligent
+
+namespace Diligent
+{
+
class TestingEnvironment final : public ::testing::Environment
{
public:
@@ -73,6 +84,8 @@ public:
static TestingEnvironment* GetInstance() { return m_pTheEnvironment; }
+ RefCntAutoPtr<ITexture> CreateTexture(const char* Name, TEXTURE_FORMAT Fmt, BIND_FLAGS BindFlags, Uint32 Width, Uint32 Height);
+
private:
const DeviceType m_DeviceType;
diff --git a/UnitTests/DiligentCoreAPITest/src/ShaderResourceArrayTest.cpp b/UnitTests/DiligentCoreAPITest/src/ShaderResourceArrayTest.cpp
index 4a4c9e62..1e373448 100644
--- a/UnitTests/DiligentCoreAPITest/src/ShaderResourceArrayTest.cpp
+++ b/UnitTests/DiligentCoreAPITest/src/ShaderResourceArrayTest.cpp
@@ -148,24 +148,12 @@ TEST(ShaderResourceLayout, ResourceArray)
RefCntAutoPtr<ITextureView> pRTV, pDSV;
{
- TextureDesc TexDesc;
- TexDesc.Name = "Offscreen render target";
- TexDesc.Type = RESOURCE_DIM_TEX_2D;
- TexDesc.Width = 25;
- TexDesc.Height = 256;
- TexDesc.Format = TEX_FORMAT_RGBA8_UNORM;
- TexDesc.BindFlags = BIND_RENDER_TARGET;
- RefCntAutoPtr<ITexture> pRenderTarget;
- pDevice->CreateTexture(TexDesc, nullptr, &pRenderTarget);
+ auto pRenderTarget = pEnv->CreateTexture("ShaderResourceLayout: offscreen render target", TEX_FORMAT_RGBA8_UNORM, BIND_RENDER_TARGET, 256, 256);
ASSERT_NE(pRenderTarget, nullptr);
pRTV = pRenderTarget->GetDefaultView(TEXTURE_VIEW_RENDER_TARGET);
ASSERT_NE(pRTV, nullptr);
- TexDesc.Name = "Offscreen depth";
- TexDesc.Format = TEX_FORMAT_D32_FLOAT;
- TexDesc.BindFlags = BIND_DEPTH_STENCIL;
- RefCntAutoPtr<ITexture> pDepth;
- pDevice->CreateTexture(TexDesc, nullptr, &pDepth);
+ auto pDepth = pEnv->CreateTexture("ShaderResourceLayout: offscreen depth", TEX_FORMAT_D32_FLOAT, BIND_DEPTH_STENCIL, 256, 256);
ASSERT_NE(pDepth, nullptr);
pDSV = pDepth->GetDefaultView(TEXTURE_VIEW_DEPTH_STENCIL);
ASSERT_NE(pDSV, nullptr);
@@ -174,7 +162,7 @@ TEST(ShaderResourceLayout, ResourceArray)
RefCntAutoPtr<ISampler> pSampler;
SamplerDesc SamDesc;
pDevice->CreateSampler(SamDesc, &pSampler);
- RefCntAutoPtr<Diligent::ITexture> pTextures[8];
+ RefCntAutoPtr<ITexture> pTextures[8];
for (auto t = 0; t < _countof(pTextures); ++t)
{
TextureDesc TexDesc;
diff --git a/UnitTests/DiligentCoreAPITest/src/ShaderResourceLayoutTest.cpp b/UnitTests/DiligentCoreAPITest/src/ShaderResourceLayoutTest.cpp
index cbf5f8b4..b1d54782 100644
--- a/UnitTests/DiligentCoreAPITest/src/ShaderResourceLayoutTest.cpp
+++ b/UnitTests/DiligentCoreAPITest/src/ShaderResourceLayoutTest.cpp
@@ -20,7 +20,10 @@
* all other commercial damages or losses), even if such Contributor has been advised
* of the possibility of such damages.
*/
+#include <unordered_map>
#include <vector>
+#include <array>
+#include <algorithm>
#include "TestingEnvironment.h"
#include "ShaderMacroHelper.h"
@@ -30,19 +33,265 @@
using namespace Diligent;
-namespace Diligent
+
+namespace
{
-namespace Test
+
+class ShaderResourceLayoutTest : public ::testing::Test
{
+protected:
+ static void SetUpTestSuite()
+ {
+ auto* pEnv = TestingEnvironment::GetInstance();
+ auto pRenderTarget = pEnv->CreateTexture("ShaderResourceLayoutTest: test RTV", TEX_FORMAT_RGBA8_UNORM, BIND_RENDER_TARGET, 512, 512);
+ ASSERT_NE(pRenderTarget, nullptr);
+ pRTV = pRenderTarget->GetDefaultView(TEXTURE_VIEW_RENDER_TARGET);
+ }
-void PrintShaderResources(IShader* pShader);
+ static void TearDownTestSuite()
+ {
+ TestingEnvironment::GetInstance()->Reset();
+ }
-}
-} // namespace Diligent
+ static void VerifyShaderResources(IShader* pShader,
+ const ShaderResourceDesc ExpectedResources[],
+ Uint32 ExpectedResCount)
+ {
+ auto ResCount = pShader->GetResourceCount();
+ EXPECT_EQ(ResCount, ExpectedResCount) << "Actual number of resources (" << ResCount << ") in shader '"
+ << pShader->GetDesc().Name << "' does not match the expected number of resources (" << ExpectedResCount << ')';
+ std::unordered_map<std::string, ShaderResourceDesc> Resources;
+ for (Uint32 i = 0; i < ResCount; ++i)
+ {
+ const auto& ResDesc = pShader->GetResource(i);
+ Resources.emplace(ResDesc.Name, ResDesc);
+ }
-namespace
+ for (Uint32 i = 0; i < ExpectedResCount; ++i)
+ {
+ const auto& ExpectedRes = ExpectedResources[i];
+
+ auto it = Resources.find(ExpectedRes.Name);
+ if (it != Resources.end())
+ {
+ EXPECT_EQ(it->second.Type, ExpectedRes.Type) << "Unexpected type of resource '" << ExpectedRes.Name << '\'';
+ EXPECT_EQ(it->second.ArraySize, ExpectedRes.ArraySize) << "Unexpected array size of resource '" << ExpectedRes.Name << '\'';
+ Resources.erase(it);
+ }
+ else
+ {
+ ADD_FAILURE() << "Unable to find resource '" << ExpectedRes.Name << "' in shader '" << pShader->GetDesc().Name << "'";
+ }
+ }
+
+ for (auto it : Resources)
+ {
+ ADD_FAILURE() << "Unexpected resource '" << it.second.Name << "' in shader '" << pShader->GetDesc().Name << "'";
+ }
+ }
+
+ static RefCntAutoPtr<IShader> CreateShader(const char* ShaderName,
+ const char* FileName,
+ const char* EntryPoint,
+ SHADER_TYPE ShaderType,
+ SHADER_SOURCE_LANGUAGE SrcLang,
+ const ShaderMacro* Macros,
+ const ShaderResourceDesc* ExpectedResources,
+ Uint32 NumExpectedResources)
+ {
+ auto* pEnv = TestingEnvironment::GetInstance();
+ auto* pDevice = pEnv->GetDevice();
+
+ RefCntAutoPtr<IShaderSourceInputStreamFactory> pShaderSourceFactory;
+ pDevice->GetEngineFactory()->CreateDefaultShaderSourceStreamFactory("shaders/ShaderResourceLayout", &pShaderSourceFactory);
+
+ ShaderCreateInfo ShaderCI;
+ ShaderCI.pShaderSourceStreamFactory = pShaderSourceFactory;
+ ShaderCI.UseCombinedTextureSamplers = false;
+
+ ShaderCI.FilePath = FileName;
+ ShaderCI.Desc.Name = ShaderName;
+ ShaderCI.EntryPoint = EntryPoint;
+ ShaderCI.Desc.ShaderType = ShaderType;
+ ShaderCI.SourceLanguage = SrcLang;
+ ShaderCI.Macros = Macros;
+
+ RefCntAutoPtr<IShader> pShader;
+ pDevice->CreateShader(ShaderCI, &pShader);
+ if (pShader)
+ {
+ VerifyShaderResources(pShader, ExpectedResources, NumExpectedResources);
+ }
+
+ return pShader;
+ }
+ static void CreateGraphicsPSO(IShader* pVS,
+ IShader* pPS,
+ const PipelineResourceLayoutDesc& ResourceLayout,
+ RefCntAutoPtr<IPipelineState>& pPSO,
+ RefCntAutoPtr<IShaderResourceBinding>& pSRB)
+ {
+ PipelineStateDesc PSODesc;
+
+ auto* pEnv = TestingEnvironment::GetInstance();
+ auto* pDevice = pEnv->GetDevice();
+
+ PSODesc.ResourceLayout = ResourceLayout;
+
+ PSODesc.Name = "Shader resource layout test";
+ PSODesc.GraphicsPipeline.pVS = pVS;
+ PSODesc.GraphicsPipeline.pPS = pPS;
+ PSODesc.GraphicsPipeline.PrimitiveTopology = PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
+ PSODesc.GraphicsPipeline.NumRenderTargets = 1;
+ PSODesc.GraphicsPipeline.RTVFormats[0] = TEX_FORMAT_RGBA8_UNORM;
+ PSODesc.GraphicsPipeline.DSVFormat = TEX_FORMAT_UNKNOWN;
+ PSODesc.SRBAllocationGranularity = 16;
+ PSODesc.GraphicsPipeline.DepthStencilDesc.DepthEnable = False;
+
+ pDevice->CreatePipelineState(PSODesc, &pPSO);
+ if (pPSO)
+ pPSO->CreateShaderResourceBinding(&pSRB, false);
+ }
+
+ static RefCntAutoPtr<ITextureView> pRTV;
+};
+
+RefCntAutoPtr<ITextureView> ShaderResourceLayoutTest::pRTV;
+
+#define SET_STATIC_VAR(PSO, ShaderFlags, VarName, SetMethod, ...) \
+ do \
+ { \
+ auto pStaticVar = PSO->GetStaticVariableByName(ShaderFlags, VarName); \
+ EXPECT_NE(pStaticVar, nullptr) << "Unable to find static variable '" << VarName << '\''; \
+ if (pStaticVar != nullptr) \
+ pStaticVar->SetMethod(__VA_ARGS__); \
+ } while (false)
+
+
+#define SET_SRB_VAR(SRB, ShaderFlags, VarName, SetMethod, ...) \
+ do \
+ { \
+ auto pVar = SRB->GetVariableByName(ShaderFlags, VarName); \
+ EXPECT_NE(pVar, nullptr) << "Unable to find SRB variable '" << VarName << '\''; \
+ if (pVar != nullptr) \
+ pVar->SetMethod(__VA_ARGS__); \
+ } while (false)
+
+TEST_F(ShaderResourceLayoutTest, Textures)
{
+ TestingEnvironment::ScopedReset AutoResetEnvironment;
+
+ static constexpr int StaticTexArraySize = 3;
+ static constexpr int MutableTexArraySize = 5;
+ static constexpr int DynamicTexArraySize = 4;
+ ShaderMacroHelper Macros;
+ Macros.AddShaderMacro("STATIC_TEX_ARRAY_SIZE", StaticTexArraySize);
+ Macros.AddShaderMacro("MUTABLE_TEX_ARRAY_SIZE", MutableTexArraySize);
+ Macros.AddShaderMacro("DYNAMIC_TEX_ARRAY_SIZE", DynamicTexArraySize);
+
+ RefCntAutoPtr<IPipelineState> pPSO;
+ RefCntAutoPtr<IShaderResourceBinding> pSRB;
+ // clang-format off
+ ShaderResourceDesc Resources[] =
+ {
+ {"g_Tex2D_Static", SHADER_RESOURCE_TYPE_TEXTURE_SRV, 1},
+ {"g_Tex2D_Mut", SHADER_RESOURCE_TYPE_TEXTURE_SRV, 1},
+ {"g_Tex2D_Dyn", SHADER_RESOURCE_TYPE_TEXTURE_SRV, 1},
+ {"g_Tex2DArr_Static", SHADER_RESOURCE_TYPE_TEXTURE_SRV, StaticTexArraySize},
+ {"g_Tex2DArr_Mut", SHADER_RESOURCE_TYPE_TEXTURE_SRV, MutableTexArraySize},
+ {"g_Tex2DArr_Dyn", SHADER_RESOURCE_TYPE_TEXTURE_SRV, DynamicTexArraySize},
+ {"g_Sampler", SHADER_RESOURCE_TYPE_SAMPLER, 1},
+ };
+ // clang-format on
+
+ auto pVS = CreateShader("ShaderResourceLayoutTest.Textures - VS", "Textures.hlsl", "VSMain",
+ SHADER_TYPE_VERTEX, SHADER_SOURCE_LANGUAGE_HLSL, Macros,
+ Resources, _countof(Resources));
+ auto pPS = CreateShader("ShaderResourceLayoutTest.Textures - PS", "Textures.hlsl", "PSMain",
+ SHADER_TYPE_PIXEL, SHADER_SOURCE_LANGUAGE_HLSL, Macros,
+ Resources, _countof(Resources));
+ ASSERT_NE(pVS, nullptr);
+ ASSERT_NE(pPS, nullptr);
+
+
+ // clang-format off
+ ShaderResourceVariableDesc Vars[] =
+ {
+ {SHADER_TYPE_VERTEX | SHADER_TYPE_PIXEL, "g_Tex2D_Static", SHADER_RESOURCE_VARIABLE_TYPE_STATIC},
+ {SHADER_TYPE_VERTEX | SHADER_TYPE_PIXEL, "g_Tex2D_Mut", SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE},
+ {SHADER_TYPE_VERTEX | SHADER_TYPE_PIXEL, "g_Tex2D_Dyn", SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC},
+
+ {SHADER_TYPE_VERTEX | SHADER_TYPE_PIXEL, "g_Tex2DArr_Static", SHADER_RESOURCE_VARIABLE_TYPE_STATIC},
+ {SHADER_TYPE_VERTEX | SHADER_TYPE_PIXEL, "g_Tex2DArr_Mut", SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE},
+ {SHADER_TYPE_VERTEX | SHADER_TYPE_PIXEL, "g_Tex2DArr_Dyn", SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC}
+ };
+ StaticSamplerDesc StaticSamplers[] =
+ {
+ {SHADER_TYPE_VERTEX | SHADER_TYPE_PIXEL, "g_Sampler", SamplerDesc{}}
+ };
+ // clang-format on
+
+ PipelineResourceLayoutDesc ResourceLayout;
+ ResourceLayout.Variables = Vars;
+ ResourceLayout.NumVariables = _countof(Vars);
+ ResourceLayout.StaticSamplers = StaticSamplers;
+ ResourceLayout.NumStaticSamplers = _countof(StaticSamplers);
+
+ CreateGraphicsPSO(pVS, pPS, ResourceLayout, pPSO, pSRB);
+ ASSERT_NE(pPSO, nullptr);
+ ASSERT_NE(pSRB, nullptr);
+
+ constexpr auto MaxTextures = std::max(std::max(StaticTexArraySize, MutableTexArraySize), DynamicTexArraySize);
+
+ std::array<RefCntAutoPtr<ITexture>, MaxTextures> pTextures;
+ std::array<IDeviceObject*, MaxTextures> pTexSRVs = {};
+
+ auto* pEnv = TestingEnvironment::GetInstance();
+ for (Uint32 i = 0; i < MaxTextures; ++i)
+ {
+ pTextures[i] = pEnv->CreateTexture("Test texture", TEX_FORMAT_RGBA8_UNORM, BIND_SHADER_RESOURCE, 256, 256);
+ 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[0]);
+ SET_STATIC_VAR(pPSO, SHADER_TYPE_PIXEL, "g_Tex2DArr_Static", SetArray, pTexSRVs.data(), 0, StaticTexArraySize);
+ SET_SRB_VAR(pSRB, SHADER_TYPE_VERTEX, "g_Tex2D_Mut", Set, pTexSRVs[0]);
+ 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(), 0, DynamicTexArraySize);
+
+ SET_SRB_VAR(pSRB, SHADER_TYPE_PIXEL, "g_Tex2D_Mut", Set, pTexSRVs[0]);
+ 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);
+
+ pSRB->InitializeStaticResources(pPSO);
+
+ auto* pContext = pEnv->GetDeviceContext();
+
+ ITextureView* ppRTVs[] = {pRTV};
+ pContext->SetRenderTargets(1, ppRTVs, nullptr, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
+
+ pContext->SetPipelineState(pPSO);
+ pContext->CommitShaderResources(pSRB, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
+
+ DrawAttribs DrawAttrs(3, DRAW_FLAG_VERIFY_ALL);
+ pContext->Draw(DrawAttrs);
+
+ SET_SRB_VAR(pSRB, SHADER_TYPE_VERTEX, "g_Tex2D_Dyn", Set, pTexSRVs[1]);
+ SET_SRB_VAR(pSRB, SHADER_TYPE_VERTEX, "g_Tex2DArr_Dyn", SetArray, pTexSRVs.data(), 1, DynamicTexArraySize - 1);
+
+ SET_SRB_VAR(pSRB, SHADER_TYPE_PIXEL, "g_Tex2D_Dyn", Set, pTexSRVs[1]);
+ SET_SRB_VAR(pSRB, SHADER_TYPE_PIXEL, "g_Tex2DArr_Dyn", SetArray, pTexSRVs.data(), 1, DynamicTexArraySize - 1);
+
+ pContext->Draw(DrawAttrs);
+}
+
+#if 0
TEST(ShaderResourceLayout, ResourceLayout)
{
auto* pEnv = TestingEnvironment::GetInstance();
@@ -54,25 +303,105 @@ TEST(ShaderResourceLayout, ResourceLayout)
const bool IsHLSL_51 = deviceType == DeviceType::D3D12;
const bool ConstantBufferArraysSupported = IsHLSL_51 || deviceType == DeviceType::Vulkan || deviceType == DeviceType::OpenGL;
- const bool VertexShaderUAVSupported = IsHLSL_51 || deviceType == DeviceType::Vulkan;
+ const bool VertexShaderUAVSupported = IsHLSL_51 || deviceType == DeviceType::Vulkan || deviceType == DeviceType::OpenGL;
+
+ static_assert(SHADER_RESOURCE_VARIABLE_TYPE_NUM_TYPES == 3, "Unexpected number of shader variable types");
+ struct ShaderResourceCounters
+ {
+ using SizeArrayType = std::array<Uint32, SHADER_RESOURCE_VARIABLE_TYPE_NUM_TYPES>;
+ SizeArrayType TexArrSize = {};
+ SizeArrayType SamplerArrSize = {};
+ SizeArrayType CbArrSize = {};
+ SizeArrayType BuffUavArrSize = {};
+ SizeArrayType TexUavArrSize = {};
+ };
+ ShaderResourceCounters VSResCounters;
+ ShaderResourceCounters PSResCounters;
- RefCntAutoPtr<IShaderSourceInputStreamFactory> pShaderSourceFactory;
- pDevice->GetEngineFactory()->CreateDefaultShaderSourceStreamFactory("shaders", &pShaderSourceFactory);
+ VSResCounters.TexArrSize = ShaderResourceCounters::SizeArrayType //
+ {
+ 2, // Static
+ 5, // Mutable
+ 3 // Dynamic
+ };
+ VSResCounters.SamplerArrSize = ShaderResourceCounters::SizeArrayType //
+ {
+ 4, // Static
+ 3, // Mutable
+ 2 // Dynamic
+ };
+ VSResCounters.CbArrSize = ShaderResourceCounters::SizeArrayType //
+ {
+ ConstantBufferArraysSupported ? 4U : 1U, // Static
+ ConstantBufferArraysSupported ? 3U : 1U, // Mutable
+ ConstantBufferArraysSupported ? 2U : 1U // Dynamic
+ };
+ if (deviceType != DeviceType::D3D11)
+ {
+ VSResCounters.BuffUavArrSize = ShaderResourceCounters::SizeArrayType //
+ {
+ 4, // Static
+ 3, // Mutable
+ 2 // Dynamic
+ };
+ VSResCounters.TexUavArrSize = ShaderResourceCounters::SizeArrayType //
+ {
+ 0, // Static
+ 3, // Mutable
+ 2 // Dynamic
+ };
+ }
- ShaderCreateInfo ShaderCI;
- ShaderCI.pShaderSourceStreamFactory = pShaderSourceFactory;
- ShaderCI.EntryPoint = "main";
- ShaderCI.UseCombinedTextureSamplers = false;
- RefCntAutoPtr<ISampler> pSamplers[4] = {};
- IDeviceObject* pSams[4] = {};
- for (int i = 0; i < 4; ++i)
+ PSResCounters.TexArrSize = ShaderResourceCounters::SizeArrayType //
+ {
+ 2, // Static
+ 5, // Mutable
+ 3 // Dynamic
+ };
+ PSResCounters.SamplerArrSize = ShaderResourceCounters::SizeArrayType //
+ {
+ 4, // Static
+ 3, // Mutable
+ 2 // Dynamic
+ };
+ PSResCounters.CbArrSize = ShaderResourceCounters::SizeArrayType //
+ {
+ ConstantBufferArraysSupported ? 4U : 1U, // Static
+ ConstantBufferArraysSupported ? 3U : 1U, // Mutable
+ ConstantBufferArraysSupported ? 2U : 1U // Dynamic
+ };
+ if (deviceType != DeviceType::D3D11)
+ {
+ PSResCounters.BuffUavArrSize = ShaderResourceCounters::SizeArrayType //
+ {
+ 4, // Static
+ 3, // Mutable
+ 2 // Dynamic
+ };
+ PSResCounters.TexUavArrSize = ShaderResourceCounters::SizeArrayType //
+ {
+ 0, // Static
+ 3, // Mutable
+ 2 // Dynamic
+ };
+ }
+
+ Uint32 MaxSamplerArraySize = 0;
+ for (auto SamArrSize : VSResCounters.SamplerArrSize)
+ MaxSamplerArraySize = std::max(MaxSamplerArraySize, SamArrSize);
+ for (auto SamArrSize : PSResCounters.SamplerArrSize)
+ MaxSamplerArraySize = std::max(MaxSamplerArraySize, SamArrSize);
+
+ std::vector<RefCntAutoPtr<ISampler>> pSamplers(MaxSamplerArraySize);
+ std::vector<IDeviceObject*> pSamplerObjs(MaxSamplerArraySize);
+ for (Uint32 i = 0; i < MaxSamplerArraySize; ++i)
{
SamplerDesc SamDesc;
pDevice->CreateSampler(SamDesc, &(pSamplers[i]));
ASSERT_NE(pSamplers[i], nullptr);
- pSams[i] = pSamplers[i];
+ pSamplerObjs[i] = pSamplers[i];
}
RefCntAutoPtr<ITexture> pTex[4];
@@ -97,9 +426,14 @@ TEST(ShaderResourceLayout, ResourceLayout)
TexDesc.BindFlags = BIND_SHADER_RESOURCE | BIND_UNORDERED_ACCESS;
TexDesc.Format = TEX_FORMAT_RGBA8_UNORM;
- RefCntAutoPtr<ITexture> pStorageTex[16] = {};
- IDeviceObject* pUAVs[_countof(pStorageTex)] = {};
- for (int i = 0; i < _countof(pStorageTex); ++i)
+ Uint32 TotalStorageTextures = 6 * 2;
+ for (auto SamArrSize : VSResCounters.TexUavArrSize)
+ TotalStorageTextures += std::max(MaxSamplerArraySize, SamArrSize);
+ for (auto SamArrSize : PSResCounters.TexUavArrSize)
+ TotalStorageTextures += std::max(MaxSamplerArraySize, SamArrSize);
+ std::vector<RefCntAutoPtr<ITexture>> pStorageTex(TotalStorageTextures);
+ std::vector<IDeviceObject*> pUAVs(TotalStorageTextures);
+ for (Uint32 i = 0; i < TotalStorageTextures; ++i)
{
pDevice->CreateTexture(TexDesc, nullptr, &(pStorageTex[i]));
ASSERT_NE(pStorageTex[i], nullptr);
@@ -132,17 +466,25 @@ TEST(ShaderResourceLayout, ResourceLayout)
BuffDesc.Mode = BUFFER_MODE_STRUCTURED;
BuffDesc.ElementByteStride = 16;
- RefCntAutoPtr<IBuffer> pStorgeBuffs[24] = {};
- IDeviceObject* pSBUAVs[_countof(pStorgeBuffs)] = {};
- for (int i = 0; i < _countof(pStorgeBuffs); ++i)
+ Uint32 TotalStorageBuffers = 3 * 2;
+ for (auto SamArrSize : VSResCounters.BuffUavArrSize)
+ TotalStorageBuffers += std::max(MaxSamplerArraySize, SamArrSize);
+ for (auto SamArrSize : PSResCounters.BuffUavArrSize)
+ TotalStorageBuffers += std::max(MaxSamplerArraySize, SamArrSize);
+ std::vector<RefCntAutoPtr<IBuffer>> pStorgeBuffs(TotalStorageBuffers);
+ std::vector<IDeviceObject*> pSBUAVs(TotalStorageBuffers);
+ for (Uint32 i = 0; i < TotalStorageBuffers; ++i)
{
pDevice->CreateBuffer(BuffDesc, nullptr, &(pStorgeBuffs[i]));
ASSERT_NE(pStorgeBuffs[i], nullptr);
pSBUAVs[i] = pStorgeBuffs[i]->GetDefaultView(BUFFER_VIEW_UNORDERED_ACCESS);
}
- RefCntAutoPtr<IBuffer> pUniformTexelBuff0, pStorageTexelBuff[4];
- RefCntAutoPtr<IBufferView> pUniformTexelBuffSRV, pStorageTexelBuffUAV[_countof(pStorageTexelBuff)];
+ constexpr Uint32 TotalStorageTexelBuffers = 4;
+ RefCntAutoPtr<IBuffer> pUniformTexelBuff;
+ RefCntAutoPtr<IBuffer> pStorageTexelBuff[TotalStorageTexelBuffers];
+ RefCntAutoPtr<IBufferView> pUniformTexelBuffSRV;
+ RefCntAutoPtr<IBufferView> pStorageTexelBuffUAV[TotalStorageTexelBuffers];
{
BufferDesc TxlBuffDesc;
TxlBuffDesc.Name = "Uniform texel buffer test";
@@ -151,8 +493,8 @@ TEST(ShaderResourceLayout, ResourceLayout)
TxlBuffDesc.Usage = USAGE_DEFAULT;
TxlBuffDesc.ElementByteStride = 16;
TxlBuffDesc.Mode = BUFFER_MODE_FORMATTED;
- pDevice->CreateBuffer(TxlBuffDesc, nullptr, &pUniformTexelBuff0);
- ASSERT_NE(pUniformTexelBuff0, nullptr);
+ pDevice->CreateBuffer(TxlBuffDesc, nullptr, &pUniformTexelBuff);
+ ASSERT_NE(pUniformTexelBuff, nullptr);
BufferViewDesc TxlBuffViewDesc;
TxlBuffViewDesc.Name = "Uniform texel buffer SRV";
@@ -160,7 +502,7 @@ TEST(ShaderResourceLayout, ResourceLayout)
TxlBuffViewDesc.Format.ValueType = VT_FLOAT32;
TxlBuffViewDesc.Format.NumComponents = 4;
TxlBuffViewDesc.Format.IsNormalized = false;
- pUniformTexelBuff0->CreateView(TxlBuffViewDesc, &pUniformTexelBuffSRV);
+ pUniformTexelBuff->CreateView(TxlBuffViewDesc, &pUniformTexelBuffSRV);
ASSERT_NE(pUniformTexelBuffSRV, nullptr);
TxlBuffDesc.Name = "Storage texel buffer test";
@@ -168,7 +510,7 @@ TEST(ShaderResourceLayout, ResourceLayout)
TxlBuffViewDesc.Name = "Storage texel buffer UAV";
TxlBuffViewDesc.ViewType = BUFFER_VIEW_UNORDERED_ACCESS;
- for (int i = 0; i < _countof(pStorageTexelBuff); ++i)
+ for (int i = 0; i < TotalStorageTexelBuffers; ++i)
{
pDevice->CreateBuffer(TxlBuffDesc, nullptr, &(pStorageTexelBuff[i]));
ASSERT_NE(pStorageTexelBuff[i], nullptr);
@@ -178,7 +520,7 @@ TEST(ShaderResourceLayout, ResourceLayout)
}
}
- ResourceMappingDesc ResMappingDesc;
+ /*ResourceMappingDesc ResMappingDesc;
// clang-format off
ResourceMappingEntry MappingEntries[] =
{
@@ -192,6 +534,8 @@ TEST(ShaderResourceLayout, ResourceLayout)
{"g_tex2DArr_Mut", pSRVs[0], 0},
{"g_tex2DArr_Mut", pSRVs[1], 1},
{"g_tex2DArr_Mut", pSRVs[2], 2},
+ {"g_tex2DArr_Mut", pSRVs[3], 3},
+ {"g_tex2DArr_Mut", pSRVs[0], 4},
{"g_tex2D_Dyn", pSRVs[0]},
{"g_tex2DArr_Dyn", pSRVs[0], 0},
{"g_tex2DArr_Dyn", pSRVs[1], 1},
@@ -215,28 +559,60 @@ TEST(ShaderResourceLayout, ResourceLayout)
{"g_sepTex2DArr_dyn", pSRVs[2], 6},
{"g_sepTex2DArr_dyn", pSRVs[3], 7},
{} //
- };
+ };*/
// clang-format on
- ShaderMacroHelper Macros;
- Macros.AddShaderMacro("VERTEX_SHADER_UAV_SUPPORTED", VertexShaderUAVSupported);
- Macros.AddShaderMacro("CONSTANT_BUFFER_ARRAYS_SUPPORTED", ConstantBufferArraysSupported);
- Macros.AddShaderMacro("HLSL_51", IsHLSL_51);
- ShaderCI.Macros = Macros;
+ RefCntAutoPtr<IShaderSourceInputStreamFactory> pShaderSourceFactory;
+ pDevice->GetEngineFactory()->CreateDefaultShaderSourceStreamFactory("shaders", &pShaderSourceFactory);
+
+ ShaderCreateInfo ShaderCI;
+ ShaderCI.pShaderSourceStreamFactory = pShaderSourceFactory;
+ ShaderCI.EntryPoint = "main";
+ ShaderCI.UseCombinedTextureSamplers = false;
+
+ //ResMappingDesc.pEntries = MappingEntries;
+ //RefCntAutoPtr<IResourceMapping> pResMapping;
+ //pDevice->CreateResourceMapping(ResMappingDesc, &pResMapping);
+ //if (IsD3DDevice)
+ //{
+ // pResMapping->AddResourceArray("g_SamArr_mut", 0, pSamplerObjs.data(), 3, true);
+ //}
+
+ auto GetShaderMacros = [&](const ShaderResourceCounters& Counters, bool UAVSupported) {
+ ShaderMacroHelper Macros;
+
+ Macros.AddShaderMacro("UAV_SUPPORTED", UAVSupported);
+ Macros.AddShaderMacro("CONSTANT_BUFFER_ARRAYS_SUPPORTED", ConstantBufferArraysSupported);
+ Macros.AddShaderMacro("HLSL_51", IsHLSL_51);
+
+# define ADD_ARRAY_SIZE_MACROS(ArrayType, Sizes) \
+ do \
+ { \
+ Macros.AddShaderMacro("STATIC_"##ArrayType, static_cast<int>(Sizes[SHADER_RESOURCE_VARIABLE_TYPE_STATIC])); \
+ Macros.AddShaderMacro("MUTABLE_"##ArrayType, static_cast<int>(Sizes[SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE])); \
+ Macros.AddShaderMacro("DYNAMIC_"##ArrayType, static_cast<int>(Sizes[SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC])); \
+ } while (false)
+
+ ADD_ARRAY_SIZE_MACROS("TEX_ARRAY_SIZE", Counters.TexArrSize);
+ ADD_ARRAY_SIZE_MACROS("SAM_ARRAY_SIZE", Counters.SamplerArrSize);
+ ADD_ARRAY_SIZE_MACROS("CB_ARRAY_SIZE", Counters.CbArrSize);
+ ADD_ARRAY_SIZE_MACROS("BUFF_UAV_ARR_SIZE", Counters.BuffUavArrSize);
+ ADD_ARRAY_SIZE_MACROS("TEX_UAV_ARR_SIZE", Counters.TexUavArrSize);
+# undef ADD_ARRAY_SIZE_MACROS
+
+ return Macros;
+ };
- ResMappingDesc.pEntries = MappingEntries;
- RefCntAutoPtr<IResourceMapping> pResMapping;
- pDevice->CreateResourceMapping(ResMappingDesc, &pResMapping);
- if (IsD3DDevice)
- {
- pResMapping->AddResourceArray("g_SamArr_mut", 0, pSams, 3, true);
- }
RefCntAutoPtr<IShader> pVS;
{
ShaderCI.Desc.Name = "Shader resource layout test VS";
ShaderCI.Desc.ShaderType = SHADER_TYPE_VERTEX;
ShaderCI.SourceLanguage = SHADER_SOURCE_LANGUAGE_GLSL;
- ShaderCI.FilePath = IsD3DDevice ? "ShaderResourceLayoutTestDX.vsh" : "ShaderResourceLayoutTestGL.vsh";
+ ShaderCI.FilePath = IsD3DDevice ? "ShaderResourceLayoutTestDX.hlsl" : "ShaderResourceLayoutTestGL.vsh";
+ ShaderCI.EntryPoint = IsD3DDevice ? "VSMain" : "main";
+
+ auto Macros = GetShaderMacros(VSResCounters, VertexShaderUAVSupported);
+ ShaderCI.Macros = Macros;
pDevice->CreateShader(ShaderCI, &pVS);
ASSERT_NE(pVS, nullptr);
@@ -249,7 +625,11 @@ TEST(ShaderResourceLayout, ResourceLayout)
ShaderCI.Desc.Name = "Shader resource layout test PS";
ShaderCI.Desc.ShaderType = SHADER_TYPE_PIXEL;
ShaderCI.SourceLanguage = SHADER_SOURCE_LANGUAGE_GLSL;
- ShaderCI.FilePath = IsD3DDevice ? "ShaderResourceLayoutTestDX.psh" : "ShaderResourceLayoutTestGL.psh";
+ ShaderCI.FilePath = IsD3DDevice ? "ShaderResourceLayoutTestDX.hlsl" : "ShaderResourceLayoutTestGL.psh";
+ ShaderCI.EntryPoint = IsD3DDevice ? "PSMain" : "main";
+
+ auto Macros = GetShaderMacros(PSResCounters, true);
+ ShaderCI.Macros = Macros;
pDevice->CreateShader(ShaderCI, &pPS);
ASSERT_NE(pPS, nullptr);
@@ -288,17 +668,15 @@ TEST(ShaderResourceLayout, ResourceLayout)
{SHADER_TYPE_VERTEX | SHADER_TYPE_PIXEL, "g_StorageTexelBuff_mut", SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC},
};
- if (IsD3DDevice)
+ if (IsHLSL_51 || deviceType == DeviceType::Vulkan)
{
- if (IsHLSL_51)
- {
- VarDesc.emplace_back(SHADER_TYPE_VERTEX | SHADER_TYPE_PIXEL, "storageBuffArr_Mut", SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE);
- VarDesc.emplace_back(SHADER_TYPE_VERTEX | SHADER_TYPE_PIXEL, "storageBuffArr_Dyn", SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC);
- VarDesc.emplace_back(SHADER_TYPE_VERTEX | SHADER_TYPE_PIXEL, "g_tex2DStorageImgArr_Mut", SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE);
- VarDesc.emplace_back(SHADER_TYPE_VERTEX | SHADER_TYPE_PIXEL, "g_tex2DStorageImgArr_Dyn", SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC);
- }
+ VarDesc.emplace_back(SHADER_TYPE_VERTEX | SHADER_TYPE_PIXEL, "storageBuffArr_Mut", SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE);
+ VarDesc.emplace_back(SHADER_TYPE_VERTEX | SHADER_TYPE_PIXEL, "storageBuffArr_Dyn", SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC);
+ VarDesc.emplace_back(SHADER_TYPE_VERTEX | SHADER_TYPE_PIXEL, "g_tex2DStorageImgArr_Mut", SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE);
+ VarDesc.emplace_back(SHADER_TYPE_VERTEX | SHADER_TYPE_PIXEL, "g_tex2DStorageImgArr_Dyn", SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC);
}
- else
+
+ if (!IsD3DDevice)
{
VarDesc.emplace_back(SHADER_TYPE_VERTEX | SHADER_TYPE_PIXEL, "g_tex2D_Static", SHADER_RESOURCE_VARIABLE_TYPE_STATIC);
}
@@ -337,24 +715,17 @@ TEST(ShaderResourceLayout, ResourceLayout)
pDevice->CreatePipelineState(PSODesc, &pTestPSO);
ASSERT_NE(pTestPSO, nullptr);
-#define SET_STATIC_VAR(ShaderFlags, VarName, SetMethod, ...) \
- do \
- { \
- auto pStaticVar = pTestPSO->GetStaticVariableByName(ShaderFlags, VarName); \
- EXPECT_NE(pStaticVar, nullptr) << "Unable to fins static variable '" << VarName << '\''; \
- if (pStaticVar != nullptr) \
- pStaticVar->SetMethod(__VA_ARGS__); \
- } while (false)
+# if 0
{
// clang-format off
//SET_STATIC_VAR(SHADER_TYPE_VERTEX, "g_tex2D_Static", Set, pSRVs[0]);
//SET_STATIC_VAR(SHADER_TYPE_VERTEX, "g_tex2DArr_Static", SetArray, pSRVs, 0, 2);
SET_STATIC_VAR(SHADER_TYPE_VERTEX, "g_sepTex2D_static", Set, pSRVs[0]);
- SET_STATIC_VAR(SHADER_TYPE_VERTEX, "g_sepTex2DArr_static", SetArray, pSRVs, 0, 2);
- SET_STATIC_VAR(SHADER_TYPE_VERTEX, "g_SamArr_static", SetArray, pSams, 0, 2);
+ SET_STATIC_VAR(SHADER_TYPE_VERTEX, "g_sepTex2DArr_static", SetArray, pSRVs, 0, VSTexArrSize[SHADER_RESOURCE_VARIABLE_TYPE_STATIC]);
+ SET_STATIC_VAR(SHADER_TYPE_VERTEX, "g_SamArr_static", SetArray, pSamplerObjs.data(), 0, VSSamplerArrSize[SHADER_RESOURCE_VARIABLE_TYPE_STATIC]);
SET_STATIC_VAR(SHADER_TYPE_VERTEX, "UniformBuff_Stat", Set, pUBs[0]);
- SET_STATIC_VAR(SHADER_TYPE_VERTEX, "UniformBuffArr_Stat", SetArray, pUBs, 0, ConstantBufferArraysSupported ? 2 : 1);
+ SET_STATIC_VAR(SHADER_TYPE_VERTEX, "UniformBuffArr_Stat", SetArray, pUBs, 0, VSCBArrSize[SHADER_RESOURCE_VARIABLE_TYPE_STATIC]);
if (VertexShaderUAVSupported)
{
SET_STATIC_VAR(SHADER_TYPE_VERTEX, "storageBuff_Static", Set, pSBUAVs[0]);
@@ -387,11 +758,11 @@ TEST(ShaderResourceLayout, ResourceLayout)
SET_STATIC_VAR(SHADER_TYPE_PIXEL, "g_tex2DArr_Static", SetArray, pSRVs, 0, 2);
//SET_STATIC_VAR(SHADER_TYPE_PIXEL, "g_sepTex2D_static", Set, pSRVs[0]);
//SET_STATIC_VAR(SHADER_TYPE_PIXEL, "g_sepTex2DArr_static", SetArray, pSRVs, 0, 2);
- SET_STATIC_VAR(SHADER_TYPE_PIXEL, "g_SamArr_static", SetArray, pSams, 0, 2);
+ SET_STATIC_VAR(SHADER_TYPE_PIXEL, "g_SamArr_static", SetArray, pSamplerObjs, 0, 2);
SET_STATIC_VAR(SHADER_TYPE_PIXEL, "UniformBuff_Stat", Set, pUBs[0]);
SET_STATIC_VAR(SHADER_TYPE_PIXEL, "UniformBuffArr_Stat", SetArray, pUBs, 0, ConstantBufferArraysSupported ? 2 : 1);
SET_STATIC_VAR(SHADER_TYPE_PIXEL, "storageBuff_Static", Set, pSBUAVs[2]);
- if (IsHLSL_51)
+ if (IsHLSL_51 || deviceType == DeviceType::Vulkan)
{
SET_STATIC_VAR(SHADER_TYPE_PIXEL, "storageBuffArr_Static", SetArray, pSBUAVs + 3, 0, 2);
}
@@ -423,28 +794,21 @@ TEST(ShaderResourceLayout, ResourceLayout)
EXPECT_EQ(pSRB->GetVariableByName(SHADER_TYPE_VERTEX, "UniformBuff_Stat"), nullptr);
EXPECT_EQ(pSRB->GetVariableByName(SHADER_TYPE_PIXEL, "g_sepTex2DArr_static"), nullptr);
-#define SET_SRB_VAR(ShaderFlags, VarName, SetMethod, ...) \
- do \
- { \
- auto pVar = pSRB->GetVariableByName(ShaderFlags, VarName); \
- EXPECT_NE(pVar, nullptr) << "Unable to find SRB variable '" << VarName << '\''; \
- if (pVar != nullptr) \
- pVar->SetMethod(__VA_ARGS__); \
- } while (false)
+
// clang-format off
SET_SRB_VAR(SHADER_TYPE_VERTEX, "g_tex2D_Mut", Set, pSRVs[0]);
- SET_SRB_VAR(SHADER_TYPE_VERTEX, "g_tex2DArr_Mut", SetArray, pSRVs, 0, 3);
+ SET_SRB_VAR(SHADER_TYPE_VERTEX, "g_tex2DArr_Mut", SetArray, pSRVs, 0, 5);
SET_SRB_VAR(SHADER_TYPE_VERTEX, "g_tex2D_Dyn", Set, pSRVs[0]);
- SET_SRB_VAR(SHADER_TYPE_VERTEX, "g_tex2DArr_Dyn", SetArray, pSRVs, 0, 4);
+ SET_SRB_VAR(SHADER_TYPE_VERTEX, "g_tex2DArr_Dyn", SetArray, pSRVs, 0, 3);
SET_SRB_VAR(SHADER_TYPE_VERTEX, "g_sepTex2D_mut", Set, pSRVs[0]);
SET_SRB_VAR(SHADER_TYPE_VERTEX, "g_sepTex2DArr_mut", SetArray, pSRVs, 0, 3);
SET_SRB_VAR(SHADER_TYPE_VERTEX, "g_sepTex2D_dyn", Set, pSRVs[0]);
SET_SRB_VAR(SHADER_TYPE_VERTEX, "g_sepTex2DArr_dyn", SetArray, pSRVs, 0, 4);
- SET_SRB_VAR(SHADER_TYPE_VERTEX, "g_Sam_mut", Set, pSams[0]);
- SET_SRB_VAR(SHADER_TYPE_VERTEX, "g_SamArr_dyn", SetArray, pSams, 0, 4);
+ SET_SRB_VAR(SHADER_TYPE_VERTEX, "g_Sam_mut", Set, pSamplerObjs[0]);
+ SET_SRB_VAR(SHADER_TYPE_VERTEX, "g_SamArr_dyn", SetArray, pSamplerObjs, 0, 4);
SET_SRB_VAR(SHADER_TYPE_VERTEX, "UniformBuff_Mut", Set, pUBs[0]);
SET_SRB_VAR(SHADER_TYPE_VERTEX, "UniformBuffArr_Mut", SetArray, pUBs, 0, ConstantBufferArraysSupported ? 3 : 1);
@@ -467,17 +831,17 @@ TEST(ShaderResourceLayout, ResourceLayout)
SET_SRB_VAR(SHADER_TYPE_PIXEL, "g_tex2D_Mut", Set, pSRVs[0]);
- SET_SRB_VAR(SHADER_TYPE_PIXEL, "g_tex2DArr_Mut", SetArray, pSRVs, 0, 3);
+ SET_SRB_VAR(SHADER_TYPE_PIXEL, "g_tex2DArr_Mut", SetArray, pSRVs, 0, 5);
SET_SRB_VAR(SHADER_TYPE_PIXEL, "g_tex2D_Dyn", Set, pSRVs[0]);
- SET_SRB_VAR(SHADER_TYPE_PIXEL, "g_tex2DArr_Dyn", SetArray, pSRVs, 0, 4);
+ SET_SRB_VAR(SHADER_TYPE_PIXEL, "g_tex2DArr_Dyn", SetArray, pSRVs, 0, 3);
SET_SRB_VAR(SHADER_TYPE_PIXEL, "g_sepTex2D_mut", Set, pSRVs[0]);
SET_SRB_VAR(SHADER_TYPE_PIXEL, "g_sepTex2DArr_mut", SetArray, pSRVs, 0, 3);
SET_SRB_VAR(SHADER_TYPE_PIXEL, "g_sepTex2D_dyn", Set, pSRVs[0]);
SET_SRB_VAR(SHADER_TYPE_PIXEL, "g_sepTex2DArr_dyn", SetArray, pSRVs, 0, 4);
- SET_SRB_VAR(SHADER_TYPE_PIXEL, "g_Sam_mut", Set, pSams[0]);
- SET_SRB_VAR(SHADER_TYPE_PIXEL, "g_SamArr_dyn", SetArray, pSams, 0, 4);
+ SET_SRB_VAR(SHADER_TYPE_PIXEL, "g_Sam_mut", Set, pSamplerObjs[0]);
+ SET_SRB_VAR(SHADER_TYPE_PIXEL, "g_SamArr_dyn", SetArray, pSamplerObjs, 0, 4);
SET_SRB_VAR(SHADER_TYPE_PIXEL, "UniformBuff_Mut", Set, pUBs[0]);
SET_SRB_VAR(SHADER_TYPE_PIXEL, "UniformBuff_Dyn", Set, pUBs[0]);
@@ -486,7 +850,7 @@ TEST(ShaderResourceLayout, ResourceLayout)
SET_SRB_VAR(SHADER_TYPE_PIXEL, "storageBuff_Mut", Set, pSBUAVs[14]);
SET_SRB_VAR(SHADER_TYPE_PIXEL, "storageBuff_Dyn", Set, pSBUAVs[15]);
- if (IsHLSL_51)
+ if (IsHLSL_51 || deviceType == DeviceType::Vulkan)
{
SET_SRB_VAR(SHADER_TYPE_PIXEL, "storageBuffArr_Mut", SetArray, pSBUAVs+16, 0, 3);
SET_SRB_VAR(SHADER_TYPE_PIXEL, "storageBuffArr_Dyn", SetArray, pSBUAVs+19, 0, 4);
@@ -510,7 +874,7 @@ TEST(ShaderResourceLayout, ResourceLayout)
SET_SRB_VAR(SHADER_TYPE_PIXEL, "storageBuff_Dyn", Set, pSBUAVs[23]);
SET_SRB_VAR(SHADER_TYPE_VERTEX, "g_tex2D_Dyn", Set, pSRVs[1]);
SET_SRB_VAR(SHADER_TYPE_VERTEX, "g_sepTex2D_dyn", Set, pSRVs[1]);
- SET_SRB_VAR(SHADER_TYPE_PIXEL, "g_SamArr_dyn", SetArray, pSams + 1, 1, 3);
+ SET_SRB_VAR(SHADER_TYPE_PIXEL, "g_SamArr_dyn", SetArray, pSamplerObjs + 1, 1, 3);
SET_SRB_VAR(SHADER_TYPE_PIXEL, "UniformBuff_Dyn", Set, pUBs[1]);
if (VertexShaderUAVSupported)
{
@@ -544,6 +908,7 @@ TEST(ShaderResourceLayout, ResourceLayout)
EXPECT_EQ(pVar, pVar2);
}
}
+# endif
}
-
+#endif
} // namespace
diff --git a/UnitTests/DiligentCoreAPITest/src/TestingEnvironment.cpp b/UnitTests/DiligentCoreAPITest/src/TestingEnvironment.cpp
index 538468b1..69bceef0 100644
--- a/UnitTests/DiligentCoreAPITest/src/TestingEnvironment.cpp
+++ b/UnitTests/DiligentCoreAPITest/src/TestingEnvironment.cpp
@@ -356,4 +356,22 @@ void TestingEnvironment::Reset()
m_pDeviceContext->InvalidateState();
}
+RefCntAutoPtr<ITexture> TestingEnvironment::CreateTexture(const char* Name, TEXTURE_FORMAT Fmt, BIND_FLAGS BindFlags, Uint32 Width, Uint32 Height)
+{
+ TextureDesc TexDesc;
+
+ TexDesc.Name = Name;
+ TexDesc.Type = RESOURCE_DIM_TEX_2D;
+ TexDesc.Format = Fmt;
+ TexDesc.BindFlags = BindFlags;
+ TexDesc.Width = Width;
+ TexDesc.Height = Height;
+
+ RefCntAutoPtr<ITexture> pTexture;
+ m_pDevice->CreateTexture(TexDesc, nullptr, &pTexture);
+ VERIFY_EXPR(pTexture != nullptr);
+
+ return pTexture;
+}
+
} // namespace Diligent