[Piglit] [PATCH 14/20] msaa: Fix GL object leak when changing fbo config.
Anuj Phogat
anuj.phogat at gmail.com
Wed Jun 6 16:32:06 PDT 2012
On Tue, Jun 5, 2012 at 5:03 PM, Paul Berry <stereotype441 at gmail.com> wrote:
> Previously, we would allocate new textures and renderbuffers whenever
> the configuration of a framebuffer changed (e.g. when changing its
> sample count), causing the old textures and renderbuffers to be
> leaked. This patch fixes the leak by allocating all of the textures
> and renderbuffers that will be needed up front. It also renames the
> generate() function to generate_gl_objects() to clarify its purpose.
> ---
> tests/spec/ext_framebuffer_multisample/common.cpp | 34 ++++++++------------
> tests/spec/ext_framebuffer_multisample/common.h | 22 +++++++++++++-
> 2 files changed, 35 insertions(+), 21 deletions(-)
>
> diff --git a/tests/spec/ext_framebuffer_multisample/common.cpp b/tests/spec/ext_framebuffer_multisample/common.cpp
> index eae906d..a4b5858 100644
> --- a/tests/spec/ext_framebuffer_multisample/common.cpp
> +++ b/tests/spec/ext_framebuffer_multisample/common.cpp
> @@ -127,15 +127,19 @@ Fbo::Fbo()
> void
> Fbo::init(const FboConfig &initial_config)
> {
> - generate();
> + generate_gl_objects();
> this->config = initial_config;
> setup();
> }
>
> void
> -Fbo::generate(void)
> +Fbo::generate_gl_objects(void)
> {
> glGenFramebuffers(1, &handle);
> + glGenTextures(1, &color_tex);
> + glGenRenderbuffers(1, &color_rb);
> + glGenRenderbuffers(1, &depth_rb);
> + glGenRenderbuffers(1, &stencil_rb);
> }
>
> void
> @@ -153,22 +157,18 @@ void
> Fbo::setup()
> {
> glBindFramebuffer(GL_DRAW_FRAMEBUFFER, handle);
> - this->color_tex = 0;
>
> /* Color buffer */
> if (!config.attach_texture) {
> - GLuint rb;
> - glGenRenderbuffers(1, &rb);
> - glBindRenderbuffer(GL_RENDERBUFFER, rb);
> + glBindRenderbuffer(GL_RENDERBUFFER, color_rb);
> glRenderbufferStorageMultisample(GL_RENDERBUFFER,
> config.num_samples,
> GL_RGBA, config.width,
> config.height);
> glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER,
> GL_COLOR_ATTACHMENT0,
> - GL_RENDERBUFFER, rb);
> + GL_RENDERBUFFER, color_rb);
> } else {
> - glGenTextures(1, &color_tex);
> glBindTexture(GL_TEXTURE_2D, color_tex);
> glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
> GL_NEAREST);
> @@ -192,9 +192,7 @@ Fbo::setup()
>
> /* Depth/stencil buffer(s) */
> if (config.combine_depth_stencil) {
> - GLuint depth_stencil;
> - glGenRenderbuffers(1, &depth_stencil);
> - glBindRenderbuffer(GL_RENDERBUFFER, depth_stencil);
> + glBindRenderbuffer(GL_RENDERBUFFER, depth_rb);
> glRenderbufferStorageMultisample(GL_RENDERBUFFER,
> config.num_samples,
> GL_DEPTH_STENCIL,
> @@ -202,29 +200,25 @@ Fbo::setup()
> config.height);
> glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER,
> GL_DEPTH_STENCIL_ATTACHMENT,
> - GL_RENDERBUFFER, depth_stencil);
> + GL_RENDERBUFFER, depth_rb);
> } else {
> - GLuint stencil;
> - glGenRenderbuffers(1, &stencil);
> - glBindRenderbuffer(GL_RENDERBUFFER, stencil);
> + glBindRenderbuffer(GL_RENDERBUFFER, stencil_rb);
> glRenderbufferStorageMultisample(GL_RENDERBUFFER,
> config.num_samples,
> GL_STENCIL_INDEX8,
> config.width, config.height);
> glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER,
> GL_STENCIL_ATTACHMENT,
> - GL_RENDERBUFFER, stencil);
> + GL_RENDERBUFFER, stencil_rb);
>
> - GLuint depth;
> - glGenRenderbuffers(1, &depth);
> - glBindRenderbuffer(GL_RENDERBUFFER, depth);
> + glBindRenderbuffer(GL_RENDERBUFFER, depth_rb);
> glRenderbufferStorageMultisample(GL_RENDERBUFFER,
> config.num_samples,
> GL_DEPTH_COMPONENT24,
> config.width, config.height);
> glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER,
> GL_DEPTH_ATTACHMENT,
> - GL_RENDERBUFFER, depth);
> + GL_RENDERBUFFER, depth_rb);
> }
>
> if (glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
> diff --git a/tests/spec/ext_framebuffer_multisample/common.h b/tests/spec/ext_framebuffer_multisample/common.h
> index 71adccd..d8ba2e0 100644
> --- a/tests/spec/ext_framebuffer_multisample/common.h
> +++ b/tests/spec/ext_framebuffer_multisample/common.h
> @@ -79,7 +79,7 @@ public:
> Fbo();
>
> void init(const FboConfig &initial_config);
> - void generate();
> + void generate_gl_objects();
> void set_samples(int num_samples);
> void setup();
>
> @@ -93,6 +93,26 @@ public:
> * color buffer.
> */
> GLuint color_tex;
> +
> + /**
> + * If config.attach_texture is false, the backing store for
> + * the color buffer.
> + */
> + GLuint color_rb;
> +
> + /**
> + * If config.combine_depth_stencil is true, the backing store
> + * for the depth/stencil buffer. If
> + * config.combine_depth_stencil is false, the backing store
> + * for the depth buffer.
> + */
> + GLuint depth_rb;
> +
> + /**
> + * If config.combine_depth_stencil is false, the backing store
> + * for the stencil buffer.
> + */
> + GLuint stencil_rb;
> };
>
> /**
> --
> 1.7.7.6
>
This fix was very much required to avoid leaking textures and renderbuffers.
Reviewed-by: Anuj Phogat <anuj.phogat at gmail.com>
More information about the Piglit
mailing list