Libretro API update - add new context hardware render enums - enables

autodetection of DX12 for PS2 core
This commit is contained in:
libretroadmin 2023-04-11 00:54:02 +02:00
parent f19def349f
commit d48bd7244a
6 changed files with 107 additions and 73 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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
};

View File

@ -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
{