diff --git a/gfx/video_driver.c b/gfx/video_driver.c index e6f40b4eee..bedfd4f45e 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -1145,7 +1145,8 @@ void video_driver_set_pixel_format(enum retro_pixel_format fmt) **/ static bool video_driver_cached_frame(void) { - void *recording = recording_driver_get_data_ptr(); + retro_ctx_frame_info_t info; + void *recording = recording_driver_get_data_ptr(); if (runloop_ctl(RUNLOOP_CTL_IS_IDLE, NULL)) return true; /* Maybe return false here for indication of idleness? */ @@ -1157,13 +1158,15 @@ static bool video_driver_cached_frame(void) * freed the memory, but no known implementations do this. * It would be really stupid at any rate ... */ - if (retro_ctx.frame_cb) - retro_ctx.frame_cb( - (video_driver_state.frame_cache.data == RETRO_HW_FRAME_BUFFER_VALID) - ? NULL : video_driver_state.frame_cache.data, - video_driver_state.frame_cache.width, - video_driver_state.frame_cache.height, - video_driver_state.frame_cache.pitch); + info.data = NULL; + info.width = video_driver_state.frame_cache.width; + info.height = video_driver_state.frame_cache.height; + info.pitch = video_driver_state.frame_cache.pitch; + + if (video_driver_state.frame_cache.data != RETRO_HW_FRAME_BUFFER_VALID) + info.data = video_driver_state.frame_cache.data; + + core_ctl(CORE_CTL_RETRO_CTX_FRAME_CB, &info); recording_driver_set_data_ptr(recording); diff --git a/libretro_version_1.c b/libretro_version_1.c index 7bdf8026e8..0f58acbf16 100644 --- a/libretro_version_1.c +++ b/libretro_version_1.c @@ -171,6 +171,21 @@ bool core_ctl(enum core_ctl_state state, void *data) { switch (state) { + case CORE_CTL_RETRO_CTX_FRAME_CB: + { + retro_ctx_frame_info_t *info = (retro_ctx_frame_info_t*)data; + if (!info || !retro_ctx.frame_cb) + return false; + + retro_ctx.frame_cb( + info->data, info->width, info->height, info->pitch); + } + break; + case CORE_CTL_RETRO_CTX_POLL_CB: + if (!retro_ctx.poll_cb) + return false; + retro_ctx.poll_cb(); + break; case CORE_CTL_RETRO_GET_SYSTEM_AV_INFO: { struct retro_system_av_info *av_info = (struct retro_system_av_info*)data; diff --git a/libretro_version_1.h b/libretro_version_1.h index da159e9fb5..ffd4342418 100644 --- a/libretro_version_1.h +++ b/libretro_version_1.h @@ -60,9 +60,21 @@ enum core_ctl_state CORE_CTL_RETRO_RESET, - CORE_CTL_RETRO_GET_SYSTEM_AV_INFO + CORE_CTL_RETRO_GET_SYSTEM_AV_INFO, + + CORE_CTL_RETRO_CTX_FRAME_CB, + + CORE_CTL_RETRO_CTX_POLL_CB }; +typedef struct retro_ctx_frame_info +{ + const void *data; + unsigned width; + unsigned height; + size_t pitch; +} retro_ctx_frame_info_t; + typedef struct retro_callbacks { retro_video_refresh_t frame_cb; diff --git a/menu/menu_input.c b/menu/menu_input.c index 5a124b9b4f..a3fc742727 100644 --- a/menu/menu_input.c +++ b/menu/menu_input.c @@ -1183,8 +1183,7 @@ unsigned menu_input_frame_retropad(retro_input_t input, retro_input_t trigger_in if (!menu_input) return 0; - if (retro_ctx.poll_cb) - retro_ctx.poll_cb(); + core_ctl(CORE_CTL_RETRO_CTX_POLL_CB, NULL); /* don't run anything first frame, only capture held inputs * for old_input_state. */