1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-24 17:49:52 +01:00

add option to enable direct3d 12 renderer (via MS 9on12)

This commit is contained in:
FunkyFr3sh 2022-09-20 11:21:32 +02:00
parent 9ac9aa3c6a
commit 5616af006b
4 changed files with 30 additions and 5 deletions

View File

@ -149,6 +149,7 @@ typedef struct CNCDDRAW
BOOL lock_surfaces; BOOL lock_surfaces;
BOOL d3d9linear; BOOL d3d9linear;
BOOL gdilinear; BOOL gdilinear;
BOOL d3d9on12;
int resolutions; int resolutions;
BOOL armadahack; BOOL armadahack;
BOOL tshack; BOOL tshack;

View File

@ -27,6 +27,17 @@ typedef struct D3D9RENDERER
int tex_height; int tex_height;
} D3D9RENDERER; } 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(); BOOL d3d9_is_available();
DWORD WINAPI d3d9_render_main(void); DWORD WINAPI d3d9_render_main(void);
BOOL d3d9_create(); BOOL d3d9_create();

View File

@ -46,6 +46,7 @@ void cfg_load()
g_ddraw->releasealt = cfg_get_bool("releasealt", FALSE); g_ddraw->releasealt = cfg_get_bool("releasealt", FALSE);
g_ddraw->d3d9linear = cfg_get_bool("d3d9linear", TRUE); g_ddraw->d3d9linear = cfg_get_bool("d3d9linear", TRUE);
g_ddraw->gdilinear = cfg_get_bool("gdilinear", FALSE); 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->resolutions = cfg_get_int("resolutions", RESLIST_NORMAL);
g_ddraw->fpupreserve = cfg_get_bool("fpupreserve", FALSE); g_ddraw->fpupreserve = cfg_get_bool("fpupreserve", FALSE);
g_ddraw->allow_wmactivate = cfg_get_bool("allow_wmactivate", FALSE); g_ddraw->allow_wmactivate = cfg_get_bool("allow_wmactivate", FALSE);
@ -154,7 +155,7 @@ void cfg_load()
{ {
g_ddraw->renderer = gdi_render_main; 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; g_ddraw->renderer = d3d9_render_main;
} }
@ -347,7 +348,8 @@ static void cfg_create_ini()
"fpupreserve=false\n" "fpupreserve=false\n"
"\n" "\n"
"\n" "\n"
"; Undocumented compatibility settings\n" "; Undocumented settings\n"
"d3d9on12=false\n"
"accuratetimers=false\n" "accuratetimers=false\n"
"fixpitch=true\n" "fixpitch=true\n"
"fixwndprochook=false\n" "fixwndprochook=false\n"

View File

@ -53,10 +53,21 @@ BOOL d3d9_create()
d3d9_enable_shim(TRUE); d3d9_enable_shim(TRUE);
} }
IDirect3D9* (WINAPI * d3d_create9)(UINT) = D3D9ON12_ARGS args;
(IDirect3D9 * (WINAPI*)(UINT))GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); 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; g_d3d9.bits_per_pixel = g_ddraw->render.bpp ? g_ddraw->render.bpp : g_ddraw->mode.dmBitsPerPel;