From be01a0ea5977292fd5b66119826fa2ab33c9d587 Mon Sep 17 00:00:00 2001 From: Themaister Date: Sat, 20 Apr 2013 10:56:04 +0200 Subject: [PATCH] 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. --- config.def.h | 6 ++- driver.c | 5 +++ frontend/menu/menu_common.c | 11 +++++- frontend/menu/rgui.c | 79 +++++++++++++++++++++---------------- gfx/gfx_common.c | 63 ++++++++++++++++++----------- gfx/gfx_common.h | 24 ++++++----- gfx/gl.c | 71 ++++++++++++++------------------- gx/gx_video.c | 13 +++--- settings.c | 3 +- xdk/xdk_d3d.cpp | 13 +++--- 10 files changed, 162 insertions(+), 126 deletions(-) diff --git a/config.def.h b/config.def.h index d48b36e92f..20d57fa6cc 100644 --- a/config.def.h +++ b/config.def.h @@ -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. diff --git a/driver.c b/driver.c index 2655a55780..6b58747474 100644 --- a/driver.c +++ b/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) { diff --git a/frontend/menu/menu_common.c b/frontend/menu/menu_common.c index 5ef7483078..af1097d030 100644 --- a/frontend/menu/menu_common.c +++ b/frontend/menu/menu_common.c @@ -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; diff --git a/frontend/menu/rgui.c b/frontend/menu/rgui.c index 2dffc8e0a5..697bd09d4e 100644 --- a/frontend/menu/rgui.c +++ b/frontend/menu/rgui.c @@ -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; diff --git a/gfx/gfx_common.c b/gfx/gfx_common.c index d6515b4167..cde4cb2af0 100644 --- a/gfx/gfx_common.c +++ b/gfx/gfx_common.c @@ -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; } diff --git a/gfx/gfx_common.h b/gfx/gfx_common.h index 616b582485..00f28689f2 100644 --- a/gfx/gfx_common.h +++ b/gfx/gfx_common.h @@ -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 } diff --git a/gfx/gl.c b/gfx/gl.c index 19def50407..8f5182f3c9 100644 --- a/gfx/gl.c +++ b/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, diff --git a/gx/gx_video.c b/gx/gx_video.c index 3def68d478..546cf5f351 100644 --- a/gx/gx_video.c +++ b/gx/gx_video.c @@ -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; } diff --git a/settings.c b/settings.c index 34524fdd6a..9e114a16b0 100644 --- a/settings.c +++ b/settings.c @@ -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++) { diff --git a/xdk/xdk_d3d.cpp b/xdk/xdk_d3d.cpp index d75bb4b188..4419e00ec0 100644 --- a/xdk/xdk_d3d.cpp +++ b/xdk/xdk_d3d.cpp @@ -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; }