diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index e4d413b641..a9958e909b 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -1971,9 +1971,8 @@ static void gl2_render_overlay(gl_t *gl, video_frame_info_t *video_info) glViewport(0, 0, width, height); /* Ensure that we reset the attrib array. */ - if (video_info->shader_driver && video_info->shader_driver->use) - video_info->shader_driver->use(gl, - video_info->shader_data, VIDEO_SHADER_STOCK_BLEND, true); + gl->shader->use(gl, gl->shader_data, + VIDEO_SHADER_STOCK_BLEND, true); gl->coords.vertex = gl->overlay_vertex_coord; gl->coords.tex_coord = gl->overlay_tex_coord; @@ -2012,6 +2011,76 @@ static void gl2_set_viewport_wrapper(void *data, unsigned viewport_width, } /* Shaders */ +static const shader_backend_t *gl_shader_driver_set_backend( + enum rarch_shader_type type) +{ + switch (type) + { + case RARCH_SHADER_CG: + { +#ifdef HAVE_CG + gfx_ctx_flags_t flags; + flags.flags = 0; + video_context_driver_get_flags(&flags); + + if (BIT32_GET(flags.flags, GFX_CTX_FLAGS_GL_CORE_CONTEXT)) + { + RARCH_ERR("[Shader driver]: Cg cannot be used with core" + " GL context. Trying to fall back to GLSL...\n"); + return gl_shader_driver_set_backend(RARCH_SHADER_GLSL); + } + + RARCH_LOG("[Shader driver]: Using Cg shader backend.\n"); + return &gl_cg_backend; +#else + break; +#endif + } + case RARCH_SHADER_GLSL: +#ifdef HAVE_GLSL + RARCH_LOG("[Shader driver]: Using GLSL shader backend.\n"); + return &gl_glsl_backend; +#else + break; +#endif + case RARCH_SHADER_HLSL: + case RARCH_SHADER_NONE: + default: + break; + } + + return NULL; +} + +static bool gl_shader_driver_init(video_shader_ctx_init_t *init) +{ + void *tmp = NULL; + settings_t *settings = config_get_ptr(); + + if (!init->shader || !init->shader->init) + { + init->shader = gl_shader_driver_set_backend(init->shader_type); + + if (!init->shader) + return false; + } + + tmp = init->shader->init(init->data, init->path); + + if (!tmp) + return false; + + if (string_is_equal(settings->arrays.menu_driver, "xmb") + && init->shader->init_menu_shaders) + { + RARCH_LOG("Setting up menu pipeline shaders for XMB ... \n"); + init->shader->init_menu_shaders(tmp); + } + + init->shader_data = tmp; + + return true; +} static bool gl2_shader_init(gl_t *gl, const gfx_ctx_driver_t *ctx_driver, struct retro_hw_render_callback *hwr @@ -2057,7 +2126,7 @@ static bool gl2_shader_init(gl_t *gl, const gfx_ctx_driver_t *ctx_driver, init_data.data = gl; init_data.path = shader_path; - if (video_shader_driver_init(&init_data)) + if (gl_shader_driver_init(&init_data)) { gl->shader = init_data.shader; gl->shader_data = init_data.shader_data; @@ -2069,7 +2138,7 @@ static bool gl2_shader_init(gl_t *gl, const gfx_ctx_driver_t *ctx_driver, init_data.shader = NULL; init_data.path = NULL; - ret = video_shader_driver_init(&init_data); + ret = gl_shader_driver_init(&init_data); gl->shader = init_data.shader; gl->shader_data = init_data.shader_data; @@ -2237,10 +2306,7 @@ static INLINE void gl2_set_shader_viewports(gl_t *gl) for (i = 0; i < 2; i++) { - if (video_info.shader_driver && video_info.shader_driver->use) - video_info.shader_driver->use(gl, - video_info.shader_data, i, true); - + gl->shader->use(gl, gl->shader_data, i, true); gl2_set_viewport(gl, &video_info, width, height, false, true); } @@ -2351,9 +2417,8 @@ static void gl2_render_osd_background( video_driver_set_viewport(video_info->width, video_info->height, true, false); - if (video_info->shader_driver && video_info->shader_driver->use) - video_info->shader_driver->use(gl, - video_info->shader_data, VIDEO_SHADER_STOCK_BLEND, true); + gl->shader->use(gl, gl->shader_data, + VIDEO_SHADER_STOCK_BLEND, true); gl->shader->set_coords(gl->shader_data, &coords); @@ -2453,9 +2518,8 @@ static INLINE void gl2_draw_texture(gl_t *gl, video_frame_info_t *video_info) glBindTexture(GL_TEXTURE_2D, gl->menu_texture); - if (video_info->shader_driver && video_info->shader_driver->use) - video_info->shader_driver->use(gl, - video_info->shader_data, VIDEO_SHADER_STOCK_BLEND, true); + gl->shader->use(gl, + gl->shader_data, VIDEO_SHADER_STOCK_BLEND, true); gl->coords.vertices = 4; @@ -2525,9 +2589,7 @@ static bool gl2_frame(void *data, const void *frame, if (gl->core_context_in_use) gl2_renderchain_bind_vao(chain); - if (video_info->shader_driver && video_info->shader_driver->use) - video_info->shader_driver->use(gl, - video_info->shader_data, 1, true); + gl->shader->use(gl, gl->shader_data, 1, true); #ifdef IOS /* Apparently the viewport is lost each frame, thanks Apple. */ @@ -2720,10 +2782,7 @@ static bool gl2_frame(void *data, const void *frame, /* Reset state which could easily mess up libretro core. */ if (gl->hw_render_fbo_init) { - if (video_info->shader_driver && video_info->shader_driver->use) - video_info->shader_driver->use(gl, - video_info->shader_data, 0, true); - + gl->shader->use(gl, gl->shader_data, 0, true); glBindTexture(GL_TEXTURE_2D, 0); } @@ -2821,7 +2880,6 @@ static void gl2_free(void *data) font_driver_free_osd(); gl->shader->deinit(gl->shader_data); - video_shader_driver_deinit(); glDeleteTextures(gl->textures, gl->texture); @@ -3430,7 +3488,7 @@ static void *gl2_init(const video_info_t *video, gl->shader = (shader_backend_t*)gl2_shader_ctx_drivers[0]; - if (!video_shader_driver_init_first(gl->shader)) + if (!gl->shader) { RARCH_ERR("[GL:]: Shader driver initialization failed.\n"); goto error; @@ -3665,8 +3723,6 @@ static bool gl2_set_shader(void *data, gl->shader->deinit(gl->shader_data); gl->shader_data = NULL; - video_shader_driver_deinit(); - switch (type) { #ifdef HAVE_GLSL @@ -3697,11 +3753,11 @@ static bool gl2_set_shader(void *data, init_data.data = gl; init_data.path = path; - if (!video_shader_driver_init(&init_data)) + if (!gl_shader_driver_init(&init_data)) { init_data.path = NULL; - video_shader_driver_init(&init_data); + gl_shader_driver_init(&init_data); gl->shader = init_data.shader; gl->shader_data = init_data.shader_data; diff --git a/gfx/video_driver.c b/gfx/video_driver.c index 84ddb15ac3..378bdf493f 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -225,9 +225,6 @@ static gfx_ctx_flags_t deferred_flag_data = {0}; static bool video_started_fullscreen = false; -static shader_backend_t *current_shader = NULL; -static void *current_shader_data = NULL; - static char video_driver_gpu_device_string[128] = {0}; static char video_driver_gpu_api_version_string[128] = {0}; @@ -2842,8 +2839,6 @@ void video_driver_build_info(video_frame_info_t *video_info) video_info->input_driver_nonblock_state = input_driver_is_nonblock_state(); video_info->context_data = video_context_data; - video_info->shader_driver = current_shader; - video_info->shader_data = current_shader_data; video_info->cb_update_window_title = current_video_context.update_window_title; video_info->cb_swap_buffers = current_video_context.swap_buffers; @@ -3408,46 +3403,6 @@ bool video_driver_cached_frame_has_valid_framebuffer(void) return false; } -static const shader_backend_t *video_shader_set_backend( - enum rarch_shader_type type) -{ - switch (type) - { - case RARCH_SHADER_CG: - { -#ifdef HAVE_CG - gfx_ctx_flags_t flags; - flags.flags = 0; - video_context_driver_get_flags(&flags); - - if (BIT32_GET(flags.flags, GFX_CTX_FLAGS_GL_CORE_CONTEXT)) - { - RARCH_ERR("[Shader driver]: Cg cannot be used with core" - " GL context. Trying to fall back to GLSL...\n"); - return video_shader_set_backend(RARCH_SHADER_GLSL); - } - - RARCH_LOG("[Shader driver]: Using Cg shader backend.\n"); - return &gl_cg_backend; -#else - break; -#endif - } - case RARCH_SHADER_GLSL: -#ifdef HAVE_GLSL - RARCH_LOG("[Shader driver]: Using GLSL shader backend.\n"); - return &gl_glsl_backend; -#else - break; -#endif - case RARCH_SHADER_HLSL: - case RARCH_SHADER_NONE: - default: - break; - } - - return NULL; -} bool video_shader_driver_get_current_shader(video_shader_ctx_t *shader) { @@ -3461,58 +3416,6 @@ bool video_shader_driver_get_current_shader(video_shader_ctx_t *shader) return true; } -bool video_shader_driver_deinit(void) -{ - current_shader_data = NULL; - current_shader = NULL; - return true; -} - -/* Finds first suitable shader context driver. */ -bool video_shader_driver_init_first(const void *data) -{ - shader_backend_t *ptr = (shader_backend_t*)data; - if (!ptr) - return false; - current_shader = ptr; - return true; -} - -bool video_shader_driver_init(video_shader_ctx_init_t *init) -{ - void *tmp = NULL; - settings_t *settings = config_get_ptr(); - - if (!init->shader || !init->shader->init) - { - init->shader = video_shader_set_backend(init->shader_type); - - if (!init->shader) - return false; - } - - tmp = init->shader->init(init->data, init->path); - - if (!tmp) - return false; - - if (string_is_equal(settings->arrays.menu_driver, "xmb") - && init->shader->init_menu_shaders) - { - RARCH_LOG("Setting up menu pipeline shaders for XMB ... \n"); - init->shader->init_menu_shaders(tmp); - } - - init->shader_data = tmp; - current_shader_data = tmp; - - RARCH_LOG("Resetting shader to defaults ... \n"); - - current_shader = (shader_backend_t*)init->shader; - - return true; -} - float video_driver_get_refresh_rate(void) { if (video_driver_poke && video_driver_poke->get_refresh_rate) diff --git a/gfx/video_driver.h b/gfx/video_driver.h index 1554ba559f..60d52dee69 100644 --- a/gfx/video_driver.h +++ b/gfx/video_driver.h @@ -491,9 +491,7 @@ typedef struct video_frame_info bool (*cb_set_resize)(void*, unsigned, unsigned); void *context_data; - void *shader_data; void *userdata; - const shader_backend_t *shader_driver; } video_frame_info_t; typedef void (*update_window_title_cb)(void*, void*); @@ -1183,12 +1181,6 @@ void video_context_driver_free(void); bool video_shader_driver_get_current_shader(video_shader_ctx_t *shader); -bool video_shader_driver_deinit(void); - -bool video_shader_driver_init_first(const void *data); - -bool video_shader_driver_init(video_shader_ctx_init_t *init); - float video_driver_get_refresh_rate(void); extern bool (*video_driver_cb_has_focus)(void);