2929#include " RenderStateCache.h"
3030#include " RenderStateCache.hpp"
3131#include " FastRand.hpp"
32+ #include " GraphicsTypesX.hpp"
33+ #include " CallbackWrapper.hpp"
3234
3335#include " InlineShaders/RayTracingTestHLSL.h"
3436
@@ -49,7 +51,7 @@ using namespace Diligent::Testing;
4951namespace
5052{
5153
52- void TestDraw (IShader* pVS, IShader* pPS, IPipelineState* pPSO, bool UseRenderPass)
54+ void TestDraw (IShader* pVS, IShader* pPS, IPipelineState* pPSO, bool UseRenderPass, IBuffer* pVertexBuffer = nullptr )
5355{
5456 VERIFY_EXPR ((pVS != nullptr && pPS != nullptr ) ^ (pPSO != nullptr ));
5557
@@ -122,6 +124,12 @@ void TestDraw(IShader* pVS, IShader* pPS, IPipelineState* pPSO, bool UseRenderPa
122124 pCtx->ClearRenderTarget (pRTVs[0 ], ClearColor, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
123125 }
124126
127+ if (pVertexBuffer != nullptr )
128+ {
129+ IBuffer* pVBs[] = {pVertexBuffer};
130+ pCtx->SetVertexBuffers (0 , _countof (pVBs), pVBs, nullptr , RESOURCE_STATE_TRANSITION_MODE_NONE);
131+ }
132+
125133 pCtx->SetPipelineState (pPSO);
126134 pCtx->Draw ({6 , DRAW_FLAG_VERIFY_ALL});
127135
@@ -354,10 +362,41 @@ TEST(RenderStateCacheTest, BrokenShader)
354362 }
355363}
356364
365+ RefCntAutoPtr<IRenderPass> CreateRenderPass (TEXTURE_FORMAT ColorBufferFormat)
366+ {
367+ auto * pEnv = GPUTestingEnvironment::GetInstance ();
368+ auto * pDevice = pEnv->GetDevice ();
369+
370+ RenderPassAttachmentDesc Attachments[1 ];
371+ Attachments[0 ].Format = ColorBufferFormat;
372+ Attachments[0 ].InitialState = RESOURCE_STATE_RENDER_TARGET;
373+ Attachments[0 ].FinalState = RESOURCE_STATE_RENDER_TARGET;
374+ Attachments[0 ].LoadOp = ATTACHMENT_LOAD_OP_CLEAR;
375+ Attachments[0 ].StoreOp = ATTACHMENT_STORE_OP_STORE;
376+
377+ constexpr AttachmentReference RTAttachmentRefs0[] =
378+ {
379+ {0 , RESOURCE_STATE_RENDER_TARGET},
380+ };
381+ SubpassDesc Subpasses[1 ];
382+ Subpasses[0 ].RenderTargetAttachmentCount = _countof (RTAttachmentRefs0);
383+ Subpasses[0 ].pRenderTargetAttachments = RTAttachmentRefs0;
384+
385+ RenderPassDesc RPDesc;
386+ RPDesc.Name = " Render State Cache Test" ;
387+ RPDesc.AttachmentCount = _countof (Attachments);
388+ RPDesc.pAttachments = Attachments;
389+ RPDesc.SubpassCount = _countof (Subpasses);
390+ RPDesc.pSubpasses = Subpasses;
391+
392+ RefCntAutoPtr<IRenderPass> pRenderPass;
393+ pDevice->CreateRenderPass (RPDesc, &pRenderPass);
394+ return pRenderPass;
395+ }
396+
357397void CreateGraphicsPSO (IRenderStateCache* pCache, bool PresentInCache, IShader* pVS, IShader* pPS, bool UseRenderPass, IPipelineState** ppPSO)
358398{
359399 auto * pEnv = GPUTestingEnvironment::GetInstance ();
360- auto * pDevice = pEnv->GetDevice ();
361400 auto * pSwapChain = pEnv->GetSwapChain ();
362401
363402 GraphicsPipelineStateCreateInfo PsoCI;
@@ -371,29 +410,7 @@ void CreateGraphicsPSO(IRenderStateCache* pCache, bool PresentInCache, IShader*
371410 RefCntAutoPtr<IRenderPass> pRenderPass;
372411 if (UseRenderPass)
373412 {
374- RenderPassAttachmentDesc Attachments[1 ];
375- Attachments[0 ].Format = ColorBufferFormat;
376- Attachments[0 ].InitialState = RESOURCE_STATE_RENDER_TARGET;
377- Attachments[0 ].FinalState = RESOURCE_STATE_RENDER_TARGET;
378- Attachments[0 ].LoadOp = ATTACHMENT_LOAD_OP_CLEAR;
379- Attachments[0 ].StoreOp = ATTACHMENT_STORE_OP_STORE;
380-
381- constexpr AttachmentReference RTAttachmentRefs0[] =
382- {
383- {0 , RESOURCE_STATE_RENDER_TARGET},
384- };
385- SubpassDesc Subpasses[1 ];
386- Subpasses[0 ].RenderTargetAttachmentCount = _countof (RTAttachmentRefs0);
387- Subpasses[0 ].pRenderTargetAttachments = RTAttachmentRefs0;
388-
389- RenderPassDesc RPDesc;
390- RPDesc.Name = " Render State Cache Test" ;
391- RPDesc.AttachmentCount = _countof (Attachments);
392- RPDesc.pAttachments = Attachments;
393- RPDesc.SubpassCount = _countof (Subpasses);
394- RPDesc.pSubpasses = Subpasses;
395-
396- pDevice->CreateRenderPass (RPDesc, &pRenderPass);
413+ pRenderPass = CreateRenderPass (ColorBufferFormat);
397414 ASSERT_NE (pRenderPass, nullptr );
398415 PsoCI.GraphicsPipeline .pRenderPass = pRenderPass;
399416 }
@@ -891,8 +908,10 @@ TEST(RenderStateCacheTest, RenderDeviceWithCache)
891908
892909void TestPipelineReload (bool UseRenderPass)
893910{
894- auto * pEnv = GPUTestingEnvironment::GetInstance ();
895- auto * pDevice = pEnv->GetDevice ();
911+ auto * pEnv = GPUTestingEnvironment::GetInstance ();
912+ auto * pDevice = pEnv->GetDevice ();
913+ auto * pCtx = pEnv->GetDeviceContext ();
914+ auto * pSwapChain = pEnv->GetSwapChain ();
896915
897916 GPUTestingEnvironment::ScopedReset AutoReset;
898917
@@ -906,6 +925,51 @@ void TestPipelineReload(bool UseRenderPass)
906925
907926 constexpr auto HotReload = true ;
908927
928+ RefCntAutoPtr<IBuffer> pVertBuff;
929+ {
930+ struct Vertex
931+ {
932+ float4 Pos;
933+ float3 Color;
934+ };
935+
936+ constexpr float4 Pos[] =
937+ {
938+ float4{-1.0 , -0.5 , 0.0 , 1.0 },
939+ float4{-0.5 , +0.5 , 0.0 , 1.0 },
940+ float4{+0.0 , -0.5 , 0.0 , 1.0 },
941+
942+ float4{+0.0 , -0.5 , 0.0 , 1.0 },
943+ float4{+0.5 , +0.5 , 0.0 , 1.0 },
944+ float4{+1.0 , -0.5 , 0.0 , 1.0 },
945+ };
946+
947+ constexpr float3 Color[] =
948+ {
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 ]},
963+ };
964+
965+ RenderDeviceX<> Device{pDevice};
966+ pVertBuff = Device.CreateBuffer (" Vert buffer" , sizeof (Vert), USAGE_DEFAULT, BIND_VERTEX_BUFFER, CPU_ACCESS_NONE, Vert);
967+ ASSERT_NE (pVertBuff, nullptr );
968+
969+ StateTransitionDesc Barrier{pVertBuff, RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_VERTEX_BUFFER, STATE_TRANSITION_FLAG_UPDATE_STATE};
970+ pCtx->TransitionResourceStates (1 , &Barrier);
971+ }
972+
909973 RefCntAutoPtr<IDataBlob> pData;
910974 for (Uint32 pass = 0 ; pass < 3 ; ++pass)
911975 {
@@ -921,13 +985,57 @@ void TestPipelineReload(bool UseRenderPass)
921985 ASSERT_NE (pVS, nullptr );
922986 ASSERT_NE (pPS, nullptr );
923987
988+ constexpr char PSOName[] = " Render State Cache Reload Test" ;
989+
924990 RefCntAutoPtr<IPipelineState> pPSO;
925- CreateGraphicsPSO (pCache, pData != nullptr , pVS, pPS, UseRenderPass, &pPSO);
991+ {
992+ GraphicsPipelineStateCreateInfo PsoCI;
993+ PsoCI.PSODesc .Name = PSOName;
994+
995+ auto & GraphicsPipeline{PsoCI.GraphicsPipeline };
996+ GraphicsPipeline.PrimitiveTopology = PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
997+ GraphicsPipeline.RasterizerDesc .CullMode = CULL_MODE_NONE;
998+ GraphicsPipeline.DepthStencilDesc .DepthEnable = False;
999+
1000+ InputLayoutDescX InputLayout{
1001+ LayoutElement{0 , 0 , 4 , VT_FLOAT32},
1002+ LayoutElement{1 , 0 , 3 , VT_FLOAT32},
1003+ };
1004+
1005+ GraphicsPipeline.InputLayout = InputLayout;
1006+
1007+ const auto ColorBufferFormat = pSwapChain->GetDesc ().ColorBufferFormat ;
1008+
1009+ RefCntAutoPtr<IRenderPass> pRenderPass;
1010+ if (UseRenderPass)
1011+ {
1012+ pRenderPass = CreateRenderPass (ColorBufferFormat);
1013+ ASSERT_NE (pRenderPass, nullptr );
1014+ PsoCI.GraphicsPipeline .pRenderPass = pRenderPass;
1015+ }
1016+ else
1017+ {
1018+ PsoCI.GraphicsPipeline .NumRenderTargets = 1 ;
1019+ PsoCI.GraphicsPipeline .RTVFormats [0 ] = ColorBufferFormat;
1020+ }
1021+ PsoCI.pVS = pVS;
1022+ PsoCI.pPS = pPS;
1023+
1024+ EXPECT_EQ (pCache->CreateGraphicsPipelineState (PsoCI, &pPSO), pData != nullptr );
1025+ }
9261026 ASSERT_NE (pPSO, nullptr );
9271027
928- EXPECT_EQ (pCache->Reload (), pass == 0 ? 3u : 0u );
1028+ auto ModifyPSO = MakeCallback (
1029+ [&](PipelineStateCreateInfo& CreateInfo) {
1030+ ASSERT_STREQ (CreateInfo.PSODesc .Name , PSOName);
1031+ auto & GraphicsPsoCI = static_cast <GraphicsPipelineStateCreateInfo&>(CreateInfo);
1032+
1033+ GraphicsPsoCI.GraphicsPipeline .PrimitiveTopology = PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
1034+ });
1035+
1036+ EXPECT_EQ (pCache->Reload (ModifyPSO, ModifyPSO), pass == 0 ? 3u : 0u );
9291037
930- VerifyGraphicsPSO ( pPSO, UseRenderPass);
1038+ TestDraw ( nullptr , nullptr , pPSO, UseRenderPass, pVertBuff );
9311039
9321040 pData.Release ();
9331041 pCache->WriteToBlob (&pData);
0 commit comments