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 <eocallag...@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); 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)) + 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 2e4d283..3954627 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@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev