mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-01-10 08:09:26 +01:00
Merge pull request #12087 from Dentomologist/dx12_use_correct_framebuffer_descriptor
D3D12: Only use framebuffer integer descriptor if allocated
This commit is contained in:
commit
b0dc067717
@ -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()
|
void DXFramebuffer::Unbind()
|
||||||
{
|
{
|
||||||
static const D3D12_DISCARD_REGION dr = {0, nullptr, 0, 1};
|
static const D3D12_DISCARD_REGION dr = {0, nullptr, 0, 1};
|
||||||
@ -556,6 +573,10 @@ bool DXFramebuffer::CreateIRTVDescriptor()
|
|||||||
const bool multisampled = m_samples > 1;
|
const bool multisampled = m_samples > 1;
|
||||||
DXGI_FORMAT non_int_format = D3DCommon::GetRTVFormatForAbstractFormat(m_color_format, false);
|
DXGI_FORMAT non_int_format = D3DCommon::GetRTVFormatForAbstractFormat(m_color_format, false);
|
||||||
DXGI_FORMAT int_format = D3DCommon::GetRTVFormatForAbstractFormat(m_color_format, true);
|
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 (int_format != non_int_format)
|
||||||
{
|
{
|
||||||
if (!g_dx_context->GetRTVHeapManager().Allocate(&m_int_rtv_descriptor))
|
if (!g_dx_context->GetRTVHeapManager().Allocate(&m_int_rtv_descriptor))
|
||||||
|
@ -75,10 +75,7 @@ public:
|
|||||||
{
|
{
|
||||||
return m_render_targets_raw.data();
|
return m_render_targets_raw.data();
|
||||||
}
|
}
|
||||||
const D3D12_CPU_DESCRIPTOR_HANDLE* GetIntRTVDescriptorArray() const
|
const D3D12_CPU_DESCRIPTOR_HANDLE* GetIntRTVDescriptorArray() const;
|
||||||
{
|
|
||||||
return m_color_attachment ? &m_int_rtv_descriptor.cpu_handle : nullptr;
|
|
||||||
}
|
|
||||||
const D3D12_CPU_DESCRIPTOR_HANDLE* GetDSVDescriptorArray() const
|
const D3D12_CPU_DESCRIPTOR_HANDLE* GetDSVDescriptorArray() const
|
||||||
{
|
{
|
||||||
return m_depth_attachment ? &m_dsv_descriptor.cpu_handle : nullptr;
|
return m_depth_attachment ? &m_dsv_descriptor.cpu_handle : nullptr;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user