summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorAdmiral H. Curtiss <pikachu025@gmail.com>2023-08-10 19:09:25 +0200
committerGitHub <noreply@github.com>2023-08-10 19:09:25 +0200
commitb0dc067717448693e30b6ca4080703e6c4daea22 (patch)
tree5299f2b11a150f7e6f0712d9048abc707d55c758 /Source/Core
parent54d3a226f342318d419c03a5b2b57bca5f42c9dd (diff)
parent83f307ec7ec77b2af13ed06d601e03a9d274bae8 (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.cpp21
-rw-r--r--Source/Core/VideoBackends/D3D12/DX12Texture.h5
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;