summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2011-08-15 16:48:03 +0100
committerDave Airlie <airlied@redhat.com>2011-08-15 16:52:25 +0100
commit8018c229d75190e0a16f0b0965ae27d90d0a4aaa (patch)
tree68964cb4480765d438ed2c09515cd6acd1a67f75
parent91b553fe4d8b81132742f656714b765197b5d652 (diff)
render: start fixing up impedpict code for multiple screens
-rw-r--r--drv/impedpict.c187
1 files changed, 109 insertions, 78 deletions
diff --git a/drv/impedpict.c b/drv/impedpict.c
index 19c30ac2e..a425438fe 100644
--- a/drv/impedpict.c
+++ b/drv/impedpict.c
@@ -49,14 +49,17 @@ static void SyncDrvPicture(PicturePtr pPicture, DrvPicturePtr pDrvPicture,
}
-static Bool CreateSourcePict(PicturePtr pPicture, PictureScreenPtr ps)
+static Bool CreateSourcePict(PicturePtr pPicture, PictureScreenPtr ps, int num_gpu)
{
impedPictPrivPtr imped_pict = impedGetPict(pPicture);
+ int i;
- if (!imped_pict->gpu[0]) {
- imped_pict->gpu[0] = DrvCreatePicture(NULL, pPicture->pFormat, 0, NULL);
- if (!imped_pict->gpu[0])
- return FALSE;
+ for (i = 0; i < num_gpu; i++) {
+ if (!imped_pict->gpu[i]) {
+ imped_pict->gpu[i] = DrvCreatePicture(NULL, pPicture->pFormat, 0, NULL);
+ if (!imped_pict->gpu[i])
+ return FALSE;
+ }
}
return TRUE;
}
@@ -69,17 +72,20 @@ impedCreatePicture (PicturePtr pPicture)
PixmapPtr pPixmap;
impedPictPrivPtr imped_pict = impedGetPict(pPicture);
impedPixmapPrivPtr imped_pixmap;
+ impedScreenPrivPtr imped_screen = impedGetScreen(pPicture->pDrawable->pScreen);
ps = GetPictureScreen(pPicture->pDrawable->pScreen);
pPixmap = GetDrawablePixmap(pPicture->pDrawable);
imped_pixmap = impedGetPixmap(pPixmap);
- imped_pict->gpu[0] = DrvCreatePicture(imped_pixmap->gpu[0], pPicture->pFormat,
- 0, 0);
- if (!imped_pict->gpu[0])
- ErrorF("no gpu 0 picture\n");
- SyncDrvPicture(pPicture, imped_pict->gpu[0], 0);
+ for (i = 0; i < imped_screen->num_gpu; i++) {
+ imped_pict->gpu[i] = DrvCreatePicture(imped_pixmap->gpu[i], pPicture->pFormat,
+ 0, 0);
+ if (!imped_pict->gpu[i])
+ ErrorF("no gpu %d picture\n", i);
+ SyncDrvPicture(pPicture, imped_pict->gpu[i], i);
+ }
return 0;
}
@@ -103,11 +109,11 @@ impedComposite (CARD8 op,
ScreenPtr pScreen = pDst->pDrawable->pScreen;
PictureScreenPtr ps = GetPictureScreen(pDst);
impedScreenPrivPtr imped_screen = impedGetScreen(pScreen);
- DrvPictureScreenPtr drv_ps = DrvGetPictureScreen(imped_screen->gpu[0]);
impedPictPrivPtr imped_src;
impedPictPrivPtr imped_mask;
impedPictPrivPtr imped_dst;
impedPixmapPrivPtr imped_src_pixmap, imped_mask_pixmap, imped_dst_pixmap;
+ int i;
if (pSrc->pDrawable) {
pSrcPixmap = GetDrawablePixmap(pSrc->pDrawable);
@@ -115,7 +121,7 @@ impedComposite (CARD8 op,
}
else {
Bool ret;
- ret = CreateSourcePict(pSrc, ps);
+ ret = CreateSourcePict(pSrc, ps, imped_screen->num_gpu);
if (!ret)
return;
}
@@ -150,24 +156,29 @@ impedComposite (CARD8 op,
xDst += x_off;
yDst += y_off;
- pDrvSrc = imped_src->gpu[0];
- SyncDrvPicture(pSrc, pDrvSrc, 0);
- if (pMask) {
- pDrvMask = imped_mask->gpu[0];
- SyncDrvPicture(pMask, pDrvMask, 0);
+ for (i = 0; i < imped_screen->num_gpu; i++) {
+ DrvPictureScreenPtr drv_ps;
+
+ pDrvSrc = imped_src->gpu[i];
+ SyncDrvPicture(pSrc, pDrvSrc, i);
+ if (pMask) {
+ pDrvMask = imped_mask->gpu[i];
+ SyncDrvPicture(pMask, pDrvMask, i);
+ }
+ pDrvDst = imped_dst->gpu[i];
+ SyncDrvPicture(pDst, pDrvDst, i);
+
+ if (pSrcPixmap)
+ pDrvSrc->pPixmap = imped_src_pixmap->gpu[i];
+ if (pDrvMask)
+ pDrvMask->pPixmap = imped_mask_pixmap->gpu[i];
+ pDrvDst->pPixmap = imped_dst_pixmap->gpu[i];
+
+ drv_ps = DrvGetPictureScreen(imped_screen->gpu[i]);
+ drv_ps->Composite(op, pDrvSrc, pDrvMask, pDrvDst,
+ xSrc, ySrc, xMask, yMask,
+ xDst, yDst, width, height);
}
- pDrvDst = imped_dst->gpu[0];
- SyncDrvPicture(pDst, pDrvDst, 0);
-
- if (pSrcPixmap)
- pDrvSrc->pPixmap = imped_src_pixmap->gpu[0];
- if (pDrvMask)
- pDrvMask->pPixmap = imped_mask_pixmap->gpu[0];
- pDrvDst->pPixmap = imped_dst_pixmap->gpu[0];
-
- drv_ps->Composite(op, pDrvSrc, pDrvMask, pDrvDst,
- xSrc, ySrc, xMask, yMask,
- xDst, yDst, width, height);
}
static void
@@ -182,11 +193,14 @@ impedRasterizeTrapezoid (PicturePtr pPicture,
DrvPicturePtr pDrvPicture;
impedScreenPrivPtr imped_screen = impedGetScreen(pPicture->pDrawable->pScreen);
DrvPictureScreenPtr drv_ps;
+ int i;
- pDrvPicture = imped_picture->gpu[0];
- pDrvPicture->pPixmap = imped_pixmap->gpu[0];
- drv_ps = DrvGetPictureScreen(imped_screen->gpu[0]);
- drv_ps->RasterizeTrapezoid(pDrvPicture, trap, x_off, y_off);
+ for (i = 0; i < imped_screen->num_gpu; i++) {
+ pDrvPicture = imped_picture->gpu[i];
+ pDrvPicture->pPixmap = imped_pixmap->gpu[i];
+ drv_ps = DrvGetPictureScreen(imped_screen->gpu[i]);
+ drv_ps->RasterizeTrapezoid(pDrvPicture, trap, x_off, y_off);
+ }
}
static void
@@ -202,10 +216,13 @@ impedAddTraps (PicturePtr pPicture,
DrvPicturePtr pDrvPicture;
impedPixmapPrivPtr imped_pixmap = impedGetPixmap(pPixmap);
impedPictPrivPtr imped_picture = impedGetPict(pPicture);
- pDrvPicture = imped_picture->gpu[0];
- pDrvPicture->pPixmap = imped_pixmap->gpu[0];
- drv_ps = DrvGetPictureScreen(imped_screen->gpu[0]);
- drv_ps->AddTraps(pDrvPicture, x_off, y_off, ntrap, traps);
+ int i;
+ for (i = 0; i < imped_screen->num_gpu; i++) {
+ pDrvPicture = imped_picture->gpu[i];
+ pDrvPicture->pPixmap = imped_pixmap->gpu[i];
+ drv_ps = DrvGetPictureScreen(imped_screen->gpu[i]);
+ drv_ps->AddTraps(pDrvPicture, x_off, y_off, ntrap, traps);
+ }
}
static void
@@ -219,10 +236,8 @@ impedTrapezoids (CARD8 op,
xTrapezoid *traps)
{
impedScreenPrivPtr imped_screen = impedGetScreen(pDst->pDrawable->pScreen);
- DrvPictureScreenPtr drv_ps = DrvGetPictureScreen(imped_screen->gpu[0]);
PictureScreenPtr ps = GetPictureScreen(pDst->pDrawable->pScreen);
PixmapPtr pSrcPixmap = NULL, pDstPixmap;
- DrvPicturePtr pDrvSrc = NULL, pDrvDst;
impedPictPrivPtr imped_src = NULL, imped_dst;
impedPixmapPrivPtr imped_src_pixmap = NULL, imped_dst_pixmap;
int i;
@@ -237,7 +252,7 @@ impedTrapezoids (CARD8 op,
xSrc += x_off;
ySrc += y_off;
} else {
- ret = CreateSourcePict(pSrc, ps);
+ ret = CreateSourcePict(pSrc, ps, imped_screen->num_gpu);
if (!ret)
return;
}
@@ -261,20 +276,25 @@ impedTrapezoids (CARD8 op,
}
}
- if (pSrc) {
- imped_src = impedGetPict(pSrc);
- pDrvSrc = imped_src->gpu[0];
- if (imped_src_pixmap)
- pDrvSrc->pPixmap = imped_src_pixmap->gpu[0];
- if (pDrvSrc)
- SyncDrvPicture(pSrc, pDrvSrc, 0);
- }
- imped_dst = impedGetPict(pDst);
- pDrvDst = imped_dst->gpu[0];
- pDrvDst->pPixmap = imped_dst_pixmap->gpu[0];
- SyncDrvPicture(pDst, pDrvDst, 0);
+ for (i = 0; i < imped_screen->num_gpu; i++) {
+ DrvPictureScreenPtr drv_ps = DrvGetPictureScreen(imped_screen->gpu[i]);
+ DrvPicturePtr pDrvSrc = NULL, pDrvDst;
+
+ if (pSrc) {
+ imped_src = impedGetPict(pSrc);
+ pDrvSrc = imped_src->gpu[i];
+ if (imped_src_pixmap)
+ pDrvSrc->pPixmap = imped_src_pixmap->gpu[i];
+ if (pDrvSrc)
+ SyncDrvPicture(pSrc, pDrvSrc, i);
+ }
+ imped_dst = impedGetPict(pDst);
+ pDrvDst = imped_dst->gpu[i];
+ pDrvDst->pPixmap = imped_dst_pixmap->gpu[i];
+ SyncDrvPicture(pDst, pDrvDst, i);
- drv_ps->Trapezoids(op, pDrvSrc, pDrvDst, maskFormat, xSrc, ySrc, ntrap, traps);
+ drv_ps->Trapezoids(op, pDrvSrc, pDrvDst, maskFormat, xSrc, ySrc, ntrap, traps);
+ }
}
static void
@@ -285,19 +305,25 @@ impedAddTriangles (PicturePtr pPicture,
xTriangle *tris)
{
impedScreenPrivPtr imped_screen = impedGetScreen(pPicture->pDrawable->pScreen);
- DrvPictureScreenPtr drv_ps = DrvGetPictureScreen(imped_screen->gpu[0]);
impedPictPrivPtr imped_picture = impedGetPict(pPicture);
int x_off, y_off;
PixmapPtr pPixmap = GetDrawablePixmap(pPicture->pDrawable);
impedPixmapPrivPtr imped_pixmap = impedGetPixmap(pPixmap);
- DrvPicturePtr pDrvPicture;
+ int i;
impedGetDrawableDeltas(pPicture->pDrawable, pPixmap, &x_off, &y_off);
x_off_orig += x_off;
y_off_orig += y_off;
- pDrvPicture = imped_picture->gpu[0];
- pDrvPicture->pPixmap = imped_pixmap->gpu[0];
- drv_ps->AddTriangles(pDrvPicture, x_off_orig, y_off_orig, ntri, tris);
+
+ for (i = 0; i < imped_screen->num_gpu; i++) {
+ DrvPictureScreenPtr drv_ps;
+ DrvPicturePtr pDrvPicture;
+
+ pDrvPicture = imped_picture->gpu[i];
+ pDrvPicture->pPixmap = imped_pixmap->gpu[i];
+ drv_ps = DrvGetPictureScreen(imped_screen->gpu[i]);
+ drv_ps->AddTriangles(pDrvPicture, x_off_orig, y_off_orig, ntri, tris);
+ }
}
static void
@@ -311,10 +337,8 @@ impedTriangles (CARD8 op,
xTriangle *tris)
{
impedScreenPrivPtr imped_screen = impedGetScreen(pDst->pDrawable->pScreen);
- DrvPictureScreenPtr drv_ps = DrvGetPictureScreen(imped_screen->gpu[0]);
int x_off, y_off, i;
PixmapPtr pSrcPixmap, pDstPixmap;
- DrvPicturePtr pDrvSrc = NULL, pDrvDst;
impedPixmapPrivPtr imped_src_pixmap, imped_dst_pixmap;
impedPictPrivPtr imped_src, imped_dst;
@@ -340,14 +364,19 @@ impedTriangles (CARD8 op,
}
}
- pDrvSrc = imped_src->gpu[0];
- pDrvSrc->pPixmap = imped_src_pixmap->gpu[0];
- pDrvDst = imped_dst->gpu[0];
- pDrvDst->pPixmap = imped_dst_pixmap->gpu[0];
+ for (i = 0; i < imped_screen->num_gpu; i++) {
+ DrvPictureScreenPtr drv_ps = DrvGetPictureScreen(imped_screen->gpu[i]);
+ DrvPicturePtr pDrvSrc = NULL, pDrvDst;
- SyncDrvPicture(pSrc, pDrvSrc, 0);
- SyncDrvPicture(pDst, pDrvDst, 0);
- drv_ps->Triangles(op, pDrvSrc, pDrvDst, maskFormat, xSrc, ySrc, ntris, tris);
+ pDrvSrc = imped_src->gpu[i];
+ pDrvSrc->pPixmap = imped_src_pixmap->gpu[i];
+ pDrvDst = imped_dst->gpu[i];
+ pDrvDst->pPixmap = imped_dst_pixmap->gpu[i];
+
+ SyncDrvPicture(pSrc, pDrvSrc, i);
+ SyncDrvPicture(pDst, pDrvDst, i);
+ drv_ps->Triangles(op, pDrvSrc, pDrvDst, maskFormat, xSrc, ySrc, ntris, tris);
+ }
}
static void
@@ -362,12 +391,11 @@ impedGlyphs(CARD8 op,
GlyphPtr *glyphs)
{
impedScreenPrivPtr imped_screen = impedGetScreen(pDst->pDrawable->pScreen);
- DrvPictureScreenPtr drv_ps = DrvGetPictureScreen(imped_screen->gpu[0]);
PixmapPtr pSrcPixmap, pDstPixmap;
int x_off, y_off;
- DrvPicturePtr pDrvSrc = NULL, pDrvDst;
impedPixmapPrivPtr imped_src_pixmap, imped_dst_pixmap;
impedPictPrivPtr imped_src, imped_dst;
+ int i;
imped_src = impedGetPict(pSrc);
pSrcPixmap = GetDrawablePixmap(pSrc->pDrawable);
@@ -381,15 +409,18 @@ impedGlyphs(CARD8 op,
imped_dst_pixmap = impedGetPixmap(pDstPixmap);
impedGetDrawableDeltas(pDst->pDrawable, pDstPixmap, &x_off, &y_off);
- pDrvSrc = imped_src->gpu[0];
- pDrvSrc->pPixmap = imped_src_pixmap->gpu[0];
- pDrvDst = imped_dst->gpu[0];
- pDrvDst->pPixmap = imped_dst_pixmap->gpu[0];
-
- SyncDrvPicture(pSrc, pDrvSrc, 0);
- SyncDrvPicture(pDst, pDrvDst, 0);
- drv_ps->Glyphs(op, pDrvSrc, pDrvDst, maskFormat, xSrc, ySrc, nlists, lists, glyphs, 0);
-
+ for (i = 0; i < imped_screen->num_gpu; i++) {
+ DrvPictureScreenPtr drv_ps = DrvGetPictureScreen(imped_screen->gpu[i]);
+ DrvPicturePtr pDrvSrc = NULL, pDrvDst;
+ pDrvSrc = imped_src->gpu[i];
+ pDrvSrc->pPixmap = imped_src_pixmap->gpu[i];
+ pDrvDst = imped_dst->gpu[i];
+ pDrvDst->pPixmap = imped_dst_pixmap->gpu[i];
+
+ SyncDrvPicture(pSrc, pDrvSrc, i);
+ SyncDrvPicture(pDst, pDrvDst, i);
+ drv_ps->Glyphs(op, pDrvSrc, pDrvDst, maskFormat, xSrc, ySrc, nlists, lists, glyphs, 0);
+ }
}
Bool