Create SHADER_CTL_INIT
This commit is contained in:
parent
8c867394a0
commit
fab6903522
|
@ -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");
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue