]> git.sesse.net Git - movit/blobdiff - effect_chain.cpp
Add a small note on unit testing of ycbcr.cpp.
[movit] / effect_chain.cpp
index 0a01bd356e6066261910a60e4ee2af2813d428f5..b00f214aa0f535e26570bca1f0df258814cc9858 100644 (file)
@@ -2,7 +2,6 @@
 
 #include <epoxy/gl.h>
 #include <assert.h>
-#include <locale.h>
 #include <math.h>
 #include <stddef.h>
 #include <stdio.h>
@@ -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<Node *, Phase *> *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<Node *, Phase *> *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<Input *>(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<Node *, Phase *> *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<Input *>(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)