diff options
Diffstat (limited to 'src/nouveau_exa.c')
-rw-r--r-- | src/nouveau_exa.c | 46 |
1 files changed, 41 insertions, 5 deletions
diff --git a/src/nouveau_exa.c b/src/nouveau_exa.c index 4e9f946..dc46d60 100644 --- a/src/nouveau_exa.c +++ b/src/nouveau_exa.c @@ -357,7 +357,7 @@ nv50_style_tiled_pixmap(PixmapPtr ppix) ScrnInfoPtr pScrn = xf86Screens[ppix->drawable.pScreen->myNum]; NVPtr pNv = NVPTR(pScrn); - return pNv->Architecture == NV_ARCH_50 && + return pNv->Architecture >= NV_ARCH_50 && (nouveau_pixmap_bo(ppix)->tile_flags & NOUVEAU_BO_TILE_LAYOUT_MASK); } @@ -378,8 +378,15 @@ nouveau_exa_download_from_screen(PixmapPtr pspix, int x, int y, int w, int h, offset = (y * src_pitch) + (x * cpp); if (pNv->GART) { - if (NVAccelDownloadM2MF(pspix, x, y, w, h, dst, dst_pitch)) - return TRUE; + if (pNv->Architecture >= NV_ARCH_C0) { + if (NVC0AccelDownloadM2MF(pspix, x, y, w, h, + dst, dst_pitch)) + return TRUE; + } else { + if (NVAccelDownloadM2MF(pspix, x, y, w, h, + dst, dst_pitch)) + return TRUE; + } } bo = nouveau_pixmap_bo(pspix); @@ -414,18 +421,28 @@ nouveau_exa_upload_to_screen(PixmapPtr pdpix, int x, int y, int w, int h, exaMarkSync(pdpix->drawable.pScreen); return TRUE; } - } else { + } else + if (pNv->Architecture < NV_ARCH_C0) { if (NV50EXAUploadSIFC(src, src_pitch, pdpix, x, y, w, h, cpp)) { exaMarkSync(pdpix->drawable.pScreen); return TRUE; } + } else { + if (NVC0EXAUploadSIFC(src, src_pitch, pdpix, + x, y, w, h, cpp)) { + exaMarkSync(pdpix->drawable.pScreen); + return TRUE; + } } } /* try gart-based transfer */ if (pNv->GART) { - if (NVAccelUploadM2MF(pdpix, x, y, w, h, src, src_pitch)) { + Bool ret = (pNv->Architecture >= NV_ARCH_C0) ? + NVC0AccelUploadM2MF(pdpix, x, y, w, h, src, src_pitch) : + NVAccelUploadM2MF(pdpix, x, y, w, h, src, src_pitch); + if (ret) { exaMarkSync(pdpix->drawable.pScreen); return TRUE; } @@ -465,6 +482,8 @@ nouveau_exa_init(ScreenPtr pScreen) return FALSE; } + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "nouveau EXA init\n"); + exa->exa_major = EXA_VERSION_MAJOR; exa->exa_minor = EXA_VERSION_MINOR; exa->flags = EXA_OFFSCREEN_PIXMAPS; @@ -546,12 +565,29 @@ nouveau_exa_init(ScreenPtr pScreen) exa->Composite = NV50EXAComposite; exa->DoneComposite = NV50EXADoneComposite; break; + case NV_ARCH_C0: + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "EXA func pointers for NVC0\n"); + exa->PrepareCopy = NVC0EXAPrepareCopy; + exa->Copy = NVC0EXACopy; + exa->DoneCopy = NVC0EXADoneCopy; + + exa->PrepareSolid = NVC0EXAPrepareSolid; + exa->Solid = NVC0EXASolid; + exa->DoneSolid = NVC0EXADoneSolid; + + exa->CheckComposite = NVC0EXACheckComposite; + exa->PrepareComposite = NVC0EXAPrepareComposite; + exa->Composite = NVC0EXAComposite; + exa->DoneComposite = NVC0EXADoneComposite; + break; default: break; } if (!exaDriverInit(pScreen, exa)) return FALSE; + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "exaDriverInit successful\n"); pNv->EXADriverPtr = exa; return TRUE; |