[D3D12] d3d12_break_on_error + fix PerformSwap descriptor heap wrap
This commit is contained in:
@@ -15,8 +15,10 @@
|
||||
|
||||
#include <DXProgrammableCapture.h>
|
||||
#include <d3d12.h>
|
||||
#include <d3d12sdklayers.h>
|
||||
#include <d3dcompiler.h>
|
||||
#include <dxgi1_4.h>
|
||||
#include <dxgidebug.h>
|
||||
|
||||
#define XELOGD3D XELOGI
|
||||
|
||||
|
||||
@@ -342,9 +342,7 @@ void D3D12Context::EndSwap() {
|
||||
direct_queue->ExecuteCommandLists(1, execute_command_lists);
|
||||
|
||||
// Present and check if the context was lost.
|
||||
HRESULT result = swap_chain_->Present(0, 0);
|
||||
if (result == DXGI_ERROR_DEVICE_RESET ||
|
||||
result == DXGI_ERROR_DEVICE_REMOVED) {
|
||||
if (FAILED(swap_chain_->Present(0, 0))) {
|
||||
context_lost_ = true;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -14,10 +14,13 @@
|
||||
|
||||
#include "xenia/base/cvar.h"
|
||||
#include "xenia/base/logging.h"
|
||||
#include "xenia/base/math.h"
|
||||
#include "xenia/ui/d3d12/d3d12_context.h"
|
||||
|
||||
DEFINE_bool(d3d12_debug, false, "Enable Direct3D 12 and DXGI debug layer.",
|
||||
"D3D12");
|
||||
DEFINE_bool(d3d12_break_on_error, false,
|
||||
"Break on Direct3D 12 validation errors.", "D3D12");
|
||||
DEFINE_int32(d3d12_adapter, -1,
|
||||
"Index of the DXGI adapter to use. "
|
||||
"-1 for any physical adapter, -2 for WARP software rendering.",
|
||||
@@ -139,6 +142,19 @@ bool D3D12Provider::Initialize() {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Configure the DXGI debug info queue.
|
||||
if (cvars::d3d12_break_on_error) {
|
||||
IDXGIInfoQueue* dxgi_info_queue;
|
||||
if (SUCCEEDED(pfn_dxgi_get_debug_interface1_(
|
||||
0, IID_PPV_ARGS(&dxgi_info_queue)))) {
|
||||
dxgi_info_queue->SetBreakOnSeverity(
|
||||
DXGI_DEBUG_ALL, DXGI_INFO_QUEUE_MESSAGE_SEVERITY_CORRUPTION, TRUE);
|
||||
dxgi_info_queue->SetBreakOnSeverity(
|
||||
DXGI_DEBUG_ALL, DXGI_INFO_QUEUE_MESSAGE_SEVERITY_ERROR, TRUE);
|
||||
dxgi_info_queue->Release();
|
||||
}
|
||||
}
|
||||
|
||||
// Enable the debug layer.
|
||||
bool debug = cvars::d3d12_debug;
|
||||
if (debug) {
|
||||
@@ -225,6 +241,36 @@ bool D3D12Provider::Initialize() {
|
||||
}
|
||||
adapter->Release();
|
||||
|
||||
// Configure the Direct3D 12 debug info queue.
|
||||
ID3D12InfoQueue* d3d12_info_queue;
|
||||
if (SUCCEEDED(device->QueryInterface(IID_PPV_ARGS(&d3d12_info_queue)))) {
|
||||
D3D12_MESSAGE_SEVERITY d3d12_info_queue_denied_severities[] = {
|
||||
D3D12_MESSAGE_SEVERITY_INFO,
|
||||
};
|
||||
D3D12_MESSAGE_ID d3d12_info_queue_denied_messages[] = {
|
||||
// Xbox 360 vertex fetch is explicit in shaders.
|
||||
D3D12_MESSAGE_ID_CREATEINPUTLAYOUT_EMPTY_LAYOUT,
|
||||
// Render targets and shader exports don't have to match on the Xbox
|
||||
// 360.
|
||||
D3D12_MESSAGE_ID_CREATEGRAPHICSPIPELINESTATE_PS_OUTPUT_RT_OUTPUT_MISMATCH,
|
||||
};
|
||||
D3D12_INFO_QUEUE_FILTER d3d12_info_queue_filter = {};
|
||||
d3d12_info_queue_filter.DenyList.NumSeverities =
|
||||
UINT(xe::countof(d3d12_info_queue_denied_severities));
|
||||
d3d12_info_queue_filter.DenyList.pSeverityList =
|
||||
d3d12_info_queue_denied_severities;
|
||||
d3d12_info_queue_filter.DenyList.NumIDs =
|
||||
UINT(xe::countof(d3d12_info_queue_denied_messages));
|
||||
d3d12_info_queue_filter.DenyList.pIDList = d3d12_info_queue_denied_messages;
|
||||
d3d12_info_queue->PushStorageFilter(&d3d12_info_queue_filter);
|
||||
if (cvars::d3d12_break_on_error) {
|
||||
d3d12_info_queue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_CORRUPTION,
|
||||
TRUE);
|
||||
d3d12_info_queue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_ERROR, TRUE);
|
||||
}
|
||||
d3d12_info_queue->Release();
|
||||
}
|
||||
|
||||
// Create the command queue for graphics.
|
||||
D3D12_COMMAND_QUEUE_DESC queue_desc;
|
||||
queue_desc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT;
|
||||
|
||||
Reference in New Issue
Block a user