nvc0: don't forget to also clear additional layers
authorIlia Mirkin <imirkin@alum.mit.edu>
Sun, 12 Jan 2014 09:51:09 +0000 (04:51 -0500)
committerMaarten Lankhorst <maarten.lankhorst@canonical.com>
Mon, 27 Jan 2014 15:40:43 +0000 (16:40 +0100)
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/gallium/drivers/nouveau/nvc0/nvc0_surface.c

index 321c3664ed0938df8ff6dbc0ca51a7450a1170f0..32d234e345303c97208c8303dada31657fde21c3 100644 (file)
@@ -414,7 +414,7 @@ nvc0_clear(struct pipe_context *pipe, unsigned buffers,
    struct nvc0_context *nvc0 = nvc0_context(pipe);
    struct nouveau_pushbuf *push = nvc0->base.pushbuf;
    struct pipe_framebuffer_state *fb = &nvc0->framebuffer;
-   unsigned i;
+   unsigned i, j, k;
    uint32_t mode = 0;
 
    /* don't need NEW_BLEND, COLOR_MASK doesn't affect CLEAR_BUFFERS */
@@ -446,14 +446,36 @@ nvc0_clear(struct pipe_context *pipe, unsigned buffers,
    }
 
    if (mode) {
-      BEGIN_NVC0(push, NVC0_3D(CLEAR_BUFFERS), 1);
-      PUSH_DATA (push, mode);
+      int zs_layers = 0, color0_layers = 0;
+      if (fb->cbufs[0] && (mode & 0x3c))
+         color0_layers = fb->cbufs[0]->u.tex.last_layer -
+            fb->cbufs[0]->u.tex.first_layer + 1;
+      if (fb->zsbuf && (mode & ~0x3c))
+         zs_layers = fb->zsbuf->u.tex.last_layer -
+            fb->zsbuf->u.tex.first_layer + 1;
+
+      for (j = 0; j < MIN2(zs_layers, color0_layers); j++) {
+         BEGIN_NVC0(push, NVC0_3D(CLEAR_BUFFERS), 1);
+         PUSH_DATA(push, mode | (j << NVC0_3D_CLEAR_BUFFERS_LAYER__SHIFT));
+      }
+      for (k = j; k < zs_layers; k++) {
+         BEGIN_NVC0(push, NVC0_3D(CLEAR_BUFFERS), 1);
+         PUSH_DATA(push, (mode & ~0x3c) | (k << NVC0_3D_CLEAR_BUFFERS_LAYER__SHIFT));
+      }
+      for (k = j; k < color0_layers; k++) {
+         BEGIN_NVC0(push, NVC0_3D(CLEAR_BUFFERS), 1);
+         PUSH_DATA(push, (mode & 0x3c) | (k << NVC0_3D_CLEAR_BUFFERS_LAYER__SHIFT));
+      }
    }
 
    for (i = 1; i < fb->nr_cbufs; i++) {
-      if (buffers & (PIPE_CLEAR_COLOR0 << i)) {
+      struct pipe_surface *sf = fb->cbufs[i];
+      if (!sf || !(buffers & (PIPE_CLEAR_COLOR0 << i)))
+         continue;
+      for (j = 0; j <= sf->u.tex.last_layer - sf->u.tex.first_layer; j++) {
          BEGIN_NVC0(push, NVC0_3D(CLEAR_BUFFERS), 1);
-         PUSH_DATA (push, (i << 6) | 0x3c);
+         PUSH_DATA (push, (i << 6) | 0x3c |
+                    (j << NVC0_3D_CLEAR_BUFFERS_LAYER__SHIFT));
       }
    }
 }