From fb02202505b336830e3c4b36707b58dc83f8d114 Mon Sep 17 00:00:00 2001 From: Dan Hawson Date: Tue, 17 Oct 2023 10:15:39 +0100 Subject: [PATCH] New D3D12BufferCreator and D3D12TextureCreator state setters Added 'D3D12BufferCreator::InitialState(D3D12_RESOURCE_STATES)' to allow user code to avoid adding unnecessary transition barriers after resource creation. Added 'D3D12TextureCreator::ClearVal(const D3D12_CLEAR_VALUE &)' to avoid a PIX performance warning/tip about clearing resources that haven't had their clear value set on creation. --- util/test/demos/d3d12/d3d12_helpers.cpp | 30 +++++++++++++++++-------- util/test/demos/d3d12/d3d12_helpers.h | 5 +++++ 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/util/test/demos/d3d12/d3d12_helpers.cpp b/util/test/demos/d3d12/d3d12_helpers.cpp index 816ccb32f..a724fdccf 100644 --- a/util/test/demos/d3d12/d3d12_helpers.cpp +++ b/util/test/demos/d3d12/d3d12_helpers.cpp @@ -250,6 +250,8 @@ D3D12BufferCreator::D3D12BufferCreator(ID3D12DevicePtr dev, D3D12GraphicsTest *t m_HeapDesc.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; m_HeapDesc.CreationNodeMask = 1; m_HeapDesc.VisibleNodeMask = 1; + + m_InitialState = D3D12_RESOURCE_STATE_COMMON; } D3D12BufferCreator &D3D12BufferCreator::UAV() @@ -261,12 +263,14 @@ D3D12BufferCreator &D3D12BufferCreator::UAV() D3D12BufferCreator &D3D12BufferCreator::Upload() { m_HeapDesc.Type = D3D12_HEAP_TYPE_UPLOAD; + m_InitialState = D3D12_RESOURCE_STATE_GENERIC_READ; return *this; } D3D12BufferCreator &D3D12BufferCreator::Readback() { m_HeapDesc.Type = D3D12_HEAP_TYPE_READBACK; + m_InitialState = D3D12_RESOURCE_STATE_COPY_DEST; return *this; } @@ -282,17 +286,16 @@ D3D12BufferCreator &D3D12BufferCreator::Size(UINT size) return *this; } +D3D12BufferCreator &D3D12BufferCreator::InitialState(D3D12_RESOURCE_STATES initialState) +{ + m_InitialState = initialState; + return *this; +} + D3D12BufferCreator::operator ID3D12ResourcePtr() const { - D3D12_RESOURCE_STATES initialState = D3D12_RESOURCE_STATE_COMMON; - - if(m_HeapDesc.Type == D3D12_HEAP_TYPE_UPLOAD) - initialState = D3D12_RESOURCE_STATE_GENERIC_READ; - else if(m_HeapDesc.Type == D3D12_HEAP_TYPE_READBACK) - initialState = D3D12_RESOURCE_STATE_COPY_DEST; - ID3D12ResourcePtr buf; - CHECK_HR(m_Dev->CreateCommittedResource(&m_HeapDesc, D3D12_HEAP_FLAG_NONE, &m_BufDesc, initialState, + CHECK_HR(m_Dev->CreateCommittedResource(&m_HeapDesc, D3D12_HEAP_FLAG_NONE, &m_BufDesc, m_InitialState, NULL, __uuidof(ID3D12Resource), (void **)&buf)); if(m_Initdata && m_Test) @@ -329,6 +332,8 @@ D3D12TextureCreator::D3D12TextureCreator(ID3D12DevicePtr dev, DXGI_FORMAT format m_HeapDesc.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; m_HeapDesc.CreationNodeMask = 1; m_HeapDesc.VisibleNodeMask = 1; + + m_ClearVal.Format = DXGI_FORMAT_UNKNOWN; } D3D12TextureCreator &D3D12TextureCreator::Mips(UINT mips) @@ -405,11 +410,18 @@ D3D12TextureCreator &D3D12TextureCreator::InitialState(D3D12_RESOURCE_STATES sta return *this; } +D3D12TextureCreator &D3D12TextureCreator::ClearVal(const D3D12_CLEAR_VALUE &clearVal) +{ + m_ClearVal = clearVal; + return *this; +} + D3D12TextureCreator::operator ID3D12ResourcePtr() const { ID3D12ResourcePtr tex; CHECK_HR(m_Dev->CreateCommittedResource(&m_HeapDesc, m_HeapFlags, &m_TexDesc, m_InitialState, - NULL, __uuidof(ID3D12Resource), (void **)&tex)); + (m_ClearVal.Format == DXGI_FORMAT_UNKNOWN) ? NULL : &m_ClearVal, + __uuidof(ID3D12Resource), (void **)&tex)); return tex; } diff --git a/util/test/demos/d3d12/d3d12_helpers.h b/util/test/demos/d3d12/d3d12_helpers.h index 16b1ac2f4..97e72101e 100644 --- a/util/test/demos/d3d12/d3d12_helpers.h +++ b/util/test/demos/d3d12/d3d12_helpers.h @@ -137,6 +137,8 @@ public: return Data(data.data()).Size(UINT(data.size() * sizeof(T))); } + D3D12BufferCreator &InitialState(D3D12_RESOURCE_STATES initialState); + operator ID3D12ResourcePtr() const; private: @@ -146,6 +148,7 @@ private: D3D12_RESOURCE_DESC m_BufDesc; D3D12_HEAP_PROPERTIES m_HeapDesc; const void *m_Initdata = NULL; + D3D12_RESOURCE_STATES m_InitialState; }; class D3D12TextureCreator @@ -169,6 +172,7 @@ public: D3D12TextureCreator &Shared(); D3D12TextureCreator &InitialState(D3D12_RESOURCE_STATES state); + D3D12TextureCreator &ClearVal(const D3D12_CLEAR_VALUE &clearVal); operator ID3D12ResourcePtr() const; @@ -179,6 +183,7 @@ protected: D3D12_RESOURCE_DESC m_TexDesc; D3D12_HEAP_PROPERTIES m_HeapDesc; D3D12_HEAP_FLAGS m_HeapFlags = D3D12_HEAP_FLAG_NONE; + D3D12_CLEAR_VALUE m_ClearVal; }; class D3D12ViewCreator