From 576626ead09235fbd00d26ad61a22b0514640b85 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Wed, 16 Sep 2015 11:14:43 +0200 Subject: [PATCH] Refactor frame_is_reversed - shader drivers should no longer be dependent upon global state --- gfx/drivers_shader/shader_gl_cg.c | 7 +++---- gfx/drivers_shader/shader_glsl.c | 3 +-- gfx/drivers_shader/shader_hlsl.c | 7 ++++--- libretro_version_1.c | 5 ++--- rewind.c | 12 ++++++++++++ rewind.h | 6 +++++- runloop.c | 8 ++++---- runloop.h | 1 - 8 files changed, 31 insertions(+), 18 deletions(-) diff --git a/gfx/drivers_shader/shader_gl_cg.c b/gfx/drivers_shader/shader_gl_cg.c index 52fe36b90e..218b1f43b6 100644 --- a/gfx/drivers_shader/shader_gl_cg.c +++ b/gfx/drivers_shader/shader_gl_cg.c @@ -38,7 +38,7 @@ #include #include "../../dynamic.h" - +#include "../../rewind.h" #include "../video_state_tracker.h" #if 0 @@ -266,7 +266,6 @@ static void gl_cg_set_params(void *data, unsigned width, unsigned height, const struct gfx_tex_info *feedback_info = (const struct gfx_tex_info*)_feedback_info; const struct gfx_tex_info *fbo_info = (const struct gfx_tex_info*)_fbo_info; driver_t *driver = driver_get_ptr(); - global_t *global = global_get_ptr(); cg_shader_data_t *cg = (cg_shader_data_t*)driver->video_shader_data; (void)data; @@ -279,13 +278,13 @@ static void gl_cg_set_params(void *data, unsigned width, unsigned height, set_param_2f(cg->prg[cg->active_idx].tex_size_f, tex_width, tex_height); set_param_2f(cg->prg[cg->active_idx].out_size_f, out_width, out_height); set_param_1f(cg->prg[cg->active_idx].frame_dir_f, - global->rewind.frame_is_reverse ? -1.0 : 1.0); + state_manager_frame_is_reversed() ? -1.0 : 1.0); set_param_2f(cg->prg[cg->active_idx].vid_size_v, width, height); set_param_2f(cg->prg[cg->active_idx].tex_size_v, tex_width, tex_height); set_param_2f(cg->prg[cg->active_idx].out_size_v, out_width, out_height); set_param_1f(cg->prg[cg->active_idx].frame_dir_v, - global->rewind.frame_is_reverse ? -1.0 : 1.0); + state_manager_frame_is_reversed() ? -1.0 : 1.0); if (cg->prg[cg->active_idx].frame_cnt_f || cg->prg[cg->active_idx].frame_cnt_v) { diff --git a/gfx/drivers_shader/shader_glsl.c b/gfx/drivers_shader/shader_glsl.c index 4df43ebceb..8902967afe 100644 --- a/gfx/drivers_shader/shader_glsl.c +++ b/gfx/drivers_shader/shader_glsl.c @@ -963,7 +963,6 @@ static void gl_glsl_set_params(void *data, unsigned width, unsigned height, const struct gfx_tex_info *fbo_info = (const struct gfx_tex_info*)_fbo_info; struct glsl_attrib *attr = (struct glsl_attrib*)attribs; driver_t *driver = driver_get_ptr(); - global_t *global = global_get_ptr(); glsl_shader_data_t *glsl = (glsl_shader_data_t*)driver->video_shader_data; if (!glsl) @@ -1002,7 +1001,7 @@ static void gl_glsl_set_params(void *data, unsigned width, unsigned height, } if (uni->frame_direction >= 0) - glUniform1i(uni->frame_direction, global->rewind.frame_is_reverse ? -1 : 1); + glUniform1i(uni->frame_direction, state_manager_frame_is_reversed() ? -1 : 1); for (i = 0; i < glsl->shader->luts; i++) diff --git a/gfx/drivers_shader/shader_hlsl.c b/gfx/drivers_shader/shader_hlsl.c index ddc2bc46a6..1d5cf54a4a 100644 --- a/gfx/drivers_shader/shader_hlsl.c +++ b/gfx/drivers_shader/shader_hlsl.c @@ -15,8 +15,10 @@ */ #include "shader_hlsl.h" + #include "../video_shader_parse.h" #include "../d3d/d3d.h" +#include "../../rewind.h" static const char *stock_hlsl_program = "void main_vertex\n" @@ -117,7 +119,6 @@ static void hlsl_set_params(void *data, unsigned width, unsigned height, (void)_feedback_info; const struct gfx_tex_info *fbo_info = (const struct gfx_tex_info*)_fbo_info; driver_t *driver = driver_get_ptr(); - global_t *global = global_get_ptr(); hlsl_shader_data_t *hlsl = (hlsl_shader_data_t*)driver->video_shader_data; if (!hlsl) @@ -135,13 +136,13 @@ static void hlsl_set_params(void *data, unsigned width, unsigned height, set_param_2f(hlsl->prg[hlsl->active_idx].tex_size_f, tex_size, hlsl->prg[hlsl->active_idx].f_ctable); set_param_2f(hlsl->prg[hlsl->active_idx].out_size_f, out_size, hlsl->prg[hlsl->active_idx].f_ctable); set_param_1f(hlsl->prg[hlsl->active_idx].frame_cnt_f, frame_cnt, hlsl->prg[hlsl->active_idx].f_ctable); - set_param_1f(hlsl->prg[hlsl->active_idx].frame_dir_f, global->rewind.frame_is_reverse ? -1.0 : 1.0, hlsl->prg[hlsl->active_idx].f_ctable); + set_param_1f(hlsl->prg[hlsl->active_idx].frame_dir_f, state_manager_frame_is_reversed() ? -1.0 : 1.0, hlsl->prg[hlsl->active_idx].f_ctable); set_param_2f(hlsl->prg[hlsl->active_idx].vid_size_v, ori_size, hlsl->prg[hlsl->active_idx].v_ctable); set_param_2f(hlsl->prg[hlsl->active_idx].tex_size_v, tex_size, hlsl->prg[hlsl->active_idx].v_ctable); set_param_2f(hlsl->prg[hlsl->active_idx].out_size_v, out_size, hlsl->prg[hlsl->active_idx].v_ctable); set_param_1f(hlsl->prg[hlsl->active_idx].frame_cnt_v, frame_cnt, hlsl->prg[hlsl->active_idx].v_ctable); - set_param_1f(hlsl->prg[hlsl->active_idx].frame_dir_v, global->rewind.frame_is_reverse ? -1.0 : 1.0, hlsl->prg[hlsl->active_idx].v_ctable); + set_param_1f(hlsl->prg[hlsl->active_idx].frame_dir_v, state_manager_frame_is_reversed() ? -1.0 : 1.0, hlsl->prg[hlsl->active_idx].v_ctable); /* TODO - set lookup textures/FBO textures/state parameters/etc */ } diff --git a/libretro_version_1.c b/libretro_version_1.c index 6820deb552..37496d476e 100644 --- a/libretro_version_1.c +++ b/libretro_version_1.c @@ -30,6 +30,7 @@ #include "runloop.h" #include "runloop_data.h" #include "retroarch.h" +#include "rewind.h" #include "performance.h" #include "input/input_remapping.h" #include "record/record_driver.h" @@ -294,9 +295,7 @@ void retro_init_libretro_cbs(void *data) **/ void retro_set_rewind_callbacks(void) { - global_t *global = global_get_ptr(); - - if (global->rewind.frame_is_reverse) + if (state_manager_frame_is_reversed()) { pretro_set_audio_sample(audio_driver_sample_rewind); pretro_set_audio_sample_batch(audio_driver_sample_batch_rewind); diff --git a/rewind.c b/rewind.c index 6cc28bd5b7..5dbc36f81a 100644 --- a/rewind.c +++ b/rewind.c @@ -64,6 +64,8 @@ repeat { size thisstart; #endif +static bool frame_is_reversed; + size_t state_manager_raw_maxsize(size_t uncomp) { /* bytes covered by a compressed block */ @@ -588,3 +590,13 @@ void init_rewind(void) pretro_serialize(state, global->rewind.size); state_manager_push_do(global->rewind.state); } + +bool state_manager_frame_is_reversed(void) +{ + return frame_is_reversed; +} + +void state_manager_set_frame_is_reversed(bool value) +{ + frame_is_reversed = value; +} diff --git a/rewind.h b/rewind.h index 62aa660f56..43d24930ba 100644 --- a/rewind.h +++ b/rewind.h @@ -22,9 +22,9 @@ extern "C" { #endif +#include #include #include -#include typedef struct state_manager state_manager_t; @@ -68,6 +68,10 @@ size_t state_manager_raw_compress(const void *src, const void *dst, size_t len, */ void state_manager_raw_decompress(const void *patch, size_t patchlen, void *data, size_t datalen); +bool state_manager_frame_is_reversed(void); + +void state_manager_set_frame_is_reversed(bool value); + #ifdef __cplusplus } #endif diff --git a/runloop.c b/runloop.c index b26da1c412..83faab5636 100644 --- a/runloop.c +++ b/runloop.c @@ -167,10 +167,10 @@ static void check_rewind(settings_t *settings, { static bool first = true; - if (global->rewind.frame_is_reverse) + if (state_manager_frame_is_reversed()) { audio_driver_frame_is_reverse(); - global->rewind.frame_is_reverse = false; + state_manager_set_frame_is_reversed(false); } if (first) @@ -188,7 +188,7 @@ static void check_rewind(settings_t *settings, if (state_manager_pop(global->rewind.state, &buf)) { - global->rewind.frame_is_reverse = true; + state_manager_set_frame_is_reversed(true); audio_driver_setup_rewind(); rarch_main_msg_queue_push_new(MSG_REWINDING, 0, @@ -243,7 +243,7 @@ static void check_slowmotion(settings_t *settings, global_t *global, if (settings->video.black_frame_insertion) video_driver_cached_frame(); - if (global->rewind.frame_is_reverse) + if (state_manager_frame_is_reversed()) rarch_main_msg_queue_push_new(MSG_SLOW_MOTION_REWIND, 0, 30, true); else rarch_main_msg_queue_push_new(MSG_SLOW_MOTION, 0, 30, true); diff --git a/runloop.h b/runloop.h index 1ec33009e3..1934aeface 100644 --- a/runloop.h +++ b/runloop.h @@ -157,7 +157,6 @@ typedef struct global /* Rewind support. */ state_manager_t *state; size_t size; - bool frame_is_reverse; } rewind; struct