summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Skeggs <skeggsb@gmail.com>2009-01-06 15:05:53 +1100
committerBen Skeggs <skeggsb@gmail.com>2009-01-06 15:05:53 +1100
commit46ec60d8649f3df8d7c72b17ab36c7af182734fe (patch)
tree37050a868a8e59e32cdbcdb95dec5e7c5be068c3
parent4cd822f344f07472c838a067ece5205c5aa73615 (diff)
nv50: quick hack to get correct sw rendering on tiled pixmaps
-rw-r--r--src/nv_exa.c47
-rw-r--r--src/nv_type.h1
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;
};