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;