summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/D3D12/DX12Texture.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/VideoBackends/D3D12/DX12Texture.cpp')
-rw-r--r--Source/Core/VideoBackends/D3D12/DX12Texture.cpp21
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))