summaryrefslogtreecommitdiff
path: root/src/nouveau_exa.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nouveau_exa.c')
-rw-r--r--src/nouveau_exa.c46
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;