X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=effect_chain.cpp;h=c46e60d20475a70fd3b721fefe3d9f3775f3d792;hp=efd4abc49a611c233164089858d586a0538d075b;hb=2d8043bb837b45c9ae509450b3e1b1eb545e44b9;hpb=7ff8195d27166151be38d637ae4b2633d4b39556 diff --git a/effect_chain.cpp b/effect_chain.cpp index efd4abc..c46e60d 100644 --- a/effect_chain.cpp +++ b/effect_chain.cpp @@ -1789,17 +1789,6 @@ void EffectChain::render_to_fbo(GLuint dest_fbo, unsigned width, unsigned height glDepthMask(GL_FALSE); check_error(); - // Generate a VAO that will be used during the entire execution, - // and bind the VBO, since it contains all the data. - GLuint vao; - glGenVertexArrays(1, &vao); - check_error(); - glBindVertexArray(vao); - check_error(); - glBindBuffer(GL_ARRAY_BUFFER, vbo); - check_error(); - set bound_attribute_indices; - set generated_mipmaps; // We choose the simplest option of having one texture per output, @@ -1847,7 +1836,7 @@ void EffectChain::render_to_fbo(GLuint dest_fbo, unsigned width, unsigned height current_srgb = true; } - execute_phase(phase, last_phase, &bound_attribute_indices, &output_textures, &generated_mipmaps); + execute_phase(phase, last_phase, &output_textures, &generated_mipmaps); if (do_phase_timing) { glEndQuery(GL_TIME_ELAPSED); } @@ -1868,8 +1857,6 @@ void EffectChain::render_to_fbo(GLuint dest_fbo, unsigned width, unsigned height check_error(); glBindVertexArray(0); check_error(); - glDeleteVertexArrays(1, &vao); - check_error(); if (do_phase_timing) { // Get back the timer queries. @@ -1932,7 +1919,6 @@ void EffectChain::print_phase_timing() } void EffectChain::execute_phase(Phase *phase, bool last_phase, - set *bound_attribute_indices, map *output_textures, set *generated_mipmaps) { @@ -1993,30 +1979,9 @@ void EffectChain::execute_phase(Phase *phase, bool last_phase, // from there. setup_uniforms(phase); - // Clean up old attributes if they are no longer needed. - for (set::iterator attr_it = bound_attribute_indices->begin(); - attr_it != bound_attribute_indices->end(); ) { - if (phase->attribute_indexes.count(*attr_it) == 0) { - glDisableVertexAttribArray(*attr_it); - check_error(); - bound_attribute_indices->erase(attr_it++); - } else { - ++attr_it; - } - } - - // Set up the new attributes, if needed. - for (set::iterator attr_it = phase->attribute_indexes.begin(); - attr_it != phase->attribute_indexes.end(); - ++attr_it) { - if (bound_attribute_indices->count(*attr_it) == 0) { - glEnableVertexAttribArray(*attr_it); - check_error(); - glVertexAttribPointer(*attr_it, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); - check_error(); - bound_attribute_indices->insert(*attr_it); - } - } + // Bind the vertex data. + GLuint vao = resource_pool->create_vec2_vao(phase->attribute_indexes, vbo); + glBindVertexArray(vao); glDrawArrays(GL_TRIANGLES, 0, 3); check_error(); @@ -2027,6 +1992,7 @@ void EffectChain::execute_phase(Phase *phase, bool last_phase, } resource_pool->unuse_glsl_program(instance_program_num); + resource_pool->release_vec2_vao(vao); if (!last_phase) { resource_pool->release_fbo(fbo);