diff --git a/exa-firstpixel-tweak.patch b/exa-firstpixel-tweak.patch new file mode 100644 index 0000000..9507e40 --- /dev/null +++ b/exa-firstpixel-tweak.patch @@ -0,0 +1,56 @@ +diff --git a/exa/exa_unaccel.c b/exa/exa_unaccel.c +index 708d1ea..9a991e7 100644 +--- a/exa/exa_unaccel.c ++++ b/exa/exa_unaccel.c +@@ -374,26 +374,41 @@ CARD32 + exaGetPixmapFirstPixel (PixmapPtr pPixmap) + { + CARD32 pixel; ++ void *fb; ++ Bool need_finish = FALSE; ++ BoxRec box; + ExaMigrationRec pixmaps[1]; ++ ExaPixmapPriv (pPixmap); ++ ++ /* Try to avoid framebuffer readbacks */ ++ if (exaPixmapIsOffscreen(pPixmap)) { ++ if (!miPointInRegion(DamageRegion(pExaPixmap->pDamage), 0, 0, &box)) { ++ fb = pExaPixmap->sys_ptr; ++ } else { ++ need_finish = TRUE; ++ fb = pPixmap->devPrivate.ptr; ++ pixmaps[0].as_dst = FALSE; ++ pixmaps[0].as_src = TRUE; ++ pixmaps[0].pPix = pPixmap; ++ exaDoMigration (pixmaps, 1, FALSE); ++ exaPrepareAccess(&pPixmap->drawable, EXA_PREPARE_SRC); ++ } ++ } + +- pixmaps[0].as_dst = FALSE; +- pixmaps[0].as_src = TRUE; +- pixmaps[0].pPix = pPixmap; +- exaDoMigration (pixmaps, 1, FALSE); +- +- exaPrepareAccess(&pPixmap->drawable, EXA_PREPARE_SRC); + switch (pPixmap->drawable.bitsPerPixel) { + case 32: +- pixel = *(CARD32 *)(pPixmap->devPrivate.ptr); ++ pixel = *(CARD32 *)fb; + break; + case 16: +- pixel = *(CARD16 *)(pPixmap->devPrivate.ptr); ++ pixel = *(CARD16 *)fb; + break; + default: +- pixel = *(CARD8 *)(pPixmap->devPrivate.ptr); ++ pixel = *(CARD8 *)fb; + break; + } +- exaFinishAccess(&pPixmap->drawable, EXA_PREPARE_SRC); ++ ++ if (need_finish) ++ exaFinishAccess(&pPixmap->drawable, EXA_PREPARE_SRC); + + return pixel; + }