Create CORE_CTL_RETRO_CTX_FRAME_CB and CORE_CTL_RETRO_CTX_POLL_CB

This commit is contained in:
twinaphex 2016-01-27 04:49:38 +01:00
parent 4165c89385
commit 6151e1c425
4 changed files with 40 additions and 11 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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. */