[Mesa-dev] [PATCH v5 1/2] i965: Return the last fence if the batch buffer is empty

yogesh.marathe at intel.com yogesh.marathe at intel.com
Wed Aug 2 19:01:04 UTC 2017


From: Zhongmin Wu <zhongmin.wu at intel.com>

Always save the last fence in the brw context when flushing
buffer. If there is nothing to be flushed, return the last
fence if asked for. Nothing to be flushed when
 _intel_batchbuffer_flush_fence.

Signed-off-by: Zhongmin Wu <zhongmin.wu at intel.com>
Signed-off-by: Yogesh Marathe <yogesh.marathe at intel.com>
---
 src/mesa/drivers/dri/i965/brw_context.c       |  5 +++++
 src/mesa/drivers/dri/i965/brw_context.h       |  1 +
 src/mesa/drivers/dri/i965/intel_batchbuffer.c | 16 ++++++++++++++--
 3 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c
index d0b22d4..869287d 100644
--- a/src/mesa/drivers/dri/i965/brw_context.c
+++ b/src/mesa/drivers/dri/i965/brw_context.c
@@ -984,6 +984,8 @@ brwCreateContext(gl_api api,
    ctx->VertexProgram._MaintainTnlProgram = true;
    ctx->FragmentProgram._MaintainTexEnvProgram = true;
 
+   brw->out_fence_fd = -1;
+
    brw_draw_init( brw );
 
    if ((flags & __DRI_CTX_FLAG_DEBUG) != 0) {
@@ -1067,6 +1069,9 @@ intelDestroyContext(__DRIcontext * driContextPriv)
    brw->throttle_batch[1] = NULL;
    brw->throttle_batch[0] = NULL;
 
+   if (brw->out_fence_fd >= 0)
+      close(brw->out_fence_fd);
+
    driDestroyOptionCache(&brw->optionCache);
 
    /* free the Mesa context */
diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
index a4a04da..1fea5d8 100644
--- a/src/mesa/drivers/dri/i965/brw_context.h
+++ b/src/mesa/drivers/dri/i965/brw_context.h
@@ -1235,6 +1235,7 @@ struct brw_context
 
    __DRIcontext *driContext;
    struct intel_screen *screen;
+   int out_fence_fd;
 };
 
 /* brw_clear.c */
diff --git a/src/mesa/drivers/dri/i965/intel_batchbuffer.c b/src/mesa/drivers/dri/i965/intel_batchbuffer.c
index e2f208a..e779bd1 100644
--- a/src/mesa/drivers/dri/i965/intel_batchbuffer.c
+++ b/src/mesa/drivers/dri/i965/intel_batchbuffer.c
@@ -642,9 +642,18 @@ do_flush_locked(struct brw_context *brw, int in_fence_fd, int *out_fence_fd)
          /* Add the batch itself to the end of the validation list */
          add_exec_bo(batch, batch->bo);
 
+         if (brw->out_fence_fd >= 0) {
+            close(brw->out_fence_fd);
+            brw->out_fence_fd = -1;
+         }
+
+         int fd = -1;
          ret = execbuffer(dri_screen->fd, batch, hw_ctx,
                           4 * USED_BATCH(*batch),
-                          in_fence_fd, out_fence_fd, flags);
+                          in_fence_fd, &fd, flags);
+         brw->out_fence_fd = fd;
+         if (out_fence_fd)
+            *out_fence_fd = (fd >=0) ? dup(fd) : -1;
       }
 
       throttle(brw);
@@ -678,8 +687,11 @@ _intel_batchbuffer_flush_fence(struct brw_context *brw,
 {
    int ret;
 
-   if (USED_BATCH(brw->batch) == 0)
+   if (USED_BATCH(brw->batch) == 0) {
+      if (out_fence_fd && brw->out_fence_fd >= 0)
+         *out_fence_fd = dup(brw->out_fence_fd);
       return 0;
+   }
 
    if (brw->throttle_batch[0] == NULL) {
       brw->throttle_batch[0] = brw->batch.bo;
-- 
2.7.4



More information about the mesa-dev mailing list