From 0b7075fed75585087fa54b537fa9866bce2fcbee Mon Sep 17 00:00:00 2001 From: Edward O'Callaghan Date: Sun, 3 Jan 2016 01:44:55 +1100 Subject: gallium: Put no.of {samples,layers} into pipe_framebuffer_state MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. V4: Squash in the following patch: 'gallium/util: Ensure util_framebuffer_get_num_samples() is valid' Upon context creation, internal driver structures are malloc()'ed and memset() to zero them. This results in a invalid number of samples 'by default'. Handle this in the simplest way to avoid elaborate and probably equally sub-optimial solutions. Signed-off-by: Edward O'Callaghan Reviewed-by: Marek Olšák --- src/gallium/auxiliary/util/u_framebuffer.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'src/gallium/auxiliary/util/u_framebuffer.c') diff --git a/src/gallium/auxiliary/util/u_framebuffer.c b/src/gallium/auxiliary/util/u_framebuffer.c index 49b391d8162..f9b804673dc 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; + if (dst->nr_cbufs != src->nr_cbufs) { 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,20 @@ 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. + * + * NOTE: fb->samples may wind up as zero due to memset()'s on internal + * driver structures on their initialization and so we take the + * MAX here to ensure we have a valid number of samples. However, + * if samples is legitimately not getting set somewhere + * multi-sampling will evidently break. + */ + if (!(fb->nr_cbufs || fb->zsbuf)) + return MAX2(fb->samples, 1); + for (i = 0; i < fb->nr_cbufs; i++) { if (fb->cbufs[i]) { return MAX2(1, fb->cbufs[i]->texture->nr_samples); -- cgit v1.2.3