From 2cb75e60b39c812828650b40881b89f17b65d949 Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Sat, 20 Dec 2025 16:29:14 +0000 Subject: [PATCH] GS/DX12: Free from correct descriptor heap in error handling --- pcsx2/GS/Renderers/DX12/GSTexture12.cpp | 45 +++++++++++++++++++++---- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/pcsx2/GS/Renderers/DX12/GSTexture12.cpp b/pcsx2/GS/Renderers/DX12/GSTexture12.cpp index 00a131bd80..8461404a79 100644 --- a/pcsx2/GS/Renderers/DX12/GSTexture12.cpp +++ b/pcsx2/GS/Renderers/DX12/GSTexture12.cpp @@ -252,7 +252,7 @@ std::unique_ptr GSTexture12::Create(Type type, Format format, int w write_descriptor_type = WriteDescriptorType::RTV; if (!CreateRTVDescriptor(resource.get(), rtv_format, &write_descriptor)) { - dev->GetRTVHeapManager().Free(&srv_descriptor); + dev->GetDescriptorHeapManager().Free(&srv_descriptor); return {}; } } @@ -263,7 +263,7 @@ std::unique_ptr GSTexture12::Create(Type type, Format format, int w write_descriptor_type = WriteDescriptorType::DSV; if (!CreateDSVDescriptor(resource.get(), dsv_format, &write_descriptor)) { - dev->GetDSVHeapManager().Free(&srv_descriptor); + dev->GetDescriptorHeapManager().Free(&srv_descriptor); return {}; } } @@ -275,7 +275,17 @@ std::unique_ptr GSTexture12::Create(Type type, Format format, int w if (uav_format != DXGI_FORMAT_UNKNOWN && !CreateUAVDescriptor(resource.get(), dsv_format, &uav_descriptor)) { - dev->GetDescriptorHeapManager().Free(&write_descriptor); + switch (write_descriptor_type) + { + case WriteDescriptorType::RTV: + dev->GetRTVHeapManager().Free(&write_descriptor); + break; + case WriteDescriptorType::DSV: + dev->GetDSVHeapManager().Free(&write_descriptor); + break; + default: + break; + } dev->GetDescriptorHeapManager().Free(&srv_descriptor); return {}; } @@ -285,7 +295,17 @@ std::unique_ptr GSTexture12::Create(Type type, Format format, int w if (!CreateSRVDescriptor(resource_fbl.get(), levels, srv_format, &fbl_descriptor)) { dev->GetDescriptorHeapManager().Free(&uav_descriptor); - dev->GetDescriptorHeapManager().Free(&write_descriptor); + switch (write_descriptor_type) + { + case WriteDescriptorType::RTV: + dev->GetRTVHeapManager().Free(&write_descriptor); + break; + case WriteDescriptorType::DSV: + dev->GetDSVHeapManager().Free(&write_descriptor); + break; + default: + break; + } dev->GetDescriptorHeapManager().Free(&srv_descriptor); return {}; } @@ -315,7 +335,7 @@ std::unique_ptr GSTexture12::Adopt(wil::com_ptr_nothrowGetRTVHeapManager().Free(&srv_descriptor); + GSDevice12::GetInstance()->GetDescriptorHeapManager().Free(&srv_descriptor); return {}; } } @@ -324,7 +344,7 @@ std::unique_ptr GSTexture12::Adopt(wil::com_ptr_nothrowGetDSVHeapManager().Free(&srv_descriptor); + GSDevice12::GetInstance()->GetDescriptorHeapManager().Free(&srv_descriptor); return {}; } } @@ -333,7 +353,18 @@ std::unique_ptr GSTexture12::Adopt(wil::com_ptr_nothrowGetDescriptorHeapManager().Free(&write_descriptor); + switch (write_descriptor_type) + { + case WriteDescriptorType::RTV: + GSDevice12::GetInstance()->GetRTVHeapManager().Free(&write_descriptor); + break; + case WriteDescriptorType::DSV: + GSDevice12::GetInstance()->GetDSVHeapManager().Free(&write_descriptor); + break; + default: + break; + } + GSDevice12::GetInstance()->GetDescriptorHeapManager().Free(&srv_descriptor); return {}; }