X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=effect_chain.cpp;h=b00f214aa0f535e26570bca1f0df258814cc9858;hp=21c4a0d1d2cf84e8a2eb3f80153715557aab8d1c;hb=54c233d62900640a60a25db95123a5fc37b95d66;hpb=d88ed3150376693000665b9016c0350d5d90e9e1 diff --git a/effect_chain.cpp b/effect_chain.cpp index 21c4a0d..b00f214 100644 --- a/effect_chain.cpp +++ b/effect_chain.cpp @@ -87,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; @@ -310,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. @@ -334,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, @@ -392,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)); } }