From a00eec529562532031370b25f5941a916d5399ab Mon Sep 17 00:00:00 2001 From: Francisco Jerez Date: Fri, 22 Oct 2010 13:43:57 +0200 Subject: [PATCH] dri/nouveau: Force a "slow" Z clear if we're getting a new depth buffer. --- src/mesa/drivers/dri/nouveau/nouveau_context.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/mesa/drivers/dri/nouveau/nouveau_context.c b/src/mesa/drivers/dri/nouveau/nouveau_context.c index d3e2c0df6c4..0ace139b886 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_context.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_context.c @@ -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); -- 2.30.2