diff options
author | Ben Skeggs <skeggsb@gmail.com> | 2009-01-06 15:05:53 +1100 |
---|---|---|
committer | Ben Skeggs <skeggsb@gmail.com> | 2009-01-06 15:05:53 +1100 |
commit | 46ec60d8649f3df8d7c72b17ab36c7af182734fe (patch) | |
tree | 37050a868a8e59e32cdbcdb95dec5e7c5be068c3 | |
parent | 4cd822f344f07472c838a067ece5205c5aa73615 (diff) |
nv50: quick hack to get correct sw rendering on tiled pixmaps
-rw-r--r-- | src/nv_exa.c | 47 | ||||
-rw-r--r-- | src/nv_type.h | 1 |
2 files changed, 23 insertions, 25 deletions
diff --git a/src/nv_exa.c b/src/nv_exa.c index ee5a08e..0b6512c 100644 --- a/src/nv_exa.c +++ b/src/nv_exa.c @@ -372,10 +372,24 @@ NVExaPixmapMap(PixmapPtr pPix) if (!nvpix || !nvpix->bo) return NULL; + if (nvpix->bo->tiled) { + nvpix->untiled = xalloc(pPix->devKind * pPix->drawable.height); + + NVAccelDownloadM2MF(pPix, 0, 0, pPix->drawable.width, + pPix->drawable.height, nvpix->untiled, + pPix->devKind); + + nouveau_bo_map(nvpix->bo, NOUVEAU_BO_RDWR); + return nvpix->untiled; + } + nouveau_bo_map(nvpix->bo, NOUVEAU_BO_RDWR); return nvpix->bo->map; } +static inline Bool +NVAccelUploadM2MF(PixmapPtr pdpix, int x, int y, int w, int h, + const char *src, int src_pitch); static inline void NVExaPixmapUnmap(PixmapPtr pPix) { @@ -384,6 +398,12 @@ NVExaPixmapUnmap(PixmapPtr pPix) if (!nvpix || !nvpix->bo) return; + if (nvpix->untiled) { + NVAccelUploadM2MF(pPix, 0, 0, pPix->drawable.width, + pPix->drawable.height, nvpix->untiled, + pPix->devKind); + xfree(nvpix->untiled); + } nouveau_bo_unmap(nvpix->bo); } @@ -680,37 +700,14 @@ static Bool NVUploadToScreen(PixmapPtr pDst, static Bool NVExaPrepareAccess(PixmapPtr pPix, int index) { - ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum]; - NVPtr pNv = NVPTR(pScrn); - struct nouveau_pixmap *nvpix; - (void)pNv; - - nvpix = exaGetPixmapDriverPrivate(pPix); - if (!nvpix || !nvpix->bo) - return FALSE; - - if (!nvpix->bo->map) { - if (nouveau_bo_map(nvpix->bo, NOUVEAU_BO_RDWR)) - return FALSE; - } - - pPix->devPrivate.ptr = nvpix->bo->map; + pPix->devPrivate.ptr = NVExaPixmapMap(pPix); return TRUE; } static void NVExaFinishAccess(PixmapPtr pPix, int index) { - ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum]; - NVPtr pNv = NVPTR(pScrn); - struct nouveau_pixmap *nvpix; - (void)pNv; - - nvpix = exaGetPixmapDriverPrivate(pPix); - if (!nvpix || !nvpix->bo) - return; - - nouveau_bo_unmap(nvpix->bo); + NVExaPixmapUnmap(pPix); pPix->devPrivate.ptr = NULL; } diff --git a/src/nv_type.h b/src/nv_type.h index 0e6e890..b642a23 100644 --- a/src/nv_type.h +++ b/src/nv_type.h @@ -357,6 +357,7 @@ enum LVDS_script { struct nouveau_pixmap { struct nouveau_bo *bo; + void *untiled; int size; }; |