From 86cb092b0229e27b7557fd8c109f51e10992c1d8 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 16 Apr 2016 04:56:15 +0200 Subject: [PATCH] Add SHADER_CTL_COMPILE_PROGRAM --- gfx/drivers_shader/shader_gl_cg.c | 10 ++++++---- gfx/drivers_shader/shader_glsl.c | 15 ++++++++++----- gfx/drivers_shader/shader_hlsl.c | 3 ++- gfx/drivers_shader/shader_null.c | 10 ++++++++++ gfx/video_shader_driver.c | 9 +++++++++ gfx/video_shader_driver.h | 7 +++++-- 6 files changed, 42 insertions(+), 12 deletions(-) diff --git a/gfx/drivers_shader/shader_gl_cg.c b/gfx/drivers_shader/shader_gl_cg.c index 8d1c2e9360..4bdcedfb53 100644 --- a/gfx/drivers_shader/shader_gl_cg.c +++ b/gfx/drivers_shader/shader_gl_cg.c @@ -92,7 +92,7 @@ struct shader_program_data typedef struct cg_shader_data { - shader_program_data_t prg[GFX_MAX_SHADERS]; + struct shader_program_data prg[GFX_MAX_SHADERS]; unsigned active_idx; unsigned cg_attrib_idx; CGprofile cgVProf; @@ -105,7 +105,7 @@ typedef struct cg_shader_data CGcontext cgCtx; } cg_shader_data_t; -static void cg_uniform_set_parameter(void *data, shader_program_data_t *shader_data, void *uniform_data) +static void cg_uniform_set_parameter(void *data, struct shader_program_data *shader_data, void *uniform_data) { struct uniform_info *param = (struct uniform_info*)data; CGparameter *cg_param = (CGparameter*)uniform_data; @@ -611,7 +611,7 @@ static void gl_cg_deinit(void *data) static bool gl_cg_compile_program( void *data, unsigned idx, - shader_program_data_t *program, + void *program_data, struct shader_program_info *program_info) { const char *list = NULL; @@ -620,6 +620,7 @@ static bool gl_cg_compile_program( char *listing_f = NULL; char *listing_v = NULL; unsigned i, argc = 0; + struct shader_program_data *program = (struct shader_program_data*)program_data; cg_shader_data_t *cg_data = (cg_shader_data_t*)data; argv[argc++] = "-DPARAMETER_UNIFORM"; @@ -940,7 +941,7 @@ static bool gl_cg_load_preset(void *data, const char *path) } static void gl_cg_set_pass_attrib( - shader_program_data_t *program, + struct shader_program_data *program, struct cg_fbo_params *fbo, const char *attr) { @@ -1260,6 +1261,7 @@ const shader_backend_t gl_cg_backend = { gl_cg_init, gl_cg_deinit, gl_cg_set_params, + gl_cg_compile_program, gl_cg_use, gl_cg_num, gl_cg_filter_type, diff --git a/gfx/drivers_shader/shader_glsl.c b/gfx/drivers_shader/shader_glsl.c index 8338d1cf0c..83447d8dde 100644 --- a/gfx/drivers_shader/shader_glsl.c +++ b/gfx/drivers_shader/shader_glsl.c @@ -264,7 +264,7 @@ typedef struct glsl_shader_data char glsl_alias_define[1024]; unsigned glsl_active_index; unsigned gl_attrib_index; - shader_program_data_t prg[GFX_MAX_SHADERS]; + struct shader_program_data prg[GFX_MAX_SHADERS]; GLuint gl_teximage[GFX_MAX_TEXTURES]; GLint gl_attribs[PREV_TEXTURES + 2 + 4 + GFX_MAX_SHADERS]; state_tracker_t *gl_state_tracker; @@ -431,12 +431,16 @@ static bool gl_glsl_link_program(GLuint prog) static bool gl_glsl_compile_program( void *data, unsigned idx, - shader_program_data_t *program, + void *program_data, struct shader_program_info *program_info) { glsl_shader_data_t *glsl = (glsl_shader_data_t*)data; + struct shader_program_data *program = (struct shader_program_data*)program_data; GLuint prog = glCreateProgram(); + if (!program) + program = &glsl->prg[idx]; + if (!prog) goto error; @@ -533,13 +537,13 @@ static bool gl_glsl_load_source_path(struct video_shader_pass *pass, } static bool gl_glsl_compile_programs( - glsl_shader_data_t *glsl, shader_program_data_t *program) + glsl_shader_data_t *glsl, struct shader_program_data *program) { unsigned i; for (i = 0; i < glsl->shader->passes; i++) { - shader_program_data_t prg; + struct shader_program_data prg; struct shader_program_info shader_prog_info; const char *vertex = NULL; const char *fragment = NULL; @@ -1050,7 +1054,7 @@ error: static float t = 0; #endif -static void glsl_uniform_set_parameter(void *data, shader_program_data_t *shader_data, void *uniform_data) +static void glsl_uniform_set_parameter(void *data, struct shader_program_data *shader_data, void *uniform_data) { struct uniform_info *param = (struct uniform_info*)data; @@ -1711,6 +1715,7 @@ const shader_backend_t gl_glsl_backend = { gl_glsl_init, gl_glsl_deinit, gl_glsl_set_params, + gl_glsl_compile_program, gl_glsl_use, gl_glsl_num, gl_glsl_filter_type, diff --git a/gfx/drivers_shader/shader_hlsl.c b/gfx/drivers_shader/shader_hlsl.c index 628c257577..cbd1acc19a 100644 --- a/gfx/drivers_shader/shader_hlsl.c +++ b/gfx/drivers_shader/shader_hlsl.c @@ -194,11 +194,12 @@ static void hlsl_set_params(void *data, void *shader_data, static bool hlsl_compile_program( void *data, unsigned idx, - shader_program_data_t *program, + void *program_data, struct shader_program_info *program_info) { hlsl_shader_data_t *hlsl = (hlsl_shader_data_t*)data; d3d_video_t *d3d = (d3d_video_t*)hlsl->d3d; + shader_program_data_t *program = (shader_program_data_t*)program_data; LPDIRECT3DDEVICE d3d_device_ptr = (LPDIRECT3DDEVICE)d3d->dev; HRESULT ret, ret_fp, ret_vp; ID3DXBuffer *listing_f = NULL; diff --git a/gfx/drivers_shader/shader_null.c b/gfx/drivers_shader/shader_null.c index 77f63f8ec2..94d80aa5dd 100644 --- a/gfx/drivers_shader/shader_null.c +++ b/gfx/drivers_shader/shader_null.c @@ -153,10 +153,20 @@ static struct video_shader *shader_null_get_current_shader(void *data) return NULL; } +static bool shader_null_compile_program( + void *data, + unsigned idx, + void *program_data, + struct shader_program_info *program_info) +{ + return true; +} + const shader_backend_t shader_null_backend = { shader_null_init, shader_null_deinit, shader_null_set_params, + shader_null_compile_program, shader_null_use, shader_null_num, shader_null_filter_type, diff --git a/gfx/video_shader_driver.c b/gfx/video_shader_driver.c index 71e4b18944..b2d0e3176a 100644 --- a/gfx/video_shader_driver.c +++ b/gfx/video_shader_driver.c @@ -223,6 +223,15 @@ bool video_shader_driver_ctl(enum video_shader_driver_ctl_state state, void *dat 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); + } + break; case SHADER_CTL_USE: { video_shader_ctx_info_t *shader_info = (video_shader_ctx_info_t*)data; diff --git a/gfx/video_shader_driver.h b/gfx/video_shader_driver.h index 26072857c2..656d533897 100644 --- a/gfx/video_shader_driver.h +++ b/gfx/video_shader_driver.h @@ -65,6 +65,7 @@ enum video_shader_driver_ctl_state 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, @@ -92,14 +93,14 @@ enum shader_uniform_type struct shader_program_info { + void *data; const char *vertex; const char *fragment; const char *combined; + unsigned idx; bool is_file; }; -typedef struct shader_program_data shader_program_data_t; - struct uniform_info { enum shader_uniform_type type; @@ -155,6 +156,8 @@ typedef struct shader_backend const void *prev_info, const void *feedback_info, const void *fbo_info, unsigned fbo_info_cnt); + bool (*compile_program)(void *data, unsigned idx, + void *program_data, struct shader_program_info *program_info); void (*use)(void *data, void *shader_data, unsigned index, bool set_active); unsigned (*num_shaders)(void *data);