[Mesa-dev] [PATCH 06/17] gallium: Put no.of {samples, layers} into pipe_framebuffer_state

Marek Olšák maraeo at gmail.com
Mon Mar 21 15:36:47 UTC 2016


Reviewed-by: Marek Olšák <marek.olsak at amd.com>

Marek

On Sat, Mar 19, 2016 at 7:41 AM, Edward O'Callaghan
<eocallaghan at alterapraxis.com> wrote:
> Here we store the number of samples and layers directly in the
> pipe_framebuffer_state so that in the case of
> ARB_framebuffer_no_attachment we may make use of them directly.
>
> Further, we adjust various gallium/auxiliary helper functions
> accordingly.
>
> V2:
>   Convert branches in util_framebuffer_get_num_layers() and
>   util_framebuffer_get_num_samples() to their canonical form.
>
> V3:
>   'git stash pop' the typo fix of 'cbufs' which should be
>   'nr_cbufs' that was missing in V2, woops! Thanks Marek for
>   pointing this out yet again.
>
> Signed-off-by: Edward O'Callaghan <eocallaghan at alterapraxis.com>
> ---
>  src/gallium/auxiliary/util/u_dump_state.c  |  2 ++
>  src/gallium/auxiliary/util/u_framebuffer.c | 24 ++++++++++++++++++++++++
>  src/gallium/include/pipe/p_state.h         |  8 ++++++++
>  3 files changed, 34 insertions(+)
>
> diff --git a/src/gallium/auxiliary/util/u_dump_state.c b/src/gallium/auxiliary/util/u_dump_state.c
> index a73a1de..b1f3982 100644
> --- a/src/gallium/auxiliary/util/u_dump_state.c
> +++ b/src/gallium/auxiliary/util/u_dump_state.c
> @@ -645,6 +645,8 @@ util_dump_framebuffer_state(FILE *stream, const struct pipe_framebuffer_state *s
>
>     util_dump_member(stream, uint, state, width);
>     util_dump_member(stream, uint, state, height);
> +   util_dump_member(stream, uint, state, samples);
> +   util_dump_member(stream, uint, state, layers);
>     util_dump_member(stream, uint, state, nr_cbufs);
>     util_dump_member_array(stream, ptr, state, cbufs);
>     util_dump_member(stream, ptr, state, zsbuf);
> diff --git a/src/gallium/auxiliary/util/u_framebuffer.c b/src/gallium/auxiliary/util/u_framebuffer.c
> index 2e0ef74..775f050 100644
> --- a/src/gallium/auxiliary/util/u_framebuffer.c
> +++ b/src/gallium/auxiliary/util/u_framebuffer.c
> @@ -55,6 +55,10 @@ util_framebuffer_state_equal(const struct pipe_framebuffer_state *dst,
>         dst->height != src->height)
>        return FALSE;
>
> +   if (dst->samples != src->samples ||
> +       dst->layers  != src->layers)
> +      return FALSE;
> +
>     for (i = 0; i < Elements(src->cbufs); i++) {
>        if (dst->cbufs[i] != src->cbufs[i]) {
>           return FALSE;
> @@ -85,6 +89,9 @@ util_copy_framebuffer_state(struct pipe_framebuffer_state *dst,
>     dst->width = src->width;
>     dst->height = src->height;
>
> +   dst->samples = src->samples;
> +   dst->layers  = src->layers;
> +
>     for (i = 0; i < src->nr_cbufs; i++)
>        pipe_surface_reference(&dst->cbufs[i], src->cbufs[i]);
>
> @@ -109,6 +116,7 @@ util_unreference_framebuffer_state(struct pipe_framebuffer_state *fb)
>
>     pipe_surface_reference(&fb->zsbuf, NULL);
>
> +   fb->samples = fb->layers = 0;
>     fb->width = fb->height = 0;
>     fb->nr_cbufs = 0;
>  }
> @@ -160,6 +168,14 @@ util_framebuffer_get_num_layers(const struct pipe_framebuffer_state *fb)
>  {
>         unsigned i, num_layers = 0;
>
> +       /**
> +        * In the case of ARB_framebuffer_no_attachment
> +        * we obtain the number of layers directly from
> +        * the framebuffer state.
> +        */
> +       if (!(fb->nr_cbufs || fb->zsbuf))
> +               return fb->layers;
> +
>         for (i = 0; i < fb->nr_cbufs; i++) {
>                 if (fb->cbufs[i]) {
>                         unsigned num = fb->cbufs[i]->u.tex.last_layer -
> @@ -184,6 +200,14 @@ util_framebuffer_get_num_samples(const struct pipe_framebuffer_state *fb)
>  {
>     unsigned i;
>
> +   /**
> +    * In the case of ARB_framebuffer_no_attachment
> +    * we obtain the number of samples directly from
> +    * the framebuffer state.
> +    */
> +   if (!(fb->nr_cbufs || fb->zsbuf))
> +      return fb->samples;
> +
>     for (i = 0; i < fb->nr_cbufs; i++) {
>        if (fb->cbufs[i]) {
>           return MAX2(1, fb->cbufs[i]->texture->nr_samples);
> diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h
> index 2e720ce..7c81a30 100644
> --- a/src/gallium/include/pipe/p_state.h
> +++ b/src/gallium/include/pipe/p_state.h
> @@ -298,9 +298,17 @@ struct pipe_stencil_ref
>  };
>
>
> +/**
> + * Note that pipe_surfaces are "texture views for rendering"
> + * and so in the case of ARB_framebuffer_no_attachment there
> + * is no pipe_surface state available such that we may
> + * extract the number of samples and layers.
> + */
>  struct pipe_framebuffer_state
>  {
>     unsigned width, height;
> +   unsigned samples; /**< Number of samples in a no-attachment framebuffer */
> +   unsigned layers;  /**< Number of layers  in a no-attachment framebuffer */
>
>     /** multiple color buffers for multiple render targets */
>     unsigned nr_cbufs;
> --
> 2.5.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list