mirror of
https://github.com/libretro/RetroArch
synced 2025-04-17 02:43:03 +00:00
Move current_shader pointer to video_shader_driver.c
This commit is contained in:
parent
629a660af4
commit
df60523f6c
@ -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
|
||||
|
@ -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;
|
||||
|
120
gfx/drivers/gl.c
120
gfx/drivers/gl.c
@ -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
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user