diff --git a/command_event.c b/command_event.c index ca5489cb2f..82b120c6f5 100644 --- a/command_event.c +++ b/command_event.c @@ -1096,10 +1096,10 @@ bool event_cmd_ctl(enum event_command cmd, void *data) break; case EVENT_CMD_REINIT: { - const struct retro_hw_render_callback *hw_render = - (const struct retro_hw_render_callback*)video_driver_callback(); + struct retro_hw_render_callback *hwr = NULL; + video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); - if (hw_render->cache_context) + if (hwr->cache_context) video_driver_ctl( RARCH_DISPLAY_CTL_SET_VIDEO_CACHE_CONTEXT, NULL); else @@ -1270,11 +1270,12 @@ bool event_cmd_ctl(enum event_command cmd, void *data) break; case EVENT_CMD_CORE_DEINIT: { - struct retro_hw_render_callback *cb = video_driver_callback(); + struct retro_hw_render_callback *hwr = NULL; + video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); event_deinit_core(true); - if (cb) - memset(cb, 0, sizeof(*cb)); + if (hwr) + memset(hwr, 0, sizeof(*hwr)); break; } @@ -1319,14 +1320,17 @@ bool event_cmd_ctl(enum event_command cmd, void *data) { /* RARCH_DRIVER_CTL_UNINIT clears the callback struct so we * need to make sure to keep a copy */ - struct retro_hw_render_callback hw_render; + struct retro_hw_render_callback *hwr = NULL; + struct retro_hw_render_callback hwr_copy; int flags = DRIVERS_CMD_ALL; - memcpy(&hw_render, video_driver_callback(), sizeof(hw_render)); + video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); + + memcpy(&hwr_copy, hwr, sizeof(hwr_copy)); driver_ctl(RARCH_DRIVER_CTL_UNINIT, &flags); - memcpy(video_driver_callback(), &hw_render, sizeof(hw_render)); + memcpy(hwr, &hwr_copy, sizeof(*hwr)); driver_ctl(RARCH_DRIVER_CTL_INIT, &flags); } diff --git a/driver.c b/driver.c index 848d5a7cee..396b3837c7 100644 --- a/driver.c +++ b/driver.c @@ -327,15 +327,15 @@ static 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(); + struct retro_hw_render_callback *hwr = NULL; + video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); video_driver_ctl(RARCH_DISPLAY_CTL_MONITOR_RESET, NULL); video_driver_ctl(RARCH_DISPLAY_CTL_INIT, NULL); if (!video_driver_ctl(RARCH_DISPLAY_CTL_IS_VIDEO_CACHE_CONTEXT_ACK, NULL) - && hw_render->context_reset) - hw_render->context_reset(); + && hwr->context_reset) + hwr->context_reset(); video_driver_ctl(RARCH_DISPLAY_CTL_UNSET_VIDEO_CACHE_CONTEXT_ACK, NULL); runloop_ctl(RUNLOOP_CTL_SET_FRAME_TIME_LAST, NULL); diff --git a/dynamic.c b/dynamic.c index f9eb0c4a1e..8dac5975a8 100644 --- a/dynamic.c +++ b/dynamic.c @@ -867,10 +867,12 @@ 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 *hwr = NULL; struct retro_hw_render_callback *cb = (struct retro_hw_render_callback*)data; + video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); + RARCH_LOG("Environ SET_HW_RENDER.\n"); switch (cb->context_type) @@ -943,10 +945,10 @@ bool rarch_environment_cb(unsigned cmd, void *data) /* Old ABI. Don't copy garbage. */ if (cmd & RETRO_ENVIRONMENT_EXPERIMENTAL) - memcpy(hw_render, + memcpy(hwr, cb, offsetof(struct retro_hw_render_callback, stencil)); else - memcpy(hw_render, cb, sizeof(*cb)); + memcpy(hwr, cb, sizeof(*cb)); break; } diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index 59614529ac..778703d737 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -782,8 +782,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; - const struct retro_hw_render_callback *hw_render = - (const struct retro_hw_render_callback*)video_driver_callback(); + struct retro_hw_render_callback *hwr = NULL; + video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); /* We can only share texture objects through contexts. * FBOs are "abstract" objects and are not shared. */ @@ -801,8 +801,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 = hw_render->depth; - stencil = hw_render->stencil; + depth = hwr->depth; + stencil = hwr->stencil; #ifdef HAVE_OPENGLES2 if (stencil && !gl_query_extension(gl, "OES_packed_depth_stencil")) @@ -2217,8 +2217,8 @@ static bool resolve_extensions(gl_t *gl, const char *context_ident) 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(); + struct retro_hw_render_callback *hwr = NULL; + video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); #if defined(HAVE_GL_SYNC) || defined(HAVE_FBO) settings_t *settings = config_get_ptr(); #endif @@ -2227,10 +2227,10 @@ static bool resolve_extensions(gl_t *gl, const char *context_ident) (void)vendor; (void)renderer; (void)version; - (void)hw_render; + (void)hwr; #ifndef HAVE_OPENGLES gl->core_context = - (hw_render->context_type == RETRO_HW_CONTEXT_OPENGL_CORE); + (hwr->context_type == RETRO_HW_CONTEXT_OPENGL_CORE); if (gl->core_context) { @@ -2477,22 +2477,22 @@ static void gl_init_pbo_readback(gl_t *gl) static const gfx_ctx_driver_t *gl_get_context(gl_t *gl) { - const struct retro_hw_render_callback *cb = - (const struct retro_hw_render_callback*)video_driver_callback(); - unsigned major = cb->version_major; - unsigned minor = cb->version_minor; + struct retro_hw_render_callback *hwr = NULL; + video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); + unsigned major = hwr->version_major; + unsigned minor = hwr->version_minor; settings_t *settings = config_get_ptr(); #ifdef HAVE_OPENGLES enum gfx_ctx_api api = GFX_CTX_OPENGL_ES_API; const char *api_name = "OpenGL ES 2.0"; #ifdef HAVE_OPENGLES3 - if (cb->context_type == RETRO_HW_CONTEXT_OPENGLES3) + if (hwr->context_type == RETRO_HW_CONTEXT_OPENGLES3) { major = 3; minor = 0; api_name = "OpenGL ES 3.0"; } - else if (cb->context_type == RETRO_HW_CONTEXT_OPENGLES_VERSION) + else if (hwr->context_type == RETRO_HW_CONTEXT_OPENGLES_VERSION) api_name = "OpenGL ES 3.1+"; #endif #else @@ -2503,7 +2503,7 @@ static const gfx_ctx_driver_t *gl_get_context(gl_t *gl) (void)api_name; gl->shared_context_use = settings->video.shared_context - && cb->context_type != RETRO_HW_CONTEXT_NONE; + && hwr->context_type != RETRO_HW_CONTEXT_NONE; return gfx_ctx_init_first(gl, settings->video.context_driver, api, major, minor, gl->shared_context_use); @@ -2655,15 +2655,18 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo video_shader_ctx_filter_t shader_filter; video_shader_ctx_info_t shader_info; video_shader_ctx_ident_t ident_info; - unsigned win_width, win_height, temp_width = 0, temp_height = 0; - bool force_smooth = false; - const char *vendor = NULL; - const char *renderer = NULL; - const char *version = NULL; - struct retro_hw_render_callback *hw_render = NULL; - settings_t *settings = config_get_ptr(); - gl_t *gl = (gl_t*)calloc(1, sizeof(gl_t)); - const gfx_ctx_driver_t *ctx_driver = gl_get_context(gl); + unsigned win_width = 0; + unsigned win_height = 0; + unsigned temp_width = 0; + unsigned temp_height = 0; + bool force_smooth = false; + const char *vendor = NULL; + const char *renderer = NULL; + const char *version = NULL; + struct retro_hw_render_callback *hwr = NULL; + settings_t *settings = config_get_ptr(); + gl_t *gl = (gl_t*)calloc(1, sizeof(gl_t)); + const gfx_ctx_driver_t *ctx_driver = gl_get_context(gl); if (!gl || !ctx_driver) goto error; @@ -2758,8 +2761,9 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo gl->full_y = temp_height; } - hw_render = video_driver_callback(); - gl->vertex_ptr = hw_render->bottom_left_origin + video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); + + gl->vertex_ptr = hwr->bottom_left_origin ? vertexes : vertexes_flipped; /* Better pipelining with GPU due to synchronous glSubTexImage. @@ -2768,7 +2772,7 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo */ gl->textures = 4; #ifdef HAVE_FBO - gl->hw_render_use = hw_render->context_type != RETRO_HW_CONTEXT_NONE; + gl->hw_render_use = hwr->context_type != RETRO_HW_CONTEXT_NONE; if (gl->hw_render_use) { @@ -2787,7 +2791,7 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo #ifdef HAVE_GLSL gl_glsl_set_get_proc_address(ctx_driver->get_proc_address); gl_glsl_set_context_type(gl->core_context, - hw_render->version_major, hw_render->version_minor); + hwr->version_major, hwr->version_minor); #endif if (!video_shader_driver_ctl(SHADER_CTL_INIT_FIRST, NULL)) diff --git a/gfx/drivers/vulkan.c b/gfx/drivers/vulkan.c index f6681568ec..1c5d6f6df7 100644 --- a/gfx/drivers/vulkan.c +++ b/gfx/drivers/vulkan.c @@ -842,12 +842,12 @@ static void vulkan_unlock_queue(void *handle) static void vulkan_init_hw_render(vk_t *vk) { - const struct retro_hw_render_callback *hw_render = - video_driver_callback(); struct retro_hw_render_interface_vulkan *iface = &vk->hw.iface; + struct retro_hw_render_callback *hwr = NULL; + video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); - if (hw_render->context_type != RETRO_HW_CONTEXT_VULKAN) + if (hwr->context_type != RETRO_HW_CONTEXT_VULKAN) return; vk->hw.enable = true; diff --git a/gfx/drivers_context/drm_ctx.c b/gfx/drivers_context/drm_ctx.c index b532ccf5d6..e6c8e3e305 100644 --- a/gfx/drivers_context/drm_ctx.c +++ b/gfx/drivers_context/drm_ctx.c @@ -459,15 +459,17 @@ static EGLint *gfx_ctx_drm_egl_fill_attribs( #ifdef EGL_KHR_create_context case GFX_CTX_OPENGL_API: { + bool debug = false; #ifdef HAVE_OPENGL unsigned version = drm->egl.major * 1000 + drm->egl.minor; bool core = version >= 3001; #ifdef GL_DEBUG - bool debug = true; + debug = true; #else - const struct retro_hw_render_callback *hw_render = - (const struct retro_hw_render_callback*)video_driver_callback(); - bool debug = hw_render->debug_context; + struct retro_hw_render_callback *hwr = NULL; + + video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); + debug = hwr->debug_context; #endif if (core) diff --git a/gfx/drivers_context/wayland_ctx.c b/gfx/drivers_context/wayland_ctx.c index 3bf79b7b93..66d756378c 100644 --- a/gfx/drivers_context/wayland_ctx.c +++ b/gfx/drivers_context/wayland_ctx.c @@ -631,15 +631,16 @@ static EGLint *egl_fill_attribs(gfx_ctx_wayland_data_t *wl, EGLint *attr) #ifdef EGL_KHR_create_context case GFX_CTX_OPENGL_API: { + bool debug = false; #ifdef HAVE_OPENGL unsigned version = wl->egl.major * 1000 + wl->egl.minor; bool core = version >= 3001; #ifdef GL_DEBUG - bool debug = true; + debug = true; #else - const struct retro_hw_render_callback *hw_render = - (const struct retro_hw_render_callback*)video_driver_callback(); - bool debug = hw_render->debug_context; + struct retro_hw_render_callback *hwr = NULL; + video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); + debug = hwr->debug_context; #endif if (core) diff --git a/gfx/drivers_context/wgl_ctx.cpp b/gfx/drivers_context/wgl_ctx.cpp index 1808edeef6..b088e5dc9e 100644 --- a/gfx/drivers_context/wgl_ctx.cpp +++ b/gfx/drivers_context/wgl_ctx.cpp @@ -98,15 +98,16 @@ static void setup_pixel_format(HDC hdc) void create_gl_context(HWND hwnd, bool *quit) { bool core_context; - const struct retro_hw_render_callback *hw_render = - (const struct retro_hw_render_callback*)video_driver_callback(); - bool debug = hw_render->debug_context; + struct retro_hw_render_callback *hwr = NULL; + bool debug = false; + video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); + + debug = hwr->debug_context; #ifdef _WIN32 - dll_handle = dylib_load("OpenGL32.dll"); + dll_handle = dylib_load("OpenGL32.dll"); #endif - - g_hdc = GetDC(hwnd); + g_hdc = GetDC(hwnd); setup_pixel_format(g_hdc); #ifdef GL_DEBUG diff --git a/gfx/drivers_context/x_ctx.c b/gfx/drivers_context/x_ctx.c index 0c1e666f92..331660deb3 100644 --- a/gfx/drivers_context/x_ctx.c +++ b/gfx/drivers_context/x_ctx.c @@ -332,8 +332,8 @@ static void *gfx_ctx_x_init(void *data) gfx_ctx_x_data_t *x = (gfx_ctx_x_data_t*) calloc(1, sizeof(gfx_ctx_x_data_t)); #ifndef GL_DEBUG - const struct retro_hw_render_callback *hw_render = - (const struct retro_hw_render_callback*)video_driver_callback(); + struct retro_hw_render_callback *hwr = NULL; + video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); #endif if (!x) @@ -362,7 +362,7 @@ static void *gfx_ctx_x_init(void *data) #ifdef GL_DEBUG x->g_debug = true; #else - x->g_debug = hw_render->debug_context; + x->g_debug = hwr->debug_context; #endif /* Have to use ContextAttribs */ diff --git a/gfx/drivers_context/xegl_ctx.c b/gfx/drivers_context/xegl_ctx.c index f9890c3f66..c1aae15d92 100644 --- a/gfx/drivers_context/xegl_ctx.c +++ b/gfx/drivers_context/xegl_ctx.c @@ -189,14 +189,16 @@ static EGLint *xegl_fill_attribs(xegl_ctx_data_t *xegl, 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(); + bool debug = false; unsigned version = xegl->egl.major * 1000 + xegl->egl.minor; bool core = version >= 3001; + struct retro_hw_render_callback *hwr = NULL; + + video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); #ifdef GL_DEBUG - bool debug = true; + debug = true; #else - bool debug = hw_render->debug_context; + debug = hwr->debug_context; #endif if (core) diff --git a/gfx/drivers_font/gl_raster_font.c b/gfx/drivers_font/gl_raster_font.c index 6bfcb93213..0b044cacb1 100644 --- a/gfx/drivers_font/gl_raster_font.c +++ b/gfx/drivers_font/gl_raster_font.c @@ -54,17 +54,19 @@ static bool gl_raster_font_upload_atlas(gl_raster_t *font, unsigned width, unsigned height) { unsigned i, j; - GLint gl_internal = GL_LUMINANCE_ALPHA; - GLenum gl_format = GL_LUMINANCE_ALPHA; - size_t ncomponents = 2; - uint8_t *tmp = NULL; - struct retro_hw_render_callback *cb = video_driver_callback(); - bool ancient = false; /* add a check here if needed */ - bool modern = font->gl->core_context || - (cb->context_type == RETRO_HW_CONTEXT_OPENGL && - cb->version_major >= 3); - - (void)modern; + GLint gl_internal = GL_LUMINANCE_ALPHA; + GLenum gl_format = GL_LUMINANCE_ALPHA; + size_t ncomponents = 2; + uint8_t *tmp = NULL; + struct retro_hw_render_callback *hwr = NULL; + bool ancient = false; /* add a check here if needed */ + bool modern = font->gl->core_context; + + video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); + + modern = modern || + (hwr->context_type == RETRO_HW_CONTEXT_OPENGL && + hwr->version_major >= 3); if (ancient) { diff --git a/gfx/video_driver.c b/gfx/video_driver.c index 1035bdd582..f513957178 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -532,7 +532,8 @@ static bool uninit_video_input(void) static bool init_video_pixel_converter(unsigned size) { - struct retro_hw_render_callback *hwr = video_driver_callback(); + struct retro_hw_render_callback *hwr = NULL; + video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); /* If pixel format is not 0RGB1555, we don't need to do * any internal pixel conversion. */ @@ -1026,13 +1027,6 @@ void video_driver_set_aspect_ratio_value(float value) video_driver_state.aspect_ratio = value; } -struct retro_hw_render_callback *video_driver_callback(void) -{ - struct retro_hw_render_callback *hwr = NULL; - video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); - return hwr; -} - static bool video_driver_frame_filter(const void *data, unsigned width, unsigned height, size_t pitch, @@ -1483,10 +1477,10 @@ bool video_driver_ctl(enum rarch_display_ctl_state state, void *data) if (video_driver_ctl(RARCH_DISPLAY_CTL_IS_HW_CONTEXT, NULL)) { - struct retro_hw_render_callback *hwr = - video_driver_callback(); + struct retro_hw_render_callback *hwr = NULL; current_video = NULL; + video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); (void)hwr; if (hwr && hw_render_context_is_vulkan(hwr->context_type)) diff --git a/gfx/video_driver.h b/gfx/video_driver.h index 508af638e9..61340274b6 100644 --- a/gfx/video_driver.h +++ b/gfx/video_driver.h @@ -429,8 +429,6 @@ 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); - rarch_softfilter_t *video_driver_frame_filter_get_ptr(void); enum retro_pixel_format video_driver_get_pixel_format(void);