.gitignore | 1 NEWS | 35 configure.ac | 34 man/intel.man | 2 src/i965_reg.h | 4 src/i965_render.c | 71 src/intel.h | 9 src/intel_batchbuffer.c | 50 src/intel_dri.c | 13 src/intel_driver.c | 7 src/intel_module.c | 4 src/intel_uxa.c | 28 src/intel_video.c | 38 src/legacy/i810/Makefile.am | 1 src/legacy/i810/i810.h | 14 src/legacy/i810/i810_cursor.c | 19 src/legacy/i810/i810_driver.c | 21 src/legacy/i810/i810_io.c | 133 - src/legacy/i810/xvmc/I810XvMC.c | 2 src/sna/Makefile.am | 8 src/sna/compiler.h | 43 src/sna/gen2_render.c | 982 +++++---- src/sna/gen3_render.c | 781 +++++-- src/sna/gen4_render.c | 281 ++ src/sna/gen5_render.c | 397 ++- src/sna/gen5_render.h | 47 src/sna/gen6_render.c | 371 ++- src/sna/gen7_render.c | 324 ++- src/sna/gen7_render.h | 4 src/sna/kgem.c | 502 +++- src/sna/kgem.h | 56 src/sna/kgem_debug.c | 14 src/sna/kgem_debug_gen2.c | 631 +++++ src/sna/kgem_debug_gen3.c | 1 src/sna/sna.h | 64 src/sna/sna_accel.c | 4316 ++++++++++++++++++++++++++++++++-------- src/sna/sna_blt.c | 741 +++++- src/sna/sna_composite.c | 87 src/sna/sna_damage.c | 666 +++++- src/sna/sna_damage.h | 57 src/sna/sna_display.c | 27 src/sna/sna_dri.c | 110 - src/sna/sna_driver.c | 22 src/sna/sna_glyphs.c | 101 src/sna/sna_gradient.c | 67 src/sna/sna_io.c | 33 src/sna/sna_reg.h | 6 src/sna/sna_render.c | 139 - src/sna/sna_render.h | 60 src/sna/sna_render_inline.h | 8 src/sna/sna_tiling.c | 27 src/sna/sna_trapezoids.c | 4198 ++++++++++++++++++++++++++++---------- src/sna/sna_video.c | 12 src/sna/sna_video_textured.c | 19 src/xvmc/i965_xvmc.c | 2 src/xvmc/intel_batchbuffer.h | 1 src/xvmc/intel_xvmc.c | 2 src/xvmc/xvmc_vld.c | 2 58 files changed, 12080 insertions(+), 3615 deletions(-)
New commits: commit 7237374a03d1e0c2e6c0b2d0eb42afc8df25df0d Author: Chris Wilson <ch...@chris-wilson.co.uk> Date: Sun Oct 30 16:46:10 2011 +0000 configure: Bump version to 2.16.901 diff --git a/configure.ac b/configure.ac index 0a60bd7..102a25a 100644 --- a/configure.ac +++ b/configure.ac @@ -23,7 +23,7 @@ # Initialize Autoconf AC_PREREQ([2.63]) AC_INIT([xf86-video-intel], - [2.16.0], + [2.16.901], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], [xf86-video-intel]) AC_CONFIG_SRCDIR([Makefile.am]) commit 0a78a75e75225d89e465804c482a667840a2c8de Author: Chris Wilson <ch...@chris-wilson.co.uk> Date: Sun Oct 30 16:45:46 2011 +0000 NEWS: Add release notes for 2.16.901 diff --git a/NEWS b/NEWS index 46d0d24..c736d63 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,27 @@ +Snapshot 2.16.901 (2011-10-30) +============================== +This is the first release candidate in preparation for the upcoming +2.17.0 release. We will appreciate any feedback we can get from +testing of this snapshot. + +The basis of this release are to push out a couple of critical stability +fixes for SandyBridge and IvyBridge. There is very little else to see +here. Those 200+ other commits do not exist... + +Bugs fixed in this snapshot (compared to 2.16.0) +-------------------------------------------------- + + * Workaround blitter hang on SandyBridge and IvyBridge + https://bugzilla.kernel.org/show_bug.cgi?id=27892 + https://bugs.freedesktop.org/show_bug.cgi + + * Workaround pipe control issues on SandyBridge + + * Use correct maximum PS thread count on IvyBridge + + * Protect against failed pixmap allocation for XV + https://bugs.freedesktop.org/show_bug.cgi?id=40439 + Release 2.16.0 (2011-08-09) ============================== A new quarter, a new release! The key feature of this release, looking past commit c7552cb819ae8c90975193c159236e0070628dd9 Author: Daniel Vetter <daniel.vet...@ffwll.ch> Date: Sun Oct 30 16:35:14 2011 +0100 i810: kill mmio vga access helpers Signed-Off-by: Daniel Vetter <daniel.vet...@ffwll.ch> diff --git a/src/legacy/i810/Makefile.am b/src/legacy/i810/Makefile.am index 3676da6..a1bdd85 100644 --- a/src/legacy/i810/Makefile.am +++ b/src/legacy/i810/Makefile.am @@ -14,7 +14,6 @@ liblegacy_i810_la_SOURCES = \ i810_dga.c \ i810_driver.c \ i810.h \ - i810_io.c \ i810_memory.c \ i810_reg.h \ i810_ring.h \ diff --git a/src/legacy/i810/i810.h b/src/legacy/i810/i810.h index c3a6255..3a355a3 100644 --- a/src/legacy/i810/i810.h +++ b/src/legacy/i810/i810.h @@ -74,14 +74,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. typedef struct _I810Rec *I810Ptr; -typedef void (*I810WriteIndexedByteFunc)(I810Ptr pI810, IOADDRESS addr, - uint8_t index, uint8_t value); -typedef uint8_t(*I810ReadIndexedByteFunc)(I810Ptr pI810, IOADDRESS addr, - uint8_t index); -typedef void (*I810WriteByteFunc)(I810Ptr pI810, IOADDRESS addr, - uint8_t value); -typedef uint8_t(*I810ReadByteFunc)(I810Ptr pI810, IOADDRESS addr); - extern void I810SetTiledMemory(ScrnInfoPtr pScrn, int nr, unsigned start, unsigned pitch, unsigned size); @@ -215,11 +207,6 @@ typedef struct _I810Rec { CloseScreenProcPtr CloseScreen; ScreenBlockHandlerProcPtr BlockHandler; - I810WriteIndexedByteFunc writeControl; - I810ReadIndexedByteFunc readControl; - I810WriteByteFunc writeStandard; - I810ReadByteFunc readStandard; - Bool directRenderingDisabled; /* DRI disabled in PreInit */ Bool directRenderingEnabled; /* false if XF86DRI not defined. */ diff --git a/src/legacy/i810/i810_driver.c b/src/legacy/i810/i810_driver.c index 9509ae2..d8f7c45 100644 --- a/src/legacy/i810/i810_driver.c +++ b/src/legacy/i810/i810_driver.c @@ -652,8 +652,6 @@ I810PreInit(ScrnInfoPtr pScrn, int flags) } #endif - /* We won't be using the VGA access after the probe */ - I810SetMMIOAccess(pI810); return TRUE; } diff --git a/src/legacy/i810/i810_io.c b/src/legacy/i810/i810_io.c deleted file mode 100644 index 954ed6e..0000000 --- a/src/legacy/i810/i810_io.c +++ /dev/null @@ -1,80 +0,0 @@ -/************************************************************************** - -Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. -All Rights Reserved. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sub license, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice (including the -next paragraph) shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. -IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -**************************************************************************/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -/* - * Authors: - * Daryll Strauss <dar...@precisioninsight.com> - * - */ - -#include "xf86.h" -#include "xf86_OSproc.h" -#include "compiler.h" - -#include "i810.h" - -#define minb(p) *(volatile uint8_t *)(pI810->MMIOBase + (p)) -#define moutb(p,v) *(volatile uint8_t *)(pI810->MMIOBase + (p)) = (v) - -static void -I810WriteControlMMIO(I810Ptr pI810, IOADDRESS addr, uint8_t index, uint8_t val) -{ - moutb(addr, index); - moutb(addr + 1, val); -} - -static uint8_t -I810ReadControlMMIO(I810Ptr pI810, IOADDRESS addr, uint8_t index) -{ - moutb(addr, index); - return minb(addr + 1); -} - -static void -I810WriteStandardMMIO(I810Ptr pI810, IOADDRESS addr, uint8_t val) -{ - moutb(addr, val); -} - -static uint8_t -I810ReadStandardMMIO(I810Ptr pI810, IOADDRESS addr) -{ - return minb(addr); -} - -void -I810SetMMIOAccess(I810Ptr pI810) -{ - pI810->writeControl = I810WriteControlMMIO; - pI810->readControl = I810ReadControlMMIO; - pI810->writeStandard = I810WriteStandardMMIO; - pI810->readStandard = I810ReadStandardMMIO; -} commit e8b8adeab3b2e69a8684217271604a5f658f617d Author: Daniel Vetter <daniel.vet...@ffwll.ch> Date: Sun Oct 30 16:34:05 2011 +0100 i810: use vgahw functions instead of roll-your-own Signed-off-by: Daniel Vetter <daniel.vet...@ffwll.ch> diff --git a/src/legacy/i810/i810_cursor.c b/src/legacy/i810/i810_cursor.c index 898a136..88829cb 100644 --- a/src/legacy/i810/i810_cursor.c +++ b/src/legacy/i810/i810_cursor.c @@ -239,26 +239,29 @@ I810SetCursorColors(ScrnInfoPtr pScrn, int bg, int fg) { int tmp; I810Ptr pI810 = I810PTR(pScrn); + vgaHWPtr hwp; #ifdef ARGB_CURSOR if (pI810->CursorIsARGB) return; #endif + hwp = VGAHWPTR(pScrn); + tmp = INREG8(PIXPIPE_CONFIG_0); tmp |= EXTENDED_PALETTE; OUTREG8(PIXPIPE_CONFIG_0, tmp); - pI810->writeStandard(pI810, DACMASK, 0xFF); - pI810->writeStandard(pI810, DACWX, 0x04); + hwp->writeDacMask(hwp, 0xFF); + hwp->writeDacWriteAddr(hwp, 0x04); - pI810->writeStandard(pI810, DACDATA, (bg & 0x00FF0000) >> 16); - pI810->writeStandard(pI810, DACDATA, (bg & 0x0000FF00) >> 8); - pI810->writeStandard(pI810, DACDATA, (bg & 0x000000FF)); + hwp->writeDacData(hwp, (bg & 0x00FF0000) >> 16); + hwp->writeDacData(hwp, (bg & 0x0000FF00) >> 8); + hwp->writeDacData(hwp, (bg & 0x000000FF)); - pI810->writeStandard(pI810, DACDATA, (fg & 0x00FF0000) >> 16); - pI810->writeStandard(pI810, DACDATA, (fg & 0x0000FF00) >> 8); - pI810->writeStandard(pI810, DACDATA, (fg & 0x000000FF)); + hwp->writeDacData(hwp, (fg & 0x00FF0000) >> 16); + hwp->writeDacData(hwp, (fg & 0x0000FF00) >> 8); + hwp->writeDacData(hwp, (fg & 0x000000FF)); tmp = INREG8(PIXPIPE_CONFIG_0); tmp &= ~EXTENDED_PALETTE; diff --git a/src/legacy/i810/i810_driver.c b/src/legacy/i810/i810_driver.c index 83c999f..9509ae2 100644 --- a/src/legacy/i810/i810_driver.c +++ b/src/legacy/i810/i810_driver.c @@ -790,7 +790,7 @@ DoSave(ScrnInfoPtr pScrn, vgaRegPtr vgaReg, I810RegPtr i810Reg, * into the fields of the vgaI810Rec structure goes here. */ i810Reg->IOControl = hwp->readCrtc(hwp, IO_CTNL); - i810Reg->AddressMapping = pI810->readControl(pI810, GRX, ADDRESS_MAPPING); + i810Reg->AddressMapping = hwp->readGr(hwp, ADDRESS_MAPPING); i810Reg->BitBLTControl = INREG8(BITBLT_CNTL); i810Reg->VideoClk2_M = INREG16(VCLK2_VCO_M); i810Reg->VideoClk2_N = INREG16(VCLK2_VCO_N); @@ -985,10 +985,10 @@ DoRestore(ScrnInfoPtr pScrn, vgaRegPtr vgaReg, I810RegPtr i810Reg, temp |= i810Reg->InterlaceControl; hwp->writeCrtc(hwp, INTERLACE_CNTL, temp); - temp = pI810->readControl(pI810, GRX, ADDRESS_MAPPING); + temp = hwp->readGr(hwp, ADDRESS_MAPPING); temp &= 0xE0; /* Save reserved bits 7:5 */ temp |= i810Reg->AddressMapping; - pI810->writeControl(pI810, GRX, ADDRESS_MAPPING, temp); + hwp->writeGr(hwp, ADDRESS_MAPPING, temp); /* Setting the OVRACT Register for video overlay */ { @@ -2061,6 +2061,7 @@ I810DisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode, I810Ptr pI810; unsigned char SEQ01 = 0; int DPMSSyncSelect = 0; + vgaHWPtr hwp; pI810 = I810PTR(pScrn); switch (PowerManagementMode) { @@ -2086,9 +2087,11 @@ I810DisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode, break; } + hwp = VGAHWPTR(pScrn); + /* Turn the screen on/off */ - SEQ01 |= pI810->readControl(pI810, SRX, 0x01) & ~0x20; - pI810->writeControl(pI810, SRX, 0x01, SEQ01); + SEQ01 |= hwp->readSeq(hwp, 0x01) & ~0x20; + hwp->writeSeq(hwp, 0x01, SEQ01); /* Set the DPMS mode */ OUTREG8(DPMS_SYNC_SELECT, DPMSSyncSelect); commit 4aeea489ed3189d7ebcae4199153c1ae736ebf68 Author: Daniel Vetter <daniel.vet...@ffwll.ch> Date: Sun Oct 30 16:07:45 2011 +0100 i810: rip out PIO access functions All the io done at init time is already converted to libpciaccess Signed-Off-by: Daniel Vetter <daniel.vet...@ffwll.ch> diff --git a/src/legacy/i810/i810.h b/src/legacy/i810/i810.h index 6620695..c3a6255 100644 --- a/src/legacy/i810/i810.h +++ b/src/legacy/i810/i810.h @@ -178,7 +178,6 @@ typedef struct _I810Rec { int Chipset; unsigned long LinearAddr; unsigned long MMIOAddr; - IOADDRESS ioBase; EntityInfoPtr pEnt; struct pci_device *PciInfo; diff --git a/src/legacy/i810/i810_driver.c b/src/legacy/i810/i810_driver.c index 3637e25..83c999f 100644 --- a/src/legacy/i810/i810_driver.c +++ b/src/legacy/i810/i810_driver.c @@ -234,7 +234,6 @@ I810DoDDC(ScrnInfoPtr pScrn, int index) static Bool I810PreInit(ScrnInfoPtr pScrn, int flags) { - vgaHWPtr hwp; I810Ptr pI810; ClockRangePtr clockRanges; int i; @@ -270,8 +269,6 @@ I810PreInit(ScrnInfoPtr pScrn, int flags) /* Allocate a vgaHWRec */ if (!vgaHWGetHWRec(pScrn)) return FALSE; - hwp = VGAHWPTR(pScrn); - pI810->ioBase = hwp->PIOOffset; pI810->PciInfo = xf86GetPciInfoForEntity(pI810->pEnt->index); @@ -378,9 +375,6 @@ I810PreInit(ScrnInfoPtr pScrn, int flags) */ I810DoDDC(pScrn, pI810->pEnt->index); - /* We have to use PIO to probe, because we haven't mapped yet */ - I810SetPIOAccess(pI810); - intel_detect_chipset(pScrn, pI810->PciInfo, &chipset); /* diff --git a/src/legacy/i810/i810_io.c b/src/legacy/i810/i810_io.c index b485cef..954ed6e 100644 --- a/src/legacy/i810/i810_io.c +++ b/src/legacy/i810/i810_io.c @@ -45,43 +45,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define moutb(p,v) *(volatile uint8_t *)(pI810->MMIOBase + (p)) = (v) static void -I810WriteControlPIO(I810Ptr pI810, IOADDRESS addr, uint8_t index, uint8_t val) -{ - addr += pI810->ioBase; - outb(addr, index); - outb(addr + 1, val); -} - -static uint8_t -I810ReadControlPIO(I810Ptr pI810, IOADDRESS addr, uint8_t index) -{ - addr += pI810->ioBase; - outb(addr, index); - return inb(addr + 1); -} - -static void -I810WriteStandardPIO(I810Ptr pI810, IOADDRESS addr, uint8_t val) -{ - outb(pI810->ioBase + addr, val); -} - -static uint8_t -I810ReadStandardPIO(I810Ptr pI810, IOADDRESS addr) -{ - return inb(pI810->ioBase + addr); -} - -void -I810SetPIOAccess(I810Ptr pI810) -{ - pI810->writeControl = I810WriteControlPIO; - pI810->readControl = I810ReadControlPIO; - pI810->writeStandard = I810WriteStandardPIO; - pI810->readStandard = I810ReadStandardPIO; -} - -static void I810WriteControlMMIO(I810Ptr pI810, IOADDRESS addr, uint8_t index, uint8_t val) { moutb(addr, index); commit e735636194671e221eca3e86b9bd06fd0d4b6c5a Author: Daniel Vetter <daniel.vet...@ffwll.ch> Date: Sun Oct 30 15:51:49 2011 +0100 i810: kill dead i830 defines Signed-Off-by: Daniel Vetter <daniel.vet...@ffwll.ch> diff --git a/src/legacy/i810/i810_io.c b/src/legacy/i810/i810_io.c index a6cf305..b485cef 100644 --- a/src/legacy/i810/i810_io.c +++ b/src/legacy/i810/i810_io.c @@ -39,23 +39,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "xf86_OSproc.h" #include "compiler.h" -#ifdef BUILD_FOR_I830 -#include "i830.h" -#define pI810 pI830 -#define I810Ptr I830Ptr -#define I810WriteControlPIO I830WriteControlPIO -#define I810ReadControlPIO I830ReadControlPIO -#define I810WriteStandardPIO I830WriteStandardPIO -#define I810ReadStandardPIO I830ReadStandardPIO -#define I810SetPIOAccess I830SetPIOAccess -#define I810WriteControlMMIO I830WriteControlMMIO -#define I810ReadControlMMIO I830ReadControlMMIO -#define I810WriteStandardMMIO I830WriteStandardMMIO -#define I810ReadStandardMMIO I830ReadStandardMMIO -#define I810SetMMIOAccess I830SetMMIOAccess -#else #include "i810.h" -#endif #define minb(p) *(volatile uint8_t *)(pI810->MMIOBase + (p)) #define moutb(p,v) *(volatile uint8_t *)(pI810->MMIOBase + (p)) = (v) commit bb840ee09fa620648065884306fbe3e0da37ad77 Author: Chris Wilson <ch...@chris-wilson.co.uk> Date: Sun Oct 30 16:13:04 2011 +0000 sna: Convert PolyRectangles to use Box32 For the same overflow protection. Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index 47b8698..c285c97 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -4186,7 +4186,7 @@ sna_poly_rectangle_extents(DrawablePtr drawable, GCPtr gc, int n, xRectangle *r, BoxPtr out) { - BoxRec box; + Box32Rec box; int extra = gc->lineWidth >> 1; bool clipped; @@ -4195,20 +4195,11 @@ sna_poly_rectangle_extents(DrawablePtr drawable, GCPtr gc, box.x1 = r->x; box.y1 = r->y; - box.x2 = r->x + r->width; - box.y2 = r->y + r->height; + box.x2 = box.x1 + r->width; + box.y2 = box.y1 + r->height; - while (--n) { - r++; - if (r->x < box.x1) - box.x1 = r->x; - if (r->x + r->width > box.x2) - box.x2 = r->x + r->width; - if (r->y < box.y1) - box.y1 = r->y; - if (r->y + r->width > box.y2) - box.y2 = r->y + r->height; - } + while (--n) + box32_add_rect(&box, r++); box.x2++; box.y2++; @@ -4220,11 +4211,10 @@ sna_poly_rectangle_extents(DrawablePtr drawable, GCPtr gc, box.y2 += extra; } - if (box_empty(&box)) + clipped = box32_trim_and_translate(&box, drawable, gc); + if (!box32_to_box16(&box, out)) return 0; - clipped = trim_and_translate_box(&box, drawable, gc); - *out = box; return 1 | clipped << 1; } commit af52e234a78bbde964a93ef8cce21f41a5c959f3 Author: Chris Wilson <ch...@chris-wilson.co.uk> Date: Sun Oct 30 15:34:34 2011 +0000 sna: Fix compilation Remember to drink coffee and compile "obvious" fixes before pushing. Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index 3666544..47b8698 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -1086,7 +1086,7 @@ static inline void box32_add_rect(Box32Rec *box, const xRectangle *r) v = r->y; if (box->y1 > v) - box->y1 = ; + box->y1 = v; v += r->height; if (box->y2 < v) box->y2 = v; commit 23b314729c43101e515e2625db2a2401c72c2596 Author: Chris Wilson <ch...@chris-wilson.co.uk> Date: Sun Oct 30 15:24:21 2011 +0000 sna: Rewrite box32_add_rect() to enable int32_t promotion Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index d227184..3666544 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -1077,15 +1077,17 @@ static inline void box32_add_rect(Box32Rec *box, const xRectangle *r) { int32_t v; - if (box->x1 > r->x) - box->x1 = r->x; - v = r->x + r->width; + v = r->x; + if (box->x1 > v) + box->x1 = v; + v += r->width; if (box->x2 < v) box->x2 = v; - if (box->y1 > r->y) - box->y1 = r->y; - v = r->y + r->height; + v = r->y; + if (box->y1 > v) + box->y1 = ; + v += r->height; if (box->y2 < v) box->y2 = v; } commit 427622aca31b7463eb2dcd52e352dc8997e84baa Author: Chris Wilson <ch...@chris-wilson.co.uk> Date: Sun Oct 30 12:02:42 2011 +0000 sna: Push overflow detection to the end of extents Removes a couple of conditionals from the middle of the hotpath and on Intel we are not realising the benefit of only utilising 16-bit values. Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index 3eb0d85..d227184 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -78,6 +78,10 @@ static inline void region_maybe_clip(RegionRec *r, RegionRec *clip) RegionIntersect(r, r, clip); } +typedef struct box32 { + int32_t x1, y1, x2, y2; +} Box32Rec; + #define PM_IS_SOLID(_draw, _pm) \ (((_pm) & FbFullMask((_draw)->depth)) == FbFullMask((_draw)->depth)) @@ -979,6 +983,65 @@ static inline bool trim_and_translate_box(BoxPtr box, DrawablePtr d, GCPtr gc) return clipped; } +static inline bool box32_trim(Box32Rec *box, DrawablePtr d) +{ + bool clipped = false; + + if (box->x1 < 0) + box->x1 = 0, clipped = true; + if (box->x2 > d->width) + box->x2 = d->width, clipped = true; + + if (box->y1 < 0) + box->y1 = 0, clipped = true; + if (box->y2 > d->height) + box->y2 = d->height, clipped = true; + + return clipped; +} + +static inline bool box32_clip(Box32Rec *box, GCPtr gc) +{ + bool clipped = gc->pCompositeClip->data != NULL; + const BoxRec *clip = &gc->pCompositeClip->extents; + + if (box->x1 < clip->x1) + box->x1 = clip->x1, clipped = true; + if (box->x2 > clip->x2) + box->x2 = clip->x2, clipped = true; + + if (box->y1 < clip->y1) + box->y1 = clip->y1, clipped = true; + if (box->y2 > clip->y2) + box->y2 = clip->y2, clipped = true; + + return clipped; +} + +static inline void box32_translate(Box32Rec *box, DrawablePtr d) +{ + box->x1 += d->x; + box->x2 += d->x; + + box->y1 += d->y; + box->y2 += d->y; +} + +static inline bool box32_trim_and_translate(Box32Rec *box, DrawablePtr d, GCPtr gc) +{ + bool clipped; + + if (likely (gc->pCompositeClip)) { + box32_translate(box, d); + clipped = box32_clip(box, gc); + } else { + clipped = box32_trim(box, d); + box32_translate(box, d); + } + + return clipped; +} + static inline void box_add_pt(BoxPtr box, int16_t x, int16_t y) { if (box->x1 > x) @@ -1000,19 +1063,29 @@ static int16_t bound(int16_t a, uint16_t b) return v; } -static inline void box_add_rect(BoxPtr box, const xRectangle *r) +static inline bool box32_to_box16(const Box32Rec *b32, BoxRec *b16) { - int v; + b16->x1 = b32->x1; + b16->y1 = b32->y1; + b16->x2 = b32->x2; + b16->y2 = b32->y2; + + return b16->x2 > b16->x1 && b16->y2 > b16->y1; +} + +static inline void box32_add_rect(Box32Rec *box, const xRectangle *r) +{ + int32_t v; if (box->x1 > r->x) box->x1 = r->x; - v = bound(r->x, r->width); + v = r->x + r->width; if (box->x2 < v) box->x2 = v; if (box->y1 > r->y) box->y1 = r->y; - v =bound(r->y, r->height); + v = r->y + r->height; if (box->y2 < v) box->y2 = v; } @@ -5172,7 +5245,7 @@ sna_poly_fill_rect_extents(DrawablePtr drawable, GCPtr gc, int n, xRectangle *rect, BoxPtr out) { - BoxRec box; + Box32Rec box; bool clipped; if (n == 0) @@ -5181,17 +5254,16 @@ sna_poly_fill_rect_extents(DrawablePtr drawable, GCPtr gc, DBG(("%s: [0] = (%d, %d)x(%d, %d)\n", __FUNCTION__, rect->x, rect->y, rect->width, rect->height)); box.x1 = rect->x; - box.x2 = bound(box.x1, rect->width); + box.x2 = box.x1 + rect->width; box.y1 = rect->y; - box.y2 = bound(box.y1, rect->height); + box.y2 = box.y1 + rect->height; while (--n) - box_add_rect(&box, ++rect); + box32_add_rect(&box, ++rect); - clipped = trim_and_translate_box(&box, drawable, gc); - if (box_empty(&box)) + clipped = box32_trim_and_translate(&box, drawable, gc); + if (!box32_to_box16(&box, out)) return 0; - *out = box; return 1 | clipped << 1; } commit 2d3aba8518ae790325c6123dacc3ce73b6e91cbd Author: Chris Wilson <ch...@chris-wilson.co.uk> Date: Sun Oct 30 11:22:26 2011 +0000 Revert "sna: Don't flush the render caches if in the process of writing again" This reverts commit 15266e1b9500f6b348661c60d1982bde911f2d0e. KDE relies upon the ability to render into a sampler and then render upon itself. Not the first sign of madness... Will have to find another way of winning back the compwinwin performance. diff --git a/src/sna/gen2_render.c b/src/sna/gen2_render.c index f8e71e7..d2a296c 100644 --- a/src/sna/gen2_render.c +++ b/src/sna/gen2_render.c @@ -1375,8 +1375,7 @@ gen2_render_composite(struct sna *sna, NULL)) kgem_submit(&sna->kgem); - if ((tmp->src.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->src.bo)) || - (tmp->mask.bo && tmp->mask.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->mask.bo))) { + if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo)) { if (tmp->src.bo == tmp->dst.bo || tmp->mask.bo == tmp->dst.bo) { kgem_emit_flush(&sna->kgem); } else { diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c index e21ea6c..eca841e 100644 --- a/src/sna/gen3_render.c +++ b/src/sna/gen3_render.c @@ -2479,8 +2479,7 @@ gen3_render_composite(struct sna *sna, NULL)) kgem_submit(&sna->kgem); - if ((tmp->src.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->src.bo)) || - (tmp->mask.bo && tmp->mask.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->mask.bo))) { + if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo)) { if (tmp->src.bo == tmp->dst.bo || tmp->mask.bo == tmp->dst.bo) { kgem_emit_flush(&sna->kgem); } else { diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c index 9fa2278..c603e67 100644 --- a/src/sna/gen4_render.c +++ b/src/sna/gen4_render.c @@ -2058,8 +2058,7 @@ gen4_render_composite(struct sna *sna, NULL)) kgem_submit(&sna->kgem); - if ((tmp->src.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->src.bo)) || - (tmp->mask.bo && tmp->mask.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->mask.bo))) + if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo)) kgem_emit_flush(&sna->kgem); gen4_bind_surfaces(sna, tmp); diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c index b33125c..3006bd1 100644 --- a/src/sna/gen5_render.c +++ b/src/sna/gen5_render.c @@ -2078,8 +2078,7 @@ gen5_render_composite(struct sna *sna, tmp->dst.bo, tmp->src.bo, tmp->mask.bo, NULL)) kgem_submit(&sna->kgem); - if ((tmp->src.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->src.bo)) || - (tmp->mask.bo && tmp->mask.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->mask.bo))) + if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo)) kgem_emit_flush(&sna->kgem); gen5_bind_surfaces(sna, tmp); diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c index 6a132ad..b7f0ed0 100644 --- a/src/sna/gen6_render.c +++ b/src/sna/gen6_render.c @@ -2248,8 +2248,7 @@ gen6_render_composite(struct sna *sna, NULL)) kgem_submit(&sna->kgem); - if ((tmp->src.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->src.bo)) || - (tmp->mask.bo && tmp->mask.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->mask.bo))) + if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo)) kgem_emit_flush(&sna->kgem); gen6_emit_composite_state(sna, tmp); diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c index 3f9e59a..4667bad 100644 --- a/src/sna/gen7_render.c +++ b/src/sna/gen7_render.c @@ -2388,8 +2388,7 @@ gen7_render_composite(struct sna *sna, NULL)) kgem_submit(&sna->kgem); - if ((tmp->src.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->src.bo)) || - (tmp->mask.bo && tmp->mask.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->mask.bo))) + if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo)) kgem_emit_flush(&sna->kgem); gen7_emit_composite_state(sna, tmp); commit d4062705178856cffc83030fa40f758e9d884566 Author: Chris Wilson <ch...@chris-wilson.co.uk> Date: Sun Oct 30 10:40:32 2011 +0000 sna/composite: Fix incorrect operator reduction for RenderFillRectangles As exemplified by KDE (using Kate) on gen3, it would attempt to render a large set of boxes using OVER and a transparent colour. As gen3 copied across some of the BLT assumptions, it was incorrectly reducing that to a CLEAR and thus rendering incorrectly. Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> diff --git a/src/sna/gen2_render.c b/src/sna/gen2_render.c index e76876c..f8e71e7 100644 --- a/src/sna/gen2_render.c +++ b/src/sna/gen2_render.c @@ -1938,20 +1938,19 @@ gen2_render_fill_boxes(struct sna *sna, box, n)) return TRUE; - if (!sna_get_pixel_from_rgba(&pixel, - color->red, - color->green, - color->blue, - color->alpha, - PICT_a8r8g8b8)) + if (op == PictOpClear) + pixel = 0; + else if (!sna_get_pixel_from_rgba(&pixel, + color->red, + color->green, + color->blue, + color->alpha, + PICT_a8r8g8b8)) return FALSE; DBG(("%s: using shader for op=%d, format=%x, pixel=%x\n", __FUNCTION__, op, (int)format, pixel)); - if (pixel == 0) - op = PictOpClear; - memset(&tmp, 0, sizeof(tmp)); tmp.op = op; tmp.dst.pixmap = dst; diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c index efd5d7a..e21ea6c 100644 --- a/src/sna/gen3_render.c +++ b/src/sna/gen3_render.c @@ -3675,6 +3675,23 @@ static inline Bool prefer_fill_blt(struct sna *sna) #endif } +static inline void set_fill_shader(struct sna_composite_channel *c, + uint32_t pixel) +{ + if (pixel == 0) + c->u.gen3.type = SHADER_ZERO; + else if (pixel == 0xff000000) + c->u.gen3.type = SHADER_BLACK; + else if (pixel == 0xffffffff) + c->u.gen3.type = SHADER_WHITE; + else + c->u.gen3.type = SHADER_CONSTANT; + c->u.gen3.mode = pixel; + c->is_affine = 1; + c->alpha_fixup = 0; + c->rb_reversed = 0; +} + static Bool gen3_render_fill_boxes(struct sna *sna, CARD8 op, @@ -3716,20 +3733,20 @@ gen3_render_fill_boxes(struct sna *sna, box, n)) return TRUE; - if (!sna_get_pixel_from_rgba(&pixel, - color->red, - color->green, - color->blue, - color->alpha, - PICT_a8r8g8b8)) - return FALSE; - + if (op == PictOpClear) { + pixel = 0; + } else { + if (!sna_get_pixel_from_rgba(&pixel, + color->red, + color->green, + color->blue, + color->alpha, + PICT_a8r8g8b8)) + return FALSE; + } DBG(("%s: using shader for op=%d, format=%x, pixel=%x\n", __FUNCTION__, op, (int)format, pixel)); - if (pixel == 0) - op = PictOpClear; - tmp.op = op; tmp.dst.pixmap = dst; tmp.dst.width = dst->drawable.width; @@ -3740,11 +3757,7 @@ gen3_render_fill_boxes(struct sna *sna, tmp.floats_per_rect = 6; tmp.rb_reversed = 0; -- To UNSUBSCRIBE, email to debian-x-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/e1rnxuu-0001xh...@vasks.debian.org