Mesa (master): vc4: Always unref the current job surfaces at job reset time.

Eric Anholt anholt at kemper.freedesktop.org
Wed Sep 14 05:26:03 UTC 2016


Module: Mesa
Branch: master
Commit: c31a7f529fadc016786eedc35ce65802a915ce09
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=c31a7f529fadc016786eedc35ce65802a915ce09

Author: Eric Anholt <eric at anholt.net>
Date:   Wed Sep  7 12:40:39 2016 -0700

vc4: Always unref the current job surfaces at job reset time.

Drops some tricky logic in vc4_flush() trying to update the pointers, and
fixes a broken lack of unref for MSAA surfaces at context destroy time.

---

 src/gallium/drivers/vc4/vc4_blit.c    | 13 ++++--------
 src/gallium/drivers/vc4/vc4_context.c | 37 ++++++++++-------------------------
 src/gallium/drivers/vc4/vc4_job.c     |  7 +++++++
 3 files changed, 21 insertions(+), 36 deletions(-)

diff --git a/src/gallium/drivers/vc4/vc4_blit.c b/src/gallium/drivers/vc4/vc4_blit.c
index c373544..ee08ab8 100644
--- a/src/gallium/drivers/vc4/vc4_blit.c
+++ b/src/gallium/drivers/vc4/vc4_blit.c
@@ -132,15 +132,10 @@ vc4_tile_blit(struct pipe_context *pctx, const struct pipe_blit_info *info)
                 vc4_get_blit_surface(pctx, info->src.resource, info->src.level);
 
         pipe_surface_reference(&vc4->color_read, src_surf);
-        pipe_surface_reference(&vc4->color_write,
-                               dst_surf->texture->nr_samples > 1 ?
-                               NULL : dst_surf);
-        pipe_surface_reference(&vc4->msaa_color_write,
-                               dst_surf->texture->nr_samples > 1 ?
-                               dst_surf : NULL);
-        pipe_surface_reference(&vc4->zs_read, NULL);
-        pipe_surface_reference(&vc4->zs_write, NULL);
-        pipe_surface_reference(&vc4->msaa_zs_write, NULL);
+        if (dst_surf->texture->nr_samples > 1)
+                pipe_surface_reference(&vc4->color_write, dst_surf);
+        else
+                pipe_surface_reference(&vc4->msaa_color_write, dst_surf);
 
         vc4->draw_min_x = info->dst.box.x;
         vc4->draw_min_y = info->dst.box.y;
diff --git a/src/gallium/drivers/vc4/vc4_context.c b/src/gallium/drivers/vc4/vc4_context.c
index e7f63d6..6f50b97 100644
--- a/src/gallium/drivers/vc4/vc4_context.c
+++ b/src/gallium/drivers/vc4/vc4_context.c
@@ -45,43 +45,29 @@ vc4_flush(struct pipe_context *pctx)
         struct pipe_surface *zsbuf = vc4->framebuffer.zsbuf;
 
         if (cbuf && (vc4->resolve & PIPE_CLEAR_COLOR0)) {
-                pipe_surface_reference(&vc4->color_write,
-                                       cbuf->texture->nr_samples > 1 ?
-                                       NULL : cbuf);
-                pipe_surface_reference(&vc4->msaa_color_write,
-                                       cbuf->texture->nr_samples > 1 ?
-                                       cbuf : NULL);
+                if (cbuf->texture->nr_samples > 1) {
+                        pipe_surface_reference(&vc4->msaa_color_write, cbuf);
+                } else {
+                        pipe_surface_reference(&vc4->color_write, cbuf);
+                }
 
                 if (!(vc4->cleared & PIPE_CLEAR_COLOR0)) {
                         pipe_surface_reference(&vc4->color_read, cbuf);
-                } else {
-                        pipe_surface_reference(&vc4->color_read, NULL);
                 }
 
-        } else {
-                pipe_surface_reference(&vc4->color_write, NULL);
-                pipe_surface_reference(&vc4->color_read, NULL);
-                pipe_surface_reference(&vc4->msaa_color_write, NULL);
         }
 
         if (vc4->framebuffer.zsbuf &&
             (vc4->resolve & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL))) {
-                pipe_surface_reference(&vc4->zs_write,
-                                       zsbuf->texture->nr_samples > 1 ?
-                                       NULL : zsbuf);
-                pipe_surface_reference(&vc4->msaa_zs_write,
-                                       zsbuf->texture->nr_samples > 1 ?
-                                       zsbuf : NULL);
+                if (zsbuf->texture->nr_samples > 1) {
+                        pipe_surface_reference(&vc4->msaa_zs_write, zsbuf);
+                } else {
+                        pipe_surface_reference(&vc4->zs_write, zsbuf);
+                }
 
                 if (!(vc4->cleared & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL))) {
                         pipe_surface_reference(&vc4->zs_read, zsbuf);
-                } else {
-                        pipe_surface_reference(&vc4->zs_read, NULL);
                 }
-        } else {
-                pipe_surface_reference(&vc4->zs_write, NULL);
-                pipe_surface_reference(&vc4->zs_read, NULL);
-                pipe_surface_reference(&vc4->msaa_zs_write, NULL);
         }
 
         vc4_job_submit(vc4);
@@ -182,9 +168,6 @@ vc4_context_destroy(struct pipe_context *pctx)
         pipe_surface_reference(&vc4->framebuffer.cbufs[0], NULL);
         pipe_surface_reference(&vc4->framebuffer.zsbuf, NULL);
 
-        pipe_surface_reference(&vc4->color_write, NULL);
-        pipe_surface_reference(&vc4->color_read, NULL);
-
         vc4_program_fini(pctx);
 
         ralloc_free(vc4);
diff --git a/src/gallium/drivers/vc4/vc4_job.c b/src/gallium/drivers/vc4/vc4_job.c
index e71f6f4..a957689 100644
--- a/src/gallium/drivers/vc4/vc4_job.c
+++ b/src/gallium/drivers/vc4/vc4_job.c
@@ -70,6 +70,13 @@ vc4_job_reset(struct vc4_context *vc4)
         vc4->draw_min_y = ~0;
         vc4->draw_max_x = 0;
         vc4->draw_max_y = 0;
+
+        pipe_surface_reference(&vc4->color_write, NULL);
+        pipe_surface_reference(&vc4->color_read, NULL);
+        pipe_surface_reference(&vc4->msaa_color_write, NULL);
+        pipe_surface_reference(&vc4->zs_write, NULL);
+        pipe_surface_reference(&vc4->zs_read, NULL);
+        pipe_surface_reference(&vc4->msaa_zs_write, NULL);
 }
 
 static void




More information about the mesa-commit mailing list