X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=effect_chain.cpp;h=30849306db298a31a0bf5661f35f6618956faace;hp=b82102357180d2534c82018c2bc82ecfa1230019;hb=d7def3f9e42e72566d7aedd52ffdeb5851da8314;hpb=a48d62d61ada1226caaa9fd42846672cfe0249e8 diff --git a/effect_chain.cpp b/effect_chain.cpp index b821023..3084930 100644 --- a/effect_chain.cpp +++ b/effect_chain.cpp @@ -523,6 +523,7 @@ void EffectChain::compile_glsl_program(Phase *phase) 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 { @@ -544,6 +545,7 @@ void EffectChain::compile_glsl_program(Phase *phase) 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); @@ -607,6 +609,7 @@ void EffectChain::compile_glsl_program(Phase *phase) 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); @@ -1050,7 +1053,7 @@ void EffectChain::inform_input_sizes(Phase *phase) // desired output size might change based on the inputs. void EffectChain::find_output_size(Phase *phase) { - Node *output_node = phase->effects.back(); + Node *output_node = phase->is_compute_shader ? phase->compute_shader_node : phase->effects.back(); // If the last effect explicitly sets an output size, use that. if (output_node->effect->changes_output_size()) { @@ -2154,6 +2157,8 @@ void EffectChain::execute_phase(Phase *phase, 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; @@ -2247,6 +2252,12 @@ void EffectChain::setup_uniforms(Phase *phase) glUniform1iv(uniform.location, uniform.num_values, uniform.value); } } + for (size_t i = 0; i < phase->uniforms_ivec2.size(); ++i) { + const Uniform &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 &uniform = phase->uniforms_float[i]; if (uniform.location != -1) {