util/u_format: add _is_alpha()
[mesa.git] / src / gallium / auxiliary / util / u_framebuffer.c
index f84485d1f1c66a20cafa83dc7fe4d4f33b542371..2e0ef749e820603fc5635707076ddc4b9afe9760 100644 (file)
@@ -127,6 +127,9 @@ util_framebuffer_min_size(const struct pipe_framebuffer_state *fb,
    unsigned i;
 
    for (i = 0; i < fb->nr_cbufs; i++) {
+      if (!fb->cbufs[i])
+         continue;
+
       w = MIN2(w, fb->cbufs[i]->width);
       h = MIN2(h, fb->cbufs[i]->height);
    }
@@ -147,3 +150,48 @@ util_framebuffer_min_size(const struct pipe_framebuffer_state *fb,
       return TRUE;
    }
 }
+
+
+/**
+ * Return the number of layers set in the framebuffer state.
+ */
+unsigned
+util_framebuffer_get_num_layers(const struct pipe_framebuffer_state *fb)
+{
+       unsigned i, num_layers = 0;
+
+       for (i = 0; i < fb->nr_cbufs; i++) {
+               if (fb->cbufs[i]) {
+                       unsigned num = fb->cbufs[i]->u.tex.last_layer -
+                                      fb->cbufs[i]->u.tex.first_layer + 1;
+                       num_layers = MAX2(num_layers, num);
+               }
+       }
+       if (fb->zsbuf) {
+               unsigned num = fb->zsbuf->u.tex.last_layer -
+                              fb->zsbuf->u.tex.first_layer + 1;
+               num_layers = MAX2(num_layers, num);
+       }
+       return num_layers;
+}
+
+
+/**
+ * Return the number of MSAA samples.
+ */
+unsigned
+util_framebuffer_get_num_samples(const struct pipe_framebuffer_state *fb)
+{
+   unsigned i;
+
+   for (i = 0; i < fb->nr_cbufs; i++) {
+      if (fb->cbufs[i]) {
+         return MAX2(1, fb->cbufs[i]->texture->nr_samples);
+      }
+   }
+   if (fb->zsbuf) {
+      return MAX2(1, fb->zsbuf->texture->nr_samples);
+   }
+
+   return 1;
+}