diff options
Diffstat (limited to 'Source/Core/VideoBackends/D3D12/DX12Texture.cpp')
| -rw-r--r-- | Source/Core/VideoBackends/D3D12/DX12Texture.cpp | 21 |
1 files changed, 21 insertions, 0 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)) |
