Mesa (master): st/xorg: flush after loading the cursor

Michel Dänzer daenzer at kemper.freedesktop.org
Tue May 3 14:41:00 UTC 2011


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

Author: Marcin Slusarz <marcin.slusarz at gmail.com>
Date:   Tue May  3 11:45:01 2011 +0200

st/xorg: flush after loading the cursor

We need cursor data to land in destination buffer before drmModeSetCursor.
It fixes "cursor lag" on nv50.

---

 src/gallium/state_trackers/xorg/xorg_crtc.c |   22 +++++++++++++++-------
 1 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/src/gallium/state_trackers/xorg/xorg_crtc.c b/src/gallium/state_trackers/xorg/xorg_crtc.c
index d751ac1..40b8434 100644
--- a/src/gallium/state_trackers/xorg/xorg_crtc.c
+++ b/src/gallium/state_trackers/xorg/xorg_crtc.c
@@ -210,6 +210,9 @@ crtc_load_cursor_argb_ga3d(xf86CrtcPtr crtc, CARD32 * image)
     modesettingPtr ms = modesettingPTR(crtc->scrn);
     struct crtc_private *crtcp = crtc->driver_private;
     struct pipe_transfer *transfer;
+    struct pipe_fence_handle *fence = NULL;
+    struct pipe_context *ctx = ms->ctx;
+    struct pipe_screen *screen = ms->screen;
 
     if (!crtcp->cursor_tex) {
 	struct pipe_resource templat;
@@ -229,23 +232,28 @@ crtc_load_cursor_argb_ga3d(xf86CrtcPtr crtc, CARD32 * image)
 	memset(&whandle, 0, sizeof(whandle));
 	whandle.type = DRM_API_HANDLE_TYPE_KMS;
 
-	crtcp->cursor_tex = ms->screen->resource_create(ms->screen,
-						       &templat);
-	ms->screen->resource_get_handle(ms->screen, crtcp->cursor_tex, &whandle);
+	crtcp->cursor_tex = screen->resource_create(screen, &templat);
+	screen->resource_get_handle(screen, crtcp->cursor_tex, &whandle);
 
 	crtcp->cursor_handle = whandle.handle;
     }
 
-    transfer = pipe_get_transfer(ms->ctx, crtcp->cursor_tex,
+    transfer = pipe_get_transfer(ctx, crtcp->cursor_tex,
                                  0, 0,
                                  PIPE_TRANSFER_WRITE,
                                  0, 0, 64, 64);
-    ptr = ms->ctx->transfer_map(ms->ctx, transfer);
+    ptr = ctx->transfer_map(ctx, transfer);
     util_copy_rect(ptr, crtcp->cursor_tex->format,
 		   transfer->stride, 0, 0,
 		   64, 64, (void*)image, 64 * 4, 0, 0);
-    ms->ctx->transfer_unmap(ms->ctx, transfer);
-    ms->ctx->transfer_destroy(ms->ctx, transfer);
+    ctx->transfer_unmap(ctx, transfer);
+    ctx->transfer_destroy(ctx, transfer);
+    ctx->flush(ctx, &fence);
+
+    if (fence) {
+	screen->fence_finish(screen, fence, PIPE_TIMEOUT_INFINITE);
+	screen->fence_reference(screen, &fence, NULL);
+    }
 
     if (crtc->cursor_shown)
 	drmModeSetCursor(ms->fd, crtcp->drm_crtc->crtc_id,




More information about the mesa-commit mailing list