From a81baed9e2ecf555b134e7fd60fb5a782f564fb3 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Wed, 20 May 2015 19:56:12 +0200 Subject: [PATCH] Move hw_render_callbakc to video driver state and take it out of global state --- command_event.c | 24 ++++++++++++++---------- driver.c | 15 +++++++++------ dynamic.c | 5 +++-- gfx/drivers/gl.c | 21 +++++++++------------ gfx/drivers_context/drm_egl_ctx.c | 4 +++- gfx/drivers_context/glx_ctx.c | 5 +++-- gfx/drivers_context/wayland_ctx.c | 5 +++-- gfx/drivers_context/wgl_ctx.c | 5 +++-- gfx/drivers_context/xegl_ctx.c | 7 ++++--- gfx/video_driver.c | 24 ++++++++++++++++++++---- gfx/video_driver.h | 4 ++++ gfx/video_texture.c | 6 +++--- menu/menu_display.c | 6 +++--- record/record_driver.c | 5 +++-- runloop.h | 1 - screenshot.c | 4 +++- 16 files changed, 87 insertions(+), 54 deletions(-) diff --git a/command_event.c b/command_event.c index 423595eb18..412b6c895d 100644 --- a/command_event.c +++ b/command_event.c @@ -1081,21 +1081,25 @@ bool event_command(enum event_command cmd) rarch_main_set_state(RARCH_ACTION_STATE_QUIT); break; case EVENT_CMD_REINIT: - driver->video_cache_context = - global->system.hw_render_callback.cache_context; - driver->video_cache_context_ack = false; - event_command(EVENT_CMD_RESET_CONTEXT); - driver->video_cache_context = false; + { + const struct retro_hw_render_callback *hw_render = + (const struct retro_hw_render_callback*)video_driver_callback(); - /* Poll input to avoid possibly stale data to corrupt things. */ - input_driver_poll(); + driver->video_cache_context = hw_render->cache_context; + driver->video_cache_context_ack = false; + event_command(EVENT_CMD_RESET_CONTEXT); + driver->video_cache_context = false; + + /* Poll input to avoid possibly stale data to corrupt things. */ + input_driver_poll(); #ifdef HAVE_MENU - menu_display_fb_set_dirty(); + menu_display_fb_set_dirty(); - if (menu_driver_alive()) - event_command(EVENT_CMD_VIDEO_SET_BLOCKING_STATE); + if (menu_driver_alive()) + event_command(EVENT_CMD_VIDEO_SET_BLOCKING_STATE); #endif + } break; case EVENT_CMD_CHEATS_DEINIT: if (!global) diff --git a/driver.c b/driver.c index 34d61f2402..c960746e13 100644 --- a/driver.c +++ b/driver.c @@ -383,13 +383,16 @@ void init_drivers(int flags) if (flags & DRIVER_VIDEO) { + const struct retro_hw_render_callback *hw_render = + (const struct retro_hw_render_callback*)video_driver_callback(); + video_monitor_reset(); init_video(); if (!driver->video_cache_context_ack - && global->system.hw_render_callback.context_reset) - global->system.hw_render_callback.context_reset(); + && hw_render->context_reset) + hw_render->context_reset(); driver->video_cache_context_ack = false; global->system.frame_time_last = 0; @@ -469,11 +472,11 @@ void uninit_drivers(int flags) if (flags & DRIVER_VIDEO) { - global_t *global = global_get_ptr(); + const struct retro_hw_render_callback *hw_render = + (const struct retro_hw_render_callback*)video_driver_callback(); - if (global->system.hw_render_callback.context_destroy && - !driver->video_cache_context) - global->system.hw_render_callback.context_destroy(); + if (hw_render->context_destroy && !driver->video_cache_context) + hw_render->context_destroy(); } if ((flags & DRIVER_VIDEO) && !driver->video_data_own) diff --git a/dynamic.c b/dynamic.c index 8f91362519..0633cfda14 100644 --- a/dynamic.c +++ b/dynamic.c @@ -805,6 +805,7 @@ bool rarch_environment_cb(unsigned cmd, void *data) case RETRO_ENVIRONMENT_SET_HW_RENDER: case RETRO_ENVIRONMENT_SET_HW_RENDER | RETRO_ENVIRONMENT_EXPERIMENTAL: { + struct retro_hw_render_callback *hw_render = video_driver_callback(); struct retro_hw_render_callback *cb = (struct retro_hw_render_callback*)data; @@ -866,10 +867,10 @@ bool rarch_environment_cb(unsigned cmd, void *data) cb->get_proc_address = video_driver_get_proc_address; if (cmd & RETRO_ENVIRONMENT_EXPERIMENTAL) /* Old ABI. Don't copy garbage. */ - memcpy(&global->system.hw_render_callback, + memcpy(hw_render, cb, offsetof(struct retro_hw_render_callback, stencil)); else - memcpy(&global->system.hw_render_callback, cb, sizeof(*cb)); + memcpy(hw_render, cb, sizeof(*cb)); break; } diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index de7e573ecd..2daff75603 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -666,7 +666,8 @@ static bool gl_init_hw_render(gl_t *gl, unsigned width, unsigned height) unsigned i; bool depth = false, stencil = false; GLint max_fbo_size = 0, max_renderbuffer_size = 0; - global_t *global = global_get_ptr(); + const struct retro_hw_render_callback *hw_render = + (const struct retro_hw_render_callback*)video_driver_callback(); /* We can only share texture objects through contexts. * FBOs are "abstract" objects and are not shared. */ @@ -684,8 +685,8 @@ static bool gl_init_hw_render(gl_t *gl, unsigned width, unsigned height) glBindTexture(GL_TEXTURE_2D, 0); glGenFramebuffers(gl->textures, gl->hw_render_fbo); - depth = global->system.hw_render_callback.depth; - stencil = global->system.hw_render_callback.stencil; + depth = hw_render->depth; + stencil = hw_render->stencil; #ifdef HAVE_OPENGLES2 if (stencil && !gl_query_extension(gl, "OES_packed_depth_stencil")) @@ -1850,20 +1851,19 @@ static void gl_set_nonblock_state(void *data, bool state) static bool resolve_extensions(gl_t *gl, const char *context_ident) { driver_t *driver = driver_get_ptr(); - global_t *global = global_get_ptr(); settings_t *settings = config_get_ptr(); const char *vendor = (const char*)glGetString(GL_VENDOR); const char *renderer = (const char*)glGetString(GL_RENDERER); const char *version = (const char*)glGetString(GL_VERSION); + const struct retro_hw_render_callback *hw_render = + (const struct retro_hw_render_callback*)video_driver_callback(); - (void)global; (void)vendor; (void)renderer; (void)version; #ifndef HAVE_OPENGLES gl->core_context = - (global->system.hw_render_callback.context_type - == RETRO_HW_CONTEXT_OPENGL_CORE); + (hw_render->context_type == RETRO_HW_CONTEXT_OPENGL_CORE); if (gl->core_context) { @@ -2072,10 +2072,8 @@ static void gl_init_pbo_readback(gl_t *gl) static const gfx_ctx_driver_t *gl_get_context(gl_t *gl) { - global_t *global = global_get_ptr(); const struct retro_hw_render_callback *cb = - (const struct retro_hw_render_callback*) - &global->system.hw_render_callback; + (const struct retro_hw_render_callback*)video_driver_callback(); unsigned major = cb->version_major; unsigned minor = cb->version_minor; settings_t *settings = config_get_ptr(); @@ -2253,7 +2251,6 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo const char *version = NULL; struct retro_hw_render_callback *hw_render = NULL; settings_t *settings = config_get_ptr(); - global_t *global = global_get_ptr(); driver_t *driver = driver_get_ptr(); gl = (gl_t*)calloc(1, sizeof(gl_t)); @@ -2334,7 +2331,7 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo gl->full_y = temp_height; } - hw_render = &global->system.hw_render_callback; + hw_render = video_driver_callback(); gl->vertex_ptr = hw_render->bottom_left_origin ? vertexes : vertexes_flipped; /* Better pipelining with GPU due to synchronous glSubTexImage. diff --git a/gfx/drivers_context/drm_egl_ctx.c b/gfx/drivers_context/drm_egl_ctx.c index dee3c218d4..c1c734238f 100644 --- a/gfx/drivers_context/drm_egl_ctx.c +++ b/gfx/drivers_context/drm_egl_ctx.c @@ -600,7 +600,9 @@ static EGLint *egl_fill_attribs(EGLint *attr) bool debug = true; #else global_t *global = global_get_ptr(); - bool debug = global->system.hw_render_callback.debug_context; + const struct retro_hw_render_callback *hw_render = + (const struct retro_hw_render_callback*)video_driver_callback(); + bool debug = hw_render->debug_context; #endif if (core) diff --git a/gfx/drivers_context/glx_ctx.c b/gfx/drivers_context/glx_ctx.c index 93899e7e9a..ed821e0b6e 100644 --- a/gfx/drivers_context/glx_ctx.c +++ b/gfx/drivers_context/glx_ctx.c @@ -347,7 +347,8 @@ static bool gfx_ctx_glx_init(void *data) GLXFBConfig *fbcs = NULL; gfx_ctx_glx_data_t *glx = (gfx_ctx_glx_data_t*)calloc(1, sizeof(gfx_ctx_glx_data_t)); driver_t *driver = driver_get_ptr(); - global_t *global = global_get_ptr(); + const struct retro_hw_render_callback *hw_render = + (const struct retro_hw_render_callback*)video_driver_callback(); if (!glx) return false; @@ -373,7 +374,7 @@ static bool gfx_ctx_glx_init(void *data) #ifdef GL_DEBUG glx->g_debug = true; #else - glx->g_debug = global->system.hw_render_callback.debug_context; + glx->g_debug = hw_render->debug_context; #endif /* Have to use ContextAttribs */ diff --git a/gfx/drivers_context/wayland_ctx.c b/gfx/drivers_context/wayland_ctx.c index 20d4b1b451..33399630a5 100644 --- a/gfx/drivers_context/wayland_ctx.c +++ b/gfx/drivers_context/wayland_ctx.c @@ -522,8 +522,9 @@ static EGLint *egl_fill_attribs(EGLint *attr) #ifdef GL_DEBUG bool debug = true; #else - global_t *global = global_get_ptr(); - bool debug = global->system.hw_render_callback.debug_context; + const struct retro_hw_render_callback *hw_render = + (const struct retro_hw_render_callback*)video_driver_callback(); + bool debug = hw_render->debug_context; #endif if (core) diff --git a/gfx/drivers_context/wgl_ctx.c b/gfx/drivers_context/wgl_ctx.c index 7cb9499ee3..46e2d25d8a 100644 --- a/gfx/drivers_context/wgl_ctx.c +++ b/gfx/drivers_context/wgl_ctx.c @@ -107,9 +107,10 @@ static void setup_pixel_format(HDC hdc) static void create_gl_context(HWND hwnd) { bool core_context; - global_t *global = global_get_ptr(); + const struct retro_hw_render_callback *hw_render = + (const struct retro_hw_render_callback*)video_driver_callback(); driver_t *driver = driver_get_ptr(); - bool debug = global->system.hw_render_callback.debug_context; + bool debug = hw_render->debug_context; #ifdef _WIN32 dll_handle = (HINSTANCE)dylib_load("OpenGL32.dll"); diff --git a/gfx/drivers_context/xegl_ctx.c b/gfx/drivers_context/xegl_ctx.c index 0f56588182..1fd1025097 100644 --- a/gfx/drivers_context/xegl_ctx.c +++ b/gfx/drivers_context/xegl_ctx.c @@ -381,10 +381,11 @@ static EGLint *xegl_fill_attribs(EGLint *attr) #ifdef EGL_KHR_create_context case GFX_CTX_OPENGL_API: { + const struct retro_hw_render_callback *hw_render = + (const struct retro_hw_render_callback*)video_driver_callback(); unsigned version = g_major * 1000 + g_minor; - bool core = version >= 3001; - global_t *global = global_get_ptr(); - bool debug = global->system.hw_render_callback.debug_context; + bool core = version >= 3001; + bool debug = hw_render->debug_context; #ifdef GL_DEBUG debug = true; diff --git a/gfx/video_driver.c b/gfx/video_driver.c index 549122a346..0e99074bbd 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -31,6 +31,7 @@ typedef struct video_driver_state { retro_time_t frame_time_samples[MEASURE_FRAME_TIME_SAMPLES_COUNT]; + struct retro_hw_render_callback hw_render_callback; uint64_t frame_time_samples_count; unsigned video_width; @@ -174,7 +175,7 @@ void find_video_driver(void) (void)global; #if defined(HAVE_OPENGL) && defined(HAVE_FBO) - if (global->system.hw_render_callback.context_type) + if (video_state.hw_render_callback.context_type) { RARCH_LOG("Using HW render, OpenGL driver forced.\n"); driver->video = &video_gl; @@ -229,7 +230,7 @@ void *video_driver_get_ptr(const video_driver_t **drv) #ifdef HAVE_THREADS if (settings->video.threaded - && !global->system.hw_render_callback.context_type) + && !video_state.hw_render_callback.context_type) return rarch_threaded_video_get_ptr(drv); #endif if (drv) @@ -362,7 +363,7 @@ static void init_video_filter(enum retro_pixel_format colfmt) if (colfmt == RETRO_PIXEL_FORMAT_0RGB1555) colfmt = RETRO_PIXEL_FORMAT_RGB565; - if (global->system.hw_render_callback.context_type) + if (video_state.hw_render_callback.context_type) { RARCH_WARN("Cannot use CPU filters when hardware rendering is used.\n"); return; @@ -461,6 +462,7 @@ void uninit_video_input(void) deinit_video_filter(); + video_driver_unset_callback(); event_command(EVENT_CMD_SHADER_DIR_DEINIT); video_monitor_compute_fps_statistics(); } @@ -564,7 +566,7 @@ void init_video(void) find_video_driver(); #ifdef HAVE_THREADS - if (settings->video.threaded && !global->system.hw_render_callback.context_type) + if (settings->video.threaded && !video_state.hw_render_callback.context_type) { /* Can't do hardware rendering with threaded driver currently. */ RARCH_LOG("Starting threaded video driver ...\n"); @@ -1108,3 +1110,17 @@ void video_driver_set_aspect_ratio_value(float value) { video_state.aspect_ratio = value; } + +struct retro_hw_render_callback *video_driver_callback(void) +{ + return &video_state.hw_render_callback; +} + +void video_driver_unset_callback(void) +{ + struct retro_hw_render_callback *hw_render = + video_driver_callback(); + + if (hw_render) + hw_render = NULL; +} diff --git a/gfx/video_driver.h b/gfx/video_driver.h index e833451149..a9f0dc9b35 100644 --- a/gfx/video_driver.h +++ b/gfx/video_driver.h @@ -352,6 +352,10 @@ float video_driver_get_aspect_ratio(void); void video_driver_set_aspect_ratio_value(float value); +struct retro_hw_render_callback *video_driver_callback(void); + +void video_driver_unset_callback(void); + #ifdef __cplusplus } #endif diff --git a/gfx/video_texture.c b/gfx/video_texture.c index 26a2d685f5..31a94e44b7 100644 --- a/gfx/video_texture.c +++ b/gfx/video_texture.c @@ -84,10 +84,10 @@ unsigned video_texture_load(void *data, enum texture_filter_type filter_type) { settings_t *settings = config_get_ptr(); - global_t *global = global_get_ptr(); + const struct retro_hw_render_callback *hw_render = + (const struct retro_hw_render_callback*)video_driver_callback(); - if (settings->video.threaded - && !global->system.hw_render_callback.context_type) + if (settings->video.threaded && !hw_render->context_type) { driver_t *driver = driver_get_ptr(); thread_video_t *thr = (thread_video_t*)driver->video_data; diff --git a/menu/menu_display.c b/menu/menu_display.c index 94490706a5..de7b13b531 100644 --- a/menu/menu_display.c +++ b/menu/menu_display.c @@ -134,10 +134,10 @@ bool menu_display_font_init_first(const void **font_driver, float font_size) { settings_t *settings = config_get_ptr(); - global_t *global = global_get_ptr(); + const struct retro_hw_render_callback *hw_render = + (const struct retro_hw_render_callback*)video_driver_callback(); - if (settings->video.threaded - && !global->system.hw_render_callback.context_type) + if (settings->video.threaded && !hw_render->context_type) { driver_t *driver = driver_get_ptr(); thread_video_t *thr = (thread_video_t*)driver->video_data; diff --git a/record/record_driver.c b/record/record_driver.c index 228dec7340..cca482f284 100644 --- a/record/record_driver.c +++ b/record/record_driver.c @@ -292,6 +292,8 @@ bool recording_init(void) driver_t *driver = driver_get_ptr(); settings_t *settings = config_get_ptr(); struct retro_system_av_info *av_info = video_viewport_get_system_av_info(); + const struct retro_hw_render_callback *hw_render = + (const struct retro_hw_render_callback*)video_driver_callback(); if (!global->record.enable) return false; @@ -302,8 +304,7 @@ bool recording_init(void) return false; } - if (!settings->video.gpu_record - && global->system.hw_render_callback.context_type) + if (!settings->video.gpu_record && hw_render->context_type) { RARCH_WARN("Libretro core is hardware rendered. Must use post-shaded recording as well.\n"); return false; diff --git a/runloop.h b/runloop.h index 4e42adfce0..a11c32f2b6 100644 --- a/runloop.h +++ b/runloop.h @@ -168,7 +168,6 @@ typedef struct global retro_keyboard_event_t key_event; struct retro_disk_control_callback disk_control; - struct retro_hw_render_callback hw_render_callback; struct retro_camera_callback camera_callback; struct retro_location_callback location_callback; diff --git a/screenshot.c b/screenshot.c index 4ad81d25be..edd5c90457 100644 --- a/screenshot.c +++ b/screenshot.c @@ -262,13 +262,15 @@ bool take_screenshot(void) driver_t *driver = driver_get_ptr(); settings_t *settings = config_get_ptr(); global_t *global = global_get_ptr(); + const struct retro_hw_render_callback *hw_render = + (const struct retro_hw_render_callback*)video_driver_callback(); /* No way to infer screenshot directory. */ if ((!*settings->screenshot_directory) && (!*global->basename)) return false; viewport_read = (settings->video.gpu_screenshot || - ((global->system.hw_render_callback.context_type + ((hw_render->context_type != RETRO_HW_CONTEXT_NONE) && !driver->video->read_frame_raw)) && driver->video->read_viewport && driver->video->viewport_info;