X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=effect_chain.cpp;h=ca6a7775eb56de0aab5b2e43dbe53a8003c34aaf;hp=b6f2a5b50b9441649bd9658e77aacfa9efb7e0e3;hb=0cdd6e9e30a807056699ed9b3fa023a23ce83af9;hpb=7bcb6d10c72b1486ef709d840e82314d4faad704 diff --git a/effect_chain.cpp b/effect_chain.cpp index b6f2a5b..ca6a777 100644 --- a/effect_chain.cpp +++ b/effect_chain.cpp @@ -68,11 +68,6 @@ EffectChain::~EffectChain() if (owns_resource_pool) { delete resource_pool; } - for (map::const_iterator fbo_it = fbos.begin(); - fbo_it != fbos.end(); ++fbo_it) { - glDeleteFramebuffers(1, &fbo_it->second); - check_error(); - } } Input *EffectChain::add_input(Input *input) @@ -1459,18 +1454,6 @@ void EffectChain::render_to_fbo(GLuint dest_fbo, unsigned width, unsigned height glDepthMask(GL_FALSE); check_error(); - if (phases.size() > 1) { - if (fbos.count(context) == 0) { - glGenFramebuffers(1, &fbo); - check_error(); - fbos.insert(make_pair(context, fbo)); - } else { - fbo = fbos[context]; - } - glBindFramebuffer(GL_FRAMEBUFFER, fbo); - check_error(); - } - set generated_mipmaps; // We choose the simplest option of having one texture per output, @@ -1485,7 +1468,7 @@ void EffectChain::render_to_fbo(GLuint dest_fbo, unsigned width, unsigned height if (phase_num != phases.size() - 1) { find_output_size(phase); - GLuint tex_num = resource_pool->create_2d_texture(GL_RGBA16F_ARB, phase->output_width, phase->output_height); + GLuint tex_num = resource_pool->create_2d_texture(GL_RGBA16F, phase->output_width, phase->output_height); output_textures.insert(make_pair(phase, tex_num)); } @@ -1536,15 +1519,8 @@ void EffectChain::render_to_fbo(GLuint dest_fbo, unsigned width, unsigned height CHECK(dither_effect->set_int("output_height", height)); } } else { - glFramebufferTexture2D( - GL_FRAMEBUFFER, - GL_COLOR_ATTACHMENT0, - GL_TEXTURE_2D, - output_textures[phase], - 0); - check_error(); - GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); - assert(status == GL_FRAMEBUFFER_COMPLETE); + fbo = resource_pool->create_fbo(context, output_textures[phase]); + glBindFramebuffer(GL_FRAMEBUFFER, fbo); glViewport(0, 0, phase->output_width, phase->output_height); } @@ -1573,6 +1549,9 @@ void EffectChain::render_to_fbo(GLuint dest_fbo, unsigned width, unsigned height Node *node = phase->effects[i]; node->effect->clear_gl_state(); } + if (phase_num != phases.size() - 1) { + resource_pool->release_fbo(fbo); + } } for (map::const_iterator texture_it = output_textures.begin();