[host] dxgi: allow the debug layer to be turned on via config

This commit is contained in:
Quantum 2022-01-15 23:05:34 -05:00 committed by Geoffrey McRae
parent b117bbafe5
commit 508c491967
3 changed files with 37 additions and 2 deletions

View File

@ -22,9 +22,11 @@
#include <assert.h> #include <assert.h>
#include <d3d12.h> #include <d3d12.h>
#include <d3d12sdklayers.h>
#include "common/debug.h" #include "common/debug.h"
#include "common/option.h" #include "common/option.h"
#include "common/windebug.h" #include "common/windebug.h"
#include "ods_capture.h"
#define ALIGN_TO(value, align) (((value) + (align) - 1) & -(align)) #define ALIGN_TO(value, align) (((value) + (align) - 1) & -(align))
@ -43,6 +45,7 @@ struct D3D12Backend
{ {
int copySleep; int copySleep;
ID3D12Device * device; ID3D12Device * device;
ID3D12InfoQueue1 * debugInfoQueue;
ID3D12CommandQueue * commandQueue; ID3D12CommandQueue * commandQueue;
ID3D12Resource * src; ID3D12Resource * src;
struct D3D12Texture * texture; struct D3D12Texture * texture;
@ -61,6 +64,11 @@ typedef HRESULT (*D3D12CreateDevice_t)(
void **ppDevice void **ppDevice
); );
typedef HRESULT (*D3D12GetDebugInterface_t)(
REFIID riid,
void **ppvDebug
);
static void d3d12_free(); static void d3d12_free();
static bool d3d12_create(struct DXGIInterface * intf) static bool d3d12_create(struct DXGIInterface * intf)
@ -72,6 +80,22 @@ static bool d3d12_create(struct DXGIInterface * intf)
if (!d3d12) if (!d3d12)
return false; return false;
if (dxgi->debug)
{
D3D12GetDebugInterface_t D3D12GetDebugInterface = (D3D12GetDebugInterface_t)
GetProcAddress(d3d12, "D3D12GetDebugInterface");
ID3D12Debug1 * debug;
if (FAILED(status = D3D12GetDebugInterface(&IID_ID3D12Debug1, (void **)&debug)))
DEBUG_WINERROR("D3D12GetDebugInterface", status);
else
{
captureOutputDebugString();
ID3D12Debug1_EnableDebugLayer(debug);
ID3D12Debug1_SetEnableGPUBasedValidation(debug, TRUE);
ID3D12Debug1_SetEnableSynchronizedCommandQueueValidation(debug, TRUE);
}
}
D3D12CreateDevice_t D3D12CreateDevice = (D3D12CreateDevice_t) D3D12CreateDevice_t D3D12CreateDevice = (D3D12CreateDevice_t)
GetProcAddress(d3d12, "D3D12CreateDevice"); GetProcAddress(d3d12, "D3D12CreateDevice");

View File

@ -34,9 +34,9 @@
#include <unistd.h> #include <unistd.h>
#include <dxgi.h> #include <dxgi.h>
#include <dxgi1_2.h> #include <dxgi1_2.h>
#include <dxgi1_3.h>
#include <dxgi1_5.h> #include <dxgi1_5.h>
#include <d3d11.h> #include <d3d11.h>
#include <d3d12.h>
#include <d3dcommon.h> #include <d3dcommon.h>
#include <versionhelpers.h> #include <versionhelpers.h>
#include <dwmapi.h> #include <dwmapi.h>
@ -127,6 +127,13 @@ static void dxgi_initOptions(void)
.type = OPTION_TYPE_INT, .type = OPTION_TYPE_INT,
.value.x_int = 5 .value.x_int = 5
}, },
{
.module = "dxgi",
.name = "debug",
.description = "Enable Direct3D debugging (developers only, massive performance penalty)",
.type = OPTION_TYPE_BOOL,
.value.x_bool = false
},
{0} {0}
}; };
@ -155,6 +162,7 @@ static bool dxgi_create(CaptureGetPointerBuffer getPointerBufferFn, CapturePostP
if (this->maxTextures <= 0) if (this->maxTextures <= 0)
this->maxTextures = 1; this->maxTextures = 1;
this->debug = option_get_bool("dxgi", "debug");
this->useAcquireLock = option_get_bool("dxgi", "useAcquireLock"); this->useAcquireLock = option_get_bool("dxgi", "useAcquireLock");
this->dwmFlush = option_get_bool("dxgi", "dwmFlush"); this->dwmFlush = option_get_bool("dxgi", "dwmFlush");
this->disableDamage = option_get_bool("dxgi", "disableDamage"); this->disableDamage = option_get_bool("dxgi", "disableDamage");
@ -199,7 +207,8 @@ static bool dxgi_init(void)
lgResetEvent(this->frameEvent); lgResetEvent(this->frameEvent);
status = CreateDXGIFactory1(&IID_IDXGIFactory1, (void **)&this->factory); status = CreateDXGIFactory2(this->debug ? DXGI_CREATE_FACTORY_DEBUG : 0,
&IID_IDXGIFactory1, (void **)&this->factory);
if (FAILED(status)) if (FAILED(status))
{ {
DEBUG_WINERROR("Failed to create DXGIFactory1", status); DEBUG_WINERROR("Failed to create DXGIFactory1", status);
@ -399,6 +408,7 @@ static bool dxgi_init(void)
DEBUG_INFO("Feature Level : 0x%x" , this->featureLevel); DEBUG_INFO("Feature Level : 0x%x" , this->featureLevel);
DEBUG_INFO("Capture Size : %u x %u", this->width, this->height); DEBUG_INFO("Capture Size : %u x %u", this->width, this->height);
DEBUG_INFO("AcquireLock : %s" , this->useAcquireLock ? "enabled" : "disabled"); DEBUG_INFO("AcquireLock : %s" , this->useAcquireLock ? "enabled" : "disabled");
DEBUG_INFO("Debug mode : %s" , this->debug ? "enabled" : "disabled");
// try to reduce the latency // try to reduce the latency
{ {

View File

@ -73,6 +73,7 @@ struct DXGIInterface
ID3D11Device * device; ID3D11Device * device;
ID3D11DeviceContext * deviceContext; ID3D11DeviceContext * deviceContext;
LG_Lock deviceContextLock; LG_Lock deviceContextLock;
bool debug;
bool useAcquireLock; bool useAcquireLock;
bool dwmFlush; bool dwmFlush;
bool disableDamage; bool disableDamage;