Create SHADER_CTL_INIT

This commit is contained in:
twinaphex 2016-02-14 18:41:45 +01:00
parent 8c867394a0
commit fab6903522
3 changed files with 46 additions and 25 deletions

View File

@ -235,6 +235,7 @@ static bool gl_check_fbo_proc(gl_t *gl)
static bool gl_shader_init(gl_t *gl)
{
video_shader_ctx_init_t init_data;
enum rarch_shader_type type;
bool ret = false;
const shader_backend_t *backend = NULL;
@ -294,12 +295,21 @@ static bool gl_shader_init(gl_t *gl)
#endif
#endif
ret = video_shader_driver_init(backend, gl, shader_path);
init_data.shader = backend;
init_data.data = gl;
init_data.path = shader_path;
ret = video_shader_driver_ctl(SHADER_CTL_INIT, &init_data);
if (!ret)
{
RARCH_ERR("[GL]: Failed to initialize shader, falling back to stock.\n");
ret = video_shader_driver_init(backend, gl, NULL);
init_data.shader = backend;
init_data.data = gl;
init_data.path = NULL;
ret = video_shader_driver_ctl(SHADER_CTL_INIT, &init_data);
}
return ret;
@ -2897,6 +2907,7 @@ static bool gl_set_shader(void *data,
enum rarch_shader_type type, const char *path)
{
#if defined(HAVE_GLSL) || defined(HAVE_CG)
video_shader_ctx_init_t init_data;
const shader_backend_t *shader = NULL;
gl_t *gl = (gl_t*)data;
@ -2940,9 +2951,15 @@ static bool gl_set_shader(void *data,
glBindTexture(GL_TEXTURE_2D, gl->texture[gl->tex_index]);
#endif
if (!video_shader_driver_init(shader, gl, path))
init_data.shader = shader;
init_data.data = gl;
init_data.path = path;
if (!video_shader_driver_ctl(SHADER_CTL_INIT, &init_data))
{
video_shader_driver_init(shader, gl, NULL);
init_data.path = NULL;
video_shader_driver_ctl(SHADER_CTL_INIT, &init_data);
RARCH_WARN("[GL]: Failed to set multipass shader. Falling back to stock.\n");

View File

@ -80,25 +80,6 @@ void video_shader_driver_scale(unsigned idx, struct gfx_fbo_scale *scale)
current_shader->shader_scale(shader_data, idx, scale);
}
bool video_shader_driver_init(const shader_backend_t *shader,
void *data, const char *path)
{
void *tmp = NULL;
if (!shader || !shader->init)
return false;
tmp = shader->init(data, path);
if (!tmp)
return false;
shader_data = tmp;
current_shader = shader;
return true;
}
void video_shader_driver_use(void *data, unsigned index)
{
if (!current_shader)
@ -216,6 +197,23 @@ bool video_shader_driver_ctl(enum video_shader_driver_ctl_state state, void *dat
}
}
return false;
case SHADER_CTL_INIT:
{
video_shader_ctx_init_t *init = (video_shader_ctx_init_t*)data;
void *tmp = NULL;
if (!init->shader || !init->shader->init)
return false;
tmp = init->shader->init(init->data, init->path);
if (!tmp)
return false;
shader_data = tmp;
current_shader = init->shader;
}
break;
case SHADER_CTL_GET_FEEDBACK_PASS:
if (!current_shader || !current_shader->get_feedback_pass)
return false;

View File

@ -34,6 +34,7 @@ enum video_shader_driver_ctl_state
{
SHADER_CTL_NONE = 0,
SHADER_CTL_DEINIT,
SHADER_CTL_INIT,
/* Finds first suitable shader context driver. */
SHADER_CTL_INIT_FIRST,
SHADER_CTL_SET_PARAMS,
@ -76,6 +77,13 @@ typedef struct shader_backend
const char *ident;
} shader_backend_t;
typedef struct video_shader_ctx_init
{
const shader_backend_t *shader;
void *data;
const char *path;
} video_shader_ctx_init_t;
typedef struct video_shader_ctx_params
{
void *data;
@ -136,8 +144,6 @@ const shader_backend_t *shader_ctx_find_driver(const char *ident);
struct video_shader *video_shader_driver_get_current_shader(void);
bool video_shader_driver_init(const shader_backend_t *shader,
void *data, const char *path);
void video_shader_driver_use(void *data, unsigned index);