mirror of
https://github.com/libretro/RetroArch
synced 2025-03-03 04:14:00 +00:00
Move video_shader_driver_init to gl.c
This commit is contained in:
parent
27928081cf
commit
819016b00c
112
gfx/drivers/gl.c
112
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;
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user