summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMario Kleiner <mario.kleiner.de@gmail.com>2014-08-06 07:37:32 +0200
committerBen Skeggs <bskeggs@redhat.com>2014-08-17 07:34:20 +1000
commit6ad053788e804f3a8bd36ee3653ec95e7df62623 (patch)
tree23a1d2368627dfda21d73f355b57be3b3e3dc268
parent17de663a71bcad6f69414eb6bc6bf9b76a6bf5f4 (diff)
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 <mario.kleiner.de@gmail.com> Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r--src/nv50_accel.c6
-rw-r--r--src/nv_accel_common.c6
-rw-r--r--src/nvc0_accel.c6
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));