(PS3) Overscan options added

This commit is contained in:
TwinAphex51224 2012-02-02 18:39:09 +01:00
parent 09a6566be0
commit a328dbd213
5 changed files with 111 additions and 14 deletions

View File

@ -175,10 +175,12 @@ struct console_settings
bool default_savestate_dir_enable; bool default_savestate_dir_enable;
bool ingame_menu_enable; bool ingame_menu_enable;
bool menu_enable; bool menu_enable;
bool overscan_enable;
bool return_to_multiman_enable; bool return_to_multiman_enable;
bool screenshots_enable; bool screenshots_enable;
bool throttle_enable; bool throttle_enable;
bool triple_buffering_enable; bool triple_buffering_enable;
float overscan_amount;
uint32_t aspect_ratio_index; uint32_t aspect_ratio_index;
uint32_t screen_orientation; uint32_t screen_orientation;
uint32_t current_resolution_index; uint32_t current_resolution_index;

View File

@ -170,6 +170,8 @@ static void set_default_settings(void)
g_console.aspect_ratio_index = 0; g_console.aspect_ratio_index = 0;
strlcpy(g_console.aspect_ratio_name, "4:3", sizeof(g_console.aspect_ratio_name)); strlcpy(g_console.aspect_ratio_name, "4:3", sizeof(g_console.aspect_ratio_name));
g_console.menu_font_size = 1.0f; g_console.menu_font_size = 1.0f;
g_console.overscan_enable = false;
g_console.overscan_amount = 0.0f;
// g_extern // g_extern
g_extern.state_slot = 0; g_extern.state_slot = 0;
@ -205,6 +207,7 @@ static void init_settings(void)
// g_console // g_console
CONFIG_GET_BOOL_CONSOLE(overscan_enable, "overscan_enable");
CONFIG_GET_BOOL_CONSOLE(screenshots_enable, "screenshots_enable"); CONFIG_GET_BOOL_CONSOLE(screenshots_enable, "screenshots_enable");
CONFIG_GET_BOOL_CONSOLE(throttle_enable, "throttle_enable"); CONFIG_GET_BOOL_CONSOLE(throttle_enable, "throttle_enable");
CONFIG_GET_BOOL_CONSOLE(triple_buffering_enable, "triple_buffering_enable"); CONFIG_GET_BOOL_CONSOLE(triple_buffering_enable, "triple_buffering_enable");
@ -214,6 +217,7 @@ static void init_settings(void)
CONFIG_GET_STRING_CONSOLE(aspect_ratio_name, "aspect_ratio_name"); CONFIG_GET_STRING_CONSOLE(aspect_ratio_name, "aspect_ratio_name");
CONFIG_GET_STRING_CONSOLE(default_rom_startup_dir, "default_rom_startup_dir"); CONFIG_GET_STRING_CONSOLE(default_rom_startup_dir, "default_rom_startup_dir");
CONFIG_GET_FLOAT_CONSOLE(menu_font_size, "menu_font_size"); CONFIG_GET_FLOAT_CONSOLE(menu_font_size, "menu_font_size");
CONFIG_GET_FLOAT_CONSOLE(overscan_amount, "overscan_amount");
// g_extern // g_extern
CONFIG_GET_INT_EXTERN(state_slot, "state_slot"); CONFIG_GET_INT_EXTERN(state_slot, "state_slot");
@ -248,6 +252,7 @@ static void save_settings(void)
config_set_bool(conf, "video_vsync", g_settings.video.vsync); config_set_bool(conf, "video_vsync", g_settings.video.vsync);
// g_console // g_console
config_set_bool(conf, "overscan_enable", g_console.overscan_enable);
config_set_bool(conf, "screenshots_enable", g_console.screenshots_enable); config_set_bool(conf, "screenshots_enable", g_console.screenshots_enable);
config_set_bool(conf, "throttle_enable", g_console.throttle_enable); config_set_bool(conf, "throttle_enable", g_console.throttle_enable);
config_set_bool(conf, "triple_buffering_enable", g_console.triple_buffering_enable); config_set_bool(conf, "triple_buffering_enable", g_console.triple_buffering_enable);
@ -257,6 +262,7 @@ static void save_settings(void)
config_set_string(conf, "aspect_ratio_name", g_console.aspect_ratio_name); config_set_string(conf, "aspect_ratio_name", g_console.aspect_ratio_name);
config_set_string(conf, "default_rom_startup_dir", g_console.default_rom_startup_dir); config_set_string(conf, "default_rom_startup_dir", g_console.default_rom_startup_dir);
config_set_float(conf, "menu_font_size", g_console.menu_font_size); config_set_float(conf, "menu_font_size", g_console.menu_font_size);
config_set_float(conf, "overscan_amount", g_console.overscan_amount);
// g_extern // g_extern
config_set_int(conf, "state_slot", g_extern.state_slot); config_set_int(conf, "state_slot", g_extern.state_slot);
@ -486,12 +492,28 @@ static void ingame_menu(void)
case MENU_ITEM_OVERSCAN_AMOUNT: case MENU_ITEM_OVERSCAN_AMOUNT:
if(CTRL_LEFT(button_was_pressed) || CTRL_LSTICK_LEFT(button_was_pressed) || CTRL_CROSS(button_was_pressed) || CTRL_LSTICK_LEFT(button_was_held)) if(CTRL_LEFT(button_was_pressed) || CTRL_LSTICK_LEFT(button_was_pressed) || CTRL_CROSS(button_was_pressed) || CTRL_LSTICK_LEFT(button_was_held))
{ {
g_console.overscan_amount -= 0.01f;
g_console.overscan_enable = true;
if(g_console.overscan_amount == 0.00f)
g_console.overscan_enable = false;
ps3graphics_set_overscan(g_console.overscan_enable, g_console.overscan_amount, 1);
} }
if(CTRL_RIGHT(button_was_pressed) || CTRL_LSTICK_RIGHT(button_was_pressed) || CTRL_CROSS(button_was_pressed) || CTRL_LSTICK_RIGHT(button_was_held)) if(CTRL_RIGHT(button_was_pressed) || CTRL_LSTICK_RIGHT(button_was_pressed) || CTRL_CROSS(button_was_pressed) || CTRL_LSTICK_RIGHT(button_was_held))
{ {
g_console.overscan_amount += 0.01f;
g_console.overscan_enable = true;
if(g_console.overscan_amount == 0.0f)
g_console.overscan_amount = false;
ps3graphics_set_overscan(g_console.overscan_enable, g_console.overscan_amount, 1);
} }
if(CTRL_START(button_was_pressed)) if(CTRL_START(button_was_pressed))
{ {
g_console.overscan_amount = 0.0f;
g_console.overscan_enable = false;
ps3graphics_set_overscan(g_console.overscan_enable, g_console.overscan_amount, 1);
} }
ingame_menu_reset_entry_colors (ingame_menu_item); ingame_menu_reset_entry_colors (ingame_menu_item);
strcpy(comment, "Press LEFT or RIGHT to change the [Overscan] settings.\nPress START to reset back to default values."); strcpy(comment, "Press LEFT or RIGHT to change the [Overscan] settings.\nPress START to reset back to default values.");
@ -657,7 +679,8 @@ static void ingame_menu(void)
cellDbgFontPrintf (x_position, (ypos+(ypos_increment*MENU_ITEM_KEEP_ASPECT_RATIO)), font_size+0.01f, BLUE, "Aspect Ratio: %s", g_console.aspect_ratio_name); cellDbgFontPrintf (x_position, (ypos+(ypos_increment*MENU_ITEM_KEEP_ASPECT_RATIO)), font_size+0.01f, BLUE, "Aspect Ratio: %s", g_console.aspect_ratio_name);
cellDbgFontPrintf(x_position, (ypos+(ypos_increment*MENU_ITEM_KEEP_ASPECT_RATIO)), font_size, menuitem_colors[MENU_ITEM_KEEP_ASPECT_RATIO], "Aspect Ratio: %s", g_console.aspect_ratio_name); cellDbgFontPrintf(x_position, (ypos+(ypos_increment*MENU_ITEM_KEEP_ASPECT_RATIO)), font_size, menuitem_colors[MENU_ITEM_KEEP_ASPECT_RATIO], "Aspect Ratio: %s", g_console.aspect_ratio_name);
cellDbgFontPrintf(x_position, (ypos+(ypos_increment*MENU_ITEM_OVERSCAN_AMOUNT)), font_size, menuitem_colors[MENU_ITEM_OVERSCAN_AMOUNT], "Overscan: "); cellDbgFontPrintf(x_position, (ypos+(ypos_increment*MENU_ITEM_OVERSCAN_AMOUNT)), font_size+0.01f, BLUE, "Overscan: %f", g_console.overscan_amount);
cellDbgFontPrintf(x_position, (ypos+(ypos_increment*MENU_ITEM_OVERSCAN_AMOUNT)), font_size, menuitem_colors[MENU_ITEM_OVERSCAN_AMOUNT], "Overscan: %f", g_console.overscan_amount);
cellDbgFontPrintf (x_position, (ypos+(ypos_increment*MENU_ITEM_ORIENTATION)), font_size+0.01f, BLUE, "Orientation: "); cellDbgFontPrintf (x_position, (ypos+(ypos_increment*MENU_ITEM_ORIENTATION)), font_size+0.01f, BLUE, "Orientation: ");
cellDbgFontPrintf (x_position, (ypos+(ypos_increment*MENU_ITEM_ORIENTATION)), font_size, menuitem_colors[MENU_ITEM_ORIENTATION], "Orientation: %s", msg_temp); cellDbgFontPrintf (x_position, (ypos+(ypos_increment*MENU_ITEM_ORIENTATION)), font_size, menuitem_colors[MENU_ITEM_ORIENTATION], "Orientation: %s", msg_temp);

View File

@ -417,6 +417,12 @@ static void set_setting_label(menu * menu_obj, int currentsetting)
snprintf(menu_obj->items[currentsetting].comment, sizeof(menu_obj->items[currentsetting].comment), "INFO - [Custom Scaling Factor] is set to: '%fx (X) / %fx (Y)'.", g_settings.video.fbo_scale_x, g_settings.video.fbo_scale_y); snprintf(menu_obj->items[currentsetting].comment, sizeof(menu_obj->items[currentsetting].comment), "INFO - [Custom Scaling Factor] is set to: '%fx (X) / %fx (Y)'.", g_settings.video.fbo_scale_x, g_settings.video.fbo_scale_y);
break; break;
case SETTING_HW_OVERSCAN_AMOUNT: case SETTING_HW_OVERSCAN_AMOUNT:
if(g_console.overscan_amount == 0.0f)
menu_obj->items[currentsetting].text_color = GREEN;
else
menu_obj->items[currentsetting].text_color = ORANGE;
snprintf(menu_obj->items[currentsetting].setting_text, sizeof(menu_obj->items[currentsetting].setting_text), "%f", g_console.overscan_amount);
break; break;
case SETTING_THROTTLE_MODE: case SETTING_THROTTLE_MODE:
if(g_console.throttle_enable) if(g_console.throttle_enable)
@ -1125,6 +1131,32 @@ static void producesettingentry(menu * menu_obj, uint64_t switchvalue)
} }
break; break;
case SETTING_HW_OVERSCAN_AMOUNT: case SETTING_HW_OVERSCAN_AMOUNT:
if(CTRL_LEFT(state) || CTRL_LSTICK_LEFT(state) || CTRL_CROSS(state))
{
g_console.overscan_amount -= 0.01f;
g_console.overscan_enable = true;
if(g_console.overscan_amount == 0.0f)
g_console.overscan_enable = false;
ps3graphics_set_overscan(g_console.overscan_enable, g_console.overscan_amount, 1);
}
if(CTRL_RIGHT(state) || CTRL_LSTICK_RIGHT(state) || CTRL_CROSS(state))
{
g_console.overscan_amount += 0.01f;
g_console.overscan_enable = true;
if(g_console.overscan_amount == 0.0f)
g_console.overscan_enable = 0;
ps3graphics_set_overscan(g_console.overscan_enable, g_console.overscan_amount, 1);
}
if(CTRL_START(state))
{
g_console.overscan_amount = 0.0f;
g_console.overscan_enable = false;
ps3graphics_set_overscan(g_console.overscan_enable, g_console.overscan_amount, 1);
}
break; break;
case SETTING_THROTTLE_MODE: case SETTING_THROTTLE_MODE:
if(CTRL_LEFT(state) || CTRL_LSTICK_LEFT(state) || CTRL_RIGHT(state) || CTRL_LSTICK_RIGHT(state)) if(CTRL_LEFT(state) || CTRL_LSTICK_LEFT(state) || CTRL_RIGHT(state) || CTRL_LSTICK_RIGHT(state))

View File

@ -119,6 +119,7 @@ typedef struct gl
bool render_to_tex; bool render_to_tex;
bool should_resize; bool should_resize;
bool vsync; bool vsync;
bool overscan_enable;
int fbo_pass; int fbo_pass;
unsigned base_size; /* 2 or 4*/ unsigned base_size; /* 2 or 4*/
unsigned last_width[TEXTURES]; unsigned last_width[TEXTURES];
@ -129,6 +130,7 @@ typedef struct gl
unsigned vp_height, vp_out_height; unsigned vp_height, vp_out_height;
unsigned win_width; unsigned win_width;
unsigned win_height; unsigned win_height;
GLfloat overscan_amount;
GLfloat tex_coords[8]; GLfloat tex_coords[8];
GLfloat fbo_tex_coords[8]; GLfloat fbo_tex_coords[8];
GLenum texture_type; /* XBGR1555 or ARGB*/ GLenum texture_type; /* XBGR1555 or ARGB*/
@ -487,37 +489,55 @@ static inline unsigned get_alignment(unsigned pitch)
static void set_viewport(gl_t *gl, unsigned width, unsigned height, bool force_full) static void set_viewport(gl_t *gl, unsigned width, unsigned height, bool force_full)
{ {
uint32_t m_viewport_x_temp, m_viewport_y_temp, m_viewport_width_temp, m_viewport_height_temp;
GLfloat m_left, m_right, m_bottom, m_top, m_zNear, m_zFar;
glMatrixMode(GL_PROJECTION); glMatrixMode(GL_PROJECTION);
glLoadIdentity(); glLoadIdentity();
m_viewport_x_temp = 0;
m_viewport_y_temp = 0;
m_viewport_width_temp = width;
m_viewport_height_temp = height;
m_left = 0.0f;
m_right = 1.0f;
m_bottom = 0.0f;
m_top = 1.0f;
m_zNear = -1.0f;
m_zFar = 1.0f;
if (gl->keep_aspect && !force_full) if (gl->keep_aspect && !force_full)
{ {
float desired_aspect = g_settings.video.aspect_ratio; float desired_aspect = g_settings.video.aspect_ratio;
float device_aspect = (float)width / height; float device_aspect = (float)width / height;
float delta = (desired_aspect / device_aspect - 1.0) / 2.0 + 0.5;
// If the aspect ratios of screen and desired aspect ratio are sufficiently equal (floating point stuff), // If the aspect ratios of screen and desired aspect ratio are sufficiently equal (floating point stuff),
// assume they are actually equal. if (device_aspect > desired_aspect)
if (fabs(device_aspect - desired_aspect) < 0.0001)
{ {
glViewport(0, 0, width, height); m_viewport_x_temp = (GLint)(width * (0.5 - delta));
} m_viewport_width_temp = (GLint)(2.0 * width * delta);
else if (device_aspect > desired_aspect)
{
float delta = (desired_aspect / device_aspect - 1.0) / 2.0 + 0.5;
glViewport((GLint)(width * (0.5 - delta)), 0,(GLint)(2.0 * width * delta), height);
width = (unsigned)(2.0 * width * delta); width = (unsigned)(2.0 * width * delta);
} }
else else
{ {
float delta = (device_aspect / desired_aspect - 1.0) / 2.0 + 0.5; m_viewport_y_temp = (GLint)(height * (0.5 - delta));
glViewport(0, (GLint)(height * (0.5 - delta)), width,(GLint)(2.0 * height * delta)); m_viewport_height_temp = (GLint)(2.0 * height * delta);
height = (unsigned)(2.0 * height * delta); height = (unsigned)(2.0 * height * delta);
} }
} }
else
glViewport(0, 0, width, height);
glOrthof(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); glViewport(m_viewport_x_temp, m_viewport_y_temp, m_viewport_width_temp, m_viewport_height_temp);
if(gl->overscan_enable && !force_full)
{
m_left = -gl->overscan_amount/2;
m_right = 1 + gl->overscan_amount/2;
m_bottom = -gl->overscan_amount/2;
}
glOrthof(m_left, m_right, m_bottom, m_top, m_zNear, m_zFar);
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); glLoadIdentity();
@ -1290,6 +1310,19 @@ void ps3_set_filtering(unsigned index, bool set_smooth)
glBindTexture(GL_TEXTURE_2D, gl->texture[gl->tex_index]); glBindTexture(GL_TEXTURE_2D, gl->texture[gl->tex_index]);
} }
void ps3graphics_set_overscan(bool overscan_enable, float amount, bool recalculate_viewport)
{
gl_t * gl = g_gl;
if(!gl)
return;
gl->overscan_enable = overscan_enable;
gl->overscan_amount = amount;
if(recalculate_viewport)
set_viewport(gl, gl->win_width, gl->win_height, false);
}
void ps3graphics_set_aspect_ratio(uint32_t aspectratio_index) void ps3graphics_set_aspect_ratio(uint32_t aspectratio_index)
{ {
gl_t * gl = g_gl; gl_t * gl = g_gl;
@ -1370,10 +1403,16 @@ void ps3graphics_video_init(bool get_all_resolutions)
video_info.input_scale = 2; video_info.input_scale = 2;
g_gl = gl_init(&video_info, NULL, NULL); g_gl = gl_init(&video_info, NULL, NULL);
gl_t * gl = g_gl;
gl->overscan_enable = g_console.overscan_enable;
gl->overscan_amount = g_console.overscan_amount;
if(get_all_resolutions) if(get_all_resolutions)
get_all_available_resolutions(); get_all_available_resolutions();
ps3_set_resolution(); ps3_set_resolution();
ps3_setup_texture(); ps3_setup_texture();
ps3graphics_set_overscan(gl->overscan_enable, gl->overscan_amount, 0);
} }
void ps3graphics_video_reinit(void) void ps3graphics_video_reinit(void)

View File

@ -52,6 +52,7 @@ void ps3_video_deinit(void);
void ps3graphics_block_swap (void); void ps3graphics_block_swap (void);
void ps3graphics_reinit_fbos (void); void ps3graphics_reinit_fbos (void);
void ps3graphics_set_aspect_ratio(uint32_t aspectratio_index); void ps3graphics_set_aspect_ratio(uint32_t aspectratio_index);
void ps3graphics_set_overscan(bool overscan_enable, float amount, bool recalculate_viewport);
void ps3graphics_set_orientation(uint32_t orientation); void ps3graphics_set_orientation(uint32_t orientation);
void ps3graphics_set_vsync(uint32_t vsync); void ps3graphics_set_vsync(uint32_t vsync);
void ps3graphics_unblock_swap (void); void ps3graphics_unblock_swap (void);