summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/D3D/D3DBase.cpp
diff options
context:
space:
mode:
authorshuffle2 <godisgovernment@gmail.com>2015-05-07 19:29:21 -0700
committershuffle2 <godisgovernment@gmail.com>2015-05-07 19:29:21 -0700
commit268b8fd26f8888bf08873bbc8d94b7eea00a402c (patch)
tree56e1ce02f62e3b1cf7ab268a5082766861dbe4b8 /Source/Core/VideoBackends/D3D/D3DBase.cpp
parent94995503aa19d5d1b6850d772e71c4697a0a5760 (diff)
parentc43da7e00bd6be103a11090f53cc04d4c0b2caf8 (diff)
Merge pull request #2026 from mrgreywater/d3d-debugbreak
D3D: More debug information and break on error
Diffstat (limited to 'Source/Core/VideoBackends/D3D/D3DBase.cpp')
-rw-r--r--Source/Core/VideoBackends/D3D/D3DBase.cpp46
1 files changed, 40 insertions, 6 deletions
diff --git a/Source/Core/VideoBackends/D3D/D3DBase.cpp b/Source/Core/VideoBackends/D3D/D3DBase.cpp
index c3978ad137..a04f80656c 100644
--- a/Source/Core/VideoBackends/D3D/D3DBase.cpp
+++ b/Source/Core/VideoBackends/D3D/D3DBase.cpp
@@ -32,6 +32,7 @@ namespace D3D
ID3D11Device* device = nullptr;
ID3D11DeviceContext* context = nullptr;
static IDXGISwapChain* swapchain = nullptr;
+static ID3D11Debug* debug = nullptr;
D3D_FEATURE_LEVEL featlevel;
D3DTexture2D* backbuf = nullptr;
HWND hWnd;
@@ -263,8 +264,7 @@ HRESULT Create(HWND wnd)
UpdateActiveConfig();
}
- DXGI_SWAP_CHAIN_DESC swap_chain_desc;
- memset(&swap_chain_desc, 0, sizeof(swap_chain_desc));
+ DXGI_SWAP_CHAIN_DESC swap_chain_desc = {};
swap_chain_desc.BufferCount = 1;
swap_chain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swap_chain_desc.OutputWindow = wnd;
@@ -272,12 +272,10 @@ HRESULT Create(HWND wnd)
swap_chain_desc.SampleDesc.Quality = 0;
swap_chain_desc.Windowed = !g_Config.bFullscreen;
- DXGI_OUTPUT_DESC out_desc;
- memset(&out_desc, 0, sizeof(out_desc));
+ DXGI_OUTPUT_DESC out_desc = {};
output->GetDesc(&out_desc);
- DXGI_MODE_DESC mode_desc;
- memset(&mode_desc, 0, sizeof(mode_desc));
+ DXGI_MODE_DESC mode_desc = {};
mode_desc.Width = out_desc.DesktopCoordinates.right - out_desc.DesktopCoordinates.left;
mode_desc.Height = out_desc.DesktopCoordinates.bottom - out_desc.DesktopCoordinates.top;
mode_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
@@ -302,6 +300,27 @@ HRESULT Create(HWND wnd)
supported_feature_levels, NUM_SUPPORTED_FEATURE_LEVELS,
D3D11_SDK_VERSION, &swap_chain_desc, &swapchain, &device,
&featlevel, &context);
+ // Debugbreak on D3D error
+ if (SUCCEEDED(hr) && SUCCEEDED(device->QueryInterface(__uuidof(ID3D11Debug), (void**)&debug)))
+ {
+ ID3D11InfoQueue* infoQueue = nullptr;
+ if (SUCCEEDED(debug->QueryInterface(__uuidof(ID3D11InfoQueue), (void**)&infoQueue)))
+ {
+ infoQueue->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_CORRUPTION, true);
+ infoQueue->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_ERROR, true);
+
+ D3D11_MESSAGE_ID hide[] =
+ {
+ D3D11_MESSAGE_ID_SETPRIVATEDATA_CHANGINGPARAMS
+ };
+
+ D3D11_INFO_QUEUE_FILTER filter = {};
+ filter.DenyList.NumIDs = sizeof(hide) / sizeof(D3D11_MESSAGE_ID);
+ filter.DenyList.pIDList = hide;
+ infoQueue->AddStorageFilterEntries(&filter);
+ infoQueue->Release();
+ }
+ }
}
if (FAILED(hr))
@@ -375,6 +394,21 @@ void Close()
SAFE_RELEASE(context);
ULONG references = device->Release();
+
+#if defined(_DEBUG) || defined(DEBUGFAST)
+ if (debug)
+ {
+ --references; // the debug interface increases the refcount of the device, subtract that.
+ if (references)
+ {
+ // print out alive objects, but only if we actually have pending references
+ // note this will also print out internal live objects to the debug console
+ debug->ReportLiveDeviceObjects(D3D11_RLDO_SUMMARY | D3D11_RLDO_DETAIL);
+ }
+ SAFE_RELEASE(debug)
+ }
+#endif
+
if (references)
{
ERROR_LOG(VIDEO, "Unreleased references: %i.", references);