From d48bd7244a97f4ee6466c665622365783a7c6b28 Mon Sep 17 00:00:00 2001 From: libretroadmin Date: Tue, 11 Apr 2023 00:54:02 +0200 Subject: [PATCH] Libretro API update - add new context hardware render enums - enables autodetection of DX12 for PS2 core --- gfx/drivers/d3d10.c | 3 +- gfx/drivers/d3d11.c | 3 +- gfx/drivers/d3d12.c | 3 +- gfx/video_driver.c | 77 ++++++++++++++++++++---------- libretro-common/include/libretro.h | 26 ++++++---- runloop.c | 68 +++++++++++++------------- 6 files changed, 107 insertions(+), 73 deletions(-) diff --git a/gfx/drivers/d3d10.c b/gfx/drivers/d3d10.c index a82bc1d55c..c8f67fe16e 100644 --- a/gfx/drivers/d3d10.c +++ b/gfx/drivers/d3d10.c @@ -1063,8 +1063,7 @@ static void *d3d10_gfx_init(const video_info_t* video, } #if 0 - if (video_driver_get_hw_context()->context_type == RETRO_HW_CONTEXT_DIRECT3D && - video_driver_get_hw_context()->version_major == 11) + if (video_driver_get_hw_context()->context_type == RETRO_HW_CONTEXT_D3D10) { d3d10->hw.enable = true; d3d10->hw.iface.interface_type = RETRO_HW_RENDER_INTERFACE_D3D10; diff --git a/gfx/drivers/d3d11.c b/gfx/drivers/d3d11.c index 0519c32907..086bffccab 100644 --- a/gfx/drivers/d3d11.c +++ b/gfx/drivers/d3d11.c @@ -1654,8 +1654,7 @@ static void *d3d11_gfx_init(const video_info_t* video, d3d11_gfx_set_shader(d3d11, type, shader_preset); } - if ( video_driver_get_hw_context()->context_type == RETRO_HW_CONTEXT_DIRECT3D - && video_driver_get_hw_context()->version_major == 11) + if (video_driver_get_hw_context()->context_type == RETRO_HW_CONTEXT_D3D11) { d3d11->flags |= D3D11_ST_FLAG_HW_IFACE_ENABLE; d3d11->hw_iface.interface_type = RETRO_HW_RENDER_INTERFACE_D3D11; diff --git a/gfx/drivers/d3d12.c b/gfx/drivers/d3d12.c index 0ff10a29c6..b23fa88785 100644 --- a/gfx/drivers/d3d12.c +++ b/gfx/drivers/d3d12.c @@ -1988,8 +1988,7 @@ static void *d3d12_gfx_init(const video_info_t* video, d3d12_gfx_set_shader(d3d12, type, shader_preset); } - if ( video_driver_get_hw_context()->context_type == RETRO_HW_CONTEXT_DIRECT3D - && video_driver_get_hw_context()->version_major == 12) + if (video_driver_get_hw_context()->context_type == RETRO_HW_CONTEXT_D3D12) { d3d12->flags |= D3D12_ST_FLAG_HW_IFACE_ENABLE; d3d12->hw_iface.interface_type = RETRO_HW_RENDER_INTERFACE_D3D12; diff --git a/gfx/video_driver.c b/gfx/video_driver.c index a2916b9763..0103356eb3 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -449,18 +449,30 @@ video_driver_t *hw_render_context_driver( #else break; #endif - case RETRO_HW_CONTEXT_DIRECT3D: -#if defined(HAVE_D3D9) -#if defined(HAVE_HLSL) - if (major == 9) - return &video_d3d9_hlsl; -#endif -#endif -#if defined(HAVE_D3D11) - if (major == 11) - return &video_d3d11; -#endif + case RETRO_HW_CONTEXT_D3D10: +#if defined(HAVE_D3D10) + return &video_d3d10; +#else break; +#endif + case RETRO_HW_CONTEXT_D3D11: +#if defined(HAVE_D3D11) + return &video_d3d11; +#else + break; +#endif + case RETRO_HW_CONTEXT_D3D12: +#if defined(HAVE_D3D11) + return &video_d3d12; +#else + break; +#endif + case RETRO_HW_CONTEXT_D3D9: +#if defined(HAVE_D3D9) && defined(HAVE_HLSL) + return &video_d3d9_hlsl; +#else + break; +#endif case RETRO_HW_CONTEXT_VULKAN: #if defined(HAVE_VULKAN) return &video_vulkan; @@ -501,19 +513,21 @@ const char *hw_render_context_name( if (type == RETRO_HW_CONTEXT_VULKAN) return "vulkan"; #endif +#if defined(HAVE_D3D9) && defined(HAVE_HLSL) + if (type == RETRO_HW_CONTEXT_D3D9) + return "d3d9_hlsl"; +#endif +#ifdef HAVE_D3D10 + if (type == RETRO_HW_CONTEXT_D3D10) + return "d3d10"; +#endif #ifdef HAVE_D3D11 - if (type == RETRO_HW_CONTEXT_DIRECT3D && major == 11) + if (type == RETRO_HW_CONTEXT_D3D11) return "d3d11"; #endif #ifdef HAVE_D3D12 - if (type == RETRO_HW_CONTEXT_DIRECT3D && major == 12) + if (type == RETRO_HW_CONTEXT_D3D12) return "d3d12"; -#endif -#ifdef HAVE_D3D9 -#if defined(HAVE_HLSL) - if (type == RETRO_HW_CONTEXT_DIRECT3D && major == 9) - return "d3d9_hlsl"; -#endif #endif return "N/A"; } @@ -532,13 +546,21 @@ enum retro_hw_context_type hw_render_context_type(const char *s) if (string_is_equal(s, "vulkan")) return RETRO_HW_CONTEXT_VULKAN; #endif -#ifdef HAVE_D3D11 - if (string_is_equal(s, "d3d11")) - return RETRO_HW_CONTEXT_DIRECT3D; +#if defined(HAVE_D3D9) && defined(HAVE_HLSL) + if (string_is_equal(s, "d3d9_hlsl")) + return RETRO_HW_CONTEXT_D3D9; +#endif +#ifdef HAVE_D3D10 + if (string_is_equal(s, "d3d10")) + return RETRO_HW_CONTEXT_D3D10; #endif #ifdef HAVE_D3D11 - if (string_is_equal(s, "d3d9_hlsl")) - return RETRO_HW_CONTEXT_DIRECT3D; + if (string_is_equal(s, "d3d11")) + return RETRO_HW_CONTEXT_D3D11; +#endif +#ifdef HAVE_D3D12 + if (string_is_equal(s, "d3d12")) + return RETRO_HW_CONTEXT_D3D12; #endif return RETRO_HW_CONTEXT_NONE; } @@ -2307,8 +2329,11 @@ bool video_driver_find_driver( { case RETRO_HW_CONTEXT_OPENGL_CORE: case RETRO_HW_CONTEXT_VULKAN: - case RETRO_HW_CONTEXT_DIRECT3D: -#if defined(HAVE_VULKAN) || defined(HAVE_D3D11) || defined(HAVE_D3D9) || defined(HAVE_OPENGL_CORE) + case RETRO_HW_CONTEXT_D3D9: + case RETRO_HW_CONTEXT_D3D10: + case RETRO_HW_CONTEXT_D3D11: + case RETRO_HW_CONTEXT_D3D12: +#if defined(HAVE_VULKAN) || defined(HAVE_D3D9) || defined(HAVE_D3D10) || defined(HAVE_D3D11) || defined(HAVE_D3D12) || defined(HAVE_OPENGL_CORE) RARCH_LOG("[Video]: Using HW render, %s driver forced.\n", rdr_context_name); diff --git a/libretro-common/include/libretro.h b/libretro-common/include/libretro.h index 3d6df6f9e1..5c95c508f9 100644 --- a/libretro-common/include/libretro.h +++ b/libretro-common/include/libretro.h @@ -1968,13 +1968,13 @@ struct retro_vfs_interface_info enum retro_hw_render_interface_type { - RETRO_HW_RENDER_INTERFACE_VULKAN = 0, - RETRO_HW_RENDER_INTERFACE_D3D9 = 1, - RETRO_HW_RENDER_INTERFACE_D3D10 = 2, - RETRO_HW_RENDER_INTERFACE_D3D11 = 3, - RETRO_HW_RENDER_INTERFACE_D3D12 = 4, + RETRO_HW_RENDER_INTERFACE_VULKAN = 0, + RETRO_HW_RENDER_INTERFACE_D3D9 = 1, + RETRO_HW_RENDER_INTERFACE_D3D10 = 2, + RETRO_HW_RENDER_INTERFACE_D3D11 = 3, + RETRO_HW_RENDER_INTERFACE_D3D12 = 4, RETRO_HW_RENDER_INTERFACE_GSKIT_PS2 = 5, - RETRO_HW_RENDER_INTERFACE_DUMMY = INT_MAX + RETRO_HW_RENDER_INTERFACE_DUMMY = INT_MAX }; /* Base struct. All retro_hw_render_interface_* types @@ -2750,9 +2750,17 @@ enum retro_hw_context_type /* Vulkan, see RETRO_ENVIRONMENT_GET_HW_RENDER_INTERFACE. */ RETRO_HW_CONTEXT_VULKAN = 6, - /* Direct3D, set version_major to select the type of interface - * returned by RETRO_ENVIRONMENT_GET_HW_RENDER_INTERFACE */ - RETRO_HW_CONTEXT_DIRECT3D = 7, + /* Direct3D11, see RETRO_ENVIRONMENT_GET_HW_RENDER_INTERFACE */ + RETRO_HW_CONTEXT_D3D11 = 7, + + /* Direct3D10, see RETRO_ENVIRONMENT_GET_HW_RENDER_INTERFACE */ + RETRO_HW_CONTEXT_D3D10 = 8, + + /* Direct3D12, see RETRO_ENVIRONMENT_GET_HW_RENDER_INTERFACE */ + RETRO_HW_CONTEXT_D3D12 = 9, + + /* Direct3D9, see RETRO_ENVIRONMENT_GET_HW_RENDER_INTERFACE */ + RETRO_HW_CONTEXT_D3D9 = 10, RETRO_HW_CONTEXT_DUMMY = INT_MAX }; diff --git a/runloop.c b/runloop.c index 4f9b06f921..846fbabcd3 100644 --- a/runloop.c +++ b/runloop.c @@ -739,9 +739,16 @@ static bool dynamic_verify_hw_context( !string_is_equal(video_ident, "glcore")) return false; break; - case RETRO_HW_CONTEXT_DIRECT3D: - if (!((string_is_equal(video_ident, "d3d11") && major == 11) || - (string_is_equal(video_ident, "d3d12") && major == 12))) + case RETRO_HW_CONTEXT_D3D10: + if (!string_is_equal(video_ident, "d3d10")) + return false; + break; + case RETRO_HW_CONTEXT_D3D11: + if (!string_is_equal(video_ident, "d3d11")) + return false; + break; + case RETRO_HW_CONTEXT_D3D12: + if (!string_is_equal(video_ident, "d3d12")) return false; break; default: @@ -835,32 +842,26 @@ static bool dynamic_request_hw_context(enum retro_hw_context_type type, break; #endif -#if defined(HAVE_D3D9) || defined(HAVE_D3D11) || defined(HAVE_D3D12) - case RETRO_HW_CONTEXT_DIRECT3D: - switch (major) - { -#ifdef HAVE_D3D9 - case 9: - RARCH_LOG("Requesting D3D9 context.\n"); - break; -#endif -#ifdef HAVE_D3D11 - case 11: - RARCH_LOG("Requesting D3D11 context.\n"); - break; -#endif -#ifdef HAVE_D3D12 - case 12: - RARCH_LOG("Requesting D3D12 context.\n"); - break; -#endif - default: - RARCH_LOG("Requesting unknown context.\n"); - return false; - } +#if defined(HAVE_D3D11) + case RETRO_HW_CONTEXT_D3D11: + RARCH_LOG("Requesting D3D11 context.\n"); + break; +#endif +#ifdef HAVE_D3D10 + case RETRO_HW_CONTEXT_D3D10: + RARCH_LOG("Requesting D3D10 context.\n"); + break; +#endif +#ifdef HAVE_D3D12 + case RETRO_HW_CONTEXT_D3D12: + RARCH_LOG("Requesting D3D12 context.\n"); + break; +#endif +#if defined(HAVE_D3D9) + case RETRO_HW_CONTEXT_D3D9: + RARCH_LOG("Requesting D3D9 context.\n"); break; #endif - default: RARCH_LOG("Requesting unknown context.\n"); return false; @@ -2251,10 +2252,15 @@ bool runloop_environment_cb(unsigned cmd, void *data) *cb = RETRO_HW_CONTEXT_VULKAN; RARCH_LOG("[Environ]: GET_PREFERRED_HW_RENDER - Context callback set to RETRO_HW_CONTEXT_VULKAN.\n"); } - else if (!strncmp(video_driver_name, "d3d", 3)) + else if (string_is_equal(video_driver_name, "d3d11")) { - *cb = RETRO_HW_CONTEXT_DIRECT3D; - RARCH_LOG("[Environ]: GET_PREFERRED_HW_RENDER - Context callback set to RETRO_HW_CONTEXT_DIRECT3D.\n"); + *cb = RETRO_HW_CONTEXT_D3D11; + RARCH_LOG("[Environ]: GET_PREFERRED_HW_RENDER - Context callback set to RETRO_HW_CONTEXT_D3D11.\n"); + } + else if (string_is_equal(video_driver_name, "d3d12")) + { + *cb = RETRO_HW_CONTEXT_D3D12; + RARCH_LOG("[Environ]: GET_PREFERRED_HW_RENDER - Context callback set to RETRO_HW_CONTEXT_D3D12.\n"); } else { @@ -3363,9 +3369,7 @@ bool runloop_environment_cb(unsigned cmd, void *data) #ifdef HAVE_VULKAN if (iface->interface_type == RETRO_HW_RENDER_CONTEXT_NEGOTIATION_INTERFACE_VULKAN) - { iface->interface_version = RETRO_HW_RENDER_CONTEXT_NEGOTIATION_INTERFACE_VULKAN_VERSION; - } else #endif {