Browse Source

st/xorg: flush after loading the cursor

We need cursor data to land in destination buffer before drmModeSetCursor.
It fixes "cursor lag" on nv50.
tags/mesa-7.11-rc1
Marcin Slusarz 14 years ago
parent
commit
a8bbce8d6d
1 changed files with 15 additions and 7 deletions
  1. 15
    7
      src/gallium/state_trackers/xorg/xorg_crtc.c

+ 15
- 7
src/gallium/state_trackers/xorg/xorg_crtc.c View 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,

Loading…
Cancel
Save