2424 * of the possibility of such damages.
2525 */
2626
27+ #include < functional>
28+
2729#include " GPUTestingEnvironment.hpp"
2830#include " TestingSwapChainBase.hpp"
2931#include " RenderStateCache.h"
3032#include " RenderStateCache.hpp"
3133#include " FastRand.hpp"
3234#include " GraphicsTypesX.hpp"
3335#include " CallbackWrapper.hpp"
36+ #include " ResourceLayoutTestCommon.hpp"
3437
3538#include " InlineShaders/RayTracingTestHLSL.h"
3639
3740#include " gtest/gtest.h"
3841
39- namespace Diligent
40- {
41- namespace Testing
42- {
43- void RenderDrawCommandReference (ISwapChain* pSwapChain, const float * pClearColor = nullptr );
44- void ComputeShaderReference (ISwapChain* pSwapChain);
45- } // namespace Testing
46- } // namespace Diligent
47-
4842using namespace Diligent ;
4943using namespace Diligent ::Testing;
5044
5145namespace
5246{
5347
54- void TestDraw (IShader* pVS, IShader* pPS, IPipelineState* pPSO, bool UseRenderPass, IBuffer* pVertexBuffer = nullptr )
48+ void TestDraw (IShader* pVS, IShader* pPS, IPipelineState* pPSO, bool UseRenderPass, std::function< void ()> PreDraw = nullptr)
5549{
5650 VERIFY_EXPR ((pVS != nullptr && pPS != nullptr ) ^ (pPSO != nullptr ));
5751
@@ -124,13 +118,11 @@ void TestDraw(IShader* pVS, IShader* pPS, IPipelineState* pPSO, bool UseRenderPa
124118 pCtx->ClearRenderTarget (pRTVs[0 ], ClearColor, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
125119 }
126120
127- if (pVertexBuffer != nullptr )
128- {
129- IBuffer* pVBs[] = {pVertexBuffer};
130- pCtx->SetVertexBuffers (0 , _countof (pVBs), pVBs, nullptr , RESOURCE_STATE_TRANSITION_MODE_NONE);
131- }
132-
133121 pCtx->SetPipelineState (pPSO);
122+
123+ if (PreDraw != nullptr )
124+ PreDraw ();
125+
134126 pCtx->Draw ({6 , DRAW_FLAG_VERIFY_ALL});
135127
136128 if (UseRenderPass)
@@ -925,14 +917,24 @@ void TestPipelineReload(bool UseRenderPass)
925917
926918 constexpr auto HotReload = true ;
927919
928- RefCntAutoPtr<IBuffer> pVertBuff;
920+ ReferenceTextures RefTextures{
921+ 4 ,
922+ 128 , 128 ,
923+ USAGE_DEFAULT,
924+ BIND_SHADER_RESOURCE,
925+ TEXTURE_VIEW_SHADER_RESOURCE //
926+ };
927+
929928 {
930- struct Vertex
931- {
932- float4 Pos ;
933- float3 Color ;
934- };
929+ RefCntAutoPtr<ISampler> pSampler;
930+ pDevice-> CreateSampler (SamplerDesc{}, &pSampler);
931+ RefTextures. GetView ( 1 )-> SetSampler (pSampler) ;
932+ RefTextures. GetView ( 3 )-> SetSampler (pSampler) ;
933+ }
935934
935+ RefCntAutoPtr<IBuffer> pVertBuff;
936+ RefCntAutoPtr<IBuffer> pConstBuff;
937+ {
936938 constexpr float4 Pos[] =
937939 {
938940 float4{-1.0 , -0.5 , 0.0 , 1.0 },
@@ -944,30 +946,33 @@ void TestPipelineReload(bool UseRenderPass)
944946 float4{+1.0 , -0.5 , 0.0 , 1.0 },
945947 };
946948
947- constexpr float3 Color[] =
949+ const float4 Color[] =
948950 {
949- float3{1.0 , 0.0 , 0.0 },
950- float3{0.0 , 1.0 , 0.0 },
951- float3{0.0 , 0.0 , 1.0 },
952- };
953-
954- constexpr Vertex Vert[] =
955- {
956- {Pos[0 ], Color[0 ]},
957- {Pos[1 ], Color[1 ]},
958- {Pos[2 ], Color[2 ]},
959-
960- {Pos[3 ], Color[0 ]},
961- {Pos[4 ], Color[1 ]},
962- {Pos[5 ], Color[2 ]},
951+ float4{1.0 , 0.0 , 0.0 , 1.0 },
952+ float4{0.0 , 1.0 , 0.0 , 1.0 },
953+ float4{0.0 , 0.0 , 1.0 , 1.0 },
954+ RefTextures.GetColor (0 ),
955+ RefTextures.GetColor (1 ),
956+ RefTextures.GetColor (2 ),
957+ RefTextures.GetColor (3 ),
963958 };
964959
965960 RenderDeviceX<> Device{pDevice};
966- pVertBuff = Device.CreateBuffer (" Vert buffer" , sizeof (Vert), USAGE_DEFAULT, BIND_VERTEX_BUFFER, CPU_ACCESS_NONE, Vert);
961+ pVertBuff = Device.CreateBuffer (" Pos buffer" , sizeof (Pos), USAGE_DEFAULT, BIND_VERTEX_BUFFER, CPU_ACCESS_NONE, Pos);
962+ ASSERT_NE (pVertBuff, nullptr );
963+
964+ pConstBuff = Device.CreateBuffer (" Color buffer" , sizeof (Color), USAGE_DEFAULT, BIND_UNIFORM_BUFFER, CPU_ACCESS_NONE, Color);
967965 ASSERT_NE (pVertBuff, nullptr );
968966
969- StateTransitionDesc Barrier{pVertBuff, RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_VERTEX_BUFFER, STATE_TRANSITION_FLAG_UPDATE_STATE};
970- pCtx->TransitionResourceStates (1 , &Barrier);
967+ StateTransitionDesc Barriers[] = {
968+ {pVertBuff, RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_VERTEX_BUFFER, STATE_TRANSITION_FLAG_UPDATE_STATE},
969+ {pConstBuff, RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_CONSTANT_BUFFER, STATE_TRANSITION_FLAG_UPDATE_STATE},
970+ {RefTextures.GetView (0 )->GetTexture (), RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_SHADER_RESOURCE, STATE_TRANSITION_FLAG_UPDATE_STATE},
971+ {RefTextures.GetView (1 )->GetTexture (), RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_SHADER_RESOURCE, STATE_TRANSITION_FLAG_UPDATE_STATE},
972+ {RefTextures.GetView (2 )->GetTexture (), RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_SHADER_RESOURCE, STATE_TRANSITION_FLAG_UPDATE_STATE},
973+ {RefTextures.GetView (3 )->GetTexture (), RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_SHADER_RESOURCE, STATE_TRANSITION_FLAG_UPDATE_STATE},
974+ };
975+ pCtx->TransitionResourceStates (_countof (Barriers), Barriers);
971976 }
972977
973978 RefCntAutoPtr<IDataBlob> pData;
@@ -999,11 +1004,22 @@ void TestPipelineReload(bool UseRenderPass)
9991004
10001005 InputLayoutDescX InputLayout{
10011006 LayoutElement{0 , 0 , 4 , VT_FLOAT32},
1002- LayoutElement{1 , 0 , 3 , VT_FLOAT32},
10031007 };
1004-
10051008 GraphicsPipeline.InputLayout = InputLayout;
10061009
1010+ PipelineResourceLayoutDescX ResLayout{
1011+ {
1012+ {SHADER_TYPE_VERTEX | SHADER_TYPE_PIXEL, " Colors" , SHADER_RESOURCE_VARIABLE_TYPE_STATIC},
1013+ {SHADER_TYPE_PIXEL, " g_Tex2D_Static1" , SHADER_RESOURCE_VARIABLE_TYPE_STATIC},
1014+ {SHADER_TYPE_PIXEL, " g_Tex2D_Mut" , SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE},
1015+ {SHADER_TYPE_PIXEL, " g_Tex2D_Dyn" , SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC},
1016+ },
1017+ {
1018+ {SHADER_TYPE_PIXEL, " g_Tex2D_Static0" , SamplerDesc{}},
1019+ {SHADER_TYPE_PIXEL, " g_Tex2D_Mut" , SamplerDesc{}},
1020+ }};
1021+ PsoCI.PSODesc .ResourceLayout = ResLayout;
1022+
10071023 const auto ColorBufferFormat = pSwapChain->GetDesc ().ColorBufferFormat ;
10081024
10091025 RefCntAutoPtr<IRenderPass> pRenderPass;
@@ -1024,6 +1040,8 @@ void TestPipelineReload(bool UseRenderPass)
10241040 EXPECT_EQ (pCache->CreateGraphicsPipelineState (PsoCI, &pPSO), pData != nullptr );
10251041 }
10261042 ASSERT_NE (pPSO, nullptr );
1043+ pPSO->GetStaticVariableByName (SHADER_TYPE_VERTEX, " Colors" )->Set (pConstBuff);
1044+ pPSO->GetStaticVariableByName (SHADER_TYPE_PIXEL, " g_Tex2D_Static0" )->Set (RefTextures.GetView (0 ));
10271045
10281046 auto ModifyPSO = MakeCallback (
10291047 [&](PipelineStateCreateInfo& CreateInfo) {
@@ -1035,7 +1053,20 @@ void TestPipelineReload(bool UseRenderPass)
10351053
10361054 EXPECT_EQ (pCache->Reload (ModifyPSO, ModifyPSO), pass == 0 ? 3u : 0u );
10371055
1038- TestDraw (nullptr , nullptr , pPSO, UseRenderPass, pVertBuff);
1056+ pPSO->GetStaticVariableByName (SHADER_TYPE_PIXEL, " g_Tex2D_Static1" )->Set (RefTextures.GetView (1 ));
1057+
1058+ RefCntAutoPtr<IShaderResourceBinding> pSRB;
1059+ pPSO->CreateShaderResourceBinding (&pSRB, true );
1060+
1061+ pSRB->GetVariableByName (SHADER_TYPE_PIXEL, " g_Tex2D_Mut" )->Set (RefTextures.GetView (2 ));
1062+ pSRB->GetVariableByName (SHADER_TYPE_PIXEL, " g_Tex2D_Dyn" )->Set (RefTextures.GetView (3 ));
1063+
1064+ TestDraw (nullptr , nullptr , pPSO, UseRenderPass,
1065+ [&]() {
1066+ IBuffer* pVBs[] = {pVertBuff};
1067+ pCtx->SetVertexBuffers (0 , _countof (pVBs), pVBs, nullptr , RESOURCE_STATE_TRANSITION_MODE_NONE);
1068+ pCtx->CommitShaderResources (pSRB, RESOURCE_STATE_TRANSITION_MODE_NONE);
1069+ });
10391070
10401071 pData.Release ();
10411072 pCache->WriteToBlob (&pData);
0 commit comments