]> git.sesse.net Git - movit/blobdiff - effect_chain.cpp
Add an assertion failure that we don't add the same effect instance twice.
[movit] / effect_chain.cpp
index e68895d7b8f40c8c30475b8f51e0e49c7f39a473..6b7a857242e0572c7be6d66afe6026734ec99c6c 100644 (file)
@@ -29,7 +29,6 @@ EffectChain::EffectChain(float aspect_nom, float aspect_denom)
        : aspect_nom(aspect_nom),
          aspect_denom(aspect_denom),
          dither_effect(NULL),
-         fbo(0),
          num_dither_bits(0),
          finalized(false) {}
 
@@ -48,9 +47,6 @@ EffectChain::~EffectChain()
                glDeleteShader(phases[i]->fragment_shader);
                delete phases[i];
        }
-       if (fbo != 0) {
-               glDeleteFramebuffers(1, &fbo);
-       }
 }
 
 Input *EffectChain::add_input(Input *input)
@@ -70,6 +66,10 @@ void EffectChain::add_output(const ImageFormat &format, OutputAlphaFormat alpha_
 
 Node *EffectChain::add_node(Effect *effect)
 {
+       for (unsigned i = 0; i < nodes.size(); ++i) {
+               assert(nodes[i]->effect != effect);
+       }
+
        char effect_id[256];
        sprintf(effect_id, "eff%u", (unsigned)nodes.size());
 
@@ -1433,8 +1433,6 @@ void EffectChain::finalize()
        // since otherwise this turns into an (albeit simple)
        // register allocation problem.
        if (phases.size() > 1) {
-               glGenFramebuffers(1, &fbo);
-
                for (unsigned i = 0; i < phases.size() - 1; ++i) {
                        inform_input_sizes(phases[i]);
                        find_output_size(phases[i]);
@@ -1473,6 +1471,7 @@ void EffectChain::render_to_fbo(GLuint dest_fbo, unsigned width, unsigned height
 
        // Save original viewport.
        GLuint x = 0, y = 0;
+       GLuint fbo = 0;
 
        if (width == 0 && height == 0) {
                GLint viewport[4];
@@ -1499,6 +1498,8 @@ void EffectChain::render_to_fbo(GLuint dest_fbo, unsigned width, unsigned height
        glLoadIdentity();
 
        if (phases.size() > 1) {
+               glGenFramebuffers(1, &fbo);
+               check_error();
                glBindFramebuffer(GL_FRAMEBUFFER, fbo);
                check_error();
        }
@@ -1614,4 +1615,12 @@ void EffectChain::render_to_fbo(GLuint dest_fbo, unsigned width, unsigned height
                        node->effect->clear_gl_state();
                }
        }
+
+       glBindFramebuffer(GL_FRAMEBUFFER, 0);
+       check_error();
+
+       if (fbo != 0) {
+               glDeleteFramebuffers(1, &fbo);
+               check_error();
+       }
 }