Add SHADER_CTL_COMPILE_PROGRAM

This commit is contained in:
twinaphex 2016-04-16 04:56:15 +02:00
parent 79ef0268e5
commit 86cb092b02
6 changed files with 42 additions and 12 deletions

View File

@ -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,

View File

@ -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,

View File

@ -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;

View File

@ -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,

View File

@ -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;

View File

@ -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);