diff --git a/ps3/main.c b/ps3/main.c index 48b8fe763f..cf23d40920 100644 --- a/ps3/main.c +++ b/ps3/main.c @@ -225,6 +225,8 @@ static void ingame_menu(void) uint32_t menuitem_colors[MENU_ITEM_LAST]; char comment[256], msg_temp[256]; + ps3_block_swap(); + do { uint64_t state = cell_pad_input_poll_device(0); @@ -481,9 +483,10 @@ static void ingame_menu(void) old_state = state; cellSysutilCheckCallback(); }while(g_console.in_game_menu); + + ps3_unblock_swap(); } -// Temporary, a more sane implementation should go here. int main(int argc, char *argv[]) { // Initialize 6 SPUs but reserve 1 SPU as a raw SPU for PSGL @@ -492,9 +495,10 @@ int main(int argc, char *argv[]) cellSysmoduleLoadModule(CELL_SYSMODULE_FS); cellSysmoduleLoadModule(CELL_SYSMODULE_SYSUTIL_GAME); - memset(&g_extern, 0, sizeof(g_extern)); - memset(&g_settings, 0, sizeof(g_settings)); - memset(&g_console, 0, sizeof(g_console)); + ssnes_main_clear_state(); + + g_console.block_config_read = true; + config_set_defaults(); SSNES_LOG("Registering Callback\n"); cellSysutilRegisterCallback(0, callback_sysutil_exit, NULL); diff --git a/ps3/ps3_video_psgl.c b/ps3/ps3_video_psgl.c index 4c7244ee99..c5a4173dbc 100644 --- a/ps3/ps3_video_psgl.c +++ b/ps3/ps3_video_psgl.c @@ -93,6 +93,7 @@ typedef struct gl PSGLdevice* gl_device; PSGLcontext* gl_context; bool vsync; + bool block_swap; GLuint texture[TEXTURES]; unsigned tex_index; // For use with PREV. struct gl_tex_info prev_info[TEXTURES]; @@ -723,7 +724,8 @@ static bool gl_frame(void *data, const void *frame, unsigned width, unsigned hei cellDbgFontDraw(); } - psglSwap(); + if(!gl->block_swap) + psglSwap(); return true; } @@ -1094,6 +1096,20 @@ const char * ps3_get_resolution_label(uint32_t resolution) } } +void ps3_block_swap (void) +{ + gl_t *gl = g_gl; + gl->block_swap = true; + SSNES_LOG("Swap is set to blocked\n"); +} + +void ps3_unblock_swap (void) +{ + gl_t *gl = g_gl; + gl->block_swap = false; + SSNES_LOG("Swap is set to non-blocked\n"); +} + // PS3 needs a working graphics stack before SSNES even starts. // To deal with this main.c, // the top level module owns the instance, and is created beforehand. diff --git a/ps3/ps3_video_psgl.h b/ps3/ps3_video_psgl.h index 855aa191d2..7f9a2c9cc6 100644 --- a/ps3/ps3_video_psgl.h +++ b/ps3/ps3_video_psgl.h @@ -31,6 +31,8 @@ void ps3_next_resolution (void); void ps3_previous_resolution (void); const char * ps3_get_resolution_label(uint32_t resolution); int ps3_check_resolution(uint32_t resolution_id); +void ps3_block_swap (void); +void ps3_unblock_swap (void); extern void *g_gl; diff --git a/ssnes.c b/ssnes.c index cde4c0348d..464fa6613b 100644 --- a/ssnes.c +++ b/ssnes.c @@ -2065,6 +2065,9 @@ void ssnes_main_clear_state(void) { memset(&g_settings, 0, sizeof(g_settings)); memset(&g_extern, 0, sizeof(g_extern)); +#ifdef SSNES_CONSOLE + memset(&g_console, 0, sizeof(g_console)); +#endif init_state(); }