return true;
}
+bool Effect::set_ivec2(const string &key, const int *values)
+{
+ if (params_ivec2.count(key) == 0) {
+ return false;
+ }
+ memcpy(params_ivec2[key], values, sizeof(int) * 2);
+ return true;
+}
+
bool Effect::set_float(const string &key, float value)
{
if (params_float.count(key) == 0) {
register_uniform_int(key, value);
}
+void Effect::register_ivec2(const string &key, int *values)
+{
+ assert(params_ivec2.count(key) == 0);
+ params_ivec2[key] = values;
+ register_uniform_ivec2(key, values);
+}
+
void Effect::register_float(const string &key, float *value)
{
assert(params_float.count(key) == 0);
uniforms_int.push_back(uniform);
}
+void Effect::register_uniform_ivec2(const std::string &key, const int *values)
+{
+ Uniform<int> uniform;
+ uniform.name = key;
+ uniform.value = values;
+ uniform.num_values = 1;
+ uniform.location = -1;
+ uniforms_ivec2.push_back(uniform);
+}
+
void Effect::register_uniform_float(const std::string &key, const float *value)
{
Uniform<float> uniform;
// Set a parameter; intended to be called from user code.
// Neither of these take ownership of the pointer.
- virtual bool set_int(const std::string&, int value) MUST_CHECK_RESULT;
+ virtual bool set_int(const std::string &key, int value) MUST_CHECK_RESULT;
+ virtual bool set_ivec2(const std::string &key, const int *values) MUST_CHECK_RESULT;
virtual bool set_float(const std::string &key, float value) MUST_CHECK_RESULT;
virtual bool set_vec2(const std::string &key, const float *values) MUST_CHECK_RESULT;
virtual bool set_vec3(const std::string &key, const float *values) MUST_CHECK_RESULT;
// These correspond directly to int/float/vec2/vec3/vec4 in GLSL.
void register_int(const std::string &key, int *value);
+ void register_ivec2(const std::string &key, int *values);
void register_float(const std::string &key, float *value);
void register_vec2(const std::string &key, float *values);
void register_vec3(const std::string &key, float *values);
// except for register_int as noted above.
void register_uniform_sampler2d(const std::string &key, const int *value);
void register_uniform_bool(const std::string &key, const bool *value);
- void register_uniform_int(const std::string &key, const int *value); // Note: Requires GLSL 1.30 or newer.
+ void register_uniform_int(const std::string &key, const int *value);
+ void register_uniform_ivec2(const std::string &key, const int *values);
void register_uniform_float(const std::string &key, const float *value);
void register_uniform_vec2(const std::string &key, const float *values);
void register_uniform_vec3(const std::string &key, const float *values);
private:
std::map<std::string, int *> params_int;
+ std::map<std::string, int *> params_ivec2;
std::map<std::string, float *> params_float;
std::map<std::string, float *> params_vec2;
std::map<std::string, float *> params_vec3;
std::vector<Uniform<int>> uniforms_sampler2d;
std::vector<Uniform<bool>> uniforms_bool;
std::vector<Uniform<int>> uniforms_int;
+ std::vector<Uniform<int>> uniforms_ivec2;
std::vector<Uniform<float>> uniforms_float;
std::vector<Uniform<float>> uniforms_vec2;
std::vector<Uniform<float>> uniforms_vec3;
if (phase->is_compute_shader) {
frag_shader.append(read_file("footer.comp"));
+ phase->compute_shader_node->effect->register_uniform_ivec2("output_size", phase->uniform_output_size);
phase->compute_shader_node->effect->register_uniform_vec2("inv_output_size", (float *)&phase->inv_output_size);
phase->compute_shader_node->effect->register_uniform_vec2("output_texcoord_adjust", (float *)&phase->output_texcoord_adjust);
} else {
extract_uniform_declarations(effect->uniforms_sampler2d, "sampler2D", effect_id, &phase->uniforms_sampler2d, &frag_shader_uniforms);
extract_uniform_declarations(effect->uniforms_bool, "bool", effect_id, &phase->uniforms_bool, &frag_shader_uniforms);
extract_uniform_declarations(effect->uniforms_int, "int", effect_id, &phase->uniforms_int, &frag_shader_uniforms);
+ extract_uniform_declarations(effect->uniforms_ivec2, "ivec2", effect_id, &phase->uniforms_ivec2, &frag_shader_uniforms);
extract_uniform_declarations(effect->uniforms_float, "float", effect_id, &phase->uniforms_float, &frag_shader_uniforms);
extract_uniform_declarations(effect->uniforms_vec2, "vec2", effect_id, &phase->uniforms_vec2, &frag_shader_uniforms);
extract_uniform_declarations(effect->uniforms_vec3, "vec3", effect_id, &phase->uniforms_vec3, &frag_shader_uniforms);
collect_uniform_locations(phase->glsl_program_num, &phase->uniforms_sampler2d);
collect_uniform_locations(phase->glsl_program_num, &phase->uniforms_bool);
collect_uniform_locations(phase->glsl_program_num, &phase->uniforms_int);
+ collect_uniform_locations(phase->glsl_program_num, &phase->uniforms_ivec2);
collect_uniform_locations(phase->glsl_program_num, &phase->uniforms_float);
collect_uniform_locations(phase->glsl_program_num, &phase->uniforms_vec2);
collect_uniform_locations(phase->glsl_program_num, &phase->uniforms_vec3);
phase->outbuf_image_unit = 0;
glBindImageTexture(phase->outbuf_image_unit, destinations[0].texnum, 0, GL_FALSE, 0, GL_WRITE_ONLY, destinations[0].format);
check_error();
+ phase->uniform_output_size[0] = phase->output_width;
+ phase->uniform_output_size[1] = phase->output_height;
phase->inv_output_size.x = 1.0f / phase->output_width;
phase->inv_output_size.y = 1.0f / phase->output_height;
phase->output_texcoord_adjust.x = 0.5f / phase->output_width;
glUniform1iv(uniform.location, uniform.num_values, uniform.value);
}
}
+ for (size_t i = 0; i < phase->uniforms_ivec2.size(); ++i) {
+ const Uniform<int> &uniform = phase->uniforms_ivec2[i];
+ if (uniform.location != -1) {
+ glUniform2iv(uniform.location, uniform.num_values, uniform.value);
+ }
+ }
for (size_t i = 0; i < phase->uniforms_float.size(); ++i) {
const Uniform<float> &uniform = phase->uniforms_float[i];
if (uniform.location != -1) {
// These are used in transforming from unnormalized to normalized coordinates
// in compute shaders.
+ int uniform_output_size[2];
Point2D inv_output_size, output_texcoord_adjust;
// Identifier used to create unique variables in GLSL.
std::vector<Uniform<int>> uniforms_sampler2d;
std::vector<Uniform<bool>> uniforms_bool;
std::vector<Uniform<int>> uniforms_int;
+ std::vector<Uniform<int>> uniforms_ivec2;
std::vector<Uniform<float>> uniforms_float;
std::vector<Uniform<float>> uniforms_vec2;
std::vector<Uniform<float>> uniforms_vec3;