From: Steinar H. Gunderson Date: Sun, 13 Sep 2015 23:18:38 +0000 (+0200) Subject: Reuse the VAO across all phases. X-Git-Tag: 1.2.0~14 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;ds=sidebyside;h=5e34f7a8969f4afc169f034d34fb908019b3a389;p=movit Reuse the VAO across all phases. --- diff --git a/effect_chain.cpp b/effect_chain.cpp index 471d603..bf01716 100644 --- a/effect_chain.cpp +++ b/effect_chain.cpp @@ -1625,6 +1625,23 @@ void EffectChain::render_to_fbo(GLuint dest_fbo, unsigned width, unsigned height glDepthMask(GL_FALSE); check_error(); + // Generate a VAO. All the phases should have exactly the same vertex attributes, + // so it's safe to reuse this. + float vertices[] = { + 0.0f, 2.0f, + 0.0f, 0.0f, + 2.0f, 0.0f + }; + + GLuint vao; + glGenVertexArrays(1, &vao); + check_error(); + glBindVertexArray(vao); + check_error(); + + GLuint position_vbo = fill_vertex_attribute(phases[0]->glsl_program_num, "position", 2, GL_FLOAT, sizeof(vertices), vertices); + GLuint texcoord_vbo = fill_vertex_attribute(phases[0]->glsl_program_num, "texcoord", 2, GL_FLOAT, sizeof(vertices), vertices); // Same as vertices. + set generated_mipmaps; // We choose the simplest option of having one texture per output, @@ -1666,6 +1683,12 @@ void EffectChain::render_to_fbo(GLuint dest_fbo, unsigned width, unsigned height glUseProgram(0); check_error(); + cleanup_vertex_attribute(phases[0]->glsl_program_num, "position", position_vbo); + cleanup_vertex_attribute(phases[0]->glsl_program_num, "texcoord", texcoord_vbo); + + glDeleteVertexArrays(1, &vao); + check_error(); + if (do_phase_timing) { // Get back the timer queries. for (unsigned phase_num = 0; phase_num < phases.size(); ++phase_num) { @@ -1779,28 +1802,9 @@ void EffectChain::execute_phase(Phase *phase, bool last_phase, maprelease_fbo(fbo); } - - glDeleteVertexArrays(1, &vao); - check_error(); } void EffectChain::setup_uniforms(Phase *phase)