From 258f433fffa67710d6424d3703528294133ada65 Mon Sep 17 00:00:00 2001 From: Keith Whitwell Date: Thu, 27 May 2010 15:48:38 +0100 Subject: util: add util_framebuffer_min_size --- src/gallium/auxiliary/util/u_framebuffer.c | 35 ++++++++++++++++++++++++++++++ src/gallium/auxiliary/util/u_framebuffer.h | 5 +++++ 2 files changed, 40 insertions(+) (limited to 'src/gallium') diff --git a/src/gallium/auxiliary/util/u_framebuffer.c b/src/gallium/auxiliary/util/u_framebuffer.c index bdac12dbca2..768ae9ceb5d 100644 --- a/src/gallium/auxiliary/util/u_framebuffer.c +++ b/src/gallium/auxiliary/util/u_framebuffer.c @@ -109,3 +109,38 @@ util_unreference_framebuffer_state(struct pipe_framebuffer_state *fb) fb->width = fb->height = 0; fb->nr_cbufs = 0; } + + +/* Where multiple sizes are allowed for framebuffer surfaces, find the + * minimum width and height of all bound surfaces. + */ +boolean +util_framebuffer_min_size(const struct pipe_framebuffer_state *fb, + unsigned *width, + unsigned *height) +{ + unsigned w = ~0; + unsigned h = ~0; + unsigned i; + + for (i = 0; i < fb->nr_cbufs; i++) { + w = MIN2(w, fb->cbufs[i]->width); + h = MIN2(h, fb->cbufs[i]->height); + } + + if (fb->zsbuf) { + w = MIN2(w, fb->zsbuf->width); + h = MIN2(h, fb->zsbuf->height); + } + + if (w == ~0) { + *width = 0; + *height = 0; + return FALSE; + } + else { + *width = w; + *height = h; + return TRUE; + } +} diff --git a/src/gallium/auxiliary/util/u_framebuffer.h b/src/gallium/auxiliary/util/u_framebuffer.h index adf1254e1b6..e7dc1e9e41d 100644 --- a/src/gallium/auxiliary/util/u_framebuffer.h +++ b/src/gallium/auxiliary/util/u_framebuffer.h @@ -46,4 +46,9 @@ extern void util_unreference_framebuffer_state(struct pipe_framebuffer_state *fb); +extern boolean +util_framebuffer_min_size(const struct pipe_framebuffer_state *fb, + unsigned *width, + unsigned *height); + #endif /* U_FRAMEBUFFER_H */ -- cgit v1.2.3