Move current_shader pointer to video_shader_driver.c

This commit is contained in:
twinaphex 2015-12-08 09:27:25 +01:00
parent 629a660af4
commit df60523f6c
8 changed files with 145 additions and 170 deletions

View File

@ -110,9 +110,7 @@ typedef struct d3d_video
std::string shader_path;
#if defined(HAVE_CG) || defined(HAVE_HLSL) || defined(HAVE_GLSL)
#ifdef _XBOX
const shader_backend_t *shader;
#else
#ifndef _XBOX
struct video_shader shader;
#endif
#endif

View File

@ -45,7 +45,7 @@ static void renderchain_set_mvp(void *data, unsigned vp_width,
#if defined(_XBOX360) && defined(HAVE_HLSL)
hlsl_set_proj_matrix(XMMatrixRotationZ(rotation * (M_PI / 2.0)));
video_shader_driver_set_mvp(d3d->shader, d3d, NULL);
video_shader_driver_set_mvp(d3d, NULL);
#elif defined(HAVE_D3D8)
D3DXMATRIX p_out, p_rotate, mat;
D3DXMatrixOrthoOffCenterLH(&mat, 0, vp_width, vp_height, 0, 0.0f, 1.0f);
@ -209,15 +209,12 @@ static void renderchain_set_vertices(void *data, unsigned pass,
#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_HLSL)
#ifdef _XBOX
if (d3d->shader)
{
renderchain_set_mvp(d3d, width, height, d3d->dev_rotation);
video_shader_driver_use(d3d->shader, d3d, pass);
video_shader_driver_set_params(
d3d->shader, d3d, vert_width, vert_height, chain->tex_w,
chain->tex_h, width, height, frame_count,
NULL, NULL, NULL, NULL, 0);
}
renderchain_set_mvp(d3d, width, height, d3d->dev_rotation);
video_shader_driver_use(d3d, pass);
video_shader_driver_set_params(
d3d, vert_width, vert_height, chain->tex_w,
chain->tex_h, width, height, frame_count,
NULL, NULL, NULL, NULL, 0);
#endif
#endif
}
@ -302,9 +299,9 @@ static bool xdk_renderchain_init_shader(void *data, void *renderchain_data)
#if defined(HAVE_HLSL)
RARCH_LOG("D3D]: Using HLSL shader backend.\n");
shader_path = settings->video.shader_path;
d3d->shader = &hlsl_backend;
const shader_backend_t *shader = &hlsl_backend;
return video_shader_driver_init(d3d->shader, d3d, shader_path);
return video_shader_driver_init(hlsl_backend, d3d, shader_path);
#endif
return true;

View File

@ -278,14 +278,12 @@ static bool gl_shader_init(gl_t *gl)
#endif
#endif
gl->shader = backend;
ret = video_shader_driver_init(gl->shader, gl, shader_path);
ret = video_shader_driver_init(backend, gl, shader_path);
if (!ret)
{
RARCH_ERR("[GL]: Failed to initialize shader, falling back to stock.\n");
ret = video_shader_driver_init(gl->shader, gl, NULL);
ret = video_shader_driver_init(backend, gl, NULL);
}
return ret;
@ -293,8 +291,7 @@ static bool gl_shader_init(gl_t *gl)
static void gl_shader_deinit(gl_t *gl)
{
video_shader_driver_deinit(gl->shader);
gl->shader = NULL;
video_shader_driver_deinit();
}
#ifndef NO_GL_FF_VERTEX
@ -441,10 +438,10 @@ static void gl_create_fbo_texture(gl_t *gl, unsigned i, GLuint texture)
glBindTexture(GL_TEXTURE_2D, texture);
mipmapped = video_shader_driver_mipmap_input(gl->shader, i + 2);
mipmapped = video_shader_driver_mipmap_input(i + 2);
min_filter = mipmapped ? base_mip_filt : base_filt;
if (video_shader_driver_filter_type(gl->shader, i + 2, &smooth))
if (video_shader_driver_filter_type(i + 2, &smooth))
{
min_filter = mipmapped ? (smooth ?
GL_LINEAR_MIPMAP_LINEAR : GL_NEAREST_MIPMAP_NEAREST)
@ -453,7 +450,7 @@ static void gl_create_fbo_texture(gl_t *gl, unsigned i, GLuint texture)
mag_filter = min_filter_to_mag(min_filter);
wrap = video_shader_driver_wrap_type(gl->shader, i + 2);
wrap = video_shader_driver_wrap_type(i + 2);
wrap_enum = gl_wrap_type_to_enum(wrap);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter);
@ -626,16 +623,16 @@ static void gl_init_fbo(gl_t *gl, unsigned fbo_width, unsigned fbo_height)
unsigned width, height;
struct gfx_fbo_scale scale, scale_last;
if (!gl || video_shader_driver_num_shaders(gl->shader) == 0)
if (!gl || video_shader_driver_num_shaders() == 0)
return;
video_driver_get_size(&width, &height);
video_shader_scale(1, gl->shader, &scale);
video_shader_scale(video_shader_driver_num_shaders(gl->shader), gl->shader, &scale_last);
video_shader_driver_scale(1, &scale);
video_shader_driver_scale(video_shader_driver_num_shaders(), &scale_last);
/* we always want FBO to be at least initialized on startup for consoles */
if (video_shader_driver_num_shaders(gl->shader) == 1 && !scale.valid)
if (video_shader_driver_num_shaders() == 1 && !scale.valid)
return;
if (!gl_check_fbo_proc(gl))
@ -644,7 +641,7 @@ static void gl_init_fbo(gl_t *gl, unsigned fbo_width, unsigned fbo_height)
return;
}
gl->fbo_pass = video_shader_driver_num_shaders(gl->shader) - 1;
gl->fbo_pass = video_shader_driver_num_shaders() - 1;
if (scale_last.valid)
gl->fbo_pass++;
@ -660,7 +657,7 @@ static void gl_init_fbo(gl_t *gl, unsigned fbo_width, unsigned fbo_height)
for (i = 1; i < gl->fbo_pass; i++)
{
video_shader_scale(i + 1, gl->shader, &gl->fbo_scale[i]);
video_shader_driver_scale(i + 1, &gl->fbo_scale[i]);
if (!gl->fbo_scale[i].valid)
{
@ -681,7 +678,7 @@ static void gl_init_fbo(gl_t *gl, unsigned fbo_width, unsigned fbo_height)
gl->fbo_rect[i].width, gl->fbo_rect[i].height);
}
gl->fbo_feedback_enable = video_shader_driver_get_feedback_pass(gl->shader, &gl->fbo_feedback_pass);
gl->fbo_feedback_enable = video_shader_driver_get_feedback_pass(&gl->fbo_feedback_pass);
if (gl->fbo_feedback_enable && gl->fbo_feedback_pass < (unsigned)gl->fbo_pass)
{
@ -1106,24 +1103,24 @@ static void gl_frame_fbo(gl_t *gl, uint64_t frame_count,
glBindFramebuffer(RARCH_GL_FRAMEBUFFER, gl->fbo[i]);
video_shader_driver_use(gl->shader, gl, i + 1);
video_shader_driver_use(gl, i + 1);
glBindTexture(GL_TEXTURE_2D, gl->fbo_texture[i - 1]);
if (video_shader_driver_mipmap_input(gl->shader, i + 1))
if (video_shader_driver_mipmap_input(i + 1))
glGenerateMipmap(GL_TEXTURE_2D);
glClear(GL_COLOR_BUFFER_BIT);
/* Render to FBO with certain size. */
gl_set_viewport(gl, rect->img_width, rect->img_height, true, false);
video_shader_driver_set_params(gl->shader, gl, prev_rect->img_width, prev_rect->img_height,
video_shader_driver_set_params(gl, prev_rect->img_width, prev_rect->img_height,
prev_rect->width, prev_rect->height,
gl->vp.width, gl->vp.height, (unsigned int)frame_count,
tex_info, gl->prev_info, feedback_info, fbo_tex_info, fbo_tex_info_cnt);
gl->coords.vertices = 4;
video_shader_driver_set_coords(gl->shader, NULL, &gl->coords);
video_shader_driver_set_mvp(gl->shader, gl, &gl->mvp);
video_shader_driver_set_coords(NULL, &gl->coords);
video_shader_driver_set_mvp(gl, &gl->mvp);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}
@ -1152,17 +1149,17 @@ static void gl_frame_fbo(gl_t *gl, uint64_t frame_count,
/* Render our FBO texture to back buffer. */
gl_bind_backbuffer();
video_shader_driver_use(gl->shader, gl, gl->fbo_pass + 1);
video_shader_driver_use(gl, gl->fbo_pass + 1);
glBindTexture(GL_TEXTURE_2D, gl->fbo_texture[gl->fbo_pass - 1]);
if (video_shader_driver_mipmap_input(gl->shader, gl->fbo_pass + 1))
if (video_shader_driver_mipmap_input(gl->fbo_pass + 1))
glGenerateMipmap(GL_TEXTURE_2D);
glClear(GL_COLOR_BUFFER_BIT);
gl_set_viewport(gl, width, height, false, true);
video_shader_driver_set_params(gl->shader, gl,
video_shader_driver_set_params(gl,
prev_rect->img_width, prev_rect->img_height,
prev_rect->width, prev_rect->height,
gl->vp.width, gl->vp.height, (unsigned int)frame_count,
@ -1171,8 +1168,8 @@ static void gl_frame_fbo(gl_t *gl, uint64_t frame_count,
gl->coords.vertex = gl->vertex_ptr;
gl->coords.vertices = 4;
video_shader_driver_set_coords(gl->shader, NULL, &gl->coords);
video_shader_driver_set_mvp(gl->shader, gl, &gl->mvp);
video_shader_driver_set_coords(NULL, &gl->coords);
video_shader_driver_set_mvp(gl, &gl->mvp);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
gl->coords.tex_coord = gl->tex_info.coord;
@ -1536,7 +1533,7 @@ static INLINE void gl_set_shader_viewport(gl_t *gl, unsigned shader)
video_driver_get_size(&width, &height);
video_shader_driver_use(gl->shader, gl, shader);
video_shader_driver_use(gl, shader);
gl_set_viewport(gl, width, height, false, true);
}
@ -1608,10 +1605,10 @@ static INLINE void gl_draw_texture(gl_t *gl)
gl->coords.color = color;
glBindTexture(GL_TEXTURE_2D, gl->menu_texture);
video_shader_driver_use(gl->shader, gl, GL_SHADER_STOCK_BLEND);
video_shader_driver_use(gl, GL_SHADER_STOCK_BLEND);
gl->coords.vertices = 4;
video_shader_driver_set_coords(gl->shader, NULL, &gl->coords);
video_shader_driver_set_mvp(gl->shader, gl, &gl->mvp_no_rot);
video_shader_driver_set_coords(NULL, &gl->coords);
video_shader_driver_set_mvp(gl, &gl->mvp_no_rot);
glEnable(GL_BLEND);
@ -1656,7 +1653,7 @@ static bool gl_frame(void *data, const void *frame,
glBindVertexArray(gl->vao);
#endif
video_shader_driver_use(gl->shader, gl, 1);
video_shader_driver_use(gl, 1);
#ifdef IOS
/* Apparently the viewport is lost each frame, thanks Apple. */
@ -1768,7 +1765,7 @@ static bool gl_frame(void *data, const void *frame,
glClear(GL_COLOR_BUFFER_BIT);
video_shader_driver_set_params(gl->shader, gl,
video_shader_driver_set_params(gl,
frame_width, frame_height,
gl->tex_w, gl->tex_h,
gl->vp.width, gl->vp.height,
@ -1777,8 +1774,8 @@ static bool gl_frame(void *data, const void *frame,
NULL, 0);
gl->coords.vertices = 4;
video_shader_driver_set_coords(gl->shader, NULL, &gl->coords);
video_shader_driver_set_mvp(gl->shader, gl, &gl->mvp);
video_shader_driver_set_coords(NULL, &gl->coords);
video_shader_driver_set_mvp(gl, &gl->mvp);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
#ifdef HAVE_FBO
@ -1814,7 +1811,7 @@ static bool gl_frame(void *data, const void *frame,
/* Reset state which could easily mess up libretro core. */
if (gl->hw_render_fbo_init)
{
video_shader_driver_use(gl->shader, gl, 0);
video_shader_driver_use(gl, 0);
glBindTexture(GL_TEXTURE_2D, 0);
#ifndef NO_GL_FF_VERTEX
gl_disable_client_arrays(gl);
@ -2557,12 +2554,10 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo
hw_render->version_major, hw_render->version_minor);
#endif
gl->shader = (const shader_backend_t*)shader_ctx_init_first();
if (!shader_driver_ctx_init_first())
goto error;
if (gl->shader)
{
RARCH_LOG("[GL]: Default shader backend found: %s.\n", video_shader_driver_get_ident(gl->shader));
}
RARCH_LOG("[GL]: Default shader backend found: %s.\n", video_shader_driver_get_ident());
if (!gl_shader_init(gl))
{
@ -2570,14 +2565,13 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo
goto error;
}
if (gl->shader)
{
unsigned minimum = video_shader_driver_get_prev_textures(gl->shader);
unsigned minimum = video_shader_driver_get_prev_textures();
gl->textures = max(minimum + 1, gl->textures);
}
RARCH_LOG("[GL]: Using %u textures.\n", gl->textures);
RARCH_LOG("[GL]: Loaded %u program(s).\n", video_shader_driver_num_shaders(gl->shader));
RARCH_LOG("[GL]: Loaded %u program(s).\n", video_shader_driver_num_shaders());
gl->tex_w = gl->tex_h = (RARCH_SCALE_BASE * video->input_scale);
gl->keep_aspect = video->force_aspect;
@ -2587,9 +2581,9 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo
gl_set_shader_viewport(gl, 0);
gl_set_shader_viewport(gl, 1);
gl->tex_mipmap = video_shader_driver_mipmap_input(gl->shader, 1);
gl->tex_mipmap = video_shader_driver_mipmap_input(1);
if (video_shader_driver_filter_type(gl->shader, 1, &force_smooth))
if (video_shader_driver_filter_type(1, &force_smooth))
gl->tex_min_filter = gl->tex_mipmap ? (force_smooth ?
GL_LINEAR_MIPMAP_LINEAR : GL_NEAREST_MIPMAP_NEAREST)
: (force_smooth ? GL_LINEAR : GL_NEAREST);
@ -2599,7 +2593,7 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo
: (video->smooth ? GL_LINEAR : GL_NEAREST);
gl->tex_mag_filter = min_filter_to_mag(gl->tex_min_filter);
gl->wrap_mode = gl_wrap_type_to_enum(video_shader_driver_wrap_type(gl->shader, 1));
gl->wrap_mode = gl_wrap_type_to_enum(video_shader_driver_wrap_type(1));
gl_set_texture_fmts(gl, video->rgb32);
@ -2722,11 +2716,11 @@ static void gl_update_tex_filter_frame(gl_t *gl)
context_bind_hw_render(gl, false);
if (!video_shader_driver_filter_type(gl->shader, 1, &smooth))
if (!video_shader_driver_filter_type(1, &smooth))
smooth = settings->video.smooth;
wrap_mode = gl_wrap_type_to_enum(video_shader_driver_wrap_type(gl->shader, 1));
gl->tex_mipmap = video_shader_driver_mipmap_input(gl->shader, 1);
wrap_mode = gl_wrap_type_to_enum(video_shader_driver_wrap_type(1));
gl->tex_mipmap = video_shader_driver_mipmap_input(1);
gl->video_info.smooth = smooth;
new_filt = gl->tex_mipmap ? (smooth ?
@ -2760,6 +2754,7 @@ static bool gl_set_shader(void *data,
enum rarch_shader_type type, const char *path)
{
#if defined(HAVE_GLSL) || defined(HAVE_CG)
const shader_backend_t *shader = NULL;
gl_t *gl = (gl_t*)data;
if (!gl)
@ -2776,13 +2771,13 @@ static bool gl_set_shader(void *data,
{
#ifdef HAVE_GLSL
case RARCH_SHADER_GLSL:
gl->shader = &gl_glsl_backend;
shader = &gl_glsl_backend;
break;
#endif
#ifdef HAVE_CG
case RARCH_SHADER_CG:
gl->shader = &gl_cg_backend;
shader = &gl_cg_backend;
break;
#endif
@ -2790,7 +2785,7 @@ static bool gl_set_shader(void *data,
break;
}
if (!gl->shader)
if (!shader)
{
RARCH_ERR("[GL]: Cannot find shader core for path: %s.\n", path);
context_bind_hw_render(gl, true);
@ -2802,23 +2797,21 @@ static bool gl_set_shader(void *data,
glBindTexture(GL_TEXTURE_2D, gl->texture[gl->tex_index]);
#endif
if (!video_shader_driver_init(gl->shader, gl, path))
if (!video_shader_driver_init(shader, gl, path))
{
bool ret = video_shader_driver_init(gl->shader, gl, NULL);
bool ret = video_shader_driver_init(shader, gl, NULL);
RARCH_WARN("[GL]: Failed to set multipass shader. Falling back to stock.\n");
if (!ret)
gl->shader = NULL;
context_bind_hw_render(gl, true);
return false;
}
gl_update_tex_filter_frame(gl);
if (gl->shader)
if (shader)
{
unsigned textures = video_shader_driver_get_prev_textures(gl->shader) + 1;
unsigned textures = video_shader_driver_get_prev_textures() + 1;
if (textures > gl->textures) /* Have to reinit a bit. */
{
@ -3235,15 +3228,15 @@ static void gl_render_overlay(void *data)
glViewport(0, 0, width, height);
/* Ensure that we reset the attrib array. */
video_shader_driver_use(gl->shader, gl, GL_SHADER_STOCK_BLEND);
video_shader_driver_use(gl, GL_SHADER_STOCK_BLEND);
gl->coords.vertex = gl->overlay_vertex_coord;
gl->coords.tex_coord = gl->overlay_tex_coord;
gl->coords.color = gl->overlay_color_coord;
gl->coords.vertices = 4 * gl->overlays;
video_shader_driver_set_coords(gl->shader, NULL, &gl->coords);
video_shader_driver_set_mvp(gl->shader, gl, &gl->mvp_no_rot);
video_shader_driver_set_coords(NULL, &gl->coords);
video_shader_driver_set_mvp(gl, &gl->mvp_no_rot);
for (i = 0; i < gl->overlays; i++)
{
@ -3387,10 +3380,7 @@ static void gl_show_mouse(void *data, bool state)
static struct video_shader *gl_get_current_shader(void *data)
{
gl_t *gl = (gl_t*)data;
if (!gl)
return NULL;
return video_shader_driver_direct_get_current_shader(gl->shader);
return video_shader_driver_direct_get_current_shader();
}
#endif

View File

@ -225,11 +225,8 @@ static int gl_get_message_width(void *data, const char *msg, unsigned msg_len_fu
static void gl_raster_font_draw_vertices(gl_t *gl, const gfx_coords_t *coords)
{
if (!gl)
return;
video_shader_driver_set_coords(gl->shader, NULL, coords);
video_shader_driver_set_mvp(gl->shader, gl, &gl->mvp_no_rot);
video_shader_driver_set_coords(NULL, coords);
video_shader_driver_set_mvp(gl, &gl->mvp_no_rot);
glDrawArrays(GL_TRIANGLES, 0, coords->vertices);
}
@ -367,7 +364,6 @@ static void gl_raster_font_render_message(
static void gl_raster_font_setup_viewport(gl_raster_t *font, bool full_screen)
{
unsigned width, height;
gl_t *gl = font ? font->gl : NULL;
video_driver_get_size(&width, &height);
@ -379,7 +375,7 @@ static void gl_raster_font_setup_viewport(gl_raster_t *font, bool full_screen)
glBindTexture(GL_TEXTURE_2D, font->tex);
video_shader_driver_use(gl->shader, NULL, GL_SHADER_STOCK_BLEND);
video_shader_driver_use(NULL, GL_SHADER_STOCK_BLEND);
}
static void gl_raster_font_restore_viewport(gl_t *gl)

View File

@ -32,6 +32,7 @@ static const shader_backend_t *shader_ctx_drivers[] = {
NULL
};
static const shader_backend_t *current_shader;
static void *shader_data;
/**
@ -56,20 +57,23 @@ const shader_backend_t *shader_ctx_find_driver(const char *ident)
}
/**
* shader_ctx_init_first:
* shader_driver_ctx_init_first:
*
* Finds first suitable shader context driver and initializes.
* Finds first suitable shader context driver.
*
* Returns: shader context driver if found, otherwise NULL.
* Returns: true (1) if found, otherwise false (0).
**/
const shader_backend_t *shader_ctx_init_first(void)
bool shader_driver_ctx_init_first(void)
{
unsigned i;
for (i = 0; shader_ctx_drivers[i]; i++)
return shader_ctx_drivers[i];
{
current_shader = shader_ctx_drivers[i];
return true;
}
return NULL;
return false;
}
struct video_shader *video_shader_driver_get_current_shader(void)
@ -83,16 +87,15 @@ struct video_shader *video_shader_driver_get_current_shader(void)
return video_poke->get_current_shader(video_driver);
}
void video_shader_scale(unsigned idx,
const shader_backend_t *shader, struct gfx_fbo_scale *scale)
void video_shader_driver_scale(unsigned idx, struct gfx_fbo_scale *scale)
{
if (!scale || !shader)
if (!scale || !current_shader)
return;
scale->valid = false;
if (shader->shader_scale)
shader->shader_scale(shader_data, idx, scale);
if (current_shader->shader_scale)
current_shader->shader_scale(shader_data, idx, scale);
}
bool video_shader_driver_init(const shader_backend_t *shader, void *data, const char *path)
@ -107,98 +110,100 @@ bool video_shader_driver_init(const shader_backend_t *shader, void *data, const
if (!tmp)
return false;
shader_data = tmp;
shader_data = tmp;
current_shader = shader;
return true;
}
void video_shader_driver_deinit(const shader_backend_t *shader)
void video_shader_driver_deinit(void)
{
if (!shader)
if (!current_shader)
return;
if (shader->deinit)
shader->deinit(shader_data);
if (current_shader->deinit)
current_shader->deinit(shader_data);
shader_data = NULL;
shader_data = NULL;
current_shader = NULL;
}
void video_shader_driver_use(const shader_backend_t *shader, void *data, unsigned index)
void video_shader_driver_use(void *data, unsigned index)
{
if (!shader)
if (!current_shader)
return;
shader->use(data, shader_data, index);
current_shader->use(data, shader_data, index);
}
const char *video_shader_driver_get_ident(const shader_backend_t *shader)
const char *video_shader_driver_get_ident(void)
{
if (!shader)
if (!current_shader)
return NULL;
return shader->ident;
return current_shader->ident;
}
bool video_shader_driver_mipmap_input(const shader_backend_t *shader, unsigned index)
bool video_shader_driver_mipmap_input(unsigned index)
{
if (!shader)
if (!current_shader)
return false;
return shader->mipmap_input(shader_data, index);
return current_shader->mipmap_input(shader_data, index);
}
unsigned video_shader_driver_num_shaders(const shader_backend_t *shader)
unsigned video_shader_driver_num_shaders(void)
{
if (!shader)
if (!current_shader)
return 0;
return shader->num_shaders(shader_data);
return current_shader->num_shaders(shader_data);
}
unsigned video_shader_driver_get_prev_textures(const shader_backend_t *shader)
unsigned video_shader_driver_get_prev_textures(void)
{
if (!shader)
if (!current_shader)
return 0;
return shader->get_prev_textures(shader_data);
return current_shader->get_prev_textures(shader_data);
}
bool video_shader_driver_set_coords(const shader_backend_t *shader, void *handle_data, const void *data)
bool video_shader_driver_set_coords(void *handle_data, const void *data)
{
if (!shader || !shader->set_coords)
if (!current_shader || !current_shader->set_coords)
return false;
return shader->set_coords(handle_data, shader_data, data);
return current_shader->set_coords(handle_data, shader_data, data);
}
bool video_shader_driver_set_mvp(const shader_backend_t *shader, void *data, const math_matrix_4x4 *mat)
bool video_shader_driver_set_mvp(void *data, const math_matrix_4x4 *mat)
{
if (!shader || !shader->set_mvp)
if (!current_shader || !current_shader->set_mvp)
return false;
return shader->set_mvp(data, shader_data, mat);
return current_shader->set_mvp(data, shader_data, mat);
}
bool video_shader_driver_filter_type(const shader_backend_t *shader, unsigned index, bool *smooth)
bool video_shader_driver_filter_type(unsigned index, bool *smooth)
{
if (!shader || !shader->filter_type)
if (!current_shader || !current_shader->filter_type)
return false;
return shader->filter_type(shader_data, index, smooth);
return current_shader->filter_type(shader_data, index, smooth);
}
enum gfx_wrap_type video_shader_driver_wrap_type(const shader_backend_t *shader, unsigned index)
enum gfx_wrap_type video_shader_driver_wrap_type(unsigned index)
{
return shader->wrap_type(shader_data, index);
return current_shader->wrap_type(shader_data, index);
}
bool video_shader_driver_get_feedback_pass(const shader_backend_t *shader, unsigned *pass)
bool video_shader_driver_get_feedback_pass(unsigned *pass)
{
if (!shader || !shader->get_feedback_pass)
if (!current_shader || !current_shader->get_feedback_pass)
return false;
return shader->get_feedback_pass(shader_data, pass);
return current_shader->get_feedback_pass(shader_data, pass);
}
struct video_shader *video_shader_driver_direct_get_current_shader(const shader_backend_t *shader)
struct video_shader *video_shader_driver_direct_get_current_shader(void)
{
if (!shader || !shader->get_current_shader)
if (!current_shader || !current_shader->get_current_shader)
return NULL;
return shader->get_current_shader(shader_data);
return current_shader->get_current_shader(shader_data);
}
void video_shader_driver_set_params(const shader_backend_t *shader,
void video_shader_driver_set_params(
void *data, unsigned width, unsigned height,
unsigned tex_width, unsigned tex_height,
unsigned out_width, unsigned out_height,
@ -208,9 +213,9 @@ void video_shader_driver_set_params(const shader_backend_t *shader,
const void *feedback_info,
const void *fbo_info, unsigned fbo_info_cnt)
{
if (!shader || !shader->set_params)
if (!current_shader || !current_shader->set_params)
return;
return shader->set_params(data, shader_data,
return current_shader->set_params(data, shader_data,
width, height, tex_width, tex_height,
out_width, out_height, frame_counter, info, prev_info, feedback_info,
fbo_info, fbo_info_cnt);

View File

@ -92,8 +92,7 @@ extern const shader_backend_t shader_null_backend;
#endif
void video_shader_scale(unsigned idx,
const shader_backend_t *shader, struct gfx_fbo_scale *scale);
void video_shader_driver_scale(unsigned idx, struct gfx_fbo_scale *scale);
/**
* shader_ctx_find_driver:
@ -106,43 +105,43 @@ void video_shader_scale(unsigned idx,
const shader_backend_t *shader_ctx_find_driver(const char *ident);
/**
* shader_ctx_init_first:
* shader_driver_ctx_init_first:
*
* Finds first suitable shader context driver and initializes.
* Finds first suitable shader context driver.
*
* Returns: shader context driver if found, otherwise NULL.
**/
const shader_backend_t *shader_ctx_init_first(void);
bool shader_driver_ctx_init_first(void);
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_deinit(const shader_backend_t *shader);
void video_shader_driver_deinit(void);
void video_shader_driver_use(const shader_backend_t *shader, void *data, unsigned index);
void video_shader_driver_use(void *data, unsigned index);
const char *video_shader_driver_get_ident(const shader_backend_t *shader);
const char *video_shader_driver_get_ident(void);
bool video_shader_driver_mipmap_input(const shader_backend_t *shader, unsigned index);
bool video_shader_driver_mipmap_input(unsigned index);
unsigned video_shader_driver_num_shaders(const shader_backend_t *shader);
unsigned video_shader_driver_num_shaders(void);
bool video_shader_driver_set_coords(const shader_backend_t *shader, void *handle_data, const void *data);
bool video_shader_driver_set_coords(void *handle_data, const void *data);
bool video_shader_driver_set_mvp(const shader_backend_t *shader, void *data, const math_matrix_4x4 *mat);
bool video_shader_driver_set_mvp(void *data, const math_matrix_4x4 *mat);
unsigned video_shader_driver_get_prev_textures(const shader_backend_t *shader);
unsigned video_shader_driver_get_prev_textures(void);
bool video_shader_driver_filter_type(const shader_backend_t *shader, unsigned index, bool *smooth);
bool video_shader_driver_filter_type(unsigned index, bool *smooth);
enum gfx_wrap_type video_shader_driver_wrap_type(const shader_backend_t *shader, unsigned index);
enum gfx_wrap_type video_shader_driver_wrap_type(unsigned index);
bool video_shader_driver_get_feedback_pass(const shader_backend_t *shader, unsigned *pass);
bool video_shader_driver_get_feedback_pass(unsigned *pass);
struct video_shader *video_shader_driver_direct_get_current_shader(const shader_backend_t *shader);
struct video_shader *video_shader_driver_direct_get_current_shader(void);
void video_shader_driver_set_params(const shader_backend_t *shader,
void video_shader_driver_set_params(
void *data, unsigned width, unsigned height,
unsigned tex_width, unsigned tex_height,
unsigned out_width, unsigned out_height,

View File

@ -83,11 +83,6 @@ static void menu_display_d3d_blend_begin(void)
return;
d3d_enable_blend_func(d3d->dev);
#if 0
if (gl->shader && gl->shader->use)
gl->shader->use(gl, GL_SHADER_STOCK_BLEND);
#endif
}
static void menu_display_d3d_blend_end(void)

View File

@ -73,15 +73,10 @@ static GLenum menu_display_prim_to_gl_enum(enum menu_display_prim_type prim_type
static void menu_display_gl_blend_begin(void)
{
gl_t *gl = gl_get_ptr();
if (!gl)
return;
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
video_shader_driver_use(gl->shader, NULL, GL_SHADER_STOCK_BLEND);
video_shader_driver_use(NULL, GL_SHADER_STOCK_BLEND);
}
static void menu_display_gl_blend_end(void)
@ -120,8 +115,8 @@ static void menu_display_gl_draw(
glViewport(x, y, width, height);
glBindTexture(GL_TEXTURE_2D, (GLuint)texture);
video_shader_driver_set_coords(gl->shader, gl, coords);
video_shader_driver_set_mvp(gl->shader, video_driver_get_ptr(false), mat);
video_shader_driver_set_coords(gl, coords);
video_shader_driver_set_mvp(video_driver_get_ptr(false), mat);
glDrawArrays(menu_display_prim_to_gl_enum(prim_type), 0, coords->vertices);