Mesa (master): vc4: Refactor flushing before mapping a BO.

Eric Anholt anholt at kemper.freedesktop.org
Fri Oct 24 17:08:59 UTC 2014


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

Author: Eric Anholt <eric at anholt.net>
Date:   Fri Oct 24 16:45:04 2014 +0100

vc4: Refactor flushing before mapping a BO.

I'm going to want to make some other decisions here before flushing.

---

 src/gallium/drivers/vc4/vc4_context.c  |   17 ++++++++---------
 src/gallium/drivers/vc4/vc4_context.h  |    2 +-
 src/gallium/drivers/vc4/vc4_resource.c |    6 ++++--
 3 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/src/gallium/drivers/vc4/vc4_context.c b/src/gallium/drivers/vc4/vc4_context.c
index 87f0251..b1f0f35 100644
--- a/src/gallium/drivers/vc4/vc4_context.c
+++ b/src/gallium/drivers/vc4/vc4_context.c
@@ -350,13 +350,13 @@ vc4_pipe_flush(struct pipe_context *pctx, struct pipe_fence_handle **fence,
  *
  * This helps avoid flushing the command buffers when unnecessary.
  */
-void
-vc4_flush_for_bo(struct pipe_context *pctx, struct vc4_bo *bo)
+bool
+vc4_cl_references_bo(struct pipe_context *pctx, struct vc4_bo *bo)
 {
         struct vc4_context *vc4 = vc4_context(pctx);
 
         if (!vc4->needs_flush)
-                return;
+                return false;
 
         /* Walk all the referenced BOs in the drawing command list to see if
          * they match.
@@ -365,8 +365,7 @@ vc4_flush_for_bo(struct pipe_context *pctx, struct vc4_bo *bo)
         for (int i = 0; i < (vc4->bo_handles.next -
                              vc4->bo_handles.base) / 4; i++) {
                 if (referenced_bos[i] == bo) {
-                        vc4_flush(pctx);
-                        return;
+                        return true;
                 }
         }
 
@@ -377,8 +376,7 @@ vc4_flush_for_bo(struct pipe_context *pctx, struct vc4_bo *bo)
         if (csurf) {
                 struct vc4_resource *ctex = vc4_resource(csurf->base.texture);
                 if (ctex->bo == bo) {
-                        vc4_flush(pctx);
-                        return;
+                        return true;
                 }
         }
 
@@ -387,10 +385,11 @@ vc4_flush_for_bo(struct pipe_context *pctx, struct vc4_bo *bo)
                 struct vc4_resource *ztex =
                         vc4_resource(zsurf->base.texture);
                 if (ztex->bo == bo) {
-                        vc4_flush(pctx);
-                        return;
+                        return true;
                 }
         }
+
+        return false;
 }
 
 static void
diff --git a/src/gallium/drivers/vc4/vc4_context.h b/src/gallium/drivers/vc4/vc4_context.h
index d0b280a..9eaff8f 100644
--- a/src/gallium/drivers/vc4/vc4_context.h
+++ b/src/gallium/drivers/vc4/vc4_context.h
@@ -278,7 +278,7 @@ void vc4_write_uniforms(struct vc4_context *vc4,
                         struct vc4_texture_stateobj *texstate);
 
 void vc4_flush(struct pipe_context *pctx);
-void vc4_flush_for_bo(struct pipe_context *pctx, struct vc4_bo *bo);
+bool vc4_cl_references_bo(struct pipe_context *pctx, struct vc4_bo *bo);
 void vc4_emit_state(struct pipe_context *pctx);
 void vc4_generate_code(struct vc4_context *vc4, struct vc4_compile *c);
 struct qpu_reg *vc4_register_allocate(struct vc4_context *vc4, struct vc4_compile *c);
diff --git a/src/gallium/drivers/vc4/vc4_resource.c b/src/gallium/drivers/vc4/vc4_resource.c
index c198ab9..62667bf 100644
--- a/src/gallium/drivers/vc4/vc4_resource.c
+++ b/src/gallium/drivers/vc4/vc4_resource.c
@@ -80,8 +80,10 @@ vc4_resource_transfer_map(struct pipe_context *pctx,
                 rsc->bo = vc4_bo_alloc(vc4->screen, size, "resource");
         }
 
-        if (!(usage & PIPE_TRANSFER_UNSYNCHRONIZED))
-                vc4_flush_for_bo(pctx, rsc->bo);
+        if (!(usage & PIPE_TRANSFER_UNSYNCHRONIZED)) {
+                if (vc4_cl_references_bo(pctx, rsc->bo))
+                        vc4_flush(pctx);
+        }
 
         if (usage & PIPE_TRANSFER_WRITE)
                 rsc->writes++;




More information about the mesa-commit mailing list