From 5616af006b14df2b2e3a683c988de7f66371f188 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Sep 2022 11:21:32 +0200 Subject: [PATCH] add option to enable direct3d 12 renderer (via MS 9on12) --- inc/dd.h | 1 + inc/render_d3d9.h | 11 +++++++++++ src/config.c | 6 ++++-- src/render_d3d9.c | 17 ++++++++++++++--- 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index dee20a9..ac31d23 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -149,6 +149,7 @@ typedef struct CNCDDRAW BOOL lock_surfaces; BOOL d3d9linear; BOOL gdilinear; + BOOL d3d9on12; int resolutions; BOOL armadahack; BOOL tshack; diff --git a/inc/render_d3d9.h b/inc/render_d3d9.h index 0e653cb..29b8552 100644 --- a/inc/render_d3d9.h +++ b/inc/render_d3d9.h @@ -27,6 +27,17 @@ typedef struct D3D9RENDERER int tex_height; } D3D9RENDERER; +#define MAX_D3D9ON12_QUEUES 2 + +typedef struct _D3D9ON12_ARGS +{ + BOOL Enable9On12; + IUnknown* pD3D12Device; + IUnknown* ppD3D12Queues[MAX_D3D9ON12_QUEUES]; + UINT NumQueues; + UINT NodeMask; +} D3D9ON12_ARGS; + BOOL d3d9_is_available(); DWORD WINAPI d3d9_render_main(void); BOOL d3d9_create(); diff --git a/src/config.c b/src/config.c index 3121646..0fd22b3 100644 --- a/src/config.c +++ b/src/config.c @@ -46,6 +46,7 @@ void cfg_load() g_ddraw->releasealt = cfg_get_bool("releasealt", FALSE); g_ddraw->d3d9linear = cfg_get_bool("d3d9linear", TRUE); g_ddraw->gdilinear = cfg_get_bool("gdilinear", FALSE); + g_ddraw->d3d9on12 = cfg_get_bool("d3d9on12", FALSE); g_ddraw->resolutions = cfg_get_int("resolutions", RESLIST_NORMAL); g_ddraw->fpupreserve = cfg_get_bool("fpupreserve", FALSE); g_ddraw->allow_wmactivate = cfg_get_bool("allow_wmactivate", FALSE); @@ -154,7 +155,7 @@ void cfg_load() { g_ddraw->renderer = gdi_render_main; } - else if (tolower(tmp[0]) == 'd') /* direct3d9 */ + else if (tolower(tmp[0]) == 'd' || g_ddraw->d3d9on12) /* direct3d9 */ { g_ddraw->renderer = d3d9_render_main; } @@ -347,7 +348,8 @@ static void cfg_create_ini() "fpupreserve=false\n" "\n" "\n" - "; Undocumented compatibility settings\n" + "; Undocumented settings\n" + "d3d9on12=false\n" "accuratetimers=false\n" "fixpitch=true\n" "fixwndprochook=false\n" diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 2b19f7e..d1b32dc 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -53,10 +53,21 @@ BOOL d3d9_create() d3d9_enable_shim(TRUE); } - IDirect3D9* (WINAPI * d3d_create9)(UINT) = - (IDirect3D9 * (WINAPI*)(UINT))GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); + D3D9ON12_ARGS args; + memset(&args, 0, sizeof(args)); + args.Enable9On12 = TRUE; - if (d3d_create9 && (g_d3d9.instance = d3d_create9(D3D_SDK_VERSION))) + IDirect3D9* (WINAPI * d3d_create9on12)(INT, D3D9ON12_ARGS*, UINT) = NULL; + + if (g_ddraw->d3d9on12) + { + d3d_create9on12 = (void*)GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9On12"); + } + + IDirect3D9* (WINAPI * d3d_create9)(UINT) = (void*)GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); + + if ((d3d_create9on12 && (g_d3d9.instance = d3d_create9on12(D3D_SDK_VERSION, &args, 1))) || + (d3d_create9 && (g_d3d9.instance = d3d_create9(D3D_SDK_VERSION)))) { g_d3d9.bits_per_pixel = g_ddraw->render.bpp ? g_ddraw->render.bpp : g_ddraw->mode.dmBitsPerPel;