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