Some refactors to make some video driver functions less dependent

on passing around the settings_t pointer
This commit is contained in:
LibretroAdmin 2025-02-09 18:23:42 +01:00
parent f71181d1c1
commit f9fa557a95
3 changed files with 89 additions and 76 deletions

View File

@ -2373,11 +2373,11 @@ static bool d3d12_init_swapchain(d3d12_video_t* d3d12,
if (max_latency == 0)
{
d3d12->flags |= D3D12_ST_FLAG_WAIT_FOR_VBLANK;
max_latency = 1;
d3d12->flags |= D3D12_ST_FLAG_WAIT_FOR_VBLANK;
max_latency = 1;
}
else
d3d12->flags &= ~D3D12_ST_FLAG_WAIT_FOR_VBLANK;
d3d12->flags &= ~D3D12_ST_FLAG_WAIT_FOR_VBLANK;
DXGISetMaximumFrameLatency(d3d12->chain.handle, max_latency);
DXGIGetMaximumFrameLatency(d3d12->chain.handle, &cur_latency);
@ -2911,7 +2911,8 @@ static void *d3d12_gfx_init(const video_info_t* video,
else
d3d12->flags &= ~D3D12_ST_FLAG_WAITABLE_SWAPCHAINS;
d3d_input_driver(settings->arrays.input_driver, settings->arrays.input_joypad_driver, input, input_data);
d3d_input_driver(settings->arrays.input_driver,
settings->arrays.input_joypad_driver, input, input_data);
d3d12_init_base(d3d12);
d3d12_init_descriptors(d3d12);

View File

@ -320,7 +320,8 @@ static const GLfloat white_color[16] = {
*/
static void gl2_set_viewport(gl2_t *gl,
unsigned vp_width, unsigned vp_height,
bool force_full, bool allow_rotate);
bool force_full, bool allow_rotate,
bool video_scale_integer);
#ifdef IOS
/* There is no default frame buffer on iOS. */
@ -943,9 +944,10 @@ static void gl2_raster_font_setup_viewport(
gl2_t *gl,
gl2_raster_t *font,
unsigned width, unsigned height,
bool full_screen)
bool full_screen,
bool video_scale_integer)
{
gl2_set_viewport(gl, width, height, full_screen, true);
gl2_set_viewport(gl, width, height, full_screen, true, video_scale_integer);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
@ -973,6 +975,7 @@ static void gl2_raster_font_render_msg(
gl2_t *gl = (gl2_t*)userdata;
unsigned width = gl->video_width;
unsigned height = gl->video_height;
bool video_scale_integer = config_get_ptr()->bools.video_scale_integer;
if (!font || string_is_empty(msg) || !gl)
return;
@ -1026,7 +1029,8 @@ static void gl2_raster_font_render_msg(
if (font->block)
font->block->fullscreen = full_screen;
else
gl2_raster_font_setup_viewport(gl, font, width, height, full_screen);
gl2_raster_font_setup_viewport(gl, font, width, height, full_screen,
config_get_ptr()->bools.video_scale_integer);
if ( !string_is_empty(msg)
&& font->font_data
@ -1055,7 +1059,7 @@ static void gl2_raster_font_render_msg(
/* Restore viewport */
glBindTexture(GL_TEXTURE_2D, gl->texture[gl->tex_index]);
glDisable(GL_BLEND);
gl2_set_viewport(gl, width, height, false, true);
gl2_set_viewport(gl, width, height, false, true, video_scale_integer);
}
}
@ -1074,18 +1078,20 @@ static void gl2_raster_font_flush_block(unsigned width, unsigned height,
gl2_raster_t *font = (gl2_raster_t*)data;
video_font_raster_block_t *block = font ? font->block : NULL;
gl2_t *gl = font ? font->gl : NULL;
bool video_scale_integer = config_get_ptr()->bools.video_scale_integer;
if (!font || !block || !block->carr.coords.vertices || !gl)
return;
gl2_raster_font_setup_viewport(gl, font, width, height, block->fullscreen);
gl2_raster_font_setup_viewport(gl, font, width, height, block->fullscreen,
video_scale_integer);
gl2_raster_font_draw_vertices(gl, font, (video_coords_t*)&block->carr.coords);
/* Restore viewport */
glBindTexture(GL_TEXTURE_2D, gl->texture[gl->tex_index]);
glDisable(GL_BLEND);
gl2_set_viewport(gl, width, height, block->fullscreen, true);
gl2_set_viewport(gl, width, height, block->fullscreen, true, video_scale_integer);
}
static void gl2_raster_font_bind_block(void *data, void *userdata)
@ -1268,16 +1274,16 @@ static void gl2_set_projection(gl2_t *gl,
static void gl2_set_viewport(gl2_t *gl,
unsigned vp_width,
unsigned vp_height,
bool force_full, bool allow_rotate)
bool force_full, bool allow_rotate,
bool video_scale_integer)
{
settings_t *settings = config_get_ptr();
float device_aspect = (float)vp_width / (float)vp_height;
if (gl->ctx_driver->translate_aspect)
device_aspect = gl->ctx_driver->translate_aspect(
gl->ctx_data, vp_width, vp_height);
if (settings->bools.video_scale_integer && !force_full)
if (video_scale_integer && !force_full)
{
video_viewport_get_scaled_integer(&gl->vp,
vp_width, vp_height,
@ -1322,7 +1328,8 @@ static void gl2_renderchain_render(
gl2_renderchain_data_t *chain,
uint64_t frame_count,
const struct video_tex_info *tex_info,
const struct video_tex_info *feedback_info)
const struct video_tex_info *feedback_info,
bool video_scale_integer)
{
int i;
video_shader_ctx_params_t params;
@ -1379,7 +1386,8 @@ static void gl2_renderchain_render(
/* Render to FBO with certain size. */
gl2_set_viewport(gl,
rect->img_width, rect->img_height, true, false);
rect->img_width, rect->img_height, true, false,
video_scale_integer);
params.data = gl;
params.width = prev_rect->img_width;
@ -1444,8 +1452,7 @@ static void gl2_renderchain_render(
glGenerateMipmap(GL_TEXTURE_2D);
glClear(GL_COLOR_BUFFER_BIT);
gl2_set_viewport(gl,
width, height, false, true);
gl2_set_viewport(gl, width, height, false, true, video_scale_integer);
params.data = gl;
params.width = prev_rect->img_width;
@ -1602,20 +1609,13 @@ static GLenum gl2_min_filter_to_mag(GLenum type)
static void gl2_create_fbo_texture(gl2_t *gl,
gl2_renderchain_data_t *chain,
unsigned i, GLuint texture)
unsigned i, GLuint texture,
bool video_smooth, bool force_srgb_disable)
{
GLenum mag_filter, wrap_enum;
enum gfx_wrap_type wrap_type;
bool fp_fbo = false;
bool smooth = false;
settings_t *settings = config_get_ptr();
bool video_smooth = settings->bools.video_smooth;
#if HAVE_ODROIDGO2
bool video_ctx_scaling = settings->bools.video_ctx_scaling;
if (video_ctx_scaling)
video_smooth = false;
#endif
bool force_srgb_disable = settings->bools.video_force_srgb_disable;
GLuint base_filt = video_smooth ? GL_LINEAR : GL_NEAREST;
GLuint base_mip_filt = video_smooth ?
GL_LINEAR_MIPMAP_LINEAR : GL_NEAREST_MIPMAP_NEAREST;
@ -1719,20 +1719,29 @@ static void gl2_create_fbo_textures(gl2_t *gl,
gl2_renderchain_data_t *chain)
{
int i;
settings_t *settings = config_get_ptr();
#if HAVE_ODROIDGO2
bool video_smooth = settings->bools.video_ctx_scaling ? false : settings->bools.video_smooth;
#else
bool video_smooth = settings->bools.video_smooth;
#endif
bool force_srgb_disable = settings->bools.video_force_srgb_disable;
glGenTextures(chain->fbo_pass, chain->fbo_texture);
for (i = 0; i < chain->fbo_pass; i++)
gl2_create_fbo_texture(gl,
(gl2_renderchain_data_t*)gl->renderchain_data,
i, chain->fbo_texture[i]);
i, chain->fbo_texture[i],
video_smooth, force_srgb_disable);
if (gl->flags & GL2_FLAG_FBO_FEEDBACK_ENABLE)
{
glGenTextures(1, &gl->fbo_feedback_texture);
gl2_create_fbo_texture(gl,
(gl2_renderchain_data_t*)gl->renderchain_data,
gl->fbo_feedback_pass, gl->fbo_feedback_texture);
gl->fbo_feedback_pass, gl->fbo_feedback_texture,
video_smooth, force_srgb_disable);
}
glBindTexture(GL_TEXTURE_2D, 0);
@ -1842,9 +1851,8 @@ static void gl2_renderchain_recompute_pass_sizes(
}
}
static void gl2_renderchain_start_render(
gl2_t *gl,
gl2_renderchain_data_t *chain)
static void gl2_renderchain_start_render(gl2_t *gl,
gl2_renderchain_data_t *chain, bool video_scale_integer)
{
/* Used when rendering to an FBO.
* Texture coords have to be aligned
@ -1860,7 +1868,8 @@ static void gl2_renderchain_start_render(
gl2_set_viewport(gl,
gl->fbo_rect[0].img_width,
gl->fbo_rect[0].img_height, true, false);
gl->fbo_rect[0].img_height, true, false,
video_scale_integer);
/* Need to preserve the "flipped" state when in FBO
* as well to have consistent texture coordinates.
@ -2759,7 +2768,10 @@ static void gl2_set_viewport_wrapper(void *data, unsigned vp_width,
unsigned vp_height, bool force_full, bool allow_rotate)
{
gl2_t *gl = (gl2_t*)data;
gl2_set_viewport(gl, vp_width, vp_height, force_full, allow_rotate);
gl2_set_viewport(gl,
vp_width, vp_height, force_full, allow_rotate,
config_get_ptr()->bools.video_scale_integer
);
}
/* Shaders */
@ -3084,7 +3096,7 @@ static void gl2_init_textures(gl2_t *gl)
glBindTexture(GL_TEXTURE_2D, gl->texture[gl->tex_index]);
}
static INLINE void gl2_set_shader_viewports(gl2_t *gl)
static INLINE void gl2_set_shader_viewports(gl2_t *gl, bool video_scale_integer)
{
int i;
unsigned width = gl->video_width;
@ -3093,7 +3105,8 @@ static INLINE void gl2_set_shader_viewports(gl2_t *gl)
for (i = 0; i < 2; i++)
{
gl->shader->use(gl, gl->shader_data, i, true);
gl2_set_viewport(gl, width, height, false, true);
gl2_set_viewport(gl, width, height, false, true,
video_scale_integer);
}
}
@ -3147,7 +3160,7 @@ static void gl2_set_texture_enable(void *data, bool state, bool full_screen)
gl->flags &= ~GL2_FLAG_MENU_TEXTURE_FULLSCREEN;
}
static void gl2_render_osd_background(gl2_t *gl, const char *msg)
static void gl2_render_osd_background(gl2_t *gl, bool video_scale_integer, const char *msg)
{
video_coords_t coords;
struct uniform_info uniform_param;
@ -3174,9 +3187,9 @@ static void gl2_render_osd_background(gl2_t *gl, const char *msg)
width += x2;
height += y2;
colors[0] = settings->uints.video_msg_bgcolor_red / 255.0f;
colors[0] = settings->uints.video_msg_bgcolor_red / 255.0f;
colors[1] = settings->uints.video_msg_bgcolor_green / 255.0f;
colors[2] = settings->uints.video_msg_bgcolor_blue / 255.0f;
colors[2] = settings->uints.video_msg_bgcolor_blue / 255.0f;
colors[3] = settings->floats.video_msg_bgcolor_opacity;
/* triangle 1 */
@ -3207,7 +3220,8 @@ static void gl2_render_osd_background(gl2_t *gl, const char *msg)
gl2_set_viewport(gl,
gl->video_width,
gl->video_height, true, false);
gl->video_height, true, false,
video_scale_integer);
gl->shader->use(gl, gl->shader_data,
VIDEO_SHADER_STOCK_BLEND, true);
@ -3255,7 +3269,7 @@ static void gl2_render_osd_background(gl2_t *gl, const char *msg)
gl2_set_viewport(gl,
gl->video_width,
gl->video_height, false, true);
gl->video_height, false, true, video_scale_integer);
}
static void gl2_show_mouse(void *data, bool state)
@ -3384,6 +3398,7 @@ static bool gl2_frame(void *data, const void *frame,
bool widgets_active = video_info->widgets_active;
#endif
bool overlay_behind_menu = video_info->overlay_behind_menu;
bool video_scale_integer = config_get_ptr()->bools.video_scale_integer;
if (!gl)
return false;
@ -3400,7 +3415,7 @@ static bool gl2_frame(void *data, const void *frame,
#ifdef IOS
/* Apparently the viewport is lost each frame, thanks Apple. */
gl2_set_viewport(gl, width, height, false, true);
gl2_set_viewport(gl, width, height, false, true, video_scale_integer);
#endif
/* Render to texture in first pass. */
@ -3411,7 +3426,7 @@ static bool gl2_frame(void *data, const void *frame,
frame_width, frame_height,
gl->out_vp_width, gl->out_vp_height);
gl2_renderchain_start_render(gl, chain);
gl2_renderchain_start_render(gl, chain, video_scale_integer);
}
if (gl->flags & GL2_FLAG_SHOULD_RESIZE)
@ -3472,10 +3487,10 @@ static bool gl2_frame(void *data, const void *frame,
/* Go back to what we're supposed to do,
* render to FBO #0. */
gl2_renderchain_start_render(gl, chain);
gl2_renderchain_start_render(gl, chain, video_scale_integer);
}
else
gl2_set_viewport(gl, width, height, false, true);
gl2_set_viewport(gl, width, height, false, true, video_scale_integer);
}
if (frame)
@ -3509,7 +3524,7 @@ static bool gl2_frame(void *data, const void *frame,
if (!(gl->flags & GL2_FLAG_FBO_INITED))
{
gl2_renderchain_bind_backbuffer();
gl2_set_viewport(gl, width, height, false, true);
gl2_set_viewport(gl, width, height, false, true, video_scale_integer);
}
gl2_renderchain_restore_default_state(gl);
@ -3573,7 +3588,8 @@ static bool gl2_frame(void *data, const void *frame,
if (gl->flags & GL2_FLAG_FBO_INITED)
gl2_renderchain_render(gl,
chain,
frame_count, &gl->tex_info, &feedback_info);
frame_count, &gl->tex_info, &feedback_info,
video_scale_integer);
/* Set prev textures. */
gl2_renderchain_bind_prev_texture(gl,
@ -3613,7 +3629,7 @@ static bool gl2_frame(void *data, const void *frame,
if (!string_is_empty(msg))
{
if (msg_bgcolor_enable)
gl2_render_osd_background(gl, msg);
gl2_render_osd_background(gl, video_scale_integer, msg);
font_driver_render_msg(gl, msg, NULL, NULL);
}
@ -4193,6 +4209,7 @@ static void *gl2_init(const video_info_t *video,
unsigned shader_info_num;
settings_t *settings = config_get_ptr();
bool video_gpu_record = settings->bools.video_gpu_record;
bool video_scale_integer = settings->bools.video_scale_integer;
int interval = 0;
unsigned mip_level = 0;
unsigned mode_width = 0;
@ -4501,7 +4518,7 @@ static void *gl2_init(const video_info_t *video,
#endif
/* Apparently need to set viewport for passes
* when we aren't using FBOs. */
gl2_set_shader_viewports(gl);
gl2_set_shader_viewports(gl, video_scale_integer);
mip_level = 1;
if (gl->shader->mipmap_input(gl->shader_data, mip_level))
@ -4657,20 +4674,13 @@ static bool gl2_suppress_screensaver(void *data, bool enable)
return false;
}
static void gl2_update_tex_filter_frame(gl2_t *gl)
static void gl2_update_tex_filter_frame(gl2_t *gl, bool video_smooth)
{
unsigned i, mip_level;
GLenum wrap_mode;
GLuint new_filt;
enum gfx_wrap_type wrap_type;
bool smooth = false;
settings_t *settings = config_get_ptr();
bool video_smooth = settings->bools.video_smooth;
#ifdef HAVE_ODROIDGO2
bool video_ctx_scaling = settings->bools.video_ctx_scaling;
if (video_ctx_scaling)
video_smooth = false;
#endif
if (gl->flags & GL2_FLAG_SHARED_CONTEXT_USE)
gl->ctx_driver->bind_hw_render(gl->ctx_data, false);
@ -4719,7 +4729,14 @@ static bool gl2_set_shader(void *data,
unsigned textures;
video_shader_ctx_init_t init_data;
enum rarch_shader_type fallback;
gl2_t *gl = (gl2_t*)data;
gl2_t *gl = (gl2_t*)data;
settings_t *settings = config_get_ptr();
bool video_scale_integer = settings->bools.video_scale_integer;
#ifdef HAVE_ODROIDGO2
bool video_smooth = settings->bools.video_ctx_scaling ? false : settings->bools.video_smooth;
#else
bool video_smooth = settings->bools.video_smooth;
#endif
if (!gl)
return false;
@ -4777,7 +4794,7 @@ static bool gl2_set_shader(void *data,
gl->shader = init_data.shader;
gl->shader_data = init_data.shader_data;
gl2_update_tex_filter_frame(gl);
gl2_update_tex_filter_frame(gl, video_smooth);
{
unsigned texture_info_id = gl->shader->get_prev_textures(gl->shader_data);
@ -4812,7 +4829,7 @@ static bool gl2_set_shader(void *data,
gl->tex_w, gl->tex_h);
/* Apparently need to set viewport for passes when we aren't using FBOs. */
gl2_set_shader_viewports(gl);
gl2_set_shader_viewports(gl, video_scale_integer);
if (gl->flags & GL2_FLAG_SHARED_CONTEXT_USE)
gl->ctx_driver->bind_hw_render(gl->ctx_data, true);

View File

@ -3257,19 +3257,15 @@ static void vulkan_init_hw_render(vk_t *vk)
iface->get_instance_proc_addr = vulkan_symbol_wrapper_instance_proc_addr();
}
static void vulkan_init_readback(vk_t *vk, settings_t *settings)
static void vulkan_init_readback(vk_t *vk, bool video_gpu_record)
{
/* Only bother with this if we're doing GPU recording.
* Check recording_st->enable and not
* driver.recording_data, because recording is
* not initialized yet.
* Check rec_st->enable and not driver.recording_data,
* because recording is not initialized yet.
*/
recording_state_t
*recording_st = recording_state_get_ptr();
bool recording_enabled = recording_st->enable;
bool video_gpu_record = settings->bools.video_gpu_record;
recording_state_t *rec_st = recording_state_get_ptr();
if (!(video_gpu_record && recording_enabled))
if (!(video_gpu_record && rec_st->enable))
{
vk->flags &= ~VK_FLAG_READBACK_STREAMED;
return;
@ -3335,10 +3331,10 @@ static void *vulkan_init(const video_info_t *video,
}
#ifdef VULKAN_HDR_SWAPCHAIN
vk->hdr.max_output_nits = settings->floats.video_hdr_max_nits;
vk->hdr.min_output_nits = 0.001f;
vk->hdr.max_cll = 0.0f;
vk->hdr.max_fall = 0.0f;
vk->hdr.max_output_nits = settings->floats.video_hdr_max_nits;
vk->hdr.min_output_nits = 0.001f;
vk->hdr.max_cll = 0.0f;
vk->hdr.max_fall = 0.0f;
#endif /* VULKAN_HDR_SWAPCHAIN */
vk->video = *video;
@ -3552,7 +3548,7 @@ static void *vulkan_init(const video_info_t *video,
is the simplest solution unless reinit tracking is done */
vk->flags |= VK_FLAG_SHOULD_RESIZE;
vulkan_init_readback(vk, settings);
vulkan_init_readback(vk, settings->bools.video_gpu_record);
return vk;
error:
@ -3830,8 +3826,7 @@ static void vulkan_set_viewport(void *data, unsigned vp_width,
{
float device_aspect = (float)vp_width / vp_height;
struct video_ortho ortho = {0, 1, 0, 1, -1, 1};
settings_t *settings = config_get_ptr();
bool video_scale_integer = settings->bools.video_scale_integer;
bool video_scale_integer = config_get_ptr()->bools.video_scale_integer;
vk_t *vk = (vk_t*)data;
if (vk->ctx_driver->translate_aspect)