X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=effect_chain.cpp;h=1832b9ee7ce6364980eef747ae2d19d6411083ae;hp=491626500ec78cc9a88e692e885ebcddd288a9c6;hb=07a8813b233fafdf5a3e6c495e4864d3cc971057;hpb=ff9e68a3f5abb179bd7bf9fb84df48327f148583 diff --git a/effect_chain.cpp b/effect_chain.cpp index 4916265..1832b9e 100644 --- a/effect_chain.cpp +++ b/effect_chain.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -17,7 +18,7 @@ #include "colorspace_conversion_effect.h" #include "dither_effect.h" #include "input.h" -#include "opengl.h" +#include "init.h" EffectChain::EffectChain(float aspect_nom, float aspect_denom) : aspect_nom(aspect_nom), @@ -50,10 +51,7 @@ EffectChain::~EffectChain() Input *EffectChain::add_input(Input *input) { inputs.push_back(input); - - Node *node = add_node(input); - node->output_color_space = input->get_color_space(); - node->output_gamma_curve = input->get_gamma_curve(); + add_node(input); return input; } @@ -268,17 +266,19 @@ Phase *EffectChain::compile_glsl_program( frag_shader += std::string("#define INPUT ") + effects.back()->effect_id + "\n"; frag_shader.append(read_file("footer.frag")); - // Output shader to a temporary file, for easier debugging. - static int compiled_shader_num = 0; - char filename[256]; - sprintf(filename, "chain-%03d.frag", compiled_shader_num++); - FILE *fp = fopen(filename, "w"); - if (fp == NULL) { - perror(filename); - exit(1); + if (movit_debug_level == MOVIT_DEBUG_ON) { + // Output shader to a temporary file, for easier debugging. + static int compiled_shader_num = 0; + char filename[256]; + sprintf(filename, "chain-%03d.frag", compiled_shader_num++); + FILE *fp = fopen(filename, "w"); + if (fp == NULL) { + perror(filename); + exit(1); + } + fprintf(fp, "%s\n", frag_shader.c_str()); + fclose(fp); } - fprintf(fp, "%s\n", frag_shader.c_str()); - fclose(fp); GLuint glsl_program_num = glCreateProgram(); GLuint vs_obj = compile_shader(read_file("vs.vert"), GL_VERTEX_SHADER); @@ -427,6 +427,10 @@ void EffectChain::construct_glsl_programs(Node *output) void EffectChain::output_dot(const char *filename) { + if (movit_debug_level != MOVIT_DEBUG_ON) { + return; + } + FILE *fp = fopen(filename, "w"); if (fp == NULL) { perror(filename); @@ -641,6 +645,21 @@ void EffectChain::topological_sort_visit_node(Node *node, std::set *visi sorted_list->push_back(node); } +void EffectChain::find_color_spaces_for_inputs() +{ + for (unsigned i = 0; i < nodes.size(); ++i) { + Node *node = nodes[i]; + if (node->disabled) { + continue; + } + if (node->incoming_links.size() == 0) { + Input *input = static_cast(node->effect); + node->output_color_space = input->get_color_space(); + node->output_gamma_curve = input->get_gamma_curve(); + } + } +} + // Propagate gamma and color space information as far as we can in the graph. // The rules are simple: Anything where all the inputs agree, get that as // output as well. Anything else keeps having *_INVALID. @@ -985,8 +1004,11 @@ void EffectChain::finalize() } output_dot("step1-rewritten.dot"); + find_color_spaces_for_inputs(); + output_dot("step2-input-colorspace.dot"); + propagate_gamma_and_color_space(); - output_dot("step2-propagated.dot"); + output_dot("step3-propagated.dot"); fix_internal_color_spaces(); fix_output_color_space();