From 4ec4260f8e05a578419b1f300d4e0d815dd71952 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jul 2023 20:13:49 +0200 Subject: [PATCH] new .ini setting "d3d9_filter" --- inc/dd.h | 6 +++++- src/config.c | 7 ++++--- src/render_d3d9.c | 5 +++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 76a1922..fff5e0e 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -32,6 +32,10 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute #define RESLIST_MINI 1 #define RESLIST_FULL 2 +#define FILTER_NEAREST 0 +#define FILTER_LINEAR 1 +#define FILTER_CUBIC 2 + #define SDM_MODE_SET_BY_GAME 0x00000001l #define SDM_LEAVE_WINDOWED 0x00000002l #define SDM_LEAVE_FULLSCREEN 0x00000004l @@ -150,7 +154,7 @@ typedef struct CNCDDRAW BOOL flipclear; BOOL locktopleft; BOOL lock_surfaces; - BOOL d3d9linear; + int d3d9_filter; BOOL gdilinear; BOOL d3d9on12; int guard_lines; diff --git a/src/config.c b/src/config.c index 395f42e..22ff8d6 100644 --- a/src/config.c +++ b/src/config.c @@ -45,7 +45,7 @@ void cfg_load() g_ddraw->locktopleft = cfg_get_bool("locktopleft", FALSE); g_ddraw->lock_surfaces = cfg_get_bool("lock_surfaces", FALSE); g_ddraw->releasealt = cfg_get_bool("releasealt", FALSE); - g_ddraw->d3d9linear = cfg_get_bool("d3d9linear", TRUE); + g_ddraw->d3d9_filter = cfg_get_int("d3d9_filter", FILTER_CUBIC); 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); @@ -304,8 +304,9 @@ static void cfg_create_ini() "; Should the window be resizable by the user in windowed mode?\n" "resizable=true\n" "\n" - "; Enable linear (D3DTEXF_LINEAR) upscaling filter for the direct3d9 renderer\n" - "d3d9linear=true\n" + "; Upscaling filter for the direct3d9 renderer\n" + "; Possible values: 0 = nearest-neighbor, 1 = bilinear, 2 = bicubic (16/32bit color depth games only)\n" + "d3d9_filter=2\n" "\n" "; Enable upscale hack for high resolution patches (Supports C&C1, Red Alert 1 and KKND Xtreme)\n" "vhack=false\n" diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 62d0296..63efb0a 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -352,7 +352,7 @@ static BOOL d3d9_set_states() err = err || FAILED(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[0])); BOOL bilinear = - g_ddraw->d3d9linear && + g_ddraw->d3d9_filter && g_d3d9.pixel_shader_upscale && (g_ddraw->render.viewport.width != g_ddraw->width || g_ddraw->render.viewport.height != g_ddraw->height); @@ -369,10 +369,11 @@ static BOOL d3d9_set_states() } else { - if (g_ddraw->d3d9linear) + if (g_ddraw->d3d9_filter) { if (SUCCEEDED(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR)) && SUCCEEDED(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR)) && + g_ddraw->d3d9_filter == FILTER_CUBIC && g_d3d9.pixel_shader_upscale && (g_ddraw->render.viewport.width != g_ddraw->width || g_ddraw->render.viewport.height != g_ddraw->height) && SUCCEEDED(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale)))