diff options
Diffstat (limited to 'testing/xf86-video-ati/0001-poor-man-s-solid-picture-support-for-evergreen.patch')
-rw-r--r-- | testing/xf86-video-ati/0001-poor-man-s-solid-picture-support-for-evergreen.patch | 290 |
1 files changed, 0 insertions, 290 deletions
diff --git a/testing/xf86-video-ati/0001-poor-man-s-solid-picture-support-for-evergreen.patch b/testing/xf86-video-ati/0001-poor-man-s-solid-picture-support-for-evergreen.patch deleted file mode 100644 index e6b5433e1..000000000 --- a/testing/xf86-video-ati/0001-poor-man-s-solid-picture-support-for-evergreen.patch +++ /dev/null @@ -1,290 +0,0 @@ -From 761ef4b340e689490a76ec5ce520c858335e2106 Mon Sep 17 00:00:00 2001 -From: Alex Deucher <alexander.deucher@amd.com> -Date: Sat, 14 Apr 2012 08:53:39 -0400 -Subject: [PATCH] poor man's solid picture support for evergreen - -Signed-off-by: Alex Deucher <alexander.deucher@amd.com> ---- - src/evergreen_exa.c | 163 ++++++++++++++++++++++++++++++--------------------- - 1 files changed, 95 insertions(+), 68 deletions(-) - -diff --git a/src/evergreen_exa.c b/src/evergreen_exa.c -index cee3ec2..61b47a4 100644 ---- a/src/evergreen_exa.c -+++ b/src/evergreen_exa.c -@@ -748,17 +748,8 @@ static Bool EVERGREENCheckCompositeTexture(PicturePtr pPict, - int op, - int unit) - { -- int w = pPict->pDrawable->width; -- int h = pPict->pDrawable->height; - unsigned int repeatType = pPict->repeat ? pPict->repeatType : RepeatNone; - unsigned int i; -- int max_tex_w, max_tex_h; -- -- max_tex_w = 16384; -- max_tex_h = 16384; -- -- if ((w > max_tex_w) || (h > max_tex_h)) -- RADEON_FALLBACK(("Picture w/h too large (%dx%d)\n", w, h)); - - for (i = 0; i < sizeof(EVERGREENTexFormats) / sizeof(EVERGREENTexFormats[0]); i++) { - if (EVERGREENTexFormats[i].fmt == pPict->format) -@@ -798,9 +789,16 @@ static void EVERGREENXFormSetup(PicturePtr pPict, PixmapPtr pPix, - ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; -- int w = pPict->pDrawable->width; -- int h = pPict->pDrawable->height; - int const_offset = unit * 8; -+ int w, h; -+ -+ if (pPict->pDrawable) { -+ w = pPict->pDrawable->width; -+ h = pPict->pDrawable->height; -+ } else { -+ w = 1; -+ h = 1; -+ } - - if (pPict->transform != 0) { - accel_state->is_transform[unit] = TRUE; -@@ -837,9 +835,7 @@ static Bool EVERGREENTextureSetup(PicturePtr pPict, PixmapPtr pPix, - ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; -- int w = pPict->pDrawable->width; -- int h = pPict->pDrawable->height; -- unsigned int repeatType = pPict->repeat ? pPict->repeatType : RepeatNone; -+ unsigned int repeatType; - unsigned int i; - tex_resource_t tex_res; - tex_sampler_t tex_samp; -@@ -854,9 +850,17 @@ static Bool EVERGREENTextureSetup(PicturePtr pPict, PixmapPtr pPix, - } - - /* Texture */ -+ if (pPict->pDrawable) { -+ tex_res.w = pPict->pDrawable->width; -+ tex_res.h = pPict->pDrawable->height; -+ repeatType = pPict->repeat ? pPict->repeatType : RepeatNone; -+ } else { -+ tex_res.w = 1; -+ tex_res.h = 1; -+ repeatType = RepeatNormal; -+ } -+ - tex_res.id = unit; -- tex_res.w = w; -- tex_res.h = h; - tex_res.pitch = accel_state->src_obj[unit].pitch; - tex_res.depth = 0; - tex_res.dim = SQ_TEX_DIM_2D; -@@ -1054,33 +1058,30 @@ static Bool EVERGREENCheckComposite(int op, PicturePtr pSrcPicture, - { - uint32_t tmp1; - PixmapPtr pSrcPixmap, pDstPixmap; -- int max_tex_w, max_tex_h, max_dst_w, max_dst_h; - - /* Check for unsupported compositing operations. */ - if (op >= (int) (sizeof(EVERGREENBlendOp) / sizeof(EVERGREENBlendOp[0]))) - RADEON_FALLBACK(("Unsupported Composite op 0x%x\n", op)); - -- if (!pSrcPicture->pDrawable) -- RADEON_FALLBACK(("Solid or gradient pictures not supported yet\n")); -+ if (pSrcPicture->pDrawable) { -+ pSrcPixmap = RADEONGetDrawablePixmap(pSrcPicture->pDrawable); - -- pSrcPixmap = RADEONGetDrawablePixmap(pSrcPicture->pDrawable); -- -- max_tex_w = 8192; -- max_tex_h = 8192; -- max_dst_w = 8192; -- max_dst_h = 8192; -+ if (pSrcPixmap->drawable.width >= 16384 || -+ pSrcPixmap->drawable.height >= 16384) { -+ RADEON_FALLBACK(("Source w/h too large (%d,%d).\n", -+ pSrcPixmap->drawable.width, -+ pSrcPixmap->drawable.height)); -+ } - -- if (pSrcPixmap->drawable.width >= max_tex_w || -- pSrcPixmap->drawable.height >= max_tex_h) { -- RADEON_FALLBACK(("Source w/h too large (%d,%d).\n", -- pSrcPixmap->drawable.width, -- pSrcPixmap->drawable.height)); -- } -+ if (!EVERGREENCheckCompositeTexture(pSrcPicture, pDstPicture, op, 0)) -+ return FALSE; -+ } else if (pSrcPicture->pSourcePict->type != SourcePictTypeSolidFill) -+ RADEON_FALLBACK(("Gradient pictures not supported yet\n")); - - pDstPixmap = RADEONGetDrawablePixmap(pDstPicture->pDrawable); - -- if (pDstPixmap->drawable.width >= max_dst_w || -- pDstPixmap->drawable.height >= max_dst_h) { -+ if (pDstPixmap->drawable.width >= 16384 || -+ pDstPixmap->drawable.height >= 16384) { - RADEON_FALLBACK(("Dest w/h too large (%d,%d).\n", - pDstPixmap->drawable.width, - pDstPixmap->drawable.height)); -@@ -1089,38 +1090,35 @@ static Bool EVERGREENCheckComposite(int op, PicturePtr pSrcPicture, - 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 >= max_tex_w || -- pMaskPixmap->drawable.height >= max_tex_h) { -- RADEON_FALLBACK(("Mask w/h too large (%d,%d).\n", -- pMaskPixmap->drawable.width, -- pMaskPixmap->drawable.height)); -- } -+ if (pMaskPixmap->drawable.width >= 16384 || -+ pMaskPixmap->drawable.height >= 16384) { -+ RADEON_FALLBACK(("Mask w/h too large (%d,%d).\n", -+ pMaskPixmap->drawable.width, -+ pMaskPixmap->drawable.height)); -+ } - -- if (pMaskPicture->componentAlpha) { -- /* Check if it's component alpha that relies on a source alpha and -- * on the source value. We can only get one of those into the -- * single source value that we get to blend with. -- */ -- if (EVERGREENBlendOp[op].src_alpha && -- (EVERGREENBlendOp[op].blend_cntl & COLOR_SRCBLEND_mask) != -- (BLEND_ZERO << COLOR_SRCBLEND_shift)) { -- RADEON_FALLBACK(("Component alpha not supported with source " -- "alpha and source value blending.\n")); -+ if (pMaskPicture->componentAlpha) { -+ /* Check if it's component alpha that relies on a source alpha and -+ * on the source value. We can only get one of those into the -+ * single source value that we get to blend with. -+ */ -+ if (EVERGREENBlendOp[op].src_alpha && -+ (EVERGREENBlendOp[op].blend_cntl & COLOR_SRCBLEND_mask) != -+ (BLEND_ZERO << COLOR_SRCBLEND_shift)) { -+ RADEON_FALLBACK(("Component alpha not supported with source " -+ "alpha and source value blending.\n")); -+ } - } -- } - -- if (!EVERGREENCheckCompositeTexture(pMaskPicture, pDstPicture, op, 1)) -- return FALSE; -+ if (!EVERGREENCheckCompositeTexture(pMaskPicture, pDstPicture, op, 1)) -+ return FALSE; -+ } else if (pMaskPicture->pSourcePict->type != SourcePictTypeSolidFill) -+ RADEON_FALLBACK(("Gradient pictures not supported yet\n")); - } - -- if (!EVERGREENCheckCompositeTexture(pSrcPicture, pDstPicture, op, 0)) -- return FALSE; -- - if (!EVERGREENGetDestFormat(pDstPicture, &tmp1)) - return FALSE; - -@@ -1132,7 +1130,8 @@ static Bool EVERGREENPrepareComposite(int op, PicturePtr pSrcPicture, - PicturePtr pMaskPicture, PicturePtr pDstPicture, - PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst) - { -- ScrnInfoPtr pScrn = xf86Screens[pSrc->drawable.pScreen->myNum]; -+ ScreenPtr pScreen = pDst->drawable.pScreen; -+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - uint32_t dst_format; -@@ -1142,13 +1141,19 @@ static Bool EVERGREENPrepareComposite(int op, PicturePtr pSrcPicture, - struct r600_accel_object src_obj, mask_obj, dst_obj; - float *cbuf; - -- if (pDst->drawable.bitsPerPixel < 8 || pSrc->drawable.bitsPerPixel < 8) -+ if (pDst->drawable.bitsPerPixel < 8 || (pSrc && pSrc->drawable.bitsPerPixel < 8)) - return FALSE; - -+ if (!pSrc) { -+ pSrc = RADEONSolidPixmap(pScreen, pSrcPicture->pSourcePict->solidFill.color); -+ if (!pSrc) -+ RADEON_FALLBACK("Failed to create solid scratch pixmap\n"); -+ } -+ - src_obj.offset = 0; - dst_obj.offset = 0; -- src_obj.bo = radeon_get_pixmap_bo(pSrc); - dst_obj.bo = radeon_get_pixmap_bo(pDst); -+ src_obj.bo = radeon_get_pixmap_bo(pSrc); - dst_obj.surface = radeon_get_pixmap_surface(pDst); - src_obj.surface = radeon_get_pixmap_surface(pSrc); - dst_obj.tiling_flags = radeon_get_pixmap_tiling(pDst); -@@ -1166,7 +1171,15 @@ static Bool EVERGREENPrepareComposite(int op, PicturePtr pSrcPicture, - dst_obj.bpp = pDst->drawable.bitsPerPixel; - dst_obj.domain = RADEON_GEM_DOMAIN_VRAM; - -- if (pMask) { -+ if (pMaskPicture) { -+ if (!pMask) { -+ pMask = RADEONSolidPixmap(pScreen, pMaskPicture->pSourcePict->solidFill.color); -+ if (!pMask) { -+ if (!pSrcPicture->pDrawable) -+ pScreen->DestroyPixmap(pSrc); -+ RADEON_FALLBACK("Failed to create solid scratch pixmap\n"); -+ } -+ } - mask_obj.offset = 0; - mask_obj.bo = radeon_get_pixmap_bo(pMask); - mask_obj.tiling_flags = radeon_get_pixmap_tiling(pMask); -@@ -1363,11 +1376,9 @@ static Bool EVERGREENPrepareComposite(int op, PicturePtr pSrcPicture, - return TRUE; - } - --static void EVERGREENDoneComposite(PixmapPtr pDst) -+static void EVERGREENFinishComposite(ScrnInfoPtr pScrn, PixmapPtr pDst, -+ struct radeon_accel_state *accel_state) - { -- ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; -- RADEONInfoPtr info = RADEONPTR(pScrn); -- struct radeon_accel_state *accel_state = info->accel_state; - int vtx_size; - - if (accel_state->vsync) -@@ -1381,6 +1392,22 @@ static void EVERGREENDoneComposite(PixmapPtr pDst) - evergreen_finish_op(pScrn, vtx_size); - } - -+static void EVERGREENDoneComposite(PixmapPtr pDst) -+{ -+ ScreenPtr pScreen = pDst->drawable.pScreen; -+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; -+ RADEONInfoPtr info = RADEONPTR(pScrn); -+ struct radeon_accel_state *accel_state = info->accel_state; -+ -+ EVERGREENFinishComposite(pScrn, pDst, accel_state); -+ -+ if (!accel_state->src_pic->pDrawable) -+ pScreen->DestroyPixmap(accel_state->src_pix); -+ -+ if (accel_state->msk_pic && !accel_state->msk_pic->pDrawable) -+ pScreen->DestroyPixmap(accel_state->msk_pix); -+} -+ - static void EVERGREENComposite(PixmapPtr pDst, - int srcX, int srcY, - int maskX, int maskY, -@@ -1393,7 +1420,7 @@ static void EVERGREENComposite(PixmapPtr pDst, - float *vb; - - if (CS_FULL(info->cs)) { -- EVERGREENDoneComposite(info->accel_state->dst_pix); -+ EVERGREENFinishComposite(pScrn, pDst, info->accel_state); - radeon_cs_flush_indirect(pScrn); - EVERGREENPrepareComposite(info->accel_state->composite_op, - info->accel_state->src_pic, --- -1.7.7.5 - |