[Piglit] [PATCH 12/20] msaa: Reuse FboConfig data structure in Fbo.

Anuj Phogat anuj.phogat at gmail.com
Wed Jun 6 15:51:58 PDT 2012


On Tue, Jun 5, 2012 at 5:03 PM, Paul Berry <stereotype441 at gmail.com> wrote:
> This patch modifies Fbo so that instead of storing its copy of the
> configuration parameters passed to init() as primitive values, it
> stores them using an FboConfig data structure.
> ---
>  tests/spec/ext_framebuffer_multisample/common.cpp |   80 ++++++++++++---------
>  tests/spec/ext_framebuffer_multisample/common.h   |   11 ++--
>  2 files changed, 51 insertions(+), 40 deletions(-)
>
> diff --git a/tests/spec/ext_framebuffer_multisample/common.cpp b/tests/spec/ext_framebuffer_multisample/common.cpp
> index 195d9c7..0d96ef2 100644
> --- a/tests/spec/ext_framebuffer_multisample/common.cpp
> +++ b/tests/spec/ext_framebuffer_multisample/common.cpp
> @@ -119,14 +119,16 @@ FboConfig::FboConfig(int num_samples, int width, int height)
>  {
>  }
>
> +Fbo::Fbo()
> +       : config(0, 0, 0) /* will be overwritten when init() is called */
> +{
> +}
> +
>  void
>  Fbo::init(const FboConfig &initial_config)
>  {
>        generate();
> -       this->width = initial_config.width;
> -       this->height = initial_config.height;
> -       this->combine_depth_stencil = initial_config.combine_depth_stencil;
> -       this->attach_texture = initial_config.attach_texture;
> +       this->config = initial_config;
>        set_samples(initial_config.num_samples);
>  }
>
> @@ -139,17 +141,19 @@ Fbo::generate(void)
>  void
>  Fbo::set_samples(int num_samples)
>  {
> +       this->config.num_samples = num_samples;
>        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, handle);
> -
>        this->color_tex = 0;
>
>        /* Color buffer */
> -       if (!attach_texture) {
> +       if (!config.attach_texture) {
>                GLuint rb;
>                glGenRenderbuffers(1, &rb);
>                glBindRenderbuffer(GL_RENDERBUFFER, rb);
> -               glRenderbufferStorageMultisample(GL_RENDERBUFFER, num_samples,
> -                                                GL_RGBA, width, height);
> +               glRenderbufferStorageMultisample(GL_RENDERBUFFER,
> +                                                config.num_samples,
> +                                                GL_RGBA, config.width,
> +                                                config.height);
>                glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER,
>                                          GL_COLOR_ATTACHMENT0,
>                                          GL_RENDERBUFFER, rb);
> @@ -163,8 +167,8 @@ Fbo::set_samples(int num_samples)
>                glTexImage2D(GL_TEXTURE_2D,
>                             0 /* level */,
>                             GL_RGBA /* internalformat */,
> -                            width,
> -                            height,
> +                            config.width,
> +                            config.height,
>                             0 /* border */,
>                             GL_RGBA /* format */,
>                             GL_BYTE /* type */,
> @@ -177,13 +181,15 @@ Fbo::set_samples(int num_samples)
>        }
>
>        /* Depth/stencil buffer(s) */
> -       if (combine_depth_stencil) {
> +       if (config.combine_depth_stencil) {
>                GLuint depth_stencil;
>                glGenRenderbuffers(1, &depth_stencil);
>                glBindRenderbuffer(GL_RENDERBUFFER, depth_stencil);
> -               glRenderbufferStorageMultisample(GL_RENDERBUFFER, num_samples,
> -                                                GL_DEPTH_STENCIL, width,
> -                                                height);
> +               glRenderbufferStorageMultisample(GL_RENDERBUFFER,
> +                                                config.num_samples,
> +                                                GL_DEPTH_STENCIL,
> +                                                config.width,
> +                                                config.height);
>                glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER,
>                                          GL_DEPTH_STENCIL_ATTACHMENT,
>                                          GL_RENDERBUFFER, depth_stencil);
> @@ -191,9 +197,10 @@ Fbo::set_samples(int num_samples)
>                GLuint stencil;
>                glGenRenderbuffers(1, &stencil);
>                glBindRenderbuffer(GL_RENDERBUFFER, stencil);
> -               glRenderbufferStorageMultisample(GL_RENDERBUFFER, num_samples,
> +               glRenderbufferStorageMultisample(GL_RENDERBUFFER,
> +                                                config.num_samples,
>                                                 GL_STENCIL_INDEX8,
> -                                                width, height);
> +                                                config.width, config.height);
>                glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER,
>                                          GL_STENCIL_ATTACHMENT,
>                                          GL_RENDERBUFFER, stencil);
> @@ -201,9 +208,10 @@ Fbo::set_samples(int num_samples)
>                GLuint depth;
>                glGenRenderbuffers(1, &depth);
>                glBindRenderbuffer(GL_RENDERBUFFER, depth);
> -               glRenderbufferStorageMultisample(GL_RENDERBUFFER, num_samples,
> +               glRenderbufferStorageMultisample(GL_RENDERBUFFER,
> +                                                config.num_samples,
>                                                 GL_DEPTH_COMPONENT24,
> -                                                width, height);
> +                                                config.width, config.height);
>                glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER,
>                                          GL_DEPTH_ATTACHMENT,
>                                          GL_RENDERBUFFER, depth);
> @@ -211,7 +219,7 @@ Fbo::set_samples(int num_samples)
>
>        if (glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
>                printf("Framebuffer not complete\n");
> -               if (!combine_depth_stencil) {
> +               if (!config.combine_depth_stencil) {
>                        /* Some implementations do not support
>                         * separate depth and stencil attachments, so
>                         * don't consider it an error if we fail to
> @@ -232,7 +240,7 @@ Fbo::set_samples(int num_samples)
>  void
>  Fbo::set_viewport()
>  {
> -       glViewport(0, 0, width, height);
> +       glViewport(0, 0, config.width, config.height);
>  }
>
>  void
> @@ -1089,8 +1097,9 @@ Test::resolve(Fbo *fbo, GLbitfield which_buffers)
>        glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo->handle);
>        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolve_fbo.handle);
>        resolve_fbo.set_viewport();
> -       glBlitFramebuffer(0, 0, fbo->width, fbo->height,
> -                         0, 0, resolve_fbo.width, resolve_fbo.height,
> +       glBlitFramebuffer(0, 0, fbo->config.width, fbo->config.height,
> +                         0, 0, resolve_fbo.config.width,
> +                         resolve_fbo.config.height,
>                          which_buffers, GL_NEAREST);
>  }
>
> @@ -1105,7 +1114,8 @@ Test::downsample_color(int downsampled_width, int downsampled_height)
>        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, downsample_fbo.handle);
>        downsample_fbo.set_viewport();
>        downsample_prog.run(&supersample_fbo,
> -                           downsample_fbo.width, downsample_fbo.height);
> +                           downsample_fbo.config.width,
> +                           downsample_fbo.config.height);
>  }
>
>  /**
> @@ -1119,10 +1129,10 @@ Test::show(Fbo *src_fbo, int x_offset, int y_offset)
>        glBindFramebuffer(GL_READ_FRAMEBUFFER, src_fbo->handle);
>        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
>        glViewport(0, 0, piglit_width, piglit_height);
> -       glBlitFramebuffer(0, 0, src_fbo->width, src_fbo->height,
> +       glBlitFramebuffer(0, 0, src_fbo->config.width, src_fbo->config.height,
>                          x_offset, y_offset,
> -                         x_offset + src_fbo->width,
> -                         y_offset + src_fbo->height,
> +                         x_offset + src_fbo->config.width,
> +                         y_offset + src_fbo->config.height,
>                          GL_COLOR_BUFFER_BIT, GL_NEAREST);
>  }
>
> @@ -1169,18 +1179,18 @@ Test::draw_pattern(int x_offset, int y_offset, int width, int height)
>  void
>  Test::draw_test_image(Fbo *fbo)
>  {
> -       int num_h_tiles = pattern_width / fbo->width;
> -       int num_v_tiles = pattern_height / fbo->height;
> +       int num_h_tiles = pattern_width / fbo->config.width;
> +       int num_v_tiles = pattern_height / fbo->config.height;
>        for (int h = 0; h < num_h_tiles; ++h) {
>                for (int v = 0; v < num_v_tiles; ++v) {
>                        glBindFramebuffer(GL_DRAW_FRAMEBUFFER,
>                                          fbo->handle);
>                        fbo->set_viewport();
> -                       int x_offset = h * fbo->width;
> -                       int y_offset = v * fbo->height;
> +                       int x_offset = h * fbo->config.width;
> +                       int y_offset = v * fbo->config.height;
>                        draw_pattern(x_offset, y_offset,
> -                                    fbo->width,
> -                                    fbo->height);
> +                                    fbo->config.width,
> +                                    fbo->config.height);
>                        if (test_resolve) {
>                                resolve(fbo, blit_type);
>                                if (manifest_program)
> @@ -1214,8 +1224,10 @@ Test::draw_to_default_framebuffer()
>  void
>  Test::draw_reference_image()
>  {
> -       int downsampled_width = supersample_fbo.width / supersample_factor;
> -       int downsampled_height = supersample_fbo.height / supersample_factor;
> +       int downsampled_width =
> +               supersample_fbo.config.width / supersample_factor;
> +       int downsampled_height =
> +               supersample_fbo.config.height / supersample_factor;
>        int num_h_tiles = pattern_width / downsampled_width;
>        int num_v_tiles = pattern_height / downsampled_height;
>        for (int h = 0; h < num_h_tiles; ++h) {
> diff --git a/tests/spec/ext_framebuffer_multisample/common.h b/tests/spec/ext_framebuffer_multisample/common.h
> index 23b0a40..1e8cd85 100644
> --- a/tests/spec/ext_framebuffer_multisample/common.h
> +++ b/tests/spec/ext_framebuffer_multisample/common.h
> @@ -76,21 +76,20 @@ public:
>  class Fbo
>  {
>  public:
> +       Fbo();
> +
>        void init(const FboConfig &initial_config);
>        void generate();
>        void set_samples(int num_samples);
>
>        void set_viewport();
>
> -       int width;
> -       int height;
> -       bool combine_depth_stencil;
> -       bool attach_texture;
> +       FboConfig config;
>        GLuint handle;
>
>        /**
> -        * If attach_texture is true, the backing store for the color
> -        * buffer.
> +        * If config.attach_texture is true, the backing store for the
> +        * color buffer.
>         */
>        GLuint color_tex;
>  };
> --
> 1.7.7.6
>

Reviewed-by: Anuj Phogat <anuj.phogat at gmail.com>


More information about the Piglit mailing list