From 1b8e8ac22a74124c8717f58d14fde3c8dbd1c7d8 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 8 May 2016 21:11:27 +0200 Subject: [PATCH] Remove video_shader_driver_ctl --- gfx/d3d/render_chain_xdk.cpp | 6 +- gfx/drivers/gl.c | 109 +++--- gfx/drivers_font/gl_raster_font.c | 6 +- gfx/video_shader_driver.c | 447 +++++++++++----------- gfx/video_shader_driver.h | 65 ++-- menu/cbs/menu_cbs_get_value.c | 2 +- menu/cbs/menu_cbs_left.c | 2 +- menu/cbs/menu_cbs_right.c | 2 +- menu/cbs/menu_cbs_start.c | 2 +- menu/drivers/nk_common.c | 4 +- menu/drivers/nk_menu.c | 2 +- menu/drivers_display/menu_display_d3d.cpp | 4 +- menu/drivers_display/menu_display_gl.c | 10 +- menu/menu_displaylist.c | 2 +- ui/drivers/ui_win32.c | 8 +- 15 files changed, 331 insertions(+), 340 deletions(-) diff --git a/gfx/d3d/render_chain_xdk.cpp b/gfx/d3d/render_chain_xdk.cpp index 3f1a4dc6a2..ac4c7d494d 100644 --- a/gfx/d3d/render_chain_xdk.cpp +++ b/gfx/d3d/render_chain_xdk.cpp @@ -50,7 +50,7 @@ static void renderchain_set_mvp(void *data, unsigned vp_width, mvp.data = d3d; mvp.matrix = NULL; - video_shader_driver_ctl(SHADER_CTL_SET_MVP, &mvp); + video_shadser_driver_set_mvp(&mvp); #elif defined(HAVE_D3D8) D3DXMATRIX p_out, p_rotate, mat; D3DXMatrixOrthoOffCenterLH(&mat, 0, vp_width, vp_height, 0, 0.0f, 1.0f); @@ -224,7 +224,7 @@ static void renderchain_set_vertices(void *data, unsigned pass, shader_info.idx = pass; shader_info.set_active = true; - video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); + video_shader_driver_use(&shader_info); params.data = d3d; params.width = vert_width; @@ -240,7 +240,7 @@ static void renderchain_set_vertices(void *data, unsigned pass, params.fbo_info = NULL; params.fbo_info_cnt = 0; - video_shader_driver_ctl(SHADER_CTL_SET_PARAMS, ¶ms); + video_shader_driver_set_parameters(¶ms); #endif #endif } diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index 43594f8ae3..ed30f4e671 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -275,7 +275,7 @@ static bool gl_shader_init(gl_t *gl) init_data.data = gl; init_data.path = shader_path; - if (video_shader_driver_ctl(SHADER_CTL_INIT, &init_data)) + if (video_shader_driver_init(&init_data)) return true; RARCH_ERR("[GL]: Failed to initialize shader, falling back to stock.\n"); @@ -283,12 +283,7 @@ static bool gl_shader_init(gl_t *gl) init_data.shader = NULL; init_data.path = NULL; - return video_shader_driver_ctl(SHADER_CTL_INIT, &init_data); -} - -static void gl_shader_deinit(gl_t *gl) -{ - video_shader_driver_ctl(SHADER_CTL_DEINIT, NULL); + return video_shader_driver_init(&init_data); } #ifndef NO_GL_FF_VERTEX @@ -441,12 +436,12 @@ static void gl_create_fbo_texture(gl_t *gl, unsigned i, GLuint texture) glBindTexture(GL_TEXTURE_2D, texture); mip_level = i + 2; - mipmapped = video_shader_driver_ctl(SHADER_CTL_MIPMAP_INPUT, &mip_level); + mipmapped = video_shader_driver_mipmap_input(&mip_level); min_filter = mipmapped ? base_mip_filt : base_filt; filter_type.index = i + 2; filter_type.smooth = &smooth; - if (video_shader_driver_ctl(SHADER_CTL_FILTER_TYPE, &filter_type)) + if (video_shader_driver_filter_type(&filter_type)) { min_filter = mipmapped ? (smooth ? GL_LINEAR_MIPMAP_LINEAR : GL_NEAREST_MIPMAP_NEAREST) @@ -456,7 +451,7 @@ static void gl_create_fbo_texture(gl_t *gl, unsigned i, GLuint texture) mag_filter = min_filter_to_mag(min_filter); wrap.idx = i + 2; - video_shader_driver_ctl(SHADER_CTL_WRAP_TYPE, &wrap); + video_shader_driver_wrap_type(&wrap); wrap_enum = gl_wrap_type_to_enum(wrap.type); @@ -635,7 +630,7 @@ static void gl_init_fbo(gl_t *gl, unsigned fbo_width, unsigned fbo_height) video_shader_ctx_info_t shader_info; struct gfx_fbo_scale scale, scale_last; - if (!video_shader_driver_ctl(SHADER_CTL_INFO, &shader_info)) + if (!video_shader_driver_info(&shader_info)) return; if (!gl || shader_info.num == 0) @@ -646,12 +641,12 @@ static void gl_init_fbo(gl_t *gl, unsigned fbo_width, unsigned fbo_height) scaler.idx = 1; scaler.scale = &scale; - video_shader_driver_ctl(SHADER_CTL_SCALE, &scaler); + video_shader_driver_scale(&scaler); scaler.idx = shader_info.num; scaler.scale = &scale_last; - video_shader_driver_ctl(SHADER_CTL_SCALE, &scaler); + video_shader_driver_scale(&scaler); /* we always want FBO to be at least initialized on startup for consoles */ if (shader_info.num == 1 && !scale.valid) @@ -682,7 +677,7 @@ static void gl_init_fbo(gl_t *gl, unsigned fbo_width, unsigned fbo_height) scaler.idx = i + 1; scaler.scale = &gl->fbo_scale[i]; - video_shader_driver_ctl(SHADER_CTL_SCALE, &scaler); + video_shader_driver_scale(&scaler); if (!gl->fbo_scale[i].valid) { @@ -703,8 +698,8 @@ 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_ctl( - SHADER_CTL_GET_FEEDBACK_PASS, &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) @@ -1157,12 +1152,12 @@ static void gl_frame_fbo(gl_t *gl, uint64_t frame_count, shader_info.idx = i + 1; shader_info.set_active = true; - video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); + video_shader_driver_use(&shader_info); glBindTexture(GL_TEXTURE_2D, gl->fbo_texture[i - 1]); mip_level = i + 1; - if (video_shader_driver_ctl(SHADER_CTL_MIPMAP_INPUT, &mip_level)) + if (video_shader_driver_mipmap_input(&mip_level)) glGenerateMipmap(GL_TEXTURE_2D); glClear(GL_COLOR_BUFFER_BIT); @@ -1184,19 +1179,19 @@ static void gl_frame_fbo(gl_t *gl, uint64_t frame_count, params.fbo_info = fbo_tex_info; params.fbo_info_cnt = fbo_tex_info_cnt; - video_shader_driver_ctl(SHADER_CTL_SET_PARAMS, ¶ms); + video_shader_driver_set_parameters(¶ms); gl->coords.vertices = 4; coords.handle_data = NULL; coords.data = &gl->coords; - video_shader_driver_ctl(SHADER_CTL_SET_COORDS, &coords); + video_shader_driver_set_coords(&coords); mvp.data = gl; mvp.matrix = &gl->mvp; - video_shader_driver_ctl(SHADER_CTL_SET_MVP, &mvp); + video_shader_driver_set_mvp(&mvp); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } @@ -1231,13 +1226,13 @@ static void gl_frame_fbo(gl_t *gl, uint64_t frame_count, shader_info.idx = gl->fbo_pass + 1; shader_info.set_active = true; - video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); + video_shader_driver_use(&shader_info); glBindTexture(GL_TEXTURE_2D, gl->fbo_texture[gl->fbo_pass - 1]); mip_level = gl->fbo_pass + 1; - if (video_shader_driver_ctl(SHADER_CTL_MIPMAP_INPUT, &mip_level)) + if (video_shader_driver_mipmap_input(&mip_level)) glGenerateMipmap(GL_TEXTURE_2D); glClear(GL_COLOR_BUFFER_BIT); @@ -1257,7 +1252,7 @@ static void gl_frame_fbo(gl_t *gl, uint64_t frame_count, params.fbo_info = fbo_tex_info; params.fbo_info_cnt = fbo_tex_info_cnt; - video_shader_driver_ctl(SHADER_CTL_SET_PARAMS, ¶ms); + video_shader_driver_set_parameters(¶ms); gl->coords.vertex = gl->vertex_ptr; @@ -1266,12 +1261,12 @@ static void gl_frame_fbo(gl_t *gl, uint64_t frame_count, coords.handle_data = NULL; coords.data = &gl->coords; - video_shader_driver_ctl(SHADER_CTL_SET_COORDS, &coords); + video_shader_driver_set_coords(&coords); mvp.data = gl; mvp.matrix = &gl->mvp; - video_shader_driver_ctl(SHADER_CTL_SET_MVP, &mvp); + video_shader_driver_set_mvp(&mvp); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); gl->coords.tex_coord = gl->tex_info.coord; @@ -1617,7 +1612,7 @@ static INLINE void gl_set_shader_viewport(gl_t *gl, unsigned idx) shader_info.idx = idx; shader_info.set_active = true; - video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); + video_shader_driver_use(&shader_info); gl_set_viewport(gl, width, height, false, true); } @@ -1696,19 +1691,19 @@ static INLINE void gl_draw_texture(gl_t *gl) shader_info.idx = VIDEO_SHADER_STOCK_BLEND; shader_info.set_active = true; - video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); + video_shader_driver_use(&shader_info); gl->coords.vertices = 4; coords.handle_data = NULL; coords.data = &gl->coords; - video_shader_driver_ctl(SHADER_CTL_SET_COORDS, &coords); + video_shader_driver_set_coords(&coords); mvp.data = gl; mvp.matrix = &gl->mvp_no_rot; - video_shader_driver_ctl(SHADER_CTL_SET_MVP, &mvp); + video_shader_driver_set_mvp(&mvp); glEnable(GL_BLEND); @@ -1767,7 +1762,7 @@ static bool gl_frame(void *data, const void *frame, shader_info.idx = 1; shader_info.set_active = true; - video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); + video_shader_driver_use(&shader_info); #ifdef IOS /* Apparently the viewport is lost each frame, thanks Apple. */ @@ -1899,18 +1894,18 @@ static bool gl_frame(void *data, const void *frame, params.fbo_info = NULL; params.fbo_info_cnt = 0; - video_shader_driver_ctl(SHADER_CTL_SET_PARAMS, ¶ms); + video_shader_driver_set_parameters(¶ms); gl->coords.vertices = 4; coords.handle_data = NULL; coords.data = &gl->coords; - video_shader_driver_ctl(SHADER_CTL_SET_COORDS, &coords); + video_shader_driver_set_coords(&coords); mvp.data = gl; mvp.matrix = &gl->mvp; - video_shader_driver_ctl(SHADER_CTL_SET_MVP, &mvp); + video_shader_driver_set_mvp(&mvp); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); @@ -1950,7 +1945,7 @@ static bool gl_frame(void *data, const void *frame, shader_info.idx = 0; shader_info.set_active = true; - video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); + video_shader_driver_use(&shader_info); glBindTexture(GL_TEXTURE_2D, 0); #ifndef NO_GL_FF_VERTEX @@ -2076,7 +2071,7 @@ static void gl_free(void *data) if (font_driver_has_render_msg()) font_driver_free(NULL); - gl_shader_deinit(gl); + video_shader_driver_deinit(); #ifndef NO_GL_FF_VERTEX gl_disable_client_arrays(gl); @@ -2727,10 +2722,10 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo hwr->version_major, hwr->version_minor); #endif - if (!video_shader_driver_ctl(SHADER_CTL_INIT_FIRST, NULL)) + if (!video_shader_driver_init_first()) goto error; - video_shader_driver_ctl(SHADER_CTL_GET_IDENT, &ident_info); + video_shader_driver_get_ident(&ident_info); RARCH_LOG("[GL]: Default shader backend found: %s.\n", ident_info.ident); @@ -2744,13 +2739,13 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo unsigned minimum; video_shader_ctx_texture_t texture_info; - video_shader_driver_ctl(SHADER_CTL_GET_PREV_TEXTURES, &texture_info); + video_shader_driver_get_prev_textures(&texture_info); minimum = texture_info.id; gl->textures = MAX(minimum + 1, gl->textures); } - if (!video_shader_driver_ctl(SHADER_CTL_INFO, &shader_info)) + if (!video_shader_driver_info(&shader_info)) goto error; RARCH_LOG("[GL]: Using %u textures.\n", gl->textures); @@ -2766,13 +2761,11 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo gl_set_shader_viewport(gl, 1); mip_level = 1; - gl->tex_mipmap = video_shader_driver_ctl(SHADER_CTL_MIPMAP_INPUT, - &mip_level); - + gl->tex_mipmap = video_shader_driver_mipmap_input(&mip_level); shader_filter.index = 1; shader_filter.smooth = &force_smooth; - if (video_shader_driver_ctl(SHADER_CTL_FILTER_TYPE, &shader_filter)) + if (video_shader_driver_filter_type(&shader_filter)) gl->tex_min_filter = gl->tex_mipmap ? (force_smooth ? GL_LINEAR_MIPMAP_LINEAR : GL_NEAREST_MIPMAP_NEAREST) : (force_smooth ? GL_LINEAR : GL_NEAREST); @@ -2785,7 +2778,7 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo wrap_info.idx = 1; - video_shader_driver_ctl(SHADER_CTL_WRAP_TYPE, &wrap_info); + video_shader_driver_wrap_type(&wrap_info); gl->wrap_mode = gl_wrap_type_to_enum(wrap_info.type); @@ -2926,18 +2919,16 @@ static void gl_update_tex_filter_frame(gl_t *gl) shader_filter.index = 1; shader_filter.smooth = &smooth; - if (!video_shader_driver_ctl(SHADER_CTL_FILTER_TYPE, &shader_filter)) + if (!video_shader_driver_filter_type(&shader_filter)) smooth = settings->video.smooth; mip_level = 1; wrap_info.idx = 1; - video_shader_driver_ctl(SHADER_CTL_WRAP_TYPE, &wrap_info); + video_shader_driver_wrap_type(&wrap_info); - wrap_mode = gl_wrap_type_to_enum(wrap_info.type); - - gl->tex_mipmap = video_shader_driver_ctl(SHADER_CTL_MIPMAP_INPUT, - &mip_level); + wrap_mode = gl_wrap_type_to_enum(wrap_info.type); + gl->tex_mipmap = video_shader_driver_mipmap_input(&mip_level); gl->video_info.smooth = smooth; new_filt = gl->tex_mipmap ? (smooth ? @@ -2984,7 +2975,7 @@ static bool gl_set_shader(void *data, if (type == RARCH_SHADER_NONE) return false; - gl_shader_deinit(gl); + video_shader_driver_deinit(); switch (type) { @@ -3013,11 +3004,11 @@ static bool gl_set_shader(void *data, init_data.data = gl; init_data.path = path; - if (!video_shader_driver_ctl(SHADER_CTL_INIT, &init_data)) + if (!video_shader_driver_init(&init_data)) { init_data.path = NULL; - video_shader_driver_ctl(SHADER_CTL_INIT, &init_data); + video_shader_driver_init(&init_data); RARCH_WARN("[GL]: Failed to set multipass shader. Falling back to stock.\n"); @@ -3026,7 +3017,7 @@ static bool gl_set_shader(void *data, gl_update_tex_filter_frame(gl); - video_shader_driver_ctl(SHADER_CTL_GET_PREV_TEXTURES, &texture_info); + video_shader_driver_get_prev_textures(&texture_info); textures = texture_info.id + 1; @@ -3514,7 +3505,7 @@ static void gl_render_overlay(gl_t *gl) shader_info.idx = VIDEO_SHADER_STOCK_BLEND; shader_info.set_active = true; - video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); + video_shader_driver_use(&shader_info); gl->coords.vertex = gl->overlay_vertex_coord; gl->coords.tex_coord = gl->overlay_tex_coord; @@ -3524,12 +3515,12 @@ static void gl_render_overlay(gl_t *gl) coords.handle_data = NULL; coords.data = &gl->coords; - video_shader_driver_ctl(SHADER_CTL_SET_COORDS, &coords); + video_shader_driver_set_coords(&coords); mvp.data = gl; mvp.matrix = &gl->mvp_no_rot; - video_shader_driver_ctl(SHADER_CTL_SET_MVP, &mvp); + video_shader_driver_set_mvp(&mvp); for (i = 0; i < gl->overlays; i++) { @@ -3684,7 +3675,7 @@ static struct video_shader *gl_get_current_shader(void *data) { video_shader_ctx_t shader_info; - video_shader_driver_ctl(SHADER_CTL_DIRECT_GET_CURRENT_SHADER, &shader_info); + video_shader_driver_direct_get_current_shader(&shader_info); return shader_info.data; } diff --git a/gfx/drivers_font/gl_raster_font.c b/gfx/drivers_font/gl_raster_font.c index ba730f413c..911a2541e9 100644 --- a/gfx/drivers_font/gl_raster_font.c +++ b/gfx/drivers_font/gl_raster_font.c @@ -237,12 +237,12 @@ static void gl_raster_font_draw_vertices(gl_t *gl, const gfx_coords_t *coords) coords_data.handle_data = NULL; coords_data.data = coords; - video_shader_driver_ctl(SHADER_CTL_SET_COORDS, &coords_data); + video_shader_driver_set_coords(&coords_data); mvp.data = gl; mvp.matrix = &gl->mvp_no_rot; - video_shader_driver_ctl(SHADER_CTL_SET_MVP, &mvp); + video_shader_driver_set_mvp(&mvp); glDrawArrays(GL_TRIANGLES, 0, coords->vertices); } @@ -406,7 +406,7 @@ static void gl_raster_font_setup_viewport(gl_raster_t *font, bool full_screen) shader_info.idx = VIDEO_SHADER_STOCK_BLEND; shader_info.set_active = true; - video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); + video_shader_driver_use(&shader_info); } static void gl_raster_font_restore_viewport(gl_t *gl) diff --git a/gfx/video_shader_driver.c b/gfx/video_shader_driver.c index 6257da50f7..68beed7855 100644 --- a/gfx/video_shader_driver.c +++ b/gfx/video_shader_driver.c @@ -34,6 +34,9 @@ static const shader_backend_t *shader_ctx_drivers[] = { NULL }; +static const shader_backend_t *current_shader = NULL; +static void *shader_data = NULL; + static const shader_backend_t *video_shader_set_backend(enum rarch_shader_type type) { switch (type) @@ -72,238 +75,224 @@ static const shader_backend_t *video_shader_set_backend(enum rarch_shader_type t return NULL; } -bool video_shader_driver_ctl(enum video_shader_driver_ctl_state state, void *data) +bool video_shader_driver_get_prev_textures(video_shader_ctx_texture_t *texture) { - static const shader_backend_t *current_shader = NULL; - static void *shader_data = NULL; - - switch (state) + if (!!texture || !current_shader) { - case SHADER_CTL_GET_PREV_TEXTURES: - { - video_shader_ctx_texture_t *texture = (video_shader_ctx_texture_t*)data; - if (!!texture || !current_shader) - { - texture->id = 0; - return false; - } - texture->id = current_shader->get_prev_textures(shader_data); - } - break; - case SHADER_CTL_GET_IDENT: - { - video_shader_ctx_ident_t *ident = (video_shader_ctx_ident_t*)data; - if (!current_shader || !ident) - return false; - ident->ident = current_shader->ident; - } - break; - case SHADER_CTL_GET_CURRENT_SHADER: - { - video_shader_ctx_t *shader = (video_shader_ctx_t*)data; - void *video_driver = video_driver_get_ptr(false); - const video_poke_interface_t *video_poke = video_driver_get_poke(); - - shader->data = NULL; - if (!video_poke || !video_driver) - return false; - if (!video_poke->get_current_shader) - return false; - shader->data = video_poke->get_current_shader(video_driver); - } - break; - case SHADER_CTL_DIRECT_GET_CURRENT_SHADER: - { - video_shader_ctx_t *shader = (video_shader_ctx_t*)data; - - shader->data = NULL; - if (!current_shader || !current_shader->get_current_shader) - return false; - - shader->data = current_shader->get_current_shader(shader_data); - } - break; - case SHADER_CTL_DEINIT: - if (!current_shader) - return false; - - if (current_shader->deinit) - current_shader->deinit(shader_data); - - shader_data = NULL; - current_shader = NULL; - break; - case SHADER_CTL_SET_PARAMETER: - { - struct uniform_info *param = (struct uniform_info*)data; - - if (!current_shader || !param) - return false; - current_shader->set_uniform_parameter(shader_data, - param, NULL); - } - break; - case SHADER_CTL_SET_PARAMS: - { - video_shader_ctx_params_t *params = - (video_shader_ctx_params_t*)data; - - if (!current_shader || !current_shader->set_params) - return false; - current_shader->set_params( - params->data, - shader_data, - params->width, - params->height, - params->tex_width, - params->tex_height, - params->out_width, - params->out_height, - params->frame_counter, - params->info, - params->prev_info, - params->feedback_info, - params->fbo_info, - params->fbo_info_cnt); - } - break; - /* Finds first suitable shader context driver. */ - case SHADER_CTL_INIT_FIRST: - { - unsigned i; - - for (i = 0; shader_ctx_drivers[i]; i++) - { - current_shader = shader_ctx_drivers[i]; - return true; - } - } - 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) - { - 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; - - shader_data = tmp; - current_shader = init->shader; - } - break; - case SHADER_CTL_GET_FEEDBACK_PASS: - if (!current_shader || !current_shader->get_feedback_pass) - return false; - if (!current_shader->get_feedback_pass(shader_data, - (unsigned*)data)) - return false; - break; - case SHADER_CTL_MIPMAP_INPUT: - if (!current_shader) - return false; - { - unsigned *index = (unsigned*)data; - if (!current_shader->mipmap_input(shader_data, *index)) - return false; - } - break; - case SHADER_CTL_SET_COORDS: - { - video_shader_ctx_coords_t *coords = (video_shader_ctx_coords_t*) - data; - if (!current_shader || !current_shader->set_coords) - return false; - if (!current_shader->set_coords(coords->handle_data, - shader_data, (const struct gfx_coords*)coords->data)) - return false; - } - break; - case SHADER_CTL_SCALE: - { - video_shader_ctx_scale_t *scaler = (video_shader_ctx_scale_t*)data; - if (!scaler || !scaler->scale) - return false; - - scaler->scale->valid = false; - - if (!current_shader || !current_shader->shader_scale) - return false; - - current_shader->shader_scale(shader_data, scaler->idx, scaler->scale); - } - break; - case SHADER_CTL_INFO: - { - video_shader_ctx_info_t *shader_info = - (video_shader_ctx_info_t*)data; - if (!shader_info || !current_shader) - return false; - - shader_info->num = 0; - if (current_shader->num_shaders) - shader_info->num = current_shader->num_shaders(shader_data); - } - break; - case SHADER_CTL_SET_MVP: - { - video_shader_ctx_mvp_t *mvp = (video_shader_ctx_mvp_t*)data; - if (!current_shader || !current_shader->set_mvp) - return false; - if (!mvp || !mvp->matrix) - return false; - if (!current_shader->set_mvp(mvp->data, shader_data, mvp->matrix)) - return false; - } - break; - case SHADER_CTL_FILTER_TYPE: - { - video_shader_ctx_filter_t *filter = - (video_shader_ctx_filter_t*)data; - if (!current_shader || !current_shader->filter_type || !filter) - return false; - if (!current_shader->filter_type(shader_data, - filter->index, filter->smooth)) - return false; - } - break; - case SHADER_CTL_COMPILE_PROGRAM: - { - struct shader_program_info *program_info = (struct shader_program_info*)data; - if (!current_shader || !program_info) - return false; - return current_shader->compile_program(program_info->data, - program_info->idx, NULL, program_info); - } - case SHADER_CTL_USE: - { - video_shader_ctx_info_t *shader_info = (video_shader_ctx_info_t*)data; - if (!current_shader || !shader_info) - return false; - current_shader->use(shader_info->data, shader_data, shader_info->idx, shader_info->set_active); - } - break; - case SHADER_CTL_WRAP_TYPE: - { - video_shader_ctx_wrap_t *wrap = (video_shader_ctx_wrap_t*)data; - if (!current_shader || !current_shader->wrap_type) - return false; - wrap->type = current_shader->wrap_type(shader_data, wrap->idx); - } - break; - case SHADER_CTL_NONE: - default: - break; + texture->id = 0; + return false; } + texture->id = current_shader->get_prev_textures(shader_data); return true; } + +bool video_shader_driver_get_ident(video_shader_ctx_ident_t *ident) +{ + if (!current_shader || !ident) + return false; + ident->ident = current_shader->ident; + return true; +} + +bool video_shader_driver_get_current_shader(video_shader_ctx_t *shader) +{ + void *video_driver = video_driver_get_ptr(false); + const video_poke_interface_t *video_poke = video_driver_get_poke(); + + shader->data = NULL; + if (!video_poke || !video_driver) + return false; + if (!video_poke->get_current_shader) + return false; + shader->data = video_poke->get_current_shader(video_driver); + return true; +} + +bool video_shader_driver_direct_get_current_shader(video_shader_ctx_t *shader) +{ + shader->data = NULL; + if (!current_shader || !current_shader->get_current_shader) + return false; + + shader->data = current_shader->get_current_shader(shader_data); + return true; +} + +bool video_shader_driver_deinit(void) +{ + if (!current_shader) + return false; + + if (current_shader->deinit) + current_shader->deinit(shader_data); + + shader_data = NULL; + current_shader = NULL; + return true; +} + +bool video_shader_driver_set_parameter(struct uniform_info *param) +{ + if (!current_shader || !param) + return false; + current_shader->set_uniform_parameter(shader_data, + param, NULL); + return true; +} + +bool video_shader_driver_set_parameters(video_shader_ctx_params_t *params) +{ + if (!current_shader || !current_shader->set_params) + return false; + current_shader->set_params( + params->data, + shader_data, + params->width, + params->height, + params->tex_width, + params->tex_height, + params->out_width, + params->out_height, + params->frame_counter, + params->info, + params->prev_info, + params->feedback_info, + params->fbo_info, + params->fbo_info_cnt); + return true; +} + +/* Finds first suitable shader context driver. */ +bool video_shader_driver_init_first(void) +{ + unsigned i; + + for (i = 0; shader_ctx_drivers[i]; i++) + { + current_shader = shader_ctx_drivers[i]; + return true; + } + return false; +} + +bool video_shader_driver_init(video_shader_ctx_init_t *init) +{ + void *tmp = NULL; + + 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; + + shader_data = tmp; + current_shader = init->shader; + + return true; +} + +bool video_shader_driver_get_feedback_pass(unsigned *data) +{ + if (!current_shader || !current_shader->get_feedback_pass) + return false; + if (!current_shader->get_feedback_pass(shader_data, data)) + return false; + return true; +} + +bool video_shader_driver_mipmap_input(unsigned *index) +{ + if (!current_shader) + return false; + if (!current_shader->mipmap_input(shader_data, *index)) + return false; + return true; +} + +bool video_shader_driver_set_coords(video_shader_ctx_coords_t *coords) +{ + if (!current_shader || !current_shader->set_coords) + return false; + if (!current_shader->set_coords(coords->handle_data, + shader_data, (const struct gfx_coords*)coords->data)) + return false; + return true; +} + +bool video_shader_driver_scale(video_shader_ctx_scale_t *scaler) +{ + if (!scaler || !scaler->scale) + return false; + + scaler->scale->valid = false; + + if (!current_shader || !current_shader->shader_scale) + return false; + + current_shader->shader_scale(shader_data, scaler->idx, scaler->scale); + return true; +} + +bool video_shader_driver_info(video_shader_ctx_info_t *shader_info) +{ + if (!shader_info || !current_shader) + return false; + + shader_info->num = 0; + if (current_shader->num_shaders) + shader_info->num = current_shader->num_shaders(shader_data); + return true; +} + +bool video_shader_driver_set_mvp(video_shader_ctx_mvp_t *mvp) +{ + if (!current_shader || !current_shader->set_mvp) + return false; + if (!mvp || !mvp->matrix) + return false; + if (!current_shader->set_mvp(mvp->data, shader_data, mvp->matrix)) + return false; + return true; +} + +bool video_shader_driver_filter_type(video_shader_ctx_filter_t *filter) +{ + if (!current_shader || !current_shader->filter_type || !filter) + return false; + if (!current_shader->filter_type(shader_data, + filter->index, filter->smooth)) + return false; + return true; +} + +bool video_shader_driver_compile_program(struct shader_program_info *program_info) +{ + if (!current_shader || !program_info) + return false; + return current_shader->compile_program(program_info->data, + program_info->idx, NULL, program_info); +} + +bool video_shader_driver_use(video_shader_ctx_info_t *shader_info) +{ + if (!current_shader || !shader_info) + return false; + current_shader->use(shader_info->data, shader_data, shader_info->idx, shader_info->set_active); + return true; +} + +bool video_shader_driver_wrap_type(video_shader_ctx_wrap_t *wrap) +{ + if (!current_shader || !current_shader->wrap_type) + return false; + wrap->type = current_shader->wrap_type(shader_data, wrap->idx); + return true; +} diff --git a/gfx/video_shader_driver.h b/gfx/video_shader_driver.h index ad8ad4b6dc..426f3ac567 100644 --- a/gfx/video_shader_driver.h +++ b/gfx/video_shader_driver.h @@ -55,31 +55,6 @@ extern "C" { #endif -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_PARAMETER, - SHADER_CTL_SET_PARAMS, - SHADER_CTL_GET_FEEDBACK_PASS, - SHADER_CTL_MIPMAP_INPUT, - SHADER_CTL_SET_COORDS, - SHADER_CTL_COMPILE_PROGRAM, - SHADER_CTL_SCALE, - SHADER_CTL_INFO, - SHADER_CTL_SET_MVP, - SHADER_CTL_FILTER_TYPE, - SHADER_CTL_USE, - SHADER_CTL_WRAP_TYPE, - SHADER_CTL_GET_CURRENT_SHADER, - SHADER_CTL_DIRECT_GET_CURRENT_SHADER, - SHADER_CTL_GET_IDENT, - SHADER_CTL_GET_PREV_TEXTURES -}; - enum shader_uniform_type { UNIFORM_1F = 0, @@ -283,13 +258,49 @@ typedef struct video_shader_ctx_texture unsigned id; } video_shader_ctx_texture_t; +bool video_shader_driver_get_prev_textures(video_shader_ctx_texture_t *texture); + +bool video_shader_driver_get_ident(video_shader_ctx_ident_t *ident); + +bool video_shader_driver_get_current_shader(video_shader_ctx_t *shader); + +bool video_shader_driver_direct_get_current_shader(video_shader_ctx_t *shader); + +bool video_shader_driver_deinit(void); + +bool video_shader_driver_set_parameter(struct uniform_info *param); + +bool video_shader_driver_set_parameters(video_shader_ctx_params_t *params); + +bool video_shader_driver_init_first(void); + +bool video_shader_driver_init(video_shader_ctx_init_t *init); + +bool video_shader_driver_get_feedback_pass(unsigned *data); + +bool video_shader_driver_mipmap_input(unsigned *index); + +bool video_shader_driver_set_coords(video_shader_ctx_coords_t *coords); + +bool video_shader_driver_scale(video_shader_ctx_scale_t *scaler); + +bool video_shader_driver_info(video_shader_ctx_info_t *shader_info); + +bool video_shader_driver_set_mvp(video_shader_ctx_mvp_t *mvp); + +bool video_shader_driver_filter_type(video_shader_ctx_filter_t *filter); + +bool video_shader_driver_compile_program(struct shader_program_info *program_info); + +bool video_shader_driver_use(video_shader_ctx_info_t *shader_info); + +bool video_shader_driver_wrap_type(video_shader_ctx_wrap_t *wrap); + extern const shader_backend_t gl_glsl_backend; extern const shader_backend_t hlsl_backend; extern const shader_backend_t gl_cg_backend; extern const shader_backend_t shader_null_backend; -bool video_shader_driver_ctl(enum video_shader_driver_ctl_state state, void *data); - #ifdef __cplusplus } #endif diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 9669054084..c5650962d3 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -296,7 +296,7 @@ static void menu_action_setting_disp_set_label_shader_parameter( strlcpy(s2, path, len2); #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_HLSL) - video_shader_driver_ctl(SHADER_CTL_GET_CURRENT_SHADER, &shader_info); + video_shader_driver_get_current_shader(&shader_info); if (!shader_info.data) return; diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index ab23bbe1bc..b550379054 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -56,7 +56,7 @@ static int shader_action_parameter_left(unsigned type, const char *label, video_shader_ctx_t shader_info; struct video_shader_parameter *param = NULL; - video_shader_driver_ctl(SHADER_CTL_GET_CURRENT_SHADER, &shader_info); + video_shader_driver_get_current_shader(&shader_info); param = &shader_info.data->parameters[type - MENU_SETTINGS_SHADER_PARAMETER_0]; return generic_shader_action_parameter_left(shader_info.data, param, type, label, wraparound); diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index 47b865482b..d17a4442dd 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -59,7 +59,7 @@ int shader_action_parameter_right(unsigned type, const char *label, bool wraparo video_shader_ctx_t shader_info; struct video_shader_parameter *param = NULL; - video_shader_driver_ctl(SHADER_CTL_GET_CURRENT_SHADER, &shader_info); + video_shader_driver_get_current_shader(&shader_info); param = &shader_info.data->parameters[type - MENU_SETTINGS_SHADER_PARAMETER_0]; return generic_shader_action_parameter_right(shader_info.data, param, type, label, wraparound); diff --git a/menu/cbs/menu_cbs_start.c b/menu/cbs/menu_cbs_start.c index a03248fe32..e74b324271 100644 --- a/menu/cbs/menu_cbs_start.c +++ b/menu/cbs/menu_cbs_start.c @@ -119,7 +119,7 @@ static int action_start_shader_action_parameter(unsigned type, const char *label video_shader_ctx_t shader_info; struct video_shader_parameter *param = NULL; - video_shader_driver_ctl(SHADER_CTL_GET_CURRENT_SHADER, &shader_info); + video_shader_driver_get_current_shader(&shader_info); if (!shader_info.data) return 0; diff --git a/menu/drivers/nk_common.c b/menu/drivers/nk_common.c index 1edd4f6e16..9ecd9ed46a 100644 --- a/menu/drivers/nk_common.c +++ b/menu/drivers/nk_common.c @@ -190,7 +190,7 @@ void nk_common_device_draw(struct nk_device *dev, shader_info.data = NULL; shader_info.idx = dev->prog; shader_info.set_active = false; - video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); + video_shader_driver_use(&shader_info); #if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) glUniformMatrix4fv(dev->uniform_proj, 1, GL_FALSE, &ortho[0][0]); @@ -253,7 +253,7 @@ void nk_common_device_draw(struct nk_device *dev, shader_info.data = NULL; shader_info.idx = (GLint)last_prog; shader_info.set_active = false; - video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); + video_shader_driver_use(&shader_info); #if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) glBindTexture(GL_TEXTURE_2D, (GLuint)last_tex); diff --git a/menu/drivers/nk_menu.c b/menu/drivers/nk_menu.c index f741f6f8c6..bf16cf3c89 100644 --- a/menu/drivers/nk_menu.c +++ b/menu/drivers/nk_menu.c @@ -314,7 +314,7 @@ void nk_menu_wnd_shader_parameters(nk_menu_handle_t *zr) nk_layout_row_dynamic(ctx, 30, 1); - video_shader_driver_ctl(SHADER_CTL_GET_CURRENT_SHADER, &shader_info); + video_shader_driver_get_current_shader(&shader_info); if (shader_info.data) { diff --git a/menu/drivers_display/menu_display_d3d.cpp b/menu/drivers_display/menu_display_d3d.cpp index fe00476e51..dd7336b4f2 100644 --- a/menu/drivers_display/menu_display_d3d.cpp +++ b/menu/drivers_display/menu_display_d3d.cpp @@ -201,7 +201,7 @@ static void menu_display_d3d_draw_pipeline(void *data) shader_info.idx = draw->pipeline.id; shader_info.set_active = true; - video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); + video_shader_driver_use(&shader_info); t += 0.01; @@ -214,7 +214,7 @@ static void menu_display_d3d_draw_pipeline(void *data) uniform_param.lookup.ident = "time"; uniform_param.result.f.v0 = t; - video_shader_driver_ctl(SHADER_CTL_SET_PARAMETER, &uniform_param); + video_shader_driver_set_parameter(&uniform_param); break; } #endif diff --git a/menu/drivers_display/menu_display_gl.c b/menu/drivers_display/menu_display_gl.c index 13bb13beb0..93f41b37e0 100644 --- a/menu/drivers_display/menu_display_gl.c +++ b/menu/drivers_display/menu_display_gl.c @@ -86,7 +86,7 @@ static void menu_display_gl_blend_begin(void) shader_info.idx = VIDEO_SHADER_STOCK_BLEND; shader_info.set_active = true; - video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); + video_shader_driver_use(&shader_info); } static void menu_display_gl_blend_end(void) @@ -137,13 +137,13 @@ static void menu_display_gl_draw(void *data) coords.handle_data = gl; coords.data = draw->coords; - video_shader_driver_ctl(SHADER_CTL_SET_COORDS, &coords); + video_shader_driver_set_coords(&coords); mvp.data = gl; mvp.matrix = draw->matrix_data ? (math_matrix_4x4*)draw->matrix_data : (math_matrix_4x4*)menu_display_gl_get_default_mvp(); - video_shader_driver_ctl(SHADER_CTL_SET_MVP, &mvp); + video_shader_driver_set_mvp(&mvp); glDrawArrays(menu_display_prim_to_gl_enum( draw->prim_type), 0, draw->coords->vertices); @@ -175,7 +175,7 @@ static void menu_display_gl_draw_pipeline(void *data) shader_info.idx = draw->pipeline.id; shader_info.set_active = true; - video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); + video_shader_driver_use(&shader_info); t += 0.01; @@ -188,7 +188,7 @@ static void menu_display_gl_draw_pipeline(void *data) uniform_param.lookup.ident = "time"; uniform_param.result.f.v0 = t; - video_shader_driver_ctl(SHADER_CTL_SET_PARAMETER, &uniform_param); + video_shader_driver_set_parameter(&uniform_param); break; } #endif diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 8ee67182b9..965d5eaaf6 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -3620,7 +3620,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) case DISPLAYLIST_SHADER_PARAMETERS: case DISPLAYLIST_SHADER_PARAMETERS_PRESET: #ifdef HAVE_SHADER_MANAGER - video_shader_driver_ctl(SHADER_CTL_GET_CURRENT_SHADER, &shader_info); + video_shader_driver_get_current_shader(&shader_info); if (shader_info.data) ret = deferred_push_video_shader_parameters_common( diff --git a/ui/drivers/ui_win32.c b/ui/drivers/ui_win32.c index 3f35adcdb2..c433833b73 100644 --- a/ui/drivers/ui_win32.c +++ b/ui/drivers/ui_win32.c @@ -121,7 +121,7 @@ static void shader_dlg_refresh_trackbar_label(int index) video_shader_ctx_t shader_info; char val_buffer[32] = {0}; - video_shader_driver_ctl(SHADER_CTL_GET_CURRENT_SHADER, &shader_info); + video_shader_driver_get_current_shader(&shader_info); if (floorf(shader_info.data->parameters[index].current) == shader_info.data->parameters[index].current) @@ -141,7 +141,7 @@ static void shader_dlg_params_refresh(void) int i; video_shader_ctx_t shader_info; - video_shader_driver_ctl(SHADER_CTL_GET_CURRENT_SHADER, &shader_info); + video_shader_driver_get_current_shader(&shader_info); for (i = 0; i < GFX_MAX_PARAMETERS; i++) { @@ -218,7 +218,7 @@ void shader_dlg_params_reload(void) int i, pos_x, pos_y; video_shader_ctx_t shader_info; - video_shader_driver_ctl(SHADER_CTL_GET_CURRENT_SHADER, &shader_info); + video_shader_driver_get_current_shader(&shader_info); shader_dlg_params_clear(); @@ -353,7 +353,7 @@ static LRESULT CALLBACK ShaderDlgWndProc(HWND hwnd, UINT message, int i, pos; video_shader_ctx_t shader_info; - video_shader_driver_ctl(SHADER_CTL_GET_CURRENT_SHADER, &shader_info); + video_shader_driver_get_current_shader(&shader_info); switch (message) {