X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=effect_chain.cpp;h=fe07a3f909d0f3a3caaf1c41058329ce2f4f12bc;hb=4179bef190d88739038233ac5d7e5ffa2ff4282f;hp=a9d9e1e2c437da605bc2997b20f824ce6ca64ee6;hpb=65c6584f77bff0af0c8e38d1ac90298bcd55e9ac;p=movit diff --git a/effect_chain.cpp b/effect_chain.cpp index a9d9e1e..fe07a3f 100644 --- a/effect_chain.cpp +++ b/effect_chain.cpp @@ -49,8 +49,8 @@ EffectChain::EffectChain(float aspect_nom, float aspect_denom, ResourcePool *res aspect_denom(aspect_denom), output_color_rgba(false), num_output_color_ycbcr(0), - dither_effect(NULL), - ycbcr_conversion_effect_node(NULL), + dither_effect(nullptr), + ycbcr_conversion_effect_node(nullptr), intermediate_format(GL_RGBA16F), intermediate_transformation(NO_FRAMEBUFFER_TRANSFORMATION), num_dither_bits(0), @@ -58,7 +58,7 @@ EffectChain::EffectChain(float aspect_nom, float aspect_denom, ResourcePool *res finalized(false), resource_pool(resource_pool), do_phase_timing(false) { - if (resource_pool == NULL) { + if (resource_pool == nullptr) { this->resource_pool = new ResourcePool(); owns_resource_pool = true; } else { @@ -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"); } @@ -781,7 +781,7 @@ void EffectChain::output_dot(const char *filename) } FILE *fp = fopen(filename, "w"); - if (fp == NULL) { + if (fp == nullptr) { perror(filename); exit(1); } @@ -825,7 +825,7 @@ void EffectChain::output_dot(const char *filename) if (nodes[i]->outgoing_links.empty() && !nodes[i]->disabled) { // Output node. - vector labels = get_labels_for_edge(nodes[i], NULL); + vector labels = get_labels_for_edge(nodes[i], nullptr); output_dot_edge(fp, from_node_id, "output", labels); } } @@ -838,7 +838,7 @@ vector EffectChain::get_labels_for_edge(const Node *from, const Node *to { vector labels; - if (to != NULL && to->effect->needs_texture_bounce()) { + if (to != nullptr && to->effect->needs_texture_bounce()) { labels.push_back("needs_bounce"); } if (from->effect->changes_output_size()) { @@ -1880,7 +1880,7 @@ void EffectChain::render_to_fbo(GLuint dest_fbo, unsigned width, unsigned height GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); assert(status == GL_FRAMEBUFFER_COMPLETE); glViewport(x, y, width, height); - if (dither_effect != NULL) { + if (dither_effect != nullptr) { CHECK(dither_effect->set_int("output_width", width)); CHECK(dither_effect->set_int("output_height", height)); } @@ -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.