From 6ad053788e804f3a8bd36ee3653ec95e7df62623 Mon Sep 17 00:00:00 2001 From: Mario Kleiner Date: Wed, 6 Aug 2014 07:37:32 +0200 Subject: dri2 and xv: Fix NVxxSyncToVBlank() for multi-x-screen's. Use helper function drmmode_head() to choose proper hw-crtc to sync to. Fixes xv blits, and dri2 Copy-Swaps. Signed-off-by: Mario Kleiner Signed-off-by: Ben Skeggs --- src/nv50_accel.c | 6 +++++- src/nv_accel_common.c | 6 +++++- src/nvc0_accel.c | 6 +++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/nv50_accel.c b/src/nv50_accel.c index 16ff643..3d489d0 100644 --- a/src/nv50_accel.c +++ b/src/nv50_accel.c @@ -31,6 +31,7 @@ void NV50SyncToVBlank(PixmapPtr ppix, BoxPtr box) { ScrnInfoPtr pScrn = xf86ScreenToScrn(ppix->drawable.pScreen); + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); NVPtr pNv = NVPTR(pScrn); struct nouveau_pushbuf *push = pNv->pushbuf; int crtcs; @@ -47,6 +48,9 @@ NV50SyncToVBlank(PixmapPtr ppix, BoxPtr box) if (!PUSH_SPACE(push, 10)) return; + crtcs = ffs(crtcs) - 1; + crtcs = drmmode_head(config->crtc[crtcs]); + BEGIN_NV04(push, SUBC_NVSW(0x0060), 2); PUSH_DATA (push, pNv->vblank_sem->handle); PUSH_DATA (push, 0); @@ -54,7 +58,7 @@ NV50SyncToVBlank(PixmapPtr ppix, BoxPtr box) PUSH_DATA (push, 0x22222222); BEGIN_NV04(push, SUBC_NVSW(0x0404), 2); PUSH_DATA (push, 0x11111111); - PUSH_DATA (push, ffs(crtcs) - 1); + PUSH_DATA (push, crtcs); BEGIN_NV04(push, SUBC_NVSW(0x0068), 1); PUSH_DATA (push, 0x11111111); } diff --git a/src/nv_accel_common.c b/src/nv_accel_common.c index 579d20d..bd9dc8a 100644 --- a/src/nv_accel_common.c +++ b/src/nv_accel_common.c @@ -133,6 +133,7 @@ void NV11SyncToVBlank(PixmapPtr ppix, BoxPtr box) { ScrnInfoPtr pScrn = xf86ScreenToScrn(ppix->drawable.pScreen); + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); NVPtr pNv = NVPTR(pScrn); struct nouveau_pushbuf *push = pNv->pushbuf; int crtcs; @@ -149,10 +150,13 @@ NV11SyncToVBlank(PixmapPtr ppix, BoxPtr box) if (!PUSH_SPACE(push, 8)) return; + crtcs = ffs(crtcs) - 1; + crtcs = drmmode_head(config->crtc[crtcs]); + BEGIN_NV04(push, SUBC_BLIT(0x0000012C), 1); PUSH_DATA (push, 0); BEGIN_NV04(push, SUBC_BLIT(0x00000134), 1); - PUSH_DATA (push, ffs(crtcs) - 1); + PUSH_DATA (push, crtcs); BEGIN_NV04(push, SUBC_BLIT(0x00000100), 1); PUSH_DATA (push, 0); BEGIN_NV04(push, SUBC_BLIT(0x00000130), 1); diff --git a/src/nvc0_accel.c b/src/nvc0_accel.c index f76cbfa..375ccc8 100644 --- a/src/nvc0_accel.c +++ b/src/nvc0_accel.c @@ -63,6 +63,7 @@ void NVC0SyncToVBlank(PixmapPtr ppix, BoxPtr box) { ScrnInfoPtr pScrn = xf86ScreenToScrn(ppix->drawable.pScreen); + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); NVPtr pNv = NVPTR(pScrn); struct nouveau_pushbuf *push = pNv->pushbuf; int crtcs; @@ -79,6 +80,9 @@ NVC0SyncToVBlank(PixmapPtr ppix, BoxPtr box) if (!PUSH_SPACE(push, 32)) return; + crtcs = ffs(crtcs) - 1; + crtcs = drmmode_head(config->crtc[crtcs]); + BEGIN_NVC0(push, NV01_SUBC(NVSW, OBJECT), 1); PUSH_DATA (push, pNv->NvSW->handle); BEGIN_NVC0(push, NV84_SUBC(NVSW, SEMAPHORE_ADDRESS_HIGH), 4); @@ -90,7 +94,7 @@ NVC0SyncToVBlank(PixmapPtr ppix, BoxPtr box) PUSH_DATA (push, (pNv->scratch->offset + SEMA_OFFSET) >> 32); PUSH_DATA (push, (pNv->scratch->offset + SEMA_OFFSET)); PUSH_DATA (push, 0x11111111); - PUSH_DATA (push, ffs(crtcs) - 1); + PUSH_DATA (push, crtcs); BEGIN_NVC0(push, NV84_SUBC(NVSW, SEMAPHORE_ADDRESS_HIGH), 4); PUSH_DATA (push, (pNv->scratch->offset + SEMA_OFFSET) >> 32); PUSH_DATA (push, (pNv->scratch->offset + SEMA_OFFSET)); -- cgit v1.2.3