OSDN Git Service

v3d: Only store buffers that have been written to.
authorEric Anholt <eric@anholt.net>
Mon, 23 Jul 2018 20:43:25 +0000 (13:43 -0700)
committerEric Anholt <eric@anholt.net>
Thu, 26 Jul 2018 18:02:25 +0000 (11:02 -0700)
I've seen cases where a color buffer is bound, but only Z is written, and
we end up storing color.

src/gallium/drivers/v3d/v3dx_draw.c

index e952038..e64f2c3 100644 (file)
@@ -578,7 +578,8 @@ v3d_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info)
                 v3d_job_add_bo(job, rsc->bo);
 
                 job->load |= PIPE_CLEAR_DEPTH & ~job->clear;
-                job->store |= PIPE_CLEAR_DEPTH;
+                if (v3d->zsa->base.depth.writemask)
+                        job->store |= PIPE_CLEAR_DEPTH;
                 rsc->initialized_buffers = PIPE_CLEAR_DEPTH;
         }
 
@@ -590,19 +591,24 @@ v3d_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info)
                 v3d_job_add_bo(job, rsc->bo);
 
                 job->load |= PIPE_CLEAR_STENCIL & ~job->clear;
-                job->store |= PIPE_CLEAR_STENCIL;
+                if (v3d->zsa->base.stencil[0].writemask ||
+                    v3d->zsa->base.stencil[1].writemask) {
+                        job->store |= PIPE_CLEAR_STENCIL;
+                }
                 rsc->initialized_buffers |= PIPE_CLEAR_STENCIL;
         }
 
         for (int i = 0; i < VC5_MAX_DRAW_BUFFERS; i++) {
                 uint32_t bit = PIPE_CLEAR_COLOR0 << i;
+                int blend_rt = v3d->blend->base.independent_blend_enable ? i : 0;
 
                 if (job->store & bit || !job->cbufs[i])
                         continue;
                 struct v3d_resource *rsc = v3d_resource(job->cbufs[i]->texture);
 
                 job->load |= bit & ~job->clear;
-                job->store |= bit;
+                if (v3d->blend->base.rt[blend_rt].colormask)
+                        job->store |= bit;
                 v3d_job_add_bo(job, rsc->bo);
         }