X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=effect_chain.cpp;h=fe07a3f909d0f3a3caaf1c41058329ce2f4f12bc;hp=0c46768fd5d7db4470430556ee9b3ea7342b4b3c;hb=c220f1f515ce115e049dfff990b08b2592bd8f8d;hpb=f34b1c36acd27944f00885edfc55363432bfec8e diff --git a/effect_chain.cpp b/effect_chain.cpp index 0c46768..fe07a3f 100644 --- a/effect_chain.cpp +++ b/effect_chain.cpp @@ -311,10 +311,10 @@ string replace_prefix(const string &text, const string &prefix) namespace { template -void extract_uniform_declarations(const vector > &effect_uniforms, +void extract_uniform_declarations(const vector> &effect_uniforms, const string &type_specifier, const string &effect_id, - vector > *phase_uniforms, + vector> *phase_uniforms, string *glsl_string) { for (unsigned i = 0; i < effect_uniforms.size(); ++i) { @@ -327,10 +327,10 @@ void extract_uniform_declarations(const vector > &effect_uniforms, } template -void extract_uniform_array_declarations(const vector > &effect_uniforms, +void extract_uniform_array_declarations(const vector> &effect_uniforms, const string &type_specifier, const string &effect_id, - vector > *phase_uniforms, + vector> *phase_uniforms, string *glsl_string) { for (unsigned i = 0; i < effect_uniforms.size(); ++i) { @@ -347,7 +347,7 @@ void extract_uniform_array_declarations(const vector > &effect_unifor } template -void collect_uniform_locations(GLuint glsl_program_num, vector > *phase_uniforms) +void collect_uniform_locations(GLuint glsl_program_num, vector> *phase_uniforms) { for (unsigned i = 0; i < phase_uniforms->size(); ++i) { Uniform &uniform = (*phase_uniforms)[i]; @@ -361,7 +361,7 @@ void EffectChain::compile_glsl_program(Phase *phase) { string frag_shader_header; if (phase->is_compute_shader) { - frag_shader_header = read_file("header.compute"); + frag_shader_header = read_file("header.comp"); } else { frag_shader_header = read_version_dependent_file("header", "frag"); } @@ -1906,10 +1906,8 @@ void EffectChain::render_to_fbo(GLuint dest_fbo, unsigned width, unsigned height } } - for (map::const_iterator texture_it = output_textures.begin(); - texture_it != output_textures.end(); - ++texture_it) { - resource_pool->release_2d_texture(texture_it->second); + for (const auto &phase_and_texnum : output_textures) { + resource_pool->release_2d_texture(phase_and_texnum.second); } glBindFramebuffer(GL_FRAMEBUFFER, 0); @@ -1926,8 +1924,8 @@ void EffectChain::render_to_fbo(GLuint dest_fbo, unsigned width, unsigned height // Get back the timer queries. for (unsigned phase_num = 0; phase_num < phases.size(); ++phase_num) { Phase *phase = phases[phase_num]; - for (std::list::iterator timer_it = phase->timer_query_objects_running.begin(); - timer_it != phase->timer_query_objects_running.end(); ) { + for (auto timer_it = phase->timer_query_objects_running.cbegin(); + timer_it != phase->timer_query_objects_running.cend(); ) { GLint timer_query_object = *timer_it; GLint available; glGetQueryObjectiv(timer_query_object, GL_QUERY_RESULT_AVAILABLE, &available); @@ -1995,6 +1993,16 @@ void EffectChain::execute_phase(Phase *phase, bool last_phase, GLuint tex_num = resource_pool->create_2d_texture(intermediate_format, phase->output_width, phase->output_height); output_textures->insert(make_pair(phase, tex_num)); + + // The output texture needs to have valid state to be written to by a compute shader. + if (phase->is_compute_shader) { + glActiveTexture(GL_TEXTURE0); + check_error(); + glBindTexture(GL_TEXTURE_2D, (*output_textures)[phase]); + check_error(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + check_error(); + } } // Set up RTT inputs for this phase.