Mesa (openchrome-branch): openchrome: Use deferred fencing.

Thomas Hellstrom thomash at kemper.freedesktop.org
Sun Mar 15 16:31:37 UTC 2009


Module: Mesa
Branch: openchrome-branch
Commit: b560216c5f212f46dbb4dbbf53798f9c10f60841
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=b560216c5f212f46dbb4dbbf53798f9c10f60841

Author: Thomas Hellstrom <thomas-at-shipmail-dot-org>
Date:   Sun Mar 15 17:30:22 2009 +0100

openchrome: Use deferred fencing.

Avoid submitting breadcrumb 2D blits to the command stream after each
3D flush.

Signed-off-by: Thomas Hellstrom <thomas-at-shipmail-dot-org>

---

 .../drivers/dri/openchrome/via_buffer_objects.c    |   12 +++++++++---
 src/mesa/drivers/dri/openchrome/via_context.c      |    2 ++
 src/mesa/drivers/dri/openchrome/via_context.h      |    1 +
 src/mesa/drivers/dri/openchrome/via_ioctl.c        |    6 +++++-
 src/mesa/drivers/dri/openchrome/via_span.c         |    1 +
 src/mesa/drivers/dri/openchrome/via_tex.c          |    6 ++++++
 6 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/src/mesa/drivers/dri/openchrome/via_buffer_objects.c b/src/mesa/drivers/dri/openchrome/via_buffer_objects.c
index d2f89ea..3c5161b 100644
--- a/src/mesa/drivers/dri/openchrome/via_buffer_objects.c
+++ b/src/mesa/drivers/dri/openchrome/via_buffer_objects.c
@@ -155,8 +155,10 @@ via_bufferobj_subdata(GLcontext * ctx,
 
     assert(via_obj);
 
-    if (wsbmBOOnList(via_obj->buffer))
+    if (wsbmBOOnList(via_obj->buffer)) {
+	vmesa->deferFence = GL_FALSE;
 	VIA_FLUSH_DMA(vmesa);
+    }
 
     ret = wsbmBOSubData(via_obj->buffer, offset, size, data, NULL);
     if (ret)
@@ -181,8 +183,10 @@ via_bufferobj_get_subdata(GLcontext * ctx,
 
     assert(via_obj);
 
-    if (wsbmBOOnList(via_obj->buffer))
+    if (wsbmBOOnList(via_obj->buffer)) {
+	vmesa->deferFence = GL_FALSE;
 	VIA_FLUSH_DMA(vmesa);
+    }
 
     ret = wsbmBOGetSubData(via_obj->buffer, offset, size, data);
     if (ret)
@@ -222,8 +226,10 @@ via_bufferobj_map(GLcontext * ctx,
 	break;
     }
 
-    if (wsbmBOOnList(via_obj->buffer))
+    if (wsbmBOOnList(via_obj->buffer)) {
+	vmesa->deferFence = GL_FALSE;
 	VIA_FLUSH_DMA(vmesa);
+    }
 
     ret = wsbmBOSyncForCpu(via_obj->buffer, flags);
 
diff --git a/src/mesa/drivers/dri/openchrome/via_context.c b/src/mesa/drivers/dri/openchrome/via_context.c
index a1cc993..81c2f0b 100644
--- a/src/mesa/drivers/dri/openchrome/via_context.c
+++ b/src/mesa/drivers/dri/openchrome/via_context.c
@@ -270,6 +270,8 @@ AllocateDmaBuffer(struct via_context *vmesa)
 
     vmesa->dmaLow = 0;
     vmesa->dmaCliprectAddr = ~0;
+    vmesa->deferFence = GL_TRUE;
+
     return GL_TRUE;
 }
 
diff --git a/src/mesa/drivers/dri/openchrome/via_context.h b/src/mesa/drivers/dri/openchrome/via_context.h
index f5083b0..f60df39 100644
--- a/src/mesa/drivers/dri/openchrome/via_context.h
+++ b/src/mesa/drivers/dri/openchrome/via_context.h
@@ -197,6 +197,7 @@ struct via_context
     GLuint dmaCliprectAddr;
     GLuint dmaLastPrim;
     GLboolean useAgp;
+    GLboolean deferFence;
 
     /* Fallback rasterization functions
      */
diff --git a/src/mesa/drivers/dri/openchrome/via_ioctl.c b/src/mesa/drivers/dri/openchrome/via_ioctl.c
index aeee35a..6aff6a7 100644
--- a/src/mesa/drivers/dri/openchrome/via_ioctl.c
+++ b/src/mesa/drivers/dri/openchrome/via_ioctl.c
@@ -568,6 +568,7 @@ viaDoSwapBuffers(struct via_context *vmesa,
 		src, back->pitch,
 		dest, front->pitch, 0, 0, w, h, VIA_BLIT_COPY, 0, 0);
     }
+    vmesa->deferFence = GL_FALSE;
     via_execbuf(vmesa, VIA_NO_CLIPRECTS);
 }
 
@@ -823,6 +824,7 @@ viaFinish(GLcontext * ctx)
 {
     struct via_context *vmesa = VIA_CONTEXT(ctx);
 
+    vmesa->deferFence = GL_FALSE;
     via_wait_context_idle(vmesa);
 }
 
@@ -1413,6 +1415,7 @@ via_drop_cmdbuf(struct via_context *vmesa)
     vmesa->dmaLow = 0;
     vmesa->dmaCliprectAddr = ~0;
     vmesa->lostState = 1;
+    vmesa->deferFence = GL_TRUE;
 
     wsbmBOUnrefUserList(vmesa->validate_list);
     (void)via_reset_reloc_buffer(vmesa->reloc_info);
@@ -1651,7 +1654,8 @@ via_execbuf(struct via_context *vmesa, GLuint fire_flags)
     arg.control = (uint64_t) (unsigned long)&control;
     arg.cmd_buffer_size = vmesa->dmaLow;
     arg.mechanism = _VIA_MECHANISM_AGP;
-    arg.exec_flags = exec_flags;
+    arg.exec_flags = exec_flags |
+      ((vmesa->deferFence) ? DRM_VIA_DEFER_FENCING : 0);
     arg.cliprect_offset = (vmesa->dmaCliprectAddr >> 2) + 4;
     arg.num_cliprects = num_clip;
     arg.cliprect_addr = (unsigned long)clip;
diff --git a/src/mesa/drivers/dri/openchrome/via_span.c b/src/mesa/drivers/dri/openchrome/via_span.c
index f61294a..6e57ff6 100644
--- a/src/mesa/drivers/dri/openchrome/via_span.c
+++ b/src/mesa/drivers/dri/openchrome/via_span.c
@@ -180,6 +180,7 @@ viaSpanRenderStart(GLcontext * ctx)
      * The wsbmBOMap() operations will wait for idle anyway.
      */
 
+    vmesa->deferFence = GL_FALSE;
     via_wait_context_idle(vmesa);
 
     if (vmesa->firstDrawAfterSwap) {
diff --git a/src/mesa/drivers/dri/openchrome/via_tex.c b/src/mesa/drivers/dri/openchrome/via_tex.c
index 4b7b0ec..d5f4e7f 100644
--- a/src/mesa/drivers/dri/openchrome/via_tex.c
+++ b/src/mesa/drivers/dri/openchrome/via_tex.c
@@ -585,6 +585,7 @@ viaTexImage(GLcontext * ctx,
     }
 
     if (wsbmBOOnList(viaImage->buf)) {
+	vmesa->deferFence = GL_FALSE;
 	VIA_FLUSH_DMA(vmesa);
     }
 
@@ -725,6 +726,7 @@ viaTexSubImage2D(GLcontext * ctx,
     }
 
     if (wsbmBOOnList(viaImage->buf)) {
+	vmesa->deferFence = GL_FALSE;
 	VIA_FLUSH_DMA(vmesa);
     }
 
@@ -772,6 +774,7 @@ viaTexSubImage1D(GLcontext * ctx,
 	containerOf(texImage, struct via_texture_image, image);
 
     if (wsbmBOOnList(viaImage->buf)) {
+	vmesa->deferFence = GL_FALSE;
 	VIA_FLUSH_DMA(vmesa);
     }
 
@@ -843,6 +846,7 @@ viaGetTexImage(GLcontext * ctx, GLenum target, GLint level,
 	containerOf(texImage, struct via_texture_image, image);
 
     if (wsbmBOOnList(viaImage->buf)) {
+	vmesa->deferFence = GL_FALSE;
 	VIA_FLUSH_DMA(vmesa);
     }
 
@@ -867,6 +871,7 @@ viaGetCompressedTexImage(GLcontext * ctx, GLenum target, GLint level,
 	containerOf(texImage, struct via_texture_image, image);
 
     if (wsbmBOOnList(viaImage->buf)) {
+	vmesa->deferFence = GL_FALSE;
 	VIA_FLUSH_DMA(vmesa);
     }
     wsbmBOWaitIdle(viaImage->buf, 0);
@@ -891,6 +896,7 @@ viaCompressedTexSubImage2D(GLcontext * ctx, GLenum target, GLint level,
 	containerOf(texImage, struct via_texture_image, image);
 
     if (wsbmBOOnList(viaImage->buf)) {
+	vmesa->deferFence = GL_FALSE;
 	VIA_FLUSH_DMA(vmesa);
     }
     wsbmBOWaitIdle(viaImage->buf, 0);




More information about the mesa-commit mailing list