From 17ec59ff219660a0137c7281b8ad865f7ad97eb3 Mon Sep 17 00:00:00 2001 From: LazyBumHorse Date: Mon, 24 Jun 2019 23:40:50 +0200 Subject: [PATCH 1/2] enable Cg shader flag for d3d9 --- gfx/drivers/d3d9.c | 61 ++++++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 32 deletions(-) diff --git a/gfx/drivers/d3d9.c b/gfx/drivers/d3d9.c index c1a40ff09a..29bb9b2bb3 100644 --- a/gfx/drivers/d3d9.c +++ b/gfx/drivers/d3d9.c @@ -69,6 +69,11 @@ #error "UWP does not support D3D9" #endif +/* Temporary workaround for d3d9 not being able to poll flags during init */ +static gfx_ctx_driver_t d3d9_fake_context; +static uint32_t d3d9_get_flags(void *data); +static bool d3d9_set_shader(void *data, enum rarch_shader_type type, const char *path); + static LPDIRECT3D9 g_pD3D9; void *dinput; @@ -248,12 +253,12 @@ static bool d3d9_init_chain(d3d9_video_t *d3d, const video_info_t *video_info) &d3d->renderchain_driver, &d3d->renderchain_data)) { - RARCH_ERR("[D3D9]: Renderchain could not be initialized.\n"); - return false; + RARCH_ERR("[D3D9]: Renderchain could not be initialized.\n"); + return false; } if (!d3d->renderchain_driver || !d3d->renderchain_data) - return false; + return false; if ( !d3d->renderchain_driver->init( @@ -494,14 +499,14 @@ static void d3d9_overlay_render(d3d9_video_t *d3d, overlay->vert_buf = d3d9_vertex_buffer_new( dev, sizeof(vert), D3DUSAGE_WRITEONLY, #ifdef _XBOX - 0, + 0, #else D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1, #endif D3DPOOL_MANAGED, NULL); - if (!overlay->vert_buf) - return; + if (!overlay->vert_buf) + return; } for (i = 0; i < 4; i++) @@ -989,7 +994,7 @@ static bool d3d9_initialize(d3d9_video_t *d3d, const video_info_t *info) video_driver_get_size(&width, &height); d3d9_set_viewport(d3d, - width, height, false, true); + width, height, false, true); #ifdef _XBOX strlcpy(settings->paths.path_font, "game:\\media\\Arial_12.xpr", @@ -1022,7 +1027,7 @@ static bool d3d9_initialize(d3d9_video_t *d3d, const video_info_t *info) #ifdef _XBOX 0, #else - D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1, + D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1, #endif D3DPOOL_DEFAULT, NULL); @@ -1265,33 +1270,22 @@ static bool d3d9_init_internal(d3d9_video_t *d3d, win_height, info->fullscreen); win32_set_window(&win_width, &win_height, info->fullscreen, - windowed_full, &rect); + windowed_full, &rect); #endif - /* This should only be done once here - * to avoid set_shader() to be overridden - * later. */ - if (settings->bools.video_shader_enable) { - enum rarch_shader_type type = - video_shader_parse_type(retroarch_get_shader_preset()); + const char *shader_preset; + enum rarch_shader_type type; - switch (type) - { - case RARCH_SHADER_CG: - if (!string_is_empty(d3d->shader_path)) - free(d3d->shader_path); - if (!string_is_empty(retroarch_get_shader_preset())) - d3d->shader_path = strdup(retroarch_get_shader_preset()); - break; - default: - break; - } + d3d9_fake_context.get_flags = d3d9_get_flags; + video_context_driver_set(&d3d9_fake_context); + + shader_preset = retroarch_get_shader_preset(); + type = video_shader_parse_type(shader_preset); + + d3d9_set_shader(d3d, type, shader_preset); } - if (!d3d9_process_shader(d3d)) - return false; - d3d->video_info = *info; if (!d3d9_initialize(d3d, &d3d->video_info)) @@ -1482,7 +1476,7 @@ static bool d3d9_overlay_load(void *data, image_data; if (!d3d) - return false; + return false; d3d9_free_overlays(d3d); d3d->overlays = (overlay_t*)calloc(num_images, sizeof(*d3d->overlays)); @@ -1823,6 +1817,8 @@ static bool d3d9_set_shader(void *data, if (!string_is_empty(path)) d3d->shader_path = strdup(path); break; + case RARCH_SHADER_NONE: + break; default: RARCH_WARN("[D3D9]: Only Cg shaders are supported. Falling back to stock.\n"); } @@ -2017,7 +2013,7 @@ static void d3d9_unload_texture(void *data, uintptr_t id) { LPDIRECT3DTEXTURE9 texid; if (!id) - return; + return; texid = (LPDIRECT3DTEXTURE9)id; d3d9_texture_free(texid); @@ -2034,10 +2030,11 @@ static void d3d9_set_video_mode(void *data, static uint32_t d3d9_get_flags(void *data) { - uint32_t flags = 0; + uint32_t flags = 0; BIT32_SET(flags, GFX_CTX_FLAGS_BLACK_FRAME_INSERTION); BIT32_SET(flags, GFX_CTX_FLAGS_MENU_FRAME_FILTERING); + BIT32_SET(flags, GFX_CTX_FLAGS_SHADERS_CG); return flags; } From c4530eb3f491a6f5f41dddd3624a08f1594f14c1 Mon Sep 17 00:00:00 2001 From: LazyBumHorse Date: Tue, 25 Jun 2019 10:54:31 +0200 Subject: [PATCH 2/2] d3d9: add Cg/HLSL shader runtime check depending on the used renderchain --- gfx/drivers/d3d9.c | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/gfx/drivers/d3d9.c b/gfx/drivers/d3d9.c index 29bb9b2bb3..20ac3063f4 100644 --- a/gfx/drivers/d3d9.c +++ b/gfx/drivers/d3d9.c @@ -75,6 +75,7 @@ static uint32_t d3d9_get_flags(void *data); static bool d3d9_set_shader(void *data, enum rarch_shader_type type, const char *path); static LPDIRECT3D9 g_pD3D9; +static enum rarch_shader_type supported_shader_type = RARCH_SHADER_NONE; void *dinput; @@ -155,7 +156,8 @@ static bool renderchain_d3d_init_first( { case GFX_CTX_DIRECT3D9_API: { - static const d3d9_renderchain_driver_t *renderchain_d3d_drivers[] = { + static const d3d9_renderchain_driver_t *renderchain_d3d_drivers[] = + { #if defined(_WIN32) && defined(HAVE_CG) &cg_d3d9_renderchain, #endif @@ -175,6 +177,12 @@ static bool renderchain_d3d_init_first( *renderchain_driver = renderchain_d3d_drivers[i]; *renderchain_handle = data; + + if (string_is_equal(renderchain_d3d_drivers[i]->ident, "cg_d3d9")) + supported_shader_type = RARCH_SHADER_CG; + else if (string_is_equal(renderchain_d3d_drivers[i]->ident, "hlsl_d3d9")) + supported_shader_type = RARCH_SHADER_HLSL; + return true; } } @@ -381,7 +389,7 @@ static bool d3d9_init_multipass(d3d9_video_t *d3d, const char *shader_path) if (!video_shader_read_conf_preset(conf, &d3d->shader)) { config_file_free(conf); - RARCH_ERR("[D3D9]: Failed to parse CGP file.\n"); + RARCH_ERR("[D3D9]: Failed to parse shader preset.\n"); return false; } @@ -434,8 +442,7 @@ static bool d3d9_init_multipass(d3d9_video_t *d3d, const char *shader_path) static bool d3d9_process_shader(d3d9_video_t *d3d) { const char *shader_path = d3d->shader_path; - if (d3d && !string_is_empty(shader_path) && - string_is_equal(path_get_extension(shader_path), "cgp")) + if (d3d && !string_is_empty(shader_path)) return d3d9_init_multipass(d3d, shader_path); return d3d9_init_singlepass(d3d); @@ -1273,6 +1280,11 @@ static bool d3d9_init_internal(d3d9_video_t *d3d, windowed_full, &rect); #endif + d3d->video_info = *info; + + if (!d3d9_initialize(d3d, &d3d->video_info)) + return false; + { const char *shader_preset; enum rarch_shader_type type; @@ -1286,11 +1298,6 @@ static bool d3d9_init_internal(d3d9_video_t *d3d, d3d9_set_shader(d3d, type, shader_preset); } - d3d->video_info = *info; - - if (!d3d9_initialize(d3d, &d3d->video_info)) - return false; - d3d_input_driver(settings->arrays.input_joypad_driver, settings->arrays.input_joypad_driver, input, input_data); @@ -1814,8 +1821,17 @@ static bool d3d9_set_shader(void *data, { case RARCH_SHADER_CG: case RARCH_SHADER_HLSL: + + if (type != supported_shader_type) + { + RARCH_WARN("[D3D9]: Shader preset %s is using unsupported shader type %s, falling back to stock %s.\n", + path, video_shader_to_str(type), video_shader_to_str(supported_shader_type)); + break; + } + if (!string_is_empty(path)) d3d->shader_path = strdup(path); + break; case RARCH_SHADER_NONE: break; @@ -2034,7 +2050,11 @@ static uint32_t d3d9_get_flags(void *data) BIT32_SET(flags, GFX_CTX_FLAGS_BLACK_FRAME_INSERTION); BIT32_SET(flags, GFX_CTX_FLAGS_MENU_FRAME_FILTERING); - BIT32_SET(flags, GFX_CTX_FLAGS_SHADERS_CG); + + if (supported_shader_type == RARCH_SHADER_CG) + BIT32_SET(flags, GFX_CTX_FLAGS_SHADERS_CG); + else if (supported_shader_type == RARCH_SHADER_HLSL) + BIT32_SET(flags, GFX_CTX_FLAGS_SHADERS_HLSL); return flags; }