summaryrefslogtreecommitdiff
path: root/extra/xf86-video-ati/0003-poor-man-s-solid-picture-support-for-r200.patch
diff options
context:
space:
mode:
Diffstat (limited to 'extra/xf86-video-ati/0003-poor-man-s-solid-picture-support-for-r200.patch')
-rw-r--r--extra/xf86-video-ati/0003-poor-man-s-solid-picture-support-for-r200.patch179
1 files changed, 179 insertions, 0 deletions
diff --git a/extra/xf86-video-ati/0003-poor-man-s-solid-picture-support-for-r200.patch b/extra/xf86-video-ati/0003-poor-man-s-solid-picture-support-for-r200.patch
new file mode 100644
index 000000000..0a448fc93
--- /dev/null
+++ b/extra/xf86-video-ati/0003-poor-man-s-solid-picture-support-for-r200.patch
@@ -0,0 +1,179 @@
+From c5c8310858f8018a1754f2457d7b102dc7d62b23 Mon Sep 17 00:00:00 2001
+From: Alex Deucher <alexander.deucher@amd.com>
+Date: Fri, 13 Apr 2012 13:28:10 -0400
+Subject: [PATCH 3/3] poor man's solid picture support for r200
+
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ src/radeon_exa_render.c | 101 +++++++++++++++++++++++++++--------------------
+ 1 files changed, 58 insertions(+), 43 deletions(-)
+
+diff --git a/src/radeon_exa_render.c b/src/radeon_exa_render.c
+index 451a625..7f1a3ff 100644
+--- a/src/radeon_exa_render.c
++++ b/src/radeon_exa_render.c
+@@ -756,17 +756,8 @@ static Bool R200CheckCompositeTexture(PicturePtr pPict,
+ int unit)
+ {
+ unsigned int repeatType = pPict->repeat ? pPict->repeatType : RepeatNone;
+- int w = pPict->pDrawable->width;
+- int h = pPict->pDrawable->height;
+ int i;
+
+- /* r200 limit should be 2048, there are issues with 2048
+- * see bug 19269
+- */
+-
+- if ((w > 2047) || (h > 2047))
+- RADEON_FALLBACK(("Picture w/h too large (%dx%d)\n", w, h));
+-
+ for (i = 0; i < sizeof(R200TexFormats) / sizeof(R200TexFormats[0]); i++)
+ {
+ if (R200TexFormats[i].fmt == pPict->format)
+@@ -776,7 +767,7 @@ static Bool R200CheckCompositeTexture(PicturePtr pPict,
+ RADEON_FALLBACK(("Unsupported picture format 0x%x\n",
+ (int)pPict->format));
+
+- if (!RADEONCheckTexturePOT(pPict, unit == 0))
++ if (pPict->pDrawable && !RADEONCheckTexturePOT(pPict, unit == 0))
+ return FALSE;
+
+ if (pPict->filter != PictFilterNearest &&
+@@ -809,15 +800,24 @@ static Bool FUNC_NAME(R200TextureSetup)(PicturePtr pPict, PixmapPtr pPix,
+ {
+ RINFO_FROM_SCREEN(pPix->drawable.pScreen);
+ uint32_t txfilter, txformat, txoffset, txpitch;
+- int w = pPict->pDrawable->width;
+- int h = pPict->pDrawable->height;
+- unsigned int repeatType = pPict->repeat ? pPict->repeatType : RepeatNone;
+- Bool repeat = (repeatType == RepeatNormal || repeatType == RepeatReflect) &&
+- !(unit == 0 && (info->accel_state->need_src_tile_x || info->accel_state->need_src_tile_y));
+- int i;
++ unsigned int repeatType;
++ Bool repeat;
++ int i, w, h;
+ struct radeon_exa_pixmap_priv *driver_priv;
+ ACCEL_PREAMBLE();
+
++ if (pPict->pDrawable) {
++ w = pPict->pDrawable->width;
++ h = pPict->pDrawable->height;
++ repeatType = pPict->repeat ? pPict->repeatType : RepeatNone;
++ } else {
++ w = h = 1;
++ repeatType = RepeatNormal;
++ }
++
++ repeat = (repeatType == RepeatNormal || repeatType == RepeatReflect) &&
++ !(unit == 0 && (info->accel_state->need_src_tile_x || info->accel_state->need_src_tile_y));
++
+ txpitch = exaGetPixmapPitch(pPix);
+
+ txoffset = 0;
+@@ -926,22 +926,6 @@ static Bool R200CheckComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskP
+ if (op >= sizeof(RadeonBlendOp) / sizeof(RadeonBlendOp[0]))
+ RADEON_FALLBACK(("Unsupported Composite op 0x%x\n", op));
+
+- if (!pSrcPicture->pDrawable)
+- RADEON_FALLBACK(("Solid or gradient pictures not supported yet\n"));
+-
+- /* r200 limit should be 2048, there are issues with 2048
+- * see bug 19269
+- */
+-
+- pSrcPixmap = RADEONGetDrawablePixmap(pSrcPicture->pDrawable);
+-
+- if (pSrcPixmap->drawable.width > 2047 ||
+- pSrcPixmap->drawable.height > 2047) {
+- RADEON_FALLBACK(("Source w/h too large (%d,%d).\n",
+- pSrcPixmap->drawable.width,
+- pSrcPixmap->drawable.height));
+- }
+-
+ pDstPixmap = RADEONGetDrawablePixmap(pDstPicture->pDrawable);
+
+ if (pDstPixmap->drawable.width > 2047 ||
+@@ -951,20 +935,35 @@ static Bool R200CheckComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskP
+ pDstPixmap->drawable.height));
+ }
+
++ if (pSrcPicture->pDrawable) {
++ /* r200 limit should be 2048, there are issues with 2048
++ * see 197a62704742a4a19736c2637ac92d1dc5ab34ed
++ */
++ pSrcPixmap = RADEONGetDrawablePixmap(pSrcPicture->pDrawable);
++
++ if (pSrcPixmap->drawable.width > 2047 ||
++ pSrcPixmap->drawable.height > 2047) {
++ RADEON_FALLBACK(("Source w/h too large (%d,%d).\n",
++ pSrcPixmap->drawable.width,
++ pSrcPixmap->drawable.height));
++ }
++ } else if (pSrcPicture->pSourcePict->type != SourcePictTypeSolidFill)
++ RADEON_FALLBACK(("Gradient pictures not supported yet\n"));
++
+ if (pMaskPicture) {
+ PixmapPtr pMaskPixmap;
+
+- if (!pMaskPicture->pDrawable)
+- RADEON_FALLBACK(("Solid or gradient pictures not supported yet\n"));
+-
+- pMaskPixmap = RADEONGetDrawablePixmap(pMaskPicture->pDrawable);
++ if (pMaskPicture->pDrawable) {
++ pMaskPixmap = RADEONGetDrawablePixmap(pMaskPicture->pDrawable);
+
+- if (pMaskPixmap->drawable.width > 2047 ||
+- pMaskPixmap->drawable.height > 2047) {
+- RADEON_FALLBACK(("Mask w/h too large (%d,%d).\n",
+- pMaskPixmap->drawable.width,
+- pMaskPixmap->drawable.height));
+- }
++ if (pMaskPixmap->drawable.width > 2047 ||
++ pMaskPixmap->drawable.height > 2047) {
++ RADEON_FALLBACK(("Mask w/h too large (%d,%d).\n",
++ pMaskPixmap->drawable.width,
++ pMaskPixmap->drawable.height));
++ }
++ } else if (pMaskPicture->pSourcePict->type != SourcePictTypeSolidFill)
++ RADEON_FALLBACK(("Gradient pictures not supported yet\n"));
+
+ if (pMaskPicture->componentAlpha) {
+ /* Check if it's component alpha that relies on a source alpha and
+@@ -997,7 +996,8 @@ static Bool FUNC_NAME(R200PrepareComposite)(int op, PicturePtr pSrcPicture,
+ PicturePtr pMaskPicture, PicturePtr pDstPicture,
+ PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst)
+ {
+- RINFO_FROM_SCREEN(pDst->drawable.pScreen);
++ ScreenPtr pScreen = pDst->drawable.pScreen;
++ RINFO_FROM_SCREEN(pScreen);
+ uint32_t dst_format, dst_pitch;
+ uint32_t pp_cntl, blendcntl, cblend, ablend, colorpitch;
+ int pixel_shift;
+@@ -1024,9 +1024,24 @@ static Bool FUNC_NAME(R200PrepareComposite)(int op, PicturePtr pSrcPicture,
+ if (((dst_pitch >> pixel_shift) & 0x7) != 0)
+ RADEON_FALLBACK(("Bad destination pitch 0x%x\n", (int)dst_pitch));
+
++ if (!pSrc) {
++ pSrc = RADEONSolidPixmap(pScreen, cpu_to_le32(pSrcPicture->pSourcePict->solidFill.color));
++ if (!pSrc)
++ RADEON_FALLBACK("Failed to create solid scratch pixmap\n");
++ }
++
+ if (!RADEONSetupSourceTile(pSrcPicture, pSrc, FALSE, TRUE))
+ return FALSE;
+
++ if (pMaskPicture && !pMask) {
++ pMask = RADEONSolidPixmap(pScreen, cpu_to_le32(pMaskPicture->pSourcePict->solidFill.color));
++ if (!pMask) {
++ if (!pSrcPicture->pDrawable)
++ pScreen->DestroyPixmap(pSrc);
++ RADEON_FALLBACK("Failed to create solid scratch pixmap\n");
++ }
++ }
++
+ RADEONPrepareCompositeCS(op, pSrcPicture, pMaskPicture, pDstPicture,
+ pSrc, pMask, pDst);
+
+--
+1.7.7.5
+