xserver: Branch 'master' - 3 commits
Dave Airlie
airlied at kemper.freedesktop.org
Mon Oct 1 21:17:35 PDT 2007
exa/exa.c | 181 +++++++++++++++++++++++++++++++++++++++------------------
exa/exa.h | 10 +++
exa/exa_priv.h | 4 +
3 files changed, 141 insertions(+), 54 deletions(-)
New commits:
diff-tree f15af2ae60bb8503c336bc3cba0560bd314a34bc (from ffb58f4fa8d86e87f831430b8627f27d85f971a9)
Author: Kristian Høgsberg <krh at redhat.com>
Date: Fri Aug 3 16:33:33 2007 +1000
exa: only setup offscreen allocator if driver doesn't provide CreatePixmap
diff --git a/exa/exa.c b/exa/exa.c
index dfad0e7..3e8054d 100644
--- a/exa/exa.c
+++ b/exa/exa.c
@@ -755,22 +755,24 @@ exaDriverInit (ScreenPtr pScreen,
return FALSE;
}
- if (!pScreenInfo->memoryBase) {
- LogMessage(X_ERROR, "EXA(%d): ExaDriverRec::memoryBase must be "
- "non-zero\n", pScreen->myNum);
- return FALSE;
- }
+ if (!pScreenInfo->CreatePixmap) {
+ if (!pScreenInfo->memoryBase) {
+ LogMessage(X_ERROR, "EXA(%d): ExaDriverRec::memoryBase "
+ "must be non-zero\n", pScreen->myNum);
+ return FALSE;
+ }
- if (!pScreenInfo->memorySize) {
- LogMessage(X_ERROR, "EXA(%d): ExaDriverRec::memorySize must be "
- "non-zero\n", pScreen->myNum);
- return FALSE;
- }
+ if (!pScreenInfo->memorySize) {
+ LogMessage(X_ERROR, "EXA(%d): ExaDriverRec::memorySize must be "
+ "non-zero\n", pScreen->myNum);
+ return FALSE;
+ }
- if (pScreenInfo->offScreenBase > pScreenInfo->memorySize) {
- LogMessage(X_ERROR, "EXA(%d): ExaDriverRec::offScreenBase must be <= "
- "ExaDriverRec::memorySize\n", pScreen->myNum);
- return FALSE;
+ if (pScreenInfo->offScreenBase > pScreenInfo->memorySize) {
+ LogMessage(X_ERROR, "EXA(%d): ExaDriverRec::offScreenBase must "
+ "be <= ExaDriverRec::memorySize\n", pScreen->myNum);
+ return FALSE;
+ }
}
if (!pScreenInfo->PrepareSolid) {
@@ -881,8 +883,7 @@ exaDriverInit (ScreenPtr pScreen,
/*
* Hookup offscreen pixmaps
*/
- if ((pExaScr->info->flags & EXA_OFFSCREEN_PIXMAPS) &&
- pExaScr->info->offScreenBase < pExaScr->info->memorySize)
+ if (pExaScr->info->flags & EXA_OFFSCREEN_PIXMAPS)
{
if (!AllocatePixmapPrivate(pScreen, exaPixmapPrivateIndex,
sizeof (ExaPixmapPrivRec))) {
@@ -899,10 +900,15 @@ exaDriverInit (ScreenPtr pScreen,
pExaScr->SavedModifyPixmapHeader = pScreen->ModifyPixmapHeader;
pScreen->ModifyPixmapHeader = exaModifyPixmapHeader;
+ if (!pExaScr->info->CreatePixmap) {
+ LogMessage(X_INFO, "EXA(%d): Offscreen pixmap area of %lu bytes\n",
+ pScreen->myNum,
+ pExaScr->info->memorySize - pExaScr->info->offScreenBase);
+ } else {
+ LogMessage(X_INFO, "EXA(%d): Driver allocated offscreen pixmaps\n",
+ pScreen->myNum);
- LogMessage(X_INFO, "EXA(%d): Offscreen pixmap area of %d bytes\n",
- pScreen->myNum,
- pExaScr->info->memorySize - pExaScr->info->offScreenBase);
+ }
}
else
{
@@ -911,14 +917,16 @@ exaDriverInit (ScreenPtr pScreen,
return FALSE;
}
- DBG_PIXMAP(("============== %ld < %ld\n", pExaScr->info->offScreenBase,
- pExaScr->info->memorySize));
- if (pExaScr->info->offScreenBase < pExaScr->info->memorySize) {
- if (!exaOffscreenInit (pScreen)) {
- LogMessage(X_WARNING, "EXA(%d): Offscreen pixmap setup failed\n",
- pScreen->myNum);
- return FALSE;
- }
+ if (!pExaScr->info->CreatePixmap) {
+ DBG_PIXMAP(("============== %ld < %ld\n", pExaScr->info->offScreenBase,
+ pExaScr->info->memorySize));
+ if (pExaScr->info->offScreenBase < pExaScr->info->memorySize) {
+ if (!exaOffscreenInit (pScreen)) {
+ LogMessage(X_WARNING, "EXA(%d): Offscreen pixmap setup failed\n",
+ pScreen->myNum);
+ return FALSE;
+ }
+ }
}
LogMessage(X_INFO, "EXA(%d): Driver registered support for the following"
diff-tree ffb58f4fa8d86e87f831430b8627f27d85f971a9 (from 31555af0005a0bc4d7ef785214696ac84681e29f)
Author: Dave Airlie <airlied at redhat.com>
Date: Tue Oct 2 14:03:39 2007 +1000
exa: add hooks for drivers to take over pixmap allocation
This adds hooks for the driver to access Create/DestroyPixmap and ModifyPixmapHe
ader.
It allocates a 0 sized pixmap using fb and calls the driver routine to do
work of allocating the actual memory.
ModifyPixmapHeader is mainly required for hooking the screen pixmap which
isn't create by normal methods
diff --git a/exa/exa.c b/exa/exa.c
index bd0f4f7..dfad0e7 100644
--- a/exa/exa.c
+++ b/exa/exa.c
@@ -183,9 +183,18 @@ exaPixmapDirty (PixmapPtr pPix, int x1,
static Bool
exaDestroyPixmap (PixmapPtr pPixmap)
{
+ ScreenPtr pScreen = pPixmap->drawable.pScreen;
+ ExaScreenPriv(pScreen);
+
if (pPixmap->refcnt == 1)
{
ExaPixmapPriv (pPixmap);
+
+ if (pExaPixmap->driverPriv) {
+ pExaScr->info->DestroyPixmap(pScreen, pExaPixmap->driverPriv);
+ pExaPixmap->driverPriv = NULL;
+ }
+
if (pExaPixmap->area)
{
DBG_PIXMAP(("-- 0x%p (0x%x) (%dx%d)\n",
@@ -229,46 +238,86 @@ exaCreatePixmap(ScreenPtr pScreen, int w
{
PixmapPtr pPixmap;
ExaPixmapPrivPtr pExaPixmap;
+ int driver_alloc = 0;
int bpp;
ExaScreenPriv(pScreen);
if (w > 32767 || h > 32767)
return NullPixmap;
- pPixmap = fbCreatePixmap (pScreen, w, h, depth);
+ if (!pExaScr->info->CreatePixmap) {
+ pPixmap = fbCreatePixmap (pScreen, w, h, depth);
+ } else {
+ driver_alloc = 1;
+ pPixmap = fbCreatePixmap(pScreen, 0, 0, depth);
+ }
+
if (!pPixmap)
- return NULL;
+ return NULL;
+
pExaPixmap = ExaGetPixmapPriv(pPixmap);
bpp = pPixmap->drawable.bitsPerPixel;
- /* Glyphs have w/h equal to zero, and may not be migrated. See exaGlyphs. */
- if (!w || !h)
- pExaPixmap->score = EXA_PIXMAP_SCORE_PINNED;
- else
- pExaPixmap->score = EXA_PIXMAP_SCORE_INIT;
-
- pExaPixmap->area = NULL;
-
- pExaPixmap->sys_ptr = pPixmap->devPrivate.ptr;
- pExaPixmap->sys_pitch = pPixmap->devKind;
-
- pPixmap->devPrivate.ptr = NULL;
- pExaPixmap->offscreen = FALSE;
-
- pExaPixmap->fb_ptr = NULL;
- if (pExaScr->info->flags & EXA_OFFSCREEN_ALIGN_POT && w != 1)
- pExaPixmap->fb_pitch = (1 << (exaLog2(w - 1) + 1)) * bpp / 8;
- else
- pExaPixmap->fb_pitch = w * bpp / 8;
- pExaPixmap->fb_pitch = EXA_ALIGN(pExaPixmap->fb_pitch,
- pExaScr->info->pixmapPitchAlign);
- pExaPixmap->fb_size = pExaPixmap->fb_pitch * h;
+ if (driver_alloc) {
+ size_t paddedWidth, datasize;
+ void *driver_priv;
+
+ paddedWidth = ((w * bpp + FB_MASK) >> FB_SHIFT) * sizeof(FbBits);
+ if (paddedWidth / 4 > 32767 || h > 32767)
+ return NullPixmap;
+
+ if (pExaScr->info->flags & EXA_OFFSCREEN_ALIGN_POT && w != 1)
+ pExaPixmap->fb_pitch = (1 << (exaLog2(w - 1) + 1)) * bpp / 8;
+ else
+ pExaPixmap->fb_pitch = w * bpp / 8;
+ pExaPixmap->fb_pitch = EXA_ALIGN(pExaPixmap->fb_pitch,
+ pExaScr->info->pixmapPitchAlign);
+ if (paddedWidth < pExaPixmap->fb_pitch)
+ paddedWidth = pExaPixmap->fb_pitch;
+
+ datasize = h * paddedWidth;
+
+ driver_priv = pExaScr->info->CreatePixmap(pScreen, datasize, 0);
+ if (!driver_priv) {
+ fbDestroyPixmap(pPixmap);
+ return NULL;
+ }
- if (pExaPixmap->fb_pitch > 131071) {
- fbDestroyPixmap(pPixmap);
- return NULL;
+ (*pScreen->ModifyPixmapHeader)(pPixmap, w, h, 0, 0,
+ paddedWidth, NULL);
+ pExaPixmap->driverPriv = driver_priv;
+ pExaPixmap->score = EXA_PIXMAP_SCORE_PINNED;
+ } else {
+ pExaPixmap->driverPriv = NULL;
+ /* Glyphs have w/h equal to zero, and may not be migrated. See exaGlyphs. */
+ if (!w || !h)
+ pExaPixmap->score = EXA_PIXMAP_SCORE_PINNED;
+ else
+ pExaPixmap->score = EXA_PIXMAP_SCORE_INIT;
+
+ pExaPixmap->sys_ptr = pPixmap->devPrivate.ptr;
+ pExaPixmap->sys_pitch = pPixmap->devKind;
+
+ pPixmap->devPrivate.ptr = NULL;
+ pExaPixmap->offscreen = FALSE;
+
+ pExaPixmap->fb_ptr = NULL;
+ if (pExaScr->info->flags & EXA_OFFSCREEN_ALIGN_POT && w != 1)
+ pExaPixmap->fb_pitch = (1 << (exaLog2(w - 1) + 1)) * bpp / 8;
+ else
+ pExaPixmap->fb_pitch = w * bpp / 8;
+ pExaPixmap->fb_pitch = EXA_ALIGN(pExaPixmap->fb_pitch,
+ pExaScr->info->pixmapPitchAlign);
+ pExaPixmap->fb_size = pExaPixmap->fb_pitch * h;
+
+ if (pExaPixmap->fb_pitch > 131071) {
+ fbDestroyPixmap(pPixmap);
+ return NULL;
+ }
}
+
+ pExaPixmap->area = NULL;
/* Set up damage tracking */
pExaPixmap->pDamage = DamageCreate (NULL, NULL, DamageReportNone, TRUE,
@@ -315,6 +364,7 @@ exaModifyPixmapHeader(PixmapPtr pPixmap,
{
ExaScreenPrivPtr pExaScr;
ExaPixmapPrivPtr pExaPixmap;
+ Bool ret;
if (!pPixmap)
return FALSE;
@@ -326,6 +376,12 @@ exaModifyPixmapHeader(PixmapPtr pPixmap,
pExaScr = ExaGetScreenPriv(pPixmap->drawable.pScreen);
+ if (pExaScr->info->ModifyPixmapHeader) {
+ ret = pExaScr->info->ModifyPixmapHeader(pPixmap, width, height, depth,
+ bitsPerPixel, devKind, pPixData);
+ if (ret == TRUE)
+ return ret;
+ }
return pExaScr->SavedModifyPixmapHeader(pPixmap, width, height, depth,
bitsPerPixel, devKind, pPixData);
}
@@ -843,6 +899,7 @@ exaDriverInit (ScreenPtr pScreen,
pExaScr->SavedModifyPixmapHeader = pScreen->ModifyPixmapHeader;
pScreen->ModifyPixmapHeader = exaModifyPixmapHeader;
+
LogMessage(X_INFO, "EXA(%d): Offscreen pixmap area of %d bytes\n",
pScreen->myNum,
pExaScr->info->memorySize - pExaScr->info->offScreenBase);
diff --git a/exa/exa.h b/exa/exa.h
index c7e39fa..0eeb1f0 100644
--- a/exa/exa.h
+++ b/exa/exa.h
@@ -702,6 +702,13 @@ typedef struct _ExaDriver {
*/
int maxPitchBytes;
+ /* Hooks to allow driver to its own pixmap memory management */
+ void *(*CreatePixmap)(ScreenPtr pScreen, int size, int align);
+ void (*DestroyPixmap)(ScreenPtr pScreen, void *driverPriv);
+ Bool (*ModifyPixmapHeader)(PixmapPtr pPixmap, int width, int height,
+ int depth, int bitsPerPixel, int devKind,
+ pointer pPixData);
+
/** @} */
} ExaDriverRec, *ExaDriverPtr;
diff-tree 31555af0005a0bc4d7ef785214696ac84681e29f (from 2d93e69690d2c5d4a89a795ede6423796528e5df)
Author: Dave Airlie <airlied at redhat.com>
Date: Tue Oct 2 13:32:57 2007 +1000
exa: add a pixmap private pointer for drivers to retrieve.
diff --git a/exa/exa.c b/exa/exa.c
index 518a5f1..bd0f4f7 100644
--- a/exa/exa.c
+++ b/exa/exa.c
@@ -74,6 +74,14 @@ exaGetPixmapOffset(PixmapPtr pPix)
(unsigned long)pExaScr->info->memoryBase);
}
+void *
+exaGetPixmapDriverPrivate(PixmapPtr pPix)
+{
+ ExaPixmapPriv(pPix);
+
+ return pExaPixmap->driverPriv;
+}
+
/**
* exaGetPixmapPitch() returns the pitch (in bytes) of the given pixmap.
*
diff --git a/exa/exa.h b/exa/exa.h
index 491e6b1..c7e39fa 100644
--- a/exa/exa.h
+++ b/exa/exa.h
@@ -773,6 +773,9 @@ exaMoveInPixmap (PixmapPtr pPixmap);
void
exaMoveOutPixmap (PixmapPtr pPixmap);
+void *
+exaGetPixmapDriverPrivate(PixmapPtr p);
+
/**
* Returns TRUE if the given planemask covers all the significant bits in the
* pixel values for pDrawable.
diff --git a/exa/exa_priv.h b/exa/exa_priv.h
index a26933d..523a76f 100644
--- a/exa/exa_priv.h
+++ b/exa/exa_priv.h
@@ -192,6 +192,10 @@ typedef struct {
* damage, which may be overreported) of a pixmap's system and FB copies.
*/
RegionRec validSys, validFB;
+ /**
+ * Driver private storage per EXA pixmap
+ */
+ void *driverPriv;
} ExaPixmapPrivRec, *ExaPixmapPrivPtr;
typedef struct _ExaMigrationRec {
More information about the xorg-commit
mailing list