summaryrefslogtreecommitdiff
path: root/x11-drivers/xf86-video-ati
diff options
context:
space:
mode:
Diffstat (limited to 'x11-drivers/xf86-video-ati')
-rw-r--r--x11-drivers/xf86-video-ati/Manifest13
-rw-r--r--x11-drivers/xf86-video-ati/files/xf86-video-ati-6.14.4-exa-solid-accel-evergreen.patch287
-rw-r--r--x11-drivers/xf86-video-ati/files/xf86-video-ati-6.14.4-exa-solid-accel-r100.patch179
-rw-r--r--x11-drivers/xf86-video-ati/files/xf86-video-ati-6.14.4-exa-solid-accel-r200.patch176
-rw-r--r--x11-drivers/xf86-video-ati/files/xf86-video-ati-6.14.4-exa-solid-accel-r300.patch560
-rw-r--r--x11-drivers/xf86-video-ati/metadata.xml5
-rw-r--r--x11-drivers/xf86-video-ati/xf86-video-ati-6.14.4-r1.ebuild46
-rw-r--r--x11-drivers/xf86-video-ati/xf86-video-ati-6.14.6-r1.ebuild43
-rw-r--r--x11-drivers/xf86-video-ati/xf86-video-ati-7.0.0.ebuild37
-rw-r--r--x11-drivers/xf86-video-ati/xf86-video-ati-7.1.0.ebuild41
10 files changed, 1387 insertions, 0 deletions
diff --git a/x11-drivers/xf86-video-ati/Manifest b/x11-drivers/xf86-video-ati/Manifest
new file mode 100644
index 00000000..cb4826b0
--- /dev/null
+++ b/x11-drivers/xf86-video-ati/Manifest
@@ -0,0 +1,13 @@
+AUX xf86-video-ati-6.14.4-exa-solid-accel-evergreen.patch 10993 SHA256 2bc497c453c5e87f63cde4f224446347c5d730575ebecccc0aa0feba18ce7fd4 SHA512 0e67b38e043d4587b54dbb05fdd5ca5816ed38cb0b02c54f3e1091585ca0759d3d9cc39b675da3db81fb72d22a26e3733d2cb354a8df720b8e508332aa08ef14 WHIRLPOOL 8b7e43b1e478ad5752128d3a058c2a3a5f3a51a2b8f8c08f801b41d8423aa3ea4c16f47cf44bd47746926ec3cce5a80b509fc52cb276751bc5568b5acd245f62
+AUX xf86-video-ati-6.14.4-exa-solid-accel-r100.patch 6527 SHA256 d1d991d7aaef21132ea892757611fbb660dfe64fb6b5ffb1bd33f8b6f2d98342 SHA512 548dc69900b76f3b9eb4674798cad7736dfe9a75972c27c96f431cd2e15f9ebe7173dca3e59e018bdc392fa879e9b2d0a21f9d54479f5a209889b28198ba22c4 WHIRLPOOL 9eaeaa995f356dc8f7a8dac3683476892465cdfd595a3f48e98d54c425496104db367f137e6aa74c16377307d1199ffcfe8715485c0e50edc0232eae75446ef6
+AUX xf86-video-ati-6.14.4-exa-solid-accel-r200.patch 6548 SHA256 0a49ca2a700e90721390eb77e62086aa0c68201ede9db2f9aea21ddc957eb444 SHA512 1f46f12584263053266e39f59720be2950fbfe057d1fcde584f039098294c8499d07b616c10356fbbe1821f444e8a08116b51b2774d0cf378a5ef3f7162b4dfb WHIRLPOOL a55c5145e821e689633ebdf57e6436e93b79fff52d3c0d0aedab48166840e8504f494c083c37d2bb9aab9268962cbe5d7da06cd6d871a7cbe9cadcdf0c2a4614
+AUX xf86-video-ati-6.14.4-exa-solid-accel-r300.patch 20383 SHA256 1ad91f3d120f06beb9d0d905931aeb4086ff7d7342ebbdf681b2d9ffa66169f7 SHA512 bffec3f83b466605ec8b7a62e4c3a882ca095777b7530518eae0d2a97e6d06a0c7216788f5821dfa5185558fc24325080caa7dbc04fd73049698bf63235af014 WHIRLPOOL a637454d3a0fb9101c32b06229a5a7ef139c68e788bc3557b502f2ea112adfc8f85ce718e3d23fee29c3d0a4f0a529c97e0044a4854be94f5ea6514c56dfb3f3
+DIST xf86-video-ati-6.14.4.tar.bz2 1108681 SHA256 4ffe435ef8fbe0989f6576f04f789e147a2de7fdefc3644e39d5ef626c37ef85 SHA512 68913954607680e299cb798ff58cfdaf2381823778f85d18adf2701439cc1f954f92867c226b51830b3adf8c3967119a989b2e07ff3af7c7b4c043e784c8e078 WHIRLPOOL a6f50f2ea1233bec17929404243f08eda636af9c7a9ba46e1bf1503f14e8d42df15627a3f41909d8b04896f2ce0f5e70d912f1768089b80b10a1d5b08600debe
+DIST xf86-video-ati-6.14.6.tar.bz2 1139495 SHA256 aa5286b3e4f0187d7df14785c06dd800255d9405205dbf061da5d77df86bec36 SHA512 7ed64bb3596703f7c575aec37a6918bac251819fe638acc66a29aab7648d8a81dedd8d416f970faa1f757fa8e9e3ccdc43e4499d06271cc2751288040d1d957e WHIRLPOOL 9b72e873c3108daeb10cfc68523eb9bc2c12f5525096f9a2639a7dbeb58fd2912b474b8820172ffc9351458d2e046b43e0d064bb4f4189bb99b06a995f3204e8
+DIST xf86-video-ati-7.0.0.tar.bz2 775854 SHA256 c0acc81386425651aae5dfe02d89f935bb63b2a62104da0d88deac3c773ea10e SHA512 f82da3445684aba7f158961fc9882e777c0661ba161a4b923bdf8d3b70a8a16bca08de87af6c7f3943fa6a4308e2aa0ea42b8749a19b52374c1599d669b9512c WHIRLPOOL 4e27614e451fdf5a479695ffe207eb86ea52e45ddfbe5835a5c9912cd58c70968bc118f0586de2f7629183eed1810a70f9bc079763db065f0dc15ae33cd62347
+DIST xf86-video-ati-7.1.0.tar.bz2 804531 SHA256 c8ae44051fcb331625217f98c09a3aa69f493052b69d62c03f41fed0bfe610cd SHA512 eff193b51db162d498b41ebc5b78fbfbcbedbfb2041dcd710ced2f41cee4a039de26ca646dedd65b3cefc9157abfb37a118e3ae2f2e034280e351a00e45db805 WHIRLPOOL d2b1bd7a140fecddc246a6d94f1f6f93fb36ad1d78d447da4f7745060fb4f42fd09b0d85fccb1a7f5b490ce77fd22d3c649982bcb0a06228db2a9b9aa1d8e3d3
+EBUILD xf86-video-ati-6.14.4-r1.ebuild 1193 SHA256 8a70a89d1191782c9579028bfacad59e195b04a1b1f591ccce6b2c493bc021d1 SHA512 a6de0a69c5990f943e8e663ffbe07dbe7907ae64ffba6817af040d92c0ac7a89a1702d6a8a14a02735deb200e513a27a56355da53228100baa0855fc3a958150 WHIRLPOOL 3f0bceaf4810de8eb67f922d7d6bd562e977dcbda69d1c144db0e2d19ad4d80534b002d78fc52eec9b8ec3261b13025e5f70f239668e6e969fe58e6f23807f04
+EBUILD xf86-video-ati-6.14.6-r1.ebuild 972 SHA256 03545ff8484c22a36bb763e6e1d211d495cba67eb696015dd85fa75ef7a3d909 SHA512 7892d21eab399e2a7f687688b62c6ff65a643c8ddfe88052d5d19d5d6dc5ce813e46484b2d98e2520848a73521c1813340bc5efa2e11e9ad848ba04765a3ea83 WHIRLPOOL 5cad5bd388ecbd3dbcb71947b46a9ca4c58e34384b8afe308f1784493c696b40e283f750c2f6b3581bff66dd200af1c654c7cfcb33137647d826636ad3fab4f3
+EBUILD xf86-video-ati-7.0.0.ebuild 834 SHA256 3d051af6cf32d2a91f2d06e77301be460cde549f4e41fa62f84790485c99b314 SHA512 0d9d47f903b653cbde981a9d1e77948208958d669f309f86b95bd26ab068731d290d2ea45ab1fcc56194e0b5f85a6b26f5447b10b6e275439c7fff26b039ac63 WHIRLPOOL 1f5756b6392ab7218efa468f745337a6569710a03fe446c926ee3a8a070b5023b86665a06939bc2f25db20640ba2054f5fe550052f88b622534ea7657ffd50f3
+EBUILD xf86-video-ati-7.1.0.ebuild 965 SHA256 b393b697e14398a463c7dc60d10180dde9c60d9978b05b853946abe7aaa58889 SHA512 0f82babf75d5fe431949bf7b762ca4445705b914d0ea23c73e1508313aae418f37eaa68841582fa20f69259d92fac180299b19e267c574eb8e2dc9a4647e6f2f WHIRLPOOL 9e1949b887a43fb4bb033afe3230b2e07a3cf4831f1dd90886d42fbe48a80e0304c2e3464182a05569482a09bab750539a31ce4ed8b47fea28e17ee3668b1cb4
+MISC metadata.xml 156 SHA256 5101ab0d4cc8c7125eea733c44e86962769bd77acaf53b69223b9cadcdd29055 SHA512 daa9bb2a9b1a16220327bc394f10d93a1a8a427bfbed8808cd247c1dfd5a5b87a4945d55d8243e07fede2c8182a208c618ebd483773d77e9d23862ec77016019 WHIRLPOOL 691e028648bb8b60771d74ef718c51fdb0f4a587e984f6ac4c13d7796415ecf770df2e0fd766399091771924bb65995e9bb290baa35971c56e07d76f2bbf6d93
diff --git a/x11-drivers/xf86-video-ati/files/xf86-video-ati-6.14.4-exa-solid-accel-evergreen.patch b/x11-drivers/xf86-video-ati/files/xf86-video-ati-6.14.4-exa-solid-accel-evergreen.patch
new file mode 100644
index 00000000..6e97a383
--- /dev/null
+++ b/x11-drivers/xf86-video-ati/files/xf86-video-ati-6.14.4-exa-solid-accel-evergreen.patch
@@ -0,0 +1,287 @@
+From cac2d7ed54918579418fc762558497d3ec547fad Mon Sep 17 00:00:00 2001
+From: Alex Deucher <alexander.deucher@amd.com>
+Date: Sat, 14 Apr 2012 12:53:39 +0000
+Subject: EXA: Support acceleration of solid pictures on Evergreen/NI.
+
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
+---
+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,
+--
+cgit v0.9.0.2-2-gbebe
diff --git a/x11-drivers/xf86-video-ati/files/xf86-video-ati-6.14.4-exa-solid-accel-r100.patch b/x11-drivers/xf86-video-ati/files/xf86-video-ati-6.14.4-exa-solid-accel-r100.patch
new file mode 100644
index 00000000..2397d083
--- /dev/null
+++ b/x11-drivers/xf86-video-ati/files/xf86-video-ati-6.14.4-exa-solid-accel-r100.patch
@@ -0,0 +1,179 @@
+From a7754b076e355fef3aea082b6e2d3aefbb8e7a9b Mon Sep 17 00:00:00 2001
+From: Alex Deucher <alexander.deucher@amd.com>
+Date: Fri, 13 Apr 2012 17:24:46 +0000
+Subject: EXA: Support acceleration of solid pictures on R1xx.
+
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
+---
+diff --git a/src/radeon_exa_render.c b/src/radeon_exa_render.c
+index b6cc9e4..451a625 100644
+--- a/src/radeon_exa_render.c
++++ b/src/radeon_exa_render.c
+@@ -338,17 +338,8 @@ static Bool R100CheckCompositeTexture(PicturePtr pPict,
+ int unit)
+ {
+ unsigned int repeatType = pPict->repeat ? pPict->repeatType : RepeatNone;
+- int w = pPict->pDrawable->width;
+- int h = pPict->pDrawable->height;
+ int i;
+
+- /* r100 limit should be 2048, there are issues with 2048
+- * see 197a62704742a4a19736c2637ac92d1dc5ab34ed
+- */
+-
+- if ((w > 2047) || (h > 2047))
+- RADEON_FALLBACK(("Picture w/h too large (%dx%d)\n", w, h));
+-
+ for (i = 0; i < sizeof(R100TexFormats) / sizeof(R100TexFormats[0]); i++) {
+ if (R100TexFormats[i].fmt == pPict->format)
+ break;
+@@ -357,7 +348,7 @@ static Bool R100CheckCompositeTexture(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 &&
+@@ -392,15 +383,24 @@ static Bool FUNC_NAME(R100TextureSetup)(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;
+
+@@ -510,22 +510,6 @@ static Bool R100CheckComposite(int op, PicturePtr pSrcPicture,
+ 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"));
+-
+- /* r100 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));
+- }
+-
+ pDstPixmap = RADEONGetDrawablePixmap(pDstPicture->pDrawable);
+
+ if (pDstPixmap->drawable.width > 2047 ||
+@@ -535,20 +519,35 @@ static Bool R100CheckComposite(int op, PicturePtr pSrcPicture,
+ pDstPixmap->drawable.height));
+ }
+
++ if (pSrcPicture->pDrawable) {
++ /* r100 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
+@@ -624,7 +623,8 @@ static Bool FUNC_NAME(R100PrepareComposite)(int op,
+ 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, colorpitch;
+ uint32_t pp_cntl, blendcntl, cblend, ablend;
+ int pixel_shift;
+@@ -648,12 +648,27 @@ static Bool FUNC_NAME(R100PrepareComposite)(int op,
+
+ CHECK_OFFSET(pDst, 0x0f, "destination");
+
++ if (!pSrc) {
++ pSrc = RADEONSolidPixmap(pScreen, cpu_to_le32(pSrcPicture->pSourcePict->solidFill.color));
++ if (!pSrc)
++ RADEON_FALLBACK("Failed to create solid scratch pixmap\n");
++ }
++
+ if (((dst_pitch >> pixel_shift) & 0x7) != 0)
+ RADEON_FALLBACK(("Bad destination pitch 0x%x\n", (int)dst_pitch));
+
+ 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);
+
+--
+cgit v0.9.0.2-2-gbebe
diff --git a/x11-drivers/xf86-video-ati/files/xf86-video-ati-6.14.4-exa-solid-accel-r200.patch b/x11-drivers/xf86-video-ati/files/xf86-video-ati-6.14.4-exa-solid-accel-r200.patch
new file mode 100644
index 00000000..ff744eec
--- /dev/null
+++ b/x11-drivers/xf86-video-ati/files/xf86-video-ati-6.14.4-exa-solid-accel-r200.patch
@@ -0,0 +1,176 @@
+From 0bda305f7ab2a4720b3fea3f318ab2a73be151e5 Mon Sep 17 00:00:00 2001
+From: Alex Deucher <alexander.deucher@amd.com>
+Date: Fri, 13 Apr 2012 17:28:10 +0000
+Subject: EXA: Support acceleration of solid pictures on R2xx.
+
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
+---
+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);
+
+--
+cgit v0.9.0.2-2-gbebe
diff --git a/x11-drivers/xf86-video-ati/files/xf86-video-ati-6.14.4-exa-solid-accel-r300.patch b/x11-drivers/xf86-video-ati/files/xf86-video-ati-6.14.4-exa-solid-accel-r300.patch
new file mode 100644
index 00000000..819173c5
--- /dev/null
+++ b/x11-drivers/xf86-video-ati/files/xf86-video-ati-6.14.4-exa-solid-accel-r300.patch
@@ -0,0 +1,560 @@
+From d88b9700137ee407c483f263bb55c77cd6f92fef Mon Sep 17 00:00:00 2001
+From: Michel Dänzer <michel.daenzer@amd.com>
+Date: Fri, 13 Apr 2012 07:35:38 +0000
+Subject: EXA: Support acceleration of solid pictures on R3xx-R7xx.
+
+Allocate 1x1 scratch pixmaps to hold the solid picture colours.
+
+Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
+---
+diff --git a/src/r600_exa.c b/src/r600_exa.c
+index e1eb62f..c3ae553 100644
+--- a/src/r600_exa.c
++++ b/src/r600_exa.c
+@@ -901,17 +901,8 @@ static Bool R600CheckCompositeTexture(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 = 8192;
+- max_tex_h = 8192;
+-
+- 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(R600TexFormats) / sizeof(R600TexFormats[0]); i++) {
+ if (R600TexFormats[i].fmt == pPict->format)
+@@ -951,9 +942,7 @@ static Bool R600TextureSetup(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;
+@@ -969,9 +958,16 @@ static Bool R600TextureSetup(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;
+@@ -1170,24 +1166,24 @@ static Bool R600TextureSetup(PicturePtr pPict, PixmapPtr pPix,
+ vs_alu_consts[0] = xFixedToFloat(pPict->transform->matrix[0][0]);
+ vs_alu_consts[1] = xFixedToFloat(pPict->transform->matrix[0][1]);
+ vs_alu_consts[2] = xFixedToFloat(pPict->transform->matrix[0][2]);
+- vs_alu_consts[3] = 1.0 / w;
++ vs_alu_consts[3] = 1.0 / tex_res.w;
+
+ vs_alu_consts[4] = xFixedToFloat(pPict->transform->matrix[1][0]);
+ vs_alu_consts[5] = xFixedToFloat(pPict->transform->matrix[1][1]);
+ vs_alu_consts[6] = xFixedToFloat(pPict->transform->matrix[1][2]);
+- vs_alu_consts[7] = 1.0 / h;
++ vs_alu_consts[7] = 1.0 / tex_res.h;
+ } else {
+ accel_state->is_transform[unit] = FALSE;
+
+ vs_alu_consts[0] = 1.0;
+ vs_alu_consts[1] = 0.0;
+ vs_alu_consts[2] = 0.0;
+- vs_alu_consts[3] = 1.0 / w;
++ vs_alu_consts[3] = 1.0 / tex_res.w;
+
+ vs_alu_consts[4] = 0.0;
+ vs_alu_consts[5] = 1.0;
+ vs_alu_consts[6] = 0.0;
+- vs_alu_consts[7] = 1.0 / h;
++ vs_alu_consts[7] = 1.0 / tex_res.h;
+ }
+
+ /* VS alu constants */
+@@ -1202,33 +1198,30 @@ static Bool R600CheckComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskP
+ {
+ 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(R600BlendOp) / sizeof(R600BlendOp[0])))
+ RADEON_FALLBACK(("Unsupported Composite op 0x%x\n", op));
+
+- if (!pSrcPicture->pDrawable)
+- RADEON_FALLBACK(("Solid or gradient pictures not supported yet\n"));
+-
+- pSrcPixmap = RADEONGetDrawablePixmap(pSrcPicture->pDrawable);
++ if (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 >= 8192 ||
++ pSrcPixmap->drawable.height >= 8192) {
++ 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 (!R600CheckCompositeTexture(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 >= 8192 ||
++ pDstPixmap->drawable.height >= 8192) {
+ RADEON_FALLBACK(("Dest w/h too large (%d,%d).\n",
+ pDstPixmap->drawable.width,
+ pDstPixmap->drawable.height));
+@@ -1237,38 +1230,35 @@ static Bool R600CheckComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskP
+ if (pMaskPicture) {
+ PixmapPtr pMaskPixmap;
+
+- if (!pMaskPicture->pDrawable)
+- RADEON_FALLBACK(("Solid or gradient pictures not supported yet\n"));
++ if (pMaskPicture->pDrawable) {
++ pMaskPixmap = RADEONGetDrawablePixmap(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 >= 8192 ||
++ pMaskPixmap->drawable.height >= 8192) {
++ 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 (R600BlendOp[op].src_alpha &&
+- (R600BlendOp[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 (R600BlendOp[op].src_alpha &&
++ (R600BlendOp[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 (!R600CheckCompositeTexture(pMaskPicture, pDstPicture, op, 1))
+- return FALSE;
++ if (!R600CheckCompositeTexture(pMaskPicture, pDstPicture, op, 1))
++ return FALSE;
++ } else if (pMaskPicture->pSourcePict->type != SourcePictTypeSolidFill)
++ RADEON_FALLBACK(("Gradient pictures not supported yet\n"));
+ }
+
+- if (!R600CheckCompositeTexture(pSrcPicture, pDstPicture, op, 0))
+- return FALSE;
+-
+ if (!R600GetDestFormat(pDstPicture, &tmp1))
+ return FALSE;
+
+@@ -1280,7 +1270,8 @@ static Bool R600PrepareComposite(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;
+@@ -1288,15 +1279,21 @@ static Bool R600PrepareComposite(int op, PicturePtr pSrcPicture,
+ shader_config_t vs_conf, ps_conf;
+ struct r600_accel_object src_obj, mask_obj, dst_obj;
+
+- 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");
++ }
++
+ #if defined(XF86DRM_MODE)
+ if (info->cs) {
+ 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.tiling_flags = radeon_get_pixmap_tiling(pDst);
+ src_obj.tiling_flags = radeon_get_pixmap_tiling(pSrc);
+ dst_obj.surface = radeon_get_pixmap_surface(pDst);
+@@ -1322,7 +1319,16 @@ static Bool R600PrepareComposite(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");
++ }
++ }
++
+ #if defined(XF86DRM_MODE)
+ if (info->cs) {
+ mask_obj.offset = 0;
+@@ -1509,11 +1515,9 @@ static Bool R600PrepareComposite(int op, PicturePtr pSrcPicture,
+ return TRUE;
+ }
+
+-static void R600DoneComposite(PixmapPtr pDst)
++static void R600FinishComposite(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)
+@@ -1527,6 +1531,22 @@ static void R600DoneComposite(PixmapPtr pDst)
+ r600_finish_op(pScrn, vtx_size);
+ }
+
++static void R600DoneComposite(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;
++
++ R600FinishComposite(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 R600Composite(PixmapPtr pDst,
+ int srcX, int srcY,
+ int maskX, int maskY,
+@@ -1543,7 +1563,7 @@ static void R600Composite(PixmapPtr pDst,
+
+ #ifdef XF86DRM_MODE
+ if (info->cs && CS_FULL(info->cs)) {
+- R600DoneComposite(info->accel_state->dst_pix);
++ R600FinishComposite(pScrn, pDst, info->accel_state);
+ radeon_cs_flush_indirect(pScrn);
+ R600PrepareComposite(info->accel_state->composite_op,
+ info->accel_state->src_pic,
+diff --git a/src/radeon_exa_render.c b/src/radeon_exa_render.c
+index e5c231f..b6cc9e4 100644
+--- a/src/radeon_exa_render.c
++++ b/src/radeon_exa_render.c
+@@ -299,8 +299,8 @@ static Bool RADEONSetupSourceTile(PicturePtr pPict,
+ if (repeatType == RepeatNormal || repeatType == RepeatReflect) {
+ Bool badPitch = needMatchingPitch && !RADEONPitchMatches(pPix);
+
+- int w = pPict->pDrawable->width;
+- int h = pPict->pDrawable->height;
++ int w = pPict->pDrawable ? pPict->pDrawable->width : 1;
++ int h = pPict->pDrawable ? pPict->pDrawable->height : 1;
+
+ if (pPict->transform) {
+ if (badPitch)
+@@ -1112,23 +1112,8 @@ static Bool R300CheckCompositeTexture(PicturePtr pPict,
+ ScreenPtr pScreen = pDstPict->pDrawable->pScreen;
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ RADEONInfoPtr info = RADEONPTR(pScrn);
+-
+ unsigned int repeatType = pPict->repeat ? pPict->repeatType : RepeatNone;
+- int w = pPict->pDrawable->width;
+- int h = pPict->pDrawable->height;
+ int i;
+- int max_tex_w, max_tex_h;
+-
+- if (is_r500) {
+- max_tex_w = 4096;
+- max_tex_h = 4096;
+- } else {
+- max_tex_w = 2048;
+- max_tex_h = 2048;
+- }
+-
+- 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(R300TexFormats) / sizeof(R300TexFormats[0]); i++)
+ {
+@@ -1139,7 +1124,7 @@ static Bool R300CheckCompositeTexture(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)) {
+ if (info->cs) {
+ struct radeon_exa_pixmap_priv *driver_priv;
+ PixmapPtr pPix;
+@@ -1181,15 +1166,23 @@ static Bool FUNC_NAME(R300TextureSetup)(PicturePtr pPict, PixmapPtr pPix,
+ {
+ RINFO_FROM_SCREEN(pPix->drawable.pScreen);
+ uint32_t txfilter, txformat0, txformat1, txoffset, txpitch, us_format = 0;
+- int w = pPict->pDrawable->width;
+- int h = pPict->pDrawable->height;
++ int w, h;
+ int i, pixel_shift, out_size = 6;
+- unsigned int repeatType = pPict->repeat ? pPict->repeatType : RepeatNone;
++ unsigned int repeatType;
+ struct radeon_exa_pixmap_priv *driver_priv;
+ ACCEL_PREAMBLE();
+
+ TRACE;
+
++ if (pPict->pDrawable) {
++ w = pPict->pDrawable->width;
++ h = pPict->pDrawable->height;
++ repeatType = pPict->repeat ? pPict->repeatType : RepeatNone;
++ } else {
++ w = h = 1;
++ repeatType = RepeatNormal;
++ }
++
+ txpitch = exaGetPixmapPitch(pPix);
+ txoffset = 0;
+
+@@ -1394,11 +1387,6 @@ static Bool R300CheckComposite(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"));
+-
+- pSrcPixmap = RADEONGetDrawablePixmap(pSrcPicture->pDrawable);
+-
+ if (IS_R500_3D) {
+ max_tex_w = 4096;
+ max_tex_h = 4096;
+@@ -1416,13 +1404,6 @@ static Bool R300CheckComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskP
+ }
+ }
+
+- 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));
+- }
+-
+ pDstPixmap = RADEONGetDrawablePixmap(pDstPicture->pDrawable);
+
+ if (pDstPixmap->drawable.width > max_dst_w ||
+@@ -1432,20 +1413,32 @@ static Bool R300CheckComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskP
+ pDstPixmap->drawable.height));
+ }
+
++ if (pSrcPicture->pDrawable) {
++ pSrcPixmap = RADEONGetDrawablePixmap(pSrcPicture->pDrawable);
++
++ 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));
++ }
++ } 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"));
++ if (pMaskPicture->pDrawable) {
++ pMaskPixmap = RADEONGetDrawablePixmap(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 > 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));
++ }
++ } 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
+@@ -1479,7 +1472,8 @@ static Bool FUNC_NAME(R300PrepareComposite)(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 txenable, colorpitch;
+ uint32_t blendcntl, output_fmt;
+@@ -1508,9 +1502,24 @@ static Bool FUNC_NAME(R300PrepareComposite)(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, TRUE, FALSE))
+ 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);
+
+@@ -2132,7 +2141,7 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture,
+ return TRUE;
+ }
+
+-static void FUNC_NAME(RadeonDoneComposite)(PixmapPtr pDst)
++static void FUNC_NAME(RadeonFinishComposite)(PixmapPtr pDst)
+ {
+ RINFO_FROM_SCREEN(pDst->drawable.pScreen);
+ ACCEL_PREAMBLE();
+@@ -2179,6 +2188,20 @@ static void FUNC_NAME(RadeonDoneComposite)(PixmapPtr pDst)
+ LEAVE_DRAW(0);
+ }
+
++static void FUNC_NAME(RadeonDoneComposite)(PixmapPtr pDst)
++{
++ ScreenPtr pScreen = pDst->drawable.pScreen;
++ RINFO_FROM_SCREEN(pScreen);
++ struct radeon_accel_state *accel_state = info->accel_state;
++
++ FUNC_NAME(RadeonFinishComposite)(pDst);
++
++ 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);
++}
+
+ #ifdef ACCEL_CP
+
+@@ -2257,7 +2280,7 @@ static void FUNC_NAME(RadeonCompositeTile)(ScrnInfoPtr pScrn,
+ if ((info->cs && CS_FULL(info->cs)) ||
+ (!info->cs && (info->cp->indirectBuffer->used + 4 * 32) >
+ info->cp->indirectBuffer->total)) {
+- FUNC_NAME(RadeonDoneComposite)(info->accel_state->dst_pix);
++ FUNC_NAME(RadeonFinishComposite)(info->accel_state->dst_pix);
+ if (info->cs)
+ radeon_cs_flush_indirect(pScrn);
+ else
+diff --git a/src/radeon_exa_shared.c b/src/radeon_exa_shared.c
+index be1d2fa..28dc335 100644
+--- a/src/radeon_exa_shared.c
++++ b/src/radeon_exa_shared.c
+@@ -126,6 +126,25 @@ Bool RADEONCheckBPP(int bpp)
+ return FALSE;
+ }
+
++PixmapPtr RADEONSolidPixmap(ScreenPtr pScreen, uint32_t solid)
++{
++ PixmapPtr pPix = pScreen->CreatePixmap(pScreen, 1, 1, 32, 0);
++ struct radeon_bo *bo;
++
++ exaMoveInPixmap(pPix);
++ bo = radeon_get_pixmap_bo(pPix);
++
++ if (radeon_bo_map(bo, 1)) {
++ pScreen->DestroyPixmap(pPix);
++ return NULL;
++ }
++
++ memcpy(bo->ptr, &solid, 4);
++ radeon_bo_unmap(bo);
++
++ return pPix;
++}
++
+ static Bool radeon_vb_get(ScrnInfoPtr pScrn)
+ {
+ RADEONInfoPtr info = RADEONPTR(pScrn);
+diff --git a/src/radeon_exa_shared.h b/src/radeon_exa_shared.h
+index 7b8b5ca..60a1045 100644
+--- a/src/radeon_exa_shared.h
++++ b/src/radeon_exa_shared.h
+@@ -40,6 +40,7 @@ extern void RADEONVlineHelperClear(ScrnInfoPtr pScrn);
+ extern void RADEONVlineHelperSet(ScrnInfoPtr pScrn, int x1, int y1, int x2, int y2);
+ extern Bool RADEONValidPM(uint32_t pm, int bpp);
+ extern Bool RADEONCheckBPP(int bpp);
++extern PixmapPtr RADEONSolidPixmap(ScreenPtr pScreen, uint32_t solid);
+
+ #define RADEON_TRACE_FALL 0
+ #define RADEON_TRACE_DRAW 0
+--
+cgit v0.9.0.2-2-gbebe
diff --git a/x11-drivers/xf86-video-ati/metadata.xml b/x11-drivers/xf86-video-ati/metadata.xml
new file mode 100644
index 00000000..01c4c004
--- /dev/null
+++ b/x11-drivers/xf86-video-ati/metadata.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+<herd>x11</herd>
+</pkgmetadata>
diff --git a/x11-drivers/xf86-video-ati/xf86-video-ati-6.14.4-r1.ebuild b/x11-drivers/xf86-video-ati/xf86-video-ati-6.14.4-r1.ebuild
new file mode 100644
index 00000000..9ab51577
--- /dev/null
+++ b/x11-drivers/xf86-video-ati/xf86-video-ati-6.14.4-r1.ebuild
@@ -0,0 +1,46 @@
+# Copyright 1999-2012 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/x11-drivers/xf86-video-ati/xf86-video-ati-6.14.4-r1.ebuild,v 1.8 2012/07/12 17:31:31 ranger Exp $
+
+EAPI=4
+
+XORG_DRI=always
+inherit xorg-2
+
+DESCRIPTION="ATI video driver"
+
+KEYWORDS="~alpha amd64 ~ia64 ppc ppc64 ~sparc x86 ~amd64-fbsd ~x86-fbsd"
+IUSE=""
+
+RDEPEND=">=x11-libs/libdrm-2.4.33[video_cards_radeon]"
+DEPEND="${RDEPEND}"
+
+PATCHES=(
+ "${FILESDIR}"/${PN}-6.14.4-exa-solid-accel-r300.patch
+ "${FILESDIR}"/${PN}-6.14.4-exa-solid-accel-evergreen.patch
+ "${FILESDIR}"/${PN}-6.14.4-exa-solid-accel-r100.patch
+ "${FILESDIR}"/${PN}-6.14.4-exa-solid-accel-r200.patch
+)
+
+pkg_setup() {
+ xorg-2_pkg_setup
+ XORG_CONFIGURE_OPTIONS=(
+ --enable-dri
+ --enable-kms
+ --enable-exa
+ )
+}
+
+src_install() {
+ xorg-2_src_install
+
+ # install a modprobe.d file to make sure that KMS
+ # is enabled for the radeon kernel driver
+ # if this package is installed. KMS is now mandatory
+ # but current Sabayon kernels have it disabled to
+ # allow fglrx to work
+ dodir /etc/modprobe.d
+ echo "options radeon modeset=1" > radeon.conf
+ insinto /etc/modprobe.d
+ doins radeon.conf
+}
diff --git a/x11-drivers/xf86-video-ati/xf86-video-ati-6.14.6-r1.ebuild b/x11-drivers/xf86-video-ati/xf86-video-ati-6.14.6-r1.ebuild
new file mode 100644
index 00000000..8d82ae96
--- /dev/null
+++ b/x11-drivers/xf86-video-ati/xf86-video-ati-6.14.6-r1.ebuild
@@ -0,0 +1,43 @@
+# Copyright 1999-2012 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=4
+
+XORG_DRI=always
+XORG_EAUTORECONF=yes
+inherit xorg-2
+
+DESCRIPTION="ATI video driver"
+
+KEYWORDS="~alpha ~amd64 ~ia64 ~ppc ~ppc64 ~sparc ~x86 ~amd64-fbsd ~x86-fbsd"
+IUSE=""
+
+RDEPEND=">=x11-libs/libdrm-2.4.36[video_cards_radeon]"
+DEPEND="${RDEPEND}"
+
+src_prepare() {
+ # disable XAA to allow building against >=xorg-server-1.12.99.902, bug #428094
+ sed -i '/USE_XAA, 1/d' configure.ac || die
+ xorg-2_src_prepare
+}
+
+pkg_setup() {
+ xorg-2_pkg_setup
+ XORG_CONFIGURE_OPTIONS=(
+ --enable-dri
+ --enable-kms
+ --enable-exa
+ )
+}
+
+pkg_preinst() {
+ # "untrack" radeon.conf, starting from kernel 3.6, this is
+ # no longer needed. However, we don't want to break the current
+ # status-quo.
+ cp "${EROOT}/etc/modprobe.d/"{radeon.conf,radeon.conf.untracked} || die
+}
+
+pkg_postinst() {
+ mv "${EROOT}/etc/modprobe.d/"{radeon.conf.untracked,radeon.conf} || die
+}
diff --git a/x11-drivers/xf86-video-ati/xf86-video-ati-7.0.0.ebuild b/x11-drivers/xf86-video-ati/xf86-video-ati-7.0.0.ebuild
new file mode 100644
index 00000000..cf517c11
--- /dev/null
+++ b/x11-drivers/xf86-video-ati/xf86-video-ati-7.0.0.ebuild
@@ -0,0 +1,37 @@
+# Copyright 1999-2012 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=4
+
+XORG_DRI=always
+inherit xorg-2
+
+DESCRIPTION="ATI video driver"
+
+KEYWORDS="~alpha amd64 ~ia64 ~ppc ~ppc64 ~sparc x86"
+IUSE="glamor udev"
+
+RDEPEND=">=x11-libs/libdrm-2.4.36[video_cards_radeon]
+ glamor? ( x11-libs/glamor )
+ udev? ( sys-fs/udev )"
+DEPEND="${RDEPEND}"
+
+src_configure() {
+ XORG_CONFIGURE_OPTIONS=(
+ $(use_enable glamor)
+ $(use_enable udev)
+ )
+ xorg-2_src_configure
+}
+
+pkg_preinst() {
+ # "untrack" radeon.conf, starting from kernel 3.6, this is
+ # no longer needed. However, we don't want to break the current
+ # status-quo.
+ cp "${EROOT}/etc/modprobe.d/"{radeon.conf,radeon.conf.untracked} || die
+}
+
+pkg_postinst() {
+ mv "${EROOT}/etc/modprobe.d/"{radeon.conf.untracked,radeon.conf} || die
+}
diff --git a/x11-drivers/xf86-video-ati/xf86-video-ati-7.1.0.ebuild b/x11-drivers/xf86-video-ati/xf86-video-ati-7.1.0.ebuild
new file mode 100644
index 00000000..7a553de5
--- /dev/null
+++ b/x11-drivers/xf86-video-ati/xf86-video-ati-7.1.0.ebuild
@@ -0,0 +1,41 @@
+# Copyright 1999-2013 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=5
+
+XORG_DRI=always
+inherit xorg-2
+
+DESCRIPTION="ATI video driver"
+
+KEYWORDS="~alpha amd64 ~ia64 ~ppc ~ppc64 ~sparc x86"
+IUSE="glamor udev"
+
+RDEPEND=">=x11-libs/libdrm-2.4.36[video_cards_radeon]
+ glamor? ( x11-libs/glamor )
+ udev? ( virtual/udev )"
+DEPEND="${RDEPEND}"
+
+src_configure() {
+ XORG_CONFIGURE_OPTIONS=(
+ $(use_enable glamor)
+ $(use_enable udev)
+ )
+ xorg-2_src_configure
+}
+
+pkg_preinst() {
+ # "untrack" radeon.conf, starting from kernel 3.6, this is
+ # no longer needed. However, we don't want to break the current
+ # status-quo.
+ if [ -f "${EROOT}/etc/modprobe.d/radeon.conf" ]; then
+ cp "${EROOT}/etc/modprobe.d/"{radeon.conf,radeon.conf.untracked} || die
+ fi
+}
+
+pkg_postinst() {
+ if [ -f "${EROOT}/etc/modprobe.d/radeon.conf.untracked" ]; then
+ mv "${EROOT}/etc/modprobe.d/"{radeon.conf.untracked,radeon.conf} || die
+ fi
+}