/** * video_shader_set_current_parameters: * @conf : Preset file to read from. * @shader : Shader passes handle. * * Reads the current value for all parameters from config file. * * Returns: true (1) if successful, otherwise false (0). **/ bool video_shader_resolve_current_parameters(config_file_t *conf, struct video_shader *shader) { char parameters[4096]; const char *id = NULL; char *save = NULL; if (!conf) return false; parameters[0] = '\0'; /* Read in parameters which override the defaults. */ if (!config_get_array(conf, "parameters", parameters, sizeof(parameters))) return true; for (id = strtok_r(parameters, ";", &save); id; id = strtok_r(NULL, ";", &save)) { struct video_shader_parameter *parameter = (struct video_shader_parameter*) video_shader_parse_find_parameter(shader->parameters, shader->num_parameters, id); if (!parameter) { RARCH_WARN("[CGP/GLSLP]: Parameter %s is set in the preset, but no shader uses this parameter, ignoring.\n", id); continue; } if (!config_get_float(conf, id, ¶meter->current)) RARCH_WARN("[CGP/GLSLP]: Parameter %s is not set in preset.\n", id); } return true; }
/** * video_shader_resolve_parameters: * @conf : Preset file to read from. * @shader : Shader passes handle. * * Resolves all shader parameters belonging to shaders. * * Returns: true (1) if successful, otherwise false (0). **/ bool video_shader_resolve_parameters(config_file_t *conf, struct video_shader *shader) { unsigned i; struct video_shader_parameter *param = &shader->parameters[shader->num_parameters]; shader->num_parameters = 0; /* Find all parameters in our shaders. */ for (i = 0; i < shader->passes; i++) { char line[4096] = {0}; FILE *file = fopen(shader->pass[i].source.path, "r"); if (!file) continue; while (shader->num_parameters < ARRAY_SIZE(shader->parameters) && fgets(line, sizeof(line), file)) { int ret = sscanf(line, "#pragma parameter %63s \"%63[^\"]\" %f %f %f %f", param->id, param->desc, ¶m->initial, ¶m->minimum, ¶m->maximum, ¶m->step); if (ret < 5) continue; param->id[63] = '\0'; param->desc[63] = '\0'; if (ret == 5) param->step = 0.1f * (param->maximum - param->minimum); RARCH_LOG("Found #pragma parameter %s (%s) %f %f %f %f\n", param->desc, param->id, param->initial, param->minimum, param->maximum, param->step); param->current = param->initial; shader->num_parameters++; param++; } fclose(file); } if (conf) { /* Read in parameters which override the defaults. */ char parameters[4096] = {0}; const char *id = NULL; char *save = NULL; if (!config_get_array(conf, "parameters", parameters, sizeof(parameters))) return true; for (id = strtok_r(parameters, ";", &save); id; id = strtok_r(NULL, ";", &save)) { struct video_shader_parameter *parameter = (struct video_shader_parameter*) video_shader_parse_find_parameter(shader->parameters, shader->num_parameters, id); if (!parameter) { RARCH_WARN("[CGP/GLSLP]: Parameter %s is set in the preset, but no shader uses this parameter, ignoring.\n", id); continue; } if (!config_get_float(conf, id, ¶meter->current)) RARCH_WARN("[CGP/GLSLP]: Parameter %s is not set in preset.\n", id); } } return true; }