Exemplo n.º 1
0
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, &param);
	return true;

fail:
	shader_param_free(&param);
	return false;
}
Exemplo n.º 2
0
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);
	}
}