From 71d7f000c4913eac94ed50e943b1b9b73a3126cb Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 17 Jun 2022 14:26:20 +0100 Subject: [PATCH] Add test for D3D12 texture contents including with DENY_SHADER_RESOURCE --- util/test/demos/d3d12/d3d12_helpers.cpp | 6 ++++ util/test/demos/d3d12/d3d12_helpers.h | 1 + .../demos/d3d12/d3d12_simple_triangle.cpp | 34 +++++++++++++++++-- .../test/tests/D3D12/D3D12_Simple_Triangle.py | 9 +++++ 4 files changed, 47 insertions(+), 3 deletions(-) diff --git a/util/test/demos/d3d12/d3d12_helpers.cpp b/util/test/demos/d3d12/d3d12_helpers.cpp index a61d37238..2d23e1cc5 100644 --- a/util/test/demos/d3d12/d3d12_helpers.cpp +++ b/util/test/demos/d3d12/d3d12_helpers.cpp @@ -337,6 +337,12 @@ D3D12TextureCreator &D3D12TextureCreator::DSV() return *this; } +D3D12TextureCreator &D3D12TextureCreator::NoSRV() +{ + m_TexDesc.Flags |= D3D12_RESOURCE_FLAG_DENY_SHADER_RESOURCE; + return *this; +} + D3D12TextureCreator &D3D12TextureCreator::Upload() { m_HeapDesc.Type = D3D12_HEAP_TYPE_UPLOAD; diff --git a/util/test/demos/d3d12/d3d12_helpers.h b/util/test/demos/d3d12/d3d12_helpers.h index c60f470b0..e8ed96886 100644 --- a/util/test/demos/d3d12/d3d12_helpers.h +++ b/util/test/demos/d3d12/d3d12_helpers.h @@ -160,6 +160,7 @@ public: D3D12TextureCreator &UAV(); D3D12TextureCreator &RTV(); D3D12TextureCreator &DSV(); + D3D12TextureCreator &NoSRV(); D3D12TextureCreator &Upload(); D3D12TextureCreator &Readback(); diff --git a/util/test/demos/d3d12/d3d12_simple_triangle.cpp b/util/test/demos/d3d12/d3d12_simple_triangle.cpp index 660c6249a..0eaa1a00f 100644 --- a/util/test/demos/d3d12/d3d12_simple_triangle.cpp +++ b/util/test/demos/d3d12/d3d12_simple_triangle.cpp @@ -51,17 +51,47 @@ RD_TEST(D3D12_Simple_Triangle, D3D12GraphicsTest) .RTV() .InitialState(D3D12_RESOURCE_STATE_RENDER_TARGET); + rtvtex->SetName(L"rtvtex"); + ID3D12ResourcePtr rtvMStex = MakeTexture(DXGI_FORMAT_R16G16B16A16_FLOAT, 4, 4) .RTV() .Multisampled(4) .InitialState(D3D12_RESOURCE_STATE_RENDER_TARGET); + rtvMStex->SetName(L"rtvMStex"); + + ID3D12ResourcePtr dsvMStex = MakeTexture(DXGI_FORMAT_D32_FLOAT_S8X24_UINT, 4, 4) + .DSV() + .NoSRV() + .Multisampled(4) + .InitialState(D3D12_RESOURCE_STATE_COMMON); + + dsvMStex->SetName(L"dsvMStex"); + + { + ID3D12GraphicsCommandListPtr cmd = GetCommandBuffer(); + Reset(cmd); + ClearRenderTargetView(cmd, MakeRTV(rtvtex).CreateCPU(1), {0.2f, 0.2f, 0.2f, 1.0f}); + ClearRenderTargetView(cmd, MakeRTV(rtvMStex).CreateCPU(2), {0.2f, 0.2f, 0.2f, 1.0f}); + + ClearDepthStencilView(cmd, dsvMStex, D3D12_CLEAR_FLAG_DEPTH | D3D12_CLEAR_FLAG_STENCIL, 0.2f, + 0x55); + + cmd->Close(); + + Submit({cmd}); + } + while(Running()) { ID3D12GraphicsCommandListPtr cmd = GetCommandBuffer(); Reset(cmd); + MakeRTV(rtvtex).CreateCPU(1); + MakeRTV(rtvMStex).CreateCPU(2); + MakeDSV(dsvMStex).CreateCPU(0); + ID3D12ResourcePtr bb = StartUsingBackbuffer(cmd, D3D12_RESOURCE_STATE_RENDER_TARGET); D3D12_CPU_DESCRIPTOR_HANDLE rtv = @@ -69,9 +99,6 @@ RD_TEST(D3D12_Simple_Triangle, D3D12GraphicsTest) ClearRenderTargetView(cmd, rtv, {0.2f, 0.2f, 0.2f, 1.0f}); - ClearRenderTargetView(cmd, MakeRTV(rtvtex).CreateCPU(1), {0.2f, 0.2f, 0.2f, 1.0f}); - ClearRenderTargetView(cmd, MakeRTV(rtvMStex).CreateCPU(2), {0.2f, 0.2f, 0.2f, 1.0f}); - cmd->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST); IASetVertexBuffer(cmd, vb, sizeof(DefaultA2V), 0); @@ -81,6 +108,7 @@ RD_TEST(D3D12_Simple_Triangle, D3D12GraphicsTest) RSSetViewport(cmd, {0.0f, 0.0f, (float)screenWidth, (float)screenHeight, 0.0f, 1.0f}); RSSetScissorRect(cmd, {0, 0, screenWidth, screenHeight}); + OMSetRenderTargets(cmd, {rtv}, MakeDSV(dsvMStex).CreateCPU(0)); OMSetRenderTargets(cmd, {rtv}, {}); cmd->DrawInstanced(3, 1, 0, 0); diff --git a/util/test/tests/D3D12/D3D12_Simple_Triangle.py b/util/test/tests/D3D12/D3D12_Simple_Triangle.py index cbe966c71..8858b30ad 100644 --- a/util/test/tests/D3D12/D3D12_Simple_Triangle.py +++ b/util/test/tests/D3D12/D3D12_Simple_Triangle.py @@ -46,6 +46,15 @@ class D3D12_Simple_Triangle(rdtest.TestCase): self.check_mesh_data(postvs_ref, postvs_data) + tex = self.get_resource_by_name("rtvtex").resourceId + self.check_pixel_value(tex, 1, 1, [0.2, 0.2, 0.2, 1.0]) + + tex = self.get_resource_by_name("rtvMStex").resourceId + self.check_pixel_value(tex, 1, 1, [0.2, 0.2, 0.2, 1.0]) + + tex = self.get_resource_by_name("dsvMStex").resourceId + self.check_pixel_value(tex, 1, 1, [0.2, (0x55)/255.0, 0.0, 1.0]) + # Check that nothing breaks if we call typical enumeration functions on resources for res in self.controller.GetResources(): res: rd.ResourceDescription