Move video_shader_driver_init to gl.c

This commit is contained in:
twinaphex 2019-03-18 15:52:21 +01:00
parent 27928081cf
commit 819016b00c
3 changed files with 84 additions and 133 deletions

View File

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

View File

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

View File

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