[Mesa-dev] [PATCH 4/7] gallium: Put no.of {samples, layers} into pipe_framebuffer_state
Ilia Mirkin
imirkin at alum.mit.edu
Sun Jan 31 06:15:28 PST 2016
On Sun, Jan 31, 2016 at 1:25 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.
>
> 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..9c9a7bf 100644
> --- a/src/gallium/auxiliary/util/u_dump_state.c
> +++ b/src/gallium/auxiliary/util/u_dump_state.c
> @@ -643,6 +643,8 @@ util_dump_framebuffer_state(FILE *stream, const struct pipe_framebuffer_state *s
> {
> util_dump_struct_begin(stream, "pipe_framebuffer_state");
>
> + util_dump_member(stream, uint, state, samples);
> + util_dump_member(stream, uint, state, layers);
Put these below width/height for consistency. Also please update the
trace driver to dump these values as well.
> util_dump_member(stream, uint, state, width);
> util_dump_member(stream, uint, state, height);
> util_dump_member(stream, uint, state, nr_cbufs);
> diff --git a/src/gallium/auxiliary/util/u_framebuffer.c b/src/gallium/auxiliary/util/u_framebuffer.c
> index 2e0ef74..f6162e3 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->cbufs == NULL) && (fb->zsbuf == NULL))
> + 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->cbufs == NULL) && (fb->zsbuf == NULL))
fb->cbufs will never be null - it's an array. I think you want
fb->nr_cbufs==0 here.
-ilia
More information about the mesa-dev
mailing list