diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp index 8b27d0a6af..a61057a6b5 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp @@ -21,6 +21,8 @@ PFN_D3D12_SERIALIZE_ROOT_SIGNATURE wrapD3D12SerializeRootSignature; PFN_D3D11ON12_CREATE_DEVICE wrapD3D11On12CreateDevice; pD3DCompile wrapD3DCompile; +ID3D12Device* g_d3d12_device = nullptr; + #define VERTEX_BUFFERS_SLOT 0 #define FRAGMENT_CONSTANT_BUFFERS_SLOT 1 #define VERTEX_CONSTANT_BUFFERS_SLOT 2 @@ -181,6 +183,8 @@ D3D12GSRender::D3D12GSRender() } } + g_d3d12_device = m_device.Get(); + // Queues D3D12_COMMAND_QUEUE_DESC graphic_queue_desc = { D3D12_COMMAND_LIST_TYPE_DIRECT }; CHECK_HRESULT(m_device->CreateCommandQueue(&graphic_queue_desc, IID_PPV_ARGS(m_command_queue.GetAddressOf()))); diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Overlay.cpp b/rpcs3/Emu/RSX/D3D12/D3D12Overlay.cpp index 1df51b57e6..69ba607a5b 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12Overlay.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12Overlay.cpp @@ -14,7 +14,6 @@ namespace ComPtr g_d3d11_device; ComPtr g_d3d11_device_context; ComPtr g_d3d11on12_device; -ComPtr g_d3d12_device; ComPtr g_dwrite_factory; ComPtr g_d2d_factory; ComPtr g_d2d_device; @@ -136,7 +135,6 @@ void D3D12GSRender::release_d2d_structures() g_d3d11_device.Reset(); g_d3d11_device_context.Reset(); g_d3d11on12_device.Reset(); - g_d3d12_device.Reset(); g_dwrite_factory.Reset(); g_d2d_factory.Reset(); g_d2d_device.Reset(); diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Utils.h b/rpcs3/Emu/RSX/D3D12/D3D12Utils.h index f9c0c18f2f..77346b0acb 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12Utils.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12Utils.h @@ -10,14 +10,21 @@ using namespace Microsoft::WRL; +extern ID3D12Device* g_d3d12_device; inline std::string get_hresult_message(HRESULT hr) { + if (hr == DXGI_ERROR_DEVICE_REMOVED) + { + hr = g_d3d12_device->GetDeviceRemovedReason(); + return fmt::format("D3D12 device was removed with error status 0x%X", hr); + } + _com_error error(hr); #ifndef UNICODE return error.ErrorMessage(); #else - using convert_type = std::codecvt; + using convert_type = std::codecvt; return std::wstring_convert().to_bytes(error.ErrorMessage()); #endif }