diff options
| author | Admiral H. Curtiss <pikachu025@gmail.com> | 2023-08-10 19:09:25 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-08-10 19:09:25 +0200 |
| commit | b0dc067717448693e30b6ca4080703e6c4daea22 (patch) | |
| tree | 5299f2b11a150f7e6f0712d9048abc707d55c758 /Source/Core | |
| parent | 54d3a226f342318d419c03a5b2b57bca5f42c9dd (diff) | |
| parent | 83f307ec7ec77b2af13ed06d601e03a9d274bae8 (diff) | |
Merge pull request #12087 from Dentomologist/dx12_use_correct_framebuffer_descriptor
D3D12: Only use framebuffer integer descriptor if allocated
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/VideoBackends/D3D12/DX12Texture.cpp | 21 | ||||
| -rw-r--r-- | Source/Core/VideoBackends/D3D12/DX12Texture.h | 5 |
2 files changed, 22 insertions, 4 deletions
diff --git a/Source/Core/VideoBackends/D3D12/DX12Texture.cpp b/Source/Core/VideoBackends/D3D12/DX12Texture.cpp index f20c37354b..e040d0483d 100644 --- a/Source/Core/VideoBackends/D3D12/DX12Texture.cpp +++ b/Source/Core/VideoBackends/D3D12/DX12Texture.cpp @@ -422,6 +422,23 @@ DXFramebuffer::~DXFramebuffer() } } +const D3D12_CPU_DESCRIPTOR_HANDLE* DXFramebuffer::GetIntRTVDescriptorArray() const +{ + if (m_color_attachment == nullptr) + return nullptr; + + const auto& handle = m_int_rtv_descriptor.cpu_handle; + + // To save space in the descriptor heap, m_int_rtv_descriptor.cpu_handle.ptr is only allocated + // when the integer RTV format corresponding to the current abstract format differs from the + // non-integer RTV format. Only use the integer handle if it has been allocated. + if (handle.ptr != 0) + return &handle; + + // The integer and non-integer RTV formats are the same, so use the non-integer descriptor. + return GetRTVDescriptorArray(); +} + void DXFramebuffer::Unbind() { static const D3D12_DISCARD_REGION dr = {0, nullptr, 0, 1}; @@ -556,6 +573,10 @@ bool DXFramebuffer::CreateIRTVDescriptor() const bool multisampled = m_samples > 1; DXGI_FORMAT non_int_format = D3DCommon::GetRTVFormatForAbstractFormat(m_color_format, false); DXGI_FORMAT int_format = D3DCommon::GetRTVFormatForAbstractFormat(m_color_format, true); + + // If the integer and non-integer RTV formats are the same for a given abstract format we can save + // space in the descriptor heap by only allocating the non-integer descriptor and using it for + // the integer RTV too. if (int_format != non_int_format) { if (!g_dx_context->GetRTVHeapManager().Allocate(&m_int_rtv_descriptor)) diff --git a/Source/Core/VideoBackends/D3D12/DX12Texture.h b/Source/Core/VideoBackends/D3D12/DX12Texture.h index ea781fd899..2054b195b2 100644 --- a/Source/Core/VideoBackends/D3D12/DX12Texture.h +++ b/Source/Core/VideoBackends/D3D12/DX12Texture.h @@ -75,10 +75,7 @@ public: { return m_render_targets_raw.data(); } - const D3D12_CPU_DESCRIPTOR_HANDLE* GetIntRTVDescriptorArray() const - { - return m_color_attachment ? &m_int_rtv_descriptor.cpu_handle : nullptr; - } + const D3D12_CPU_DESCRIPTOR_HANDLE* GetIntRTVDescriptorArray() const; const D3D12_CPU_DESCRIPTOR_HANDLE* GetDSVDescriptorArray() const { return m_depth_attachment ? &m_dsv_descriptor.cpu_handle : nullptr; |
