st/xorg: flush after loading the cursor
authorMarcin Slusarz <marcin.slusarz@gmail.com>
Tue, 3 May 2011 09:45:01 +0000 (11:45 +0200)
committerMichel Dänzer <daenzer@vmware.com>
Tue, 3 May 2011 14:36:54 +0000 (16:36 +0200)
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

index d751ac1..40b8434 100644 (file)
@@ -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,