X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=effect_chain.cpp;h=b00f214aa0f535e26570bca1f0df258814cc9858;hp=0a01bd356e6066261910a60e4ee2af2813d428f5;hb=457b9a7fa5a508084142dd97290fb590397069ff;hpb=7ea0b3a5be9bafaa2d1fa5a17ce285a725ce132b diff --git a/effect_chain.cpp b/effect_chain.cpp index 0a01bd3..b00f214 100644 --- a/effect_chain.cpp +++ b/effect_chain.cpp @@ -2,7 +2,6 @@ #include #include -#include #include #include #include @@ -88,6 +87,7 @@ Node *EffectChain::add_node(Effect *effect) node->output_color_space = COLORSPACE_INVALID; node->output_gamma_curve = GAMMA_INVALID; node->output_alpha_type = ALPHA_INVALID; + node->needs_mipmaps = false; nodes.push_back(node); node_map[effect] = node; @@ -311,6 +311,10 @@ Phase *EffectChain::construct_phase(Node *output, map *complete Node *node = effects_todo_this_phase.top(); effects_todo_this_phase.pop(); + if (node->effect->needs_mipmaps()) { + node->needs_mipmaps = true; + } + // This should currently only happen for effects that are inputs // (either true inputs or phase outputs). We special-case inputs, // and then deduplicate phase outputs below. @@ -335,6 +339,21 @@ Phase *EffectChain::construct_phase(Node *output, map *complete start_new_phase = true; } + // Propagate information about needing mipmaps down the chain, + // breaking the phase if we notice an incompatibility. + // + // Note that we cannot do this propagation as a normal pass, + // because it needs information about where the phases end + // (we should not propagate the flag across phases). + if (node->needs_mipmaps) { + if (deps[i]->effect->num_inputs() == 0) { + Input *input = static_cast(deps[i]->effect); + start_new_phase |= !input->can_supply_mipmaps(); + } else { + deps[i]->needs_mipmaps = true; + } + } + if (deps[i]->outgoing_links.size() > 1) { if (!deps[i]->effect->is_single_texture()) { // More than one effect uses this as the input, @@ -393,7 +412,9 @@ Phase *EffectChain::construct_phase(Node *output, map *complete for (unsigned i = 0; i < phase->effects.size(); ++i) { Node *node = phase->effects[i]; if (node->effect->num_inputs() == 0) { - CHECK(node->effect->set_int("needs_mipmaps", phase->input_needs_mipmaps)); + Input *input = static_cast(node->effect); + assert(!phase->input_needs_mipmaps || input->can_supply_mipmaps()); + CHECK(input->set_int("needs_mipmaps", phase->input_needs_mipmaps)); } } @@ -1330,10 +1351,6 @@ Node *EffectChain::find_output_node() void EffectChain::finalize() { - // Save the current locale, and set it to C, so that we can output decimal - // numbers with printf and be sure to get them in the format mandated by GLSL. - char *saved_locale = setlocale(LC_NUMERIC, "C"); - // Output the graph as it is before we do any conversions on it. output_dot("step0-start.dot"); @@ -1396,7 +1413,6 @@ void EffectChain::finalize() assert(phases[0]->inputs.empty()); finalized = true; - setlocale(LC_NUMERIC, saved_locale); } void EffectChain::render_to_fbo(GLuint dest_fbo, unsigned width, unsigned height)