dri/nouveau: Force a "slow" Z clear if we're getting a new depth buffer.
authorFrancisco Jerez <currojerez@riseup.net>
Fri, 22 Oct 2010 11:43:57 +0000 (13:43 +0200)
committerFrancisco Jerez <currojerez@riseup.net>
Fri, 22 Oct 2010 11:43:57 +0000 (13:43 +0200)
src/mesa/drivers/dri/nouveau/nouveau_context.c

index d3e2c0df6c48345578c35fa0b338404856db3f77..0ace139b886bbbc9c6287b40218cef5d8cf1f2b9 100644 (file)
@@ -180,6 +180,7 @@ void
 nouveau_update_renderbuffers(__DRIcontext *dri_ctx, __DRIdrawable *draw)
 {
        struct gl_context *ctx = dri_ctx->driverPrivate;
+       struct nouveau_context *nctx = to_nouveau_context(ctx);
        __DRIscreen *screen = dri_ctx->driScreenPriv;
        struct gl_framebuffer *fb = draw->driverPrivate;
        struct nouveau_framebuffer *nfb = to_nouveau_framebuffer(fb);
@@ -211,6 +212,7 @@ nouveau_update_renderbuffers(__DRIcontext *dri_ctx, __DRIdrawable *draw)
        for (i = 0; i < count; i++) {
                struct gl_renderbuffer *rb;
                struct nouveau_surface *s;
+               uint32_t old_name;
                int index;
 
                switch (buffers[i].attachment) {
@@ -240,6 +242,16 @@ nouveau_update_renderbuffers(__DRIcontext *dri_ctx, __DRIdrawable *draw)
                s->pitch = buffers[i].pitch;
                s->cpp = buffers[i].cpp;
 
+               if (index == BUFFER_DEPTH && s->bo) {
+                       ret = nouveau_bo_handle_get(s->bo, &old_name);
+                       /*
+                        * Disable fast Z clears in the next frame, the
+                        * depth buffer contents are undefined.
+                        */
+                       if (!ret && old_name != buffers[i].name)
+                               nctx->hierz.clear_seq = 0;
+               }
+
                nouveau_bo_ref(NULL, &s->bo);
                ret = nouveau_bo_handle_ref(context_dev(ctx),
                                            buffers[i].name, &s->bo);