mirror of
https://github.com/libretro/RetroArch
synced 2025-02-20 15:40:44 +00:00
Refactor aspect ratio handling.
Rework aspect ratio handling in RGUI. Custom viewports work on PC. Ensure that aspect_ratio_idx persist through reentrancy. Change ASPECT_RATIO_AUTO to ASPECT_RATIO_SQUARE to better signal that it's the square pixel option. Add ASPECT_RATIO_CONFIG as an option to use config file defined aspect ratio.
This commit is contained in:
parent
f1e3cb3b58
commit
be01a0ea59
@ -266,11 +266,13 @@ static const bool aspect_ratio_auto = false; // 1:1 PAR
|
||||
|
||||
#if defined(__CELLOS_LV2) || defined(_XBOX360)
|
||||
static unsigned aspect_ratio_idx = ASPECT_RATIO_16_9;
|
||||
#else
|
||||
#elif defined(RARCH_CONSOLE)
|
||||
static unsigned aspect_ratio_idx = ASPECT_RATIO_4_3;
|
||||
#else
|
||||
static unsigned aspect_ratio_idx = ASPECT_RATIO_CONFIG; // Use g_settings.video.aspect_ratio.
|
||||
#endif
|
||||
|
||||
// Crop overscanned frames (7/8 or 15/15 for interlaced frames).
|
||||
// Crop overscanned frames.
|
||||
static const bool crop_overscan = true;
|
||||
|
||||
// Font size for on-screen messages.
|
||||
|
5
driver.c
5
driver.c
@ -24,6 +24,7 @@
|
||||
#include "audio/utils.h"
|
||||
#include "audio/resampler.h"
|
||||
#include "gfx/thread_wrapper.h"
|
||||
#include "gfx/gfx_common.h"
|
||||
|
||||
#ifdef HAVE_X11
|
||||
#include "gfx/context/x11_common.h"
|
||||
@ -945,6 +946,10 @@ void init_video_input(void)
|
||||
if (driver.video->set_rotation && g_extern.system.rotation)
|
||||
video_set_rotation_func(g_extern.system.rotation);
|
||||
|
||||
if (driver.video_poke->set_aspect_ratio &&
|
||||
g_settings.video.aspect_ratio_idx != ASPECT_RATIO_CONFIG)
|
||||
driver.video_poke->set_aspect_ratio(driver.video_data, g_settings.video.aspect_ratio_idx);
|
||||
|
||||
#ifdef HAVE_X11
|
||||
if (driver.display_type == RARCH_DISPLAY_X11)
|
||||
{
|
||||
|
@ -476,14 +476,21 @@ bool menu_iterate(void)
|
||||
rgui->old_input_state = input_state;
|
||||
input_entry_ret = rgui_iterate(rgui);
|
||||
|
||||
#ifdef HAVE_RGUI
|
||||
#define MENU_TEXTURE_FULLSCREEN false
|
||||
#else
|
||||
#define MENU_TEXTURE_FULLSCREEN true
|
||||
#endif
|
||||
|
||||
// draw last frame for loading messages
|
||||
if (driver.video_poke && driver.video_poke->set_texture_enable)
|
||||
driver.video_poke->set_texture_enable(driver.video_data, rgui->frame_buf_show, true);
|
||||
driver.video_poke->set_texture_enable(driver.video_data, rgui->frame_buf_show, MENU_TEXTURE_FULLSCREEN);
|
||||
|
||||
rarch_render_cached_frame();
|
||||
|
||||
if (driver.video_poke && driver.video_poke->set_texture_enable)
|
||||
driver.video_poke->set_texture_enable(driver.video_data, false, true);
|
||||
driver.video_poke->set_texture_enable(driver.video_data, false,
|
||||
MENU_TEXTURE_FULLSCREEN);
|
||||
|
||||
if (rgui_input_postprocess(rgui, rgui->old_input_state) || input_entry_ret)
|
||||
goto deinit;
|
||||
|
@ -216,6 +216,12 @@ rgui_handle_t *rgui_init(void)
|
||||
rgui->selection_ptr = 0;
|
||||
rgui_settings_populate_entries(rgui);
|
||||
|
||||
// Make sure that custom viewport is something sane incase we use it
|
||||
// before it's configured.
|
||||
rarch_viewport_t *custom = &g_extern.console.screen.viewports.custom_vp;
|
||||
if (driver.video_data && (!custom->width || !custom->height))
|
||||
driver.video->viewport_info(driver.video_data, custom);
|
||||
|
||||
return rgui;
|
||||
}
|
||||
|
||||
@ -1350,26 +1356,21 @@ static void rgui_settings_controller_populate_entries(rgui_handle_t *rgui)
|
||||
|
||||
static int rgui_viewport_iterate(rgui_handle_t *rgui, rgui_action_t action)
|
||||
{
|
||||
rarch_viewport_t vp;
|
||||
driver.video->viewport_info(driver.video_data, &vp);
|
||||
unsigned win_width = vp.full_width;
|
||||
unsigned win_height = vp.full_height;
|
||||
rarch_viewport_t *custom = &g_extern.console.screen.viewports.custom_vp;
|
||||
|
||||
unsigned menu_type = 0;
|
||||
rgui_list_get_last(rgui->menu_stack, NULL, &menu_type);
|
||||
|
||||
(void)win_width;
|
||||
(void)win_height;
|
||||
|
||||
switch (action)
|
||||
{
|
||||
case RGUI_ACTION_UP:
|
||||
if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT)
|
||||
{
|
||||
g_extern.console.screen.viewports.custom_vp.y -= 1;
|
||||
g_extern.console.screen.viewports.custom_vp.height += 1;
|
||||
custom->y -= 1;
|
||||
custom->height += 1;
|
||||
}
|
||||
else
|
||||
g_extern.console.screen.viewports.custom_vp.height -= 1;
|
||||
custom->height -= 1;
|
||||
if (driver.video_poke->apply_state_changes)
|
||||
driver.video_poke->apply_state_changes(driver.video_data);
|
||||
break;
|
||||
@ -1377,11 +1378,11 @@ static int rgui_viewport_iterate(rgui_handle_t *rgui, rgui_action_t action)
|
||||
case RGUI_ACTION_DOWN:
|
||||
if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT)
|
||||
{
|
||||
g_extern.console.screen.viewports.custom_vp.y += 1;
|
||||
g_extern.console.screen.viewports.custom_vp.height -= 1;
|
||||
custom->y += 1;
|
||||
custom->height -= 1;
|
||||
}
|
||||
else
|
||||
g_extern.console.screen.viewports.custom_vp.height += 1;
|
||||
custom->height += 1;
|
||||
if (driver.video_poke->apply_state_changes)
|
||||
driver.video_poke->apply_state_changes(driver.video_data);
|
||||
break;
|
||||
@ -1389,11 +1390,11 @@ static int rgui_viewport_iterate(rgui_handle_t *rgui, rgui_action_t action)
|
||||
case RGUI_ACTION_LEFT:
|
||||
if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT)
|
||||
{
|
||||
g_extern.console.screen.viewports.custom_vp.x -= 1;
|
||||
g_extern.console.screen.viewports.custom_vp.width += 1;
|
||||
custom->x -= 1;
|
||||
custom->width += 1;
|
||||
}
|
||||
else
|
||||
g_extern.console.screen.viewports.custom_vp.width -= 1;
|
||||
custom->width -= 1;
|
||||
if (driver.video_poke->apply_state_changes)
|
||||
driver.video_poke->apply_state_changes(driver.video_data);
|
||||
break;
|
||||
@ -1401,11 +1402,11 @@ static int rgui_viewport_iterate(rgui_handle_t *rgui, rgui_action_t action)
|
||||
case RGUI_ACTION_RIGHT:
|
||||
if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT)
|
||||
{
|
||||
g_extern.console.screen.viewports.custom_vp.x += 1;
|
||||
g_extern.console.screen.viewports.custom_vp.width -= 1;
|
||||
custom->x += 1;
|
||||
custom->width -= 1;
|
||||
}
|
||||
else
|
||||
g_extern.console.screen.viewports.custom_vp.width += 1;
|
||||
custom->width += 1;
|
||||
if (driver.video_poke->apply_state_changes)
|
||||
driver.video_poke->apply_state_changes(driver.video_data);
|
||||
break;
|
||||
@ -1413,28 +1414,30 @@ static int rgui_viewport_iterate(rgui_handle_t *rgui, rgui_action_t action)
|
||||
case RGUI_ACTION_CANCEL:
|
||||
rgui_list_pop(rgui->menu_stack, &rgui->selection_ptr);
|
||||
if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT_2)
|
||||
rgui_list_push(rgui->menu_stack, "", RGUI_SETTINGS_CUSTOM_VIEWPORT, 0);
|
||||
rgui_list_push(rgui->menu_stack, "", RGUI_SETTINGS_CUSTOM_VIEWPORT,
|
||||
rgui->selection_ptr);
|
||||
break;
|
||||
|
||||
case RGUI_ACTION_OK:
|
||||
rgui_list_pop(rgui->menu_stack, &rgui->selection_ptr);
|
||||
if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT)
|
||||
rgui_list_push(rgui->menu_stack, "", RGUI_SETTINGS_CUSTOM_VIEWPORT_2, 0);
|
||||
rgui_list_push(rgui->menu_stack, "", RGUI_SETTINGS_CUSTOM_VIEWPORT_2,
|
||||
rgui->selection_ptr);
|
||||
break;
|
||||
|
||||
case RGUI_ACTION_START:
|
||||
#ifdef GEKKO
|
||||
if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT)
|
||||
{
|
||||
g_extern.console.screen.viewports.custom_vp.width += g_extern.console.screen.viewports.custom_vp.x;
|
||||
g_extern.console.screen.viewports.custom_vp.height += g_extern.console.screen.viewports.custom_vp.y;
|
||||
g_extern.console.screen.viewports.custom_vp.x = 0;
|
||||
g_extern.console.screen.viewports.custom_vp.y = 0;
|
||||
custom->width += custom->x;
|
||||
custom->height += custom->y;
|
||||
custom->x = 0;
|
||||
custom->y = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_extern.console.screen.viewports.custom_vp.width = win_width - g_extern.console.screen.viewports.custom_vp.x;
|
||||
g_extern.console.screen.viewports.custom_vp.height = win_height - g_extern.console.screen.viewports.custom_vp.y;
|
||||
custom->width = win_width - custom->x;
|
||||
custom->height = win_height - custom->y;
|
||||
}
|
||||
#endif
|
||||
if (driver.video_poke->apply_state_changes)
|
||||
@ -1457,10 +1460,16 @@ static int rgui_viewport_iterate(rgui_handle_t *rgui, rgui_action_t action)
|
||||
|
||||
render_text(rgui);
|
||||
|
||||
const char *base_msg = NULL;
|
||||
if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT)
|
||||
render_messagebox(rgui, "Set Upper-Left Corner");
|
||||
base_msg = "Set Upper-Left Corner";
|
||||
else if (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT_2)
|
||||
render_messagebox(rgui, "Set Bottom-Right Corner");
|
||||
base_msg = "Set Bottom-Right Corner";
|
||||
|
||||
char msg[64];
|
||||
snprintf(msg, sizeof(msg), "%s (%d, %d : %4ux%4u)",
|
||||
base_msg, custom->x, custom->y, custom->width, custom->height);
|
||||
render_messagebox(rgui, msg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1541,16 +1550,20 @@ static int rgui_settings_iterate(rgui_handle_t *rgui, rgui_action_t action)
|
||||
else if (type == RGUI_SETTINGS_CUSTOM_VIEWPORT && action == RGUI_ACTION_OK)
|
||||
{
|
||||
rgui_list_push(rgui->menu_stack, "", type, rgui->selection_ptr);
|
||||
g_settings.video.aspect_ratio_idx = ASPECT_RATIO_CUSTOM;
|
||||
|
||||
// Start with something sane.
|
||||
rarch_viewport_t *custom = &g_extern.console.screen.viewports.custom_vp;
|
||||
driver.video->viewport_info(driver.video_data, custom);
|
||||
|
||||
g_settings.video.aspect_ratio_idx = ASPECT_RATIO_CUSTOM;
|
||||
if (driver.video_poke->set_aspect_ratio)
|
||||
driver.video_poke->set_aspect_ratio(driver.video_data, g_settings.video.aspect_ratio_idx);
|
||||
driver.video_poke->set_aspect_ratio(driver.video_data,
|
||||
g_settings.video.aspect_ratio_idx);
|
||||
}
|
||||
else
|
||||
{
|
||||
int ret = rgui_settings_toggle_setting(rgui, type, action, menu_type);
|
||||
|
||||
if (ret != 0)
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
break;
|
||||
|
@ -165,31 +165,34 @@ void gfx_scale_integer(struct rarch_viewport *vp, unsigned width, unsigned heigh
|
||||
}
|
||||
|
||||
struct aspect_ratio_elem aspectratio_lut[ASPECT_RATIO_END] = {
|
||||
{ "4:3", 1.3333f },
|
||||
{ "16:9", 1.7778f },
|
||||
{ "16:10", 1.6f },
|
||||
{ "16:15", 16.0f / 15.0f },
|
||||
#ifdef RARCH_CONSOLE
|
||||
{ "1:1", 1.0f },
|
||||
{ "2:1", 2.0f },
|
||||
{ "3:2", 1.5f },
|
||||
{ "3:4", 0.75f },
|
||||
{ "4:1", 4.0f },
|
||||
{ "4:3", 1.3333f },
|
||||
{ "4:4", 1.0f },
|
||||
{ "5:4", 1.25f },
|
||||
{ "6:5", 1.2f },
|
||||
{ "7:9", 0.7777f },
|
||||
{ "8:3", 2.6666f },
|
||||
{ "8:7", 1.1428f },
|
||||
{ "16:9", 1.7778f },
|
||||
{ "16:10", 1.6f },
|
||||
{ "16:15", 16.0f / 15.0f },
|
||||
{ "19:12", 1.5833f },
|
||||
{ "19:14", 1.3571f },
|
||||
{ "30:17", 1.7647f },
|
||||
{ "32:9", 3.5555f },
|
||||
{ "Auto", 1.0f },
|
||||
{ "Core Provided", 1.0f },
|
||||
#endif
|
||||
{ "Config", 0.0f },
|
||||
{ "Square pixel", 1.0f },
|
||||
{ "Core provided", 1.0f },
|
||||
{ "Custom", 0.0f }
|
||||
};
|
||||
|
||||
char rotation_lut[ASPECT_RATIO_END][32] =
|
||||
char rotation_lut[4][32] =
|
||||
{
|
||||
"Normal",
|
||||
"Vertical",
|
||||
@ -197,29 +200,27 @@ char rotation_lut[ASPECT_RATIO_END][32] =
|
||||
"Flipped Rotated"
|
||||
};
|
||||
|
||||
void gfx_set_auto_viewport(unsigned width, unsigned height)
|
||||
void gfx_set_square_pixel_viewport(unsigned width, unsigned height)
|
||||
{
|
||||
if (width == 0 || height == 0)
|
||||
return;
|
||||
|
||||
unsigned aspect_x, aspect_y, len, highest, i;
|
||||
|
||||
len = width < height ? width : height;
|
||||
highest = 1;
|
||||
for (i = 1; i < len; i++)
|
||||
unsigned len = min(width, height);
|
||||
unsigned highest = 1;
|
||||
for (unsigned i = 1; i < len; i++)
|
||||
{
|
||||
if ((width % i) == 0 && (height % i) == 0)
|
||||
highest = i;
|
||||
}
|
||||
|
||||
aspect_x = width / highest;
|
||||
aspect_y = height / highest;
|
||||
unsigned aspect_x = width / highest;
|
||||
unsigned aspect_y = height / highest;
|
||||
|
||||
snprintf(aspectratio_lut[ASPECT_RATIO_AUTO].name,
|
||||
sizeof(aspectratio_lut[ASPECT_RATIO_AUTO].name),
|
||||
"%d:%d (Auto)", aspect_x, aspect_y);
|
||||
snprintf(aspectratio_lut[ASPECT_RATIO_SQUARE].name,
|
||||
sizeof(aspectratio_lut[ASPECT_RATIO_SQUARE].name),
|
||||
"%u:%u (1:1 PAR)", aspect_x, aspect_y);
|
||||
|
||||
aspectratio_lut[ASPECT_RATIO_AUTO].value = (float)aspect_x / aspect_y;
|
||||
aspectratio_lut[ASPECT_RATIO_SQUARE].value = (float)aspect_x / aspect_y;
|
||||
}
|
||||
|
||||
void gfx_set_core_viewport(void)
|
||||
@ -227,10 +228,26 @@ void gfx_set_core_viewport(void)
|
||||
if (!g_extern.main_is_init)
|
||||
return;
|
||||
|
||||
// fallback to 1:1 pixel ratio if none provided
|
||||
if (g_extern.system.av_info.geometry.aspect_ratio == 0.0)
|
||||
aspectratio_lut[ASPECT_RATIO_CORE].value = (float)g_extern.system.av_info.geometry.base_width / g_extern.system.av_info.geometry.base_height;
|
||||
const struct retro_game_geometry *geom = &g_extern.system.av_info.geometry;
|
||||
|
||||
// Fallback to 1:1 pixel ratio if none provided
|
||||
if (geom->aspect_ratio > 0.0f)
|
||||
aspectratio_lut[ASPECT_RATIO_CORE].value = geom->aspect_ratio;
|
||||
else
|
||||
aspectratio_lut[ASPECT_RATIO_CORE].value = g_extern.system.av_info.geometry.aspect_ratio;
|
||||
aspectratio_lut[ASPECT_RATIO_CORE].value = (float)geom->base_width / geom->base_height;
|
||||
}
|
||||
|
||||
void gfx_set_config_viewport(void)
|
||||
{
|
||||
if (g_settings.video.aspect_ratio < 0.0f)
|
||||
{
|
||||
const struct retro_game_geometry *geom = &g_extern.system.av_info.geometry;
|
||||
if (geom->aspect_ratio > 0.0f && g_settings.video.aspect_ratio_auto)
|
||||
aspectratio_lut[ASPECT_RATIO_CONFIG].value = geom->aspect_ratio;
|
||||
else
|
||||
aspectratio_lut[ASPECT_RATIO_CONFIG].value = (float)geom->base_width / geom->base_height; // 1:1 PAR.
|
||||
}
|
||||
else
|
||||
aspectratio_lut[ASPECT_RATIO_CONFIG].value = g_settings.video.aspect_ratio;
|
||||
}
|
||||
|
||||
|
@ -57,30 +57,33 @@ typedef struct
|
||||
|
||||
enum aspect_ratio
|
||||
{
|
||||
ASPECT_RATIO_1_1 = 0,
|
||||
ASPECT_RATIO_4_3 = 0,
|
||||
ASPECT_RATIO_16_9,
|
||||
ASPECT_RATIO_16_10,
|
||||
ASPECT_RATIO_16_15,
|
||||
#ifdef RARCH_CONSOLE // None of these aspect ratios make any sense.
|
||||
ASPECT_RATIO_1_1,
|
||||
ASPECT_RATIO_2_1,
|
||||
ASPECT_RATIO_3_2,
|
||||
ASPECT_RATIO_3_4,
|
||||
ASPECT_RATIO_4_1,
|
||||
ASPECT_RATIO_4_3,
|
||||
ASPECT_RATIO_4_4,
|
||||
ASPECT_RATIO_5_4,
|
||||
ASPECT_RATIO_6_5,
|
||||
ASPECT_RATIO_7_9,
|
||||
ASPECT_RATIO_8_3,
|
||||
ASPECT_RATIO_8_7,
|
||||
ASPECT_RATIO_16_9,
|
||||
ASPECT_RATIO_16_10,
|
||||
ASPECT_RATIO_16_15,
|
||||
ASPECT_RATIO_19_12,
|
||||
ASPECT_RATIO_19_14,
|
||||
ASPECT_RATIO_30_17,
|
||||
ASPECT_RATIO_32_9,
|
||||
ASPECT_RATIO_AUTO,
|
||||
#endif
|
||||
ASPECT_RATIO_CONFIG,
|
||||
ASPECT_RATIO_SQUARE,
|
||||
ASPECT_RATIO_CORE,
|
||||
ASPECT_RATIO_CUSTOM,
|
||||
|
||||
ASPECT_RATIO_END,
|
||||
ASPECT_RATIO_END
|
||||
};
|
||||
|
||||
#define LAST_ASPECT_RATIO ASPECT_RATIO_CUSTOM
|
||||
@ -96,7 +99,7 @@ enum rotation
|
||||
|
||||
#define LAST_ORIENTATION (ORIENTATION_END - 1)
|
||||
|
||||
extern char rotation_lut[ASPECT_RATIO_END][32];
|
||||
extern char rotation_lut[4][32];
|
||||
|
||||
/* ABGR color format defines */
|
||||
|
||||
@ -120,8 +123,9 @@ struct aspect_ratio_elem
|
||||
|
||||
extern struct aspect_ratio_elem aspectratio_lut[ASPECT_RATIO_END];
|
||||
|
||||
extern void gfx_set_auto_viewport(unsigned width, unsigned height);
|
||||
extern void gfx_set_core_viewport(void);
|
||||
void gfx_set_square_pixel_viewport(unsigned width, unsigned height);
|
||||
void gfx_set_core_viewport(void);
|
||||
void gfx_set_config_viewport(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
71
gfx/gl.c
71
gfx/gl.c
@ -702,7 +702,7 @@ void gl_set_viewport(void *data, unsigned width, unsigned height, bool force_ful
|
||||
{
|
||||
gl_t *gl = (gl_t*)data;
|
||||
|
||||
unsigned x = 0, y = 0;
|
||||
int x = 0, y = 0;
|
||||
struct gl_ortho ortho = {0, 1, 0, 1, -1, 1};
|
||||
|
||||
float device_aspect = 0.0f;
|
||||
@ -725,10 +725,14 @@ void gl_set_viewport(void *data, unsigned width, unsigned height, bool force_ful
|
||||
#if defined(HAVE_RGUI) || defined(HAVE_RMENU)
|
||||
if (g_settings.video.aspect_ratio_idx == ASPECT_RATIO_CUSTOM)
|
||||
{
|
||||
x = g_extern.console.screen.viewports.custom_vp.x;
|
||||
y = g_extern.console.screen.viewports.custom_vp.y;
|
||||
width = g_extern.console.screen.viewports.custom_vp.width;
|
||||
height = g_extern.console.screen.viewports.custom_vp.height;
|
||||
const struct rarch_viewport *custom =
|
||||
&g_extern.console.screen.viewports.custom_vp;
|
||||
|
||||
// GL has bottom-left origin viewport.
|
||||
x = custom->x;
|
||||
y = gl->win_height - custom->y - custom->height;
|
||||
width = custom->width;
|
||||
height = custom->height;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
@ -2242,34 +2246,6 @@ static void gl_get_overlay_interface(void *data, const video_overlay_interface_t
|
||||
}
|
||||
#endif
|
||||
|
||||
static void gl_set_filtering(void *data, unsigned index, bool smooth)
|
||||
{
|
||||
gl_t *gl = (gl_t*)data;
|
||||
|
||||
GLuint filter = smooth ? GL_LINEAR : GL_NEAREST;
|
||||
if (index == 1)
|
||||
{
|
||||
gl->tex_filter = filter;
|
||||
// Apply to all PREV textures.
|
||||
for (unsigned i = 0; i < TEXTURES; i++)
|
||||
{
|
||||
glBindTexture(GL_TEXTURE_2D, gl->texture[i]);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter);
|
||||
}
|
||||
}
|
||||
#ifdef HAVE_FBO
|
||||
else if (index >= 2 && gl->fbo_inited)
|
||||
{
|
||||
glBindTexture(GL_TEXTURE_2D, gl->fbo_texture[index - 2]);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter);
|
||||
}
|
||||
#endif
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, gl->texture[gl->tex_index]);
|
||||
}
|
||||
|
||||
#ifdef HAVE_FBO
|
||||
static uintptr_t gl_get_current_framebuffer(void *data)
|
||||
{
|
||||
@ -2284,19 +2260,30 @@ static retro_proc_address_t gl_get_proc_address(void *data, const char *sym)
|
||||
}
|
||||
#endif
|
||||
|
||||
static void gl_set_aspect_ratio(void *data, unsigned aspectratio_index)
|
||||
static void gl_set_aspect_ratio(void *data, unsigned aspect_ratio_idx)
|
||||
{
|
||||
gl_t *gl = (gl_t*)data;
|
||||
|
||||
if (g_settings.video.aspect_ratio_idx == ASPECT_RATIO_AUTO)
|
||||
gfx_set_auto_viewport(g_extern.frame_cache.width, g_extern.frame_cache.height);
|
||||
else if (g_settings.video.aspect_ratio_idx == ASPECT_RATIO_CORE)
|
||||
gfx_set_core_viewport();
|
||||
switch (aspect_ratio_idx)
|
||||
{
|
||||
case ASPECT_RATIO_SQUARE:
|
||||
gfx_set_square_pixel_viewport(g_extern.frame_cache.width, g_extern.frame_cache.height);
|
||||
break;
|
||||
|
||||
g_extern.system.aspect_ratio = aspectratio_lut[g_settings.video.aspect_ratio_idx].value;
|
||||
g_settings.video.force_aspect = false;
|
||||
case ASPECT_RATIO_CORE:
|
||||
gfx_set_core_viewport();
|
||||
break;
|
||||
|
||||
case ASPECT_RATIO_CONFIG:
|
||||
gfx_set_config_viewport();
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
g_extern.system.aspect_ratio = aspectratio_lut[aspect_ratio_idx].value;
|
||||
gl->keep_aspect = true;
|
||||
|
||||
gl->should_resize = true;
|
||||
}
|
||||
|
||||
@ -2375,7 +2362,7 @@ static void gl_show_mouse(void *data, bool state)
|
||||
}
|
||||
|
||||
static const video_poke_interface_t gl_poke_interface = {
|
||||
gl_set_filtering,
|
||||
NULL,
|
||||
#ifdef HAVE_FBO
|
||||
gl_get_current_framebuffer,
|
||||
gl_get_proc_address,
|
||||
|
@ -281,17 +281,18 @@ const char *gx_get_video_mode(void)
|
||||
return format;
|
||||
}
|
||||
|
||||
static void gx_set_aspect_ratio(void *data, unsigned aspectratio_idx)
|
||||
static void gx_set_aspect_ratio(void *data, unsigned aspect_ratio_idx)
|
||||
{
|
||||
gx_video_t *gx = (gx_video_t*)driver.video_data;
|
||||
|
||||
if (g_settings.video.aspect_ratio_idx == ASPECT_RATIO_AUTO)
|
||||
gfx_set_auto_viewport(g_extern.frame_cache.width, g_extern.frame_cache.height);
|
||||
else if(g_settings.video.aspect_ratio_idx == ASPECT_RATIO_CORE)
|
||||
if (aspect_ratio_idx == ASPECT_RATIO_SQUARE)
|
||||
gfx_set_square_pixel_viewport(g_extern.frame_cache.width, g_extern.frame_cache.height);
|
||||
else if (aspect_ratio_idx == ASPECT_RATIO_CORE)
|
||||
gfx_set_core_viewport();
|
||||
else if (aspect_ratio_idx == ASPECT_RATIO_CONFIG)
|
||||
gfx_set_config_viewport();
|
||||
|
||||
g_extern.system.aspect_ratio = aspectratio_lut[g_settings.video.aspect_ratio_idx].value;
|
||||
g_settings.video.force_aspect = false;
|
||||
g_extern.system.aspect_ratio = aspectratio_lut[aspect_ratio_idx].value;
|
||||
gx->keep_aspect = true;
|
||||
gx->should_resize = true;
|
||||
}
|
||||
|
@ -170,6 +170,7 @@ void config_set_defaults(void)
|
||||
g_settings.video.crop_overscan = crop_overscan;
|
||||
g_settings.video.aspect_ratio = aspect_ratio;
|
||||
g_settings.video.aspect_ratio_auto = aspect_ratio_auto; // Let implementation decide if automatic, or 1:1 PAR.
|
||||
g_settings.video.aspect_ratio_idx = aspect_ratio_idx;
|
||||
g_settings.video.shader_enable = shader_enable;
|
||||
g_settings.video.allow_rotate = allow_rotate;
|
||||
|
||||
@ -265,7 +266,6 @@ void config_set_defaults(void)
|
||||
strlcpy(g_extern.menu_texture_path, default_paths.menu_border_file, sizeof(g_extern.menu_texture_path));
|
||||
#endif
|
||||
|
||||
g_settings.video.aspect_ratio_idx = aspect_ratio_idx;
|
||||
g_extern.state_slot = 0;
|
||||
g_extern.audio_data.mute = 0;
|
||||
g_extern.verbose = true;
|
||||
@ -452,7 +452,6 @@ bool config_load_file(const char *path)
|
||||
/* TODO - will be refactored later to make it more clean - it's more
|
||||
* important that it works for consoles right now */
|
||||
CONFIG_GET_INT(video.aspect_ratio_idx, "aspect_ratio_index");
|
||||
CONFIG_GET_FLOAT(video.aspect_ratio, "video_aspect_ratio");
|
||||
|
||||
for (unsigned i = 0; i < MAX_PLAYERS; i++)
|
||||
{
|
||||
|
@ -1069,18 +1069,19 @@ static bool xdk_d3d_focus(void *data)
|
||||
return gfx_ctx_window_has_focus();
|
||||
}
|
||||
|
||||
static void xdk_d3d_set_aspect_ratio(void *data, unsigned aspectratio_index)
|
||||
static void xdk_d3d_set_aspect_ratio(void *data, unsigned aspect_ratio_idx)
|
||||
{
|
||||
(void)data;
|
||||
xdk_d3d_video_t *d3d = (xdk_d3d_video_t*)driver.video_data;
|
||||
|
||||
if (g_settings.video.aspect_ratio_idx == ASPECT_RATIO_AUTO)
|
||||
gfx_set_auto_viewport(g_extern.frame_cache.width, g_extern.frame_cache.height);
|
||||
else if (g_settings.video.aspect_ratio_idx == ASPECT_RATIO_CORE)
|
||||
if (aspect_ratio_idx == ASPECT_RATIO_SQUARE)
|
||||
gfx_set_square_pixel_viewport(g_extern.frame_cache.width, g_extern.frame_cache.height);
|
||||
else if (aspect_ratio_idx == ASPECT_RATIO_CORE)
|
||||
gfx_set_core_viewport();
|
||||
else if (aspect_ratio_idx == ASPECT_RATIO_CONFIG)
|
||||
gfx_set_config_viewport();
|
||||
|
||||
g_settings.video.aspect_ratio = aspectratio_lut[g_settings.video.aspect_ratio_idx].value;
|
||||
g_settings.video.force_aspect = false;
|
||||
g_settings.video.aspect_ratio = aspectratio_lut[aspect_ratio_idx].value;
|
||||
d3d->should_resize = true;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user