summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann <ssp@redhat.com>2010-06-08 08:26:18 -0400
committerSøren Sandmann Pedersen <ssp@redhat.com>2010-09-14 06:36:52 -0400
commit1bc58f80e13d9246cd38ac36d5ef299c4b5b9d3b (patch)
tree576c28be6b1625e4c54600acea0ea432ed3a8f55
parenta222ec8a729d9e333b7e0873efa592ba3fcb7177 (diff)
Add prepare/finish access
-rw-r--r--src/qxl.h2
-rw-r--r--src/qxl_driver.c94
2 files changed, 66 insertions, 30 deletions
diff --git a/src/qxl.h b/src/qxl.h
index 100eeb3..0c36b36 100644
--- a/src/qxl.h
+++ b/src/qxl.h
@@ -593,6 +593,8 @@ struct _qxl_screen_t
void * fb;
int bytes_per_pixel;
+ struct qxl_mode * current_mode;
+
struct qxl_mem * mem; /* Context for qxl_alloc/free */
EntityInfoPtr entity;
diff --git a/src/qxl_driver.c b/src/qxl_driver.c
index c58e0f6..0692dd8 100644
--- a/src/qxl_driver.c
+++ b/src/qxl_driver.c
@@ -301,6 +301,28 @@ qxl_reset (qxl_screen_t *qxl)
}
+static void
+set_screen_pixmap_header (ScreenPtr pScreen)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ qxl_screen_t *qxl = pScrn->driverPrivate;
+ PixmapPtr pPixmap = pScreen->GetScreenPixmap(pScreen);
+
+ if (pPixmap && qxl->current_mode)
+ {
+ ErrorF ("new stride: %d (display width: %d, bpp: %d)\n", qxl->pScrn->displayWidth * qxl->bytes_per_pixel, qxl->pScrn->displayWidth, qxl->bytes_per_pixel);
+
+ pScreen->ModifyPixmapHeader(
+ pPixmap,
+ qxl->current_mode->x_res, qxl->current_mode->y_res,
+ -1, -1,
+ qxl->pScrn->displayWidth * qxl->bytes_per_pixel,
+ NULL);
+ }
+ else
+ ErrorF ("pix: %p; mode: %p\n", pPixmap, qxl->current_mode);
+}
+
static Bool
qxl_switch_mode(int scrnIndex, DisplayModePtr p, int flags)
{
@@ -339,17 +361,7 @@ qxl_switch_mode(int scrnIndex, DisplayModePtr p, int flags)
*/
if (pScreen)
{
- PixmapPtr pPixmap = pScreen->GetScreenPixmap(pScreen);
-
- if (pPixmap)
- {
- pScreen->ModifyPixmapHeader(
- pPixmap,
- m->x_res, m->y_res,
- -1, -1,
- qxl->pScrn->displayWidth * qxl->bytes_per_pixel,
- NULL);
- }
+ set_screen_pixmap_header (pScreen);
}
if (qxl->mem)
@@ -358,6 +370,7 @@ qxl_switch_mode(int scrnIndex, DisplayModePtr p, int flags)
qxl_drop_image_cache (qxl);
}
+ qxl->current_mode = m;
return TRUE;
}
@@ -687,8 +700,9 @@ qxl_create_screen_resources(ScreenPtr pScreen)
qxl->damage = DamageCreate (qxl_on_damage, NULL,
DamageReportRawRegion,
TRUE, pScreen, qxl);
+ pPixmap = pScreen->GetScreenPixmap (pScreen);
- pPixmap = pScreen->GetScreenPixmap(pScreen);
+ set_screen_pixmap_header (pScreen);
if (!RegisterBlockAndWakeupHandlers(qxl_block_handler, qxl_wakeup_handler, qxl))
return FALSE;
@@ -1005,11 +1019,13 @@ qxl_prepare_access(PixmapPtr pixmap, uxa_access_t access)
uint8_t *copy;
int w, h, stride;
- ErrorF ("preparing access\n");
+ ErrorF ("preparing access to %p\n", pixmap);
w = pixmap->drawable.width;
h = pixmap->drawable.height;
- stride = (pixmap->drawable.width * pixmap->drawable.bitsPerPixel + 7) / 8;
+ stride = qxl->current_mode->stride;
+
+ ErrorF ("Width, stride: %d %d, real stride: %d, display wid: %d\n", w, stride, pixmap->devKind, pScrn->displayWidth);
/* Rather than go out of memory, we simply tell the
* device to dump everything
@@ -1022,16 +1038,17 @@ qxl_prepare_access(PixmapPtr pixmap, uxa_access_t access)
outb (qxl->io_base + QXL_IO_UPDATE_AREA, 0);
- n_bytes = stride * pixmap->drawable.height;
+ n_bytes = ((stride > 0)? stride : -stride) * pixmap->drawable.height;
copy = malloc (n_bytes);
if (!copy)
return FALSE;
- memcpy (copy, qxl->ram, qxl->rom->surface0_area_size);
-
- pixmap->devPrivate.ptr = copy;
+ memcpy (copy, qxl->ram, n_bytes);
+
+ pScreen->ModifyPixmapHeader(
+ pixmap, w, h, -1, -1, stride, copy);
return TRUE;
}
@@ -1048,6 +1065,8 @@ qxl_finish_access (PixmapPtr pixmap)
int stride = (pixmap->drawable.width * pixmap->drawable.bitsPerPixel + 7) / 8;
struct qxl_rect rect;
+ ErrorF ("Finishing access to %p\n", pixmap);
+
rect.left = 0;
rect.right = w;
rect.top = 0;
@@ -1068,8 +1087,26 @@ qxl_finish_access (PixmapPtr pixmap)
drawable->u.copy.mask.bitmap = 0;
push_drawable (qxl, drawable);
+
+ pScreen->ModifyPixmapHeader(
+ pixmap, w, h, -1, -1, pScrn->displayWidth * pixmap->drawable.bitsPerPixel, NULL);
+}
+
+static Bool
+qxl_pixmap_is_offscreen (PixmapPtr pixmap)
+{
+ ScreenPtr pScreen = pixmap->drawable.pScreen;
+ PixmapPtr scr_pixmap = pScreen->GetScreenPixmap(pScreen);
+
+ if (pixmap == scr_pixmap)
+ {
+ ErrorF ("%p is offscreen \n", pixmap);
+ return TRUE;
+ }
+
+ ErrorF ("is not offscreen \n");
- pixmap->devPrivate.ptr = NULL;
+ return FALSE;
}
static Bool
@@ -1113,11 +1150,10 @@ setup_uxa (qxl_screen_t *qxl, ScreenPtr screen)
qxl->uxa->put_image = unaccel;
/* Prepare access */
- qxl->uxa->prepare_access = unaccel;
- qxl->uxa->finish_access = unaccel;
-#if 0
- qxl->uxa->pixmap_is_offscreen = unaccel;
-#endif
+ qxl->uxa->prepare_access = qxl_prepare_access;
+ qxl->uxa->finish_access = qxl_finish_access;
+
+ qxl->uxa->pixmap_is_offscreen = qxl_pixmap_is_offscreen;
#if 0
screen->CreatePixmap = qxl_create_pixmap;
@@ -1175,16 +1211,14 @@ qxl_screen_init(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
if (!miSetPixmapDepths())
goto out;
- qxl->fb = xcalloc(pScrn->virtualX * pScrn->displayWidth, 4);
+ pScrn->displayWidth = pScrn->virtualX;
+
+ qxl->fb = xcalloc(pScrn->virtualY * pScrn->displayWidth, 4);
if (!qxl->fb)
goto out;
- pScrn->virtualX = pScrn->currentMode->HDisplay;
- pScrn->virtualY = pScrn->currentMode->VDisplay;
-
if (!fbScreenInit(pScreen, qxl->fb,
- pScrn->currentMode->HDisplay,
- pScrn->currentMode->VDisplay,
+ pScrn->virtualX, pScrn->virtualY,
pScrn->xDpi, pScrn->yDpi, pScrn->displayWidth,
pScrn->bitsPerPixel))
{