static bool gl_add_param(struct gs_shader *shader, struct shader_var *var, GLint *texture_id) { struct shader_param param = {0}; param.array_count = var->array_count; param.name = bstrdup(var->name); param.shader = shader; param.type = get_shader_param_type(var->type); if (param.type == SHADER_PARAM_TEXTURE) { param.sampler_id = var->gl_sampler_id; param.texture_id = (*texture_id)++; } else { param.changed = true; } da_move(param.def_value, var->default_val); da_copy(param.cur_value, param.def_value); param.param = glGetUniformLocation(shader->program, param.name); if (!gl_success("glGetUniformLocation")) goto fail; if (param.type == SHADER_PARAM_TEXTURE) { glProgramUniform1i(shader->program, param.param, param.texture_id); if (!gl_success("glProgramUniform1i")) goto fail; } da_push_back(shader->params, ¶m); return true; fail: shader_param_free(¶m); return false; }
static void upload_shader_params(struct darray *pass_params, bool changed_only) { struct pass_shaderparam *params = pass_params->array; size_t i; for (i = 0; i < pass_params->num; i++) { struct pass_shaderparam *param = params+i; struct effect_param *eparam = param->eparam; sparam_t sparam = param->sparam; if (changed_only && !eparam->changed) continue; if (!eparam->cur_val.num) { if (eparam->default_val.num) da_copy(eparam->cur_val, eparam->default_val); else continue; } shader_setval(sparam, eparam->cur_val.array, eparam->cur_val.num); } }