ChangeLog | 396 +++++++++++++++++++++++++++ NEWS | 28 + configure.ac | 8 debian/changelog | 2 src/intel_module.c | 9 src/render_program/exa_wm_src_projective.g7a | 4 src/render_program/exa_wm_src_projective.g7b | 2 src/sna/compiler.h | 2 src/sna/gen4_render.c | 17 - src/sna/kgem.c | 22 + src/sna/sna.h | 13 src/sna/sna_accel.c | 32 +- src/sna/sna_composite.c | 1 src/sna/sna_display.c | 1 src/sna/sna_dri.c | 157 +++++++--- src/sna/sna_render.c | 13 src/sna/sna_trapezoids.c | 241 ++++------------ src/sna/sna_video.c | 10 test/.gitignore | 1 19 files changed, 692 insertions(+), 267 deletions(-)
New commits: commit 85bd3c938a63a66947bf237be134f5fdb1d38e63 Author: Timo Aaltonen <tjaal...@ubuntu.com> Date: Mon Feb 25 10:17:08 2013 +0200 bump the changelogs diff --git a/ChangeLog b/ChangeLog index fe63739..27b8f4b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,399 @@ +commit d2442c74b8d41018f260f1da13f3fe5d2795792f +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Wed Feb 20 10:53:57 2013 +0000 + + 2.21.3 release + +commit 2cab7e80eb6955a7f8ea051633f6975a12248b69 +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Wed Feb 20 12:36:22 2013 +0000 + + sna/trapezoids: Clamp cells to valid range + + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +commit 14de90b251dd8a6ff106e989580ef01cf5c2944d +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Wed Feb 20 12:00:54 2013 +0000 + + sna/trapezoids: Embed a few cells into the stack + + Avoid an allocation in the common case where the set of trapezoids is + fairly narrow. + + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +commit 3eca4ea1a5d8ce04598b8d42e93e0dcb93e42e9a +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Wed Feb 20 11:20:54 2013 +0000 + + sna/trapezoids: Perform the cell allocation upfront + + As we know the maximum extents of the trapezoids, we know the maximum + number of cells we will need and so can preallocate them. + + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +commit 9df5e48c582e5c4edffdece75b5395c230a50b09 +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Tue Feb 19 10:08:29 2013 +0000 + + sna/video: Only setup XvMC if we first setup Xv + + Under certain circumstances, XvScreenInit can indeed fail, so do not + bother with creatin XvMC (as it triggers internal assertions if it + cannot find our adaptor amongst Xv's). + + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +commit b6588c48077600a3e015b6d37b101393a806ae1a +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Tue Feb 19 08:59:12 2013 +0000 + + test: Add generated vsync.avi to gitignore + +commit 1e2fd66ade6bdbf1e6011f3d59e423fada3f12f6 +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Tue Feb 19 08:57:47 2013 +0000 + + sna: Assert that the GPU damage is NULL before destroy a proxy + + If the GPU bo is a proxy, then it really is a pointer into a upload + buffer for CPU data. In these cases, there should never be any GPU + damage lying around. + + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +commit d90a123db7ac99cf017167bf89df31c635df7e1e +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Mon Feb 18 20:06:45 2013 +0000 + + sna: Assert that the gpu_bo exists if it is entirely damaged + + This should help catch the error slightly earlier. + + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +commit a03aba6f7f55577e29c6a3267528e2614016222d +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Mon Feb 18 16:12:14 2013 +0000 + + sna: A couple more assertions that we forcibly attach pixmaps correctly + + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +commit 1f16d854264ea923303b79379266bd789fd9dd4d +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Mon Feb 18 14:30:55 2013 +0000 + + sna/dri: Prevent swapping a decoupled DRI2Buffer + + If the DRI2Buffer is no longer valid for the Drawable, for example the + window had just been reparent, just complete the swap without triggering + any assertions. + + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +commit b3ba758a0186c9abc6c0583f52775ea714165134 +Author: Damien Lespiau <damien.lesp...@intel.com> +Date: Thu Feb 14 14:20:19 2013 +0000 + + uxa/gen7: Don't use a message register to store vl + + Turns out the "new" assembler that uses mesa's opcode emission hits the + path that automatically transforms MRF registers into GRF ones in the + exa_wm_src_projective shader. + + The diff with the new assembler is: + + $ intel-gen4disasm -g7 - + - { 0x00600041, 0x208077be, 0x008d03c0, 0x008d0180 }, + + { 0x00600041, 0x2e8077bd, 0x008d03c0, 0x008d0180 }, + mul(8) m4<1>F g30<8,8,1>F g12<8,8,1>F { align1 }; + mul(8) g116<1>F g30<8,8,1>F g12<8,8,1>F { align1 }; + + Of course, message registers are no more in gen7, so the shader is + trying to do something shaddy (ahem!). + + Instead of using m4, let's make exa_wm_src_projective use g68 for v (aka + vl) which makes sense since: + + 1/ vh is g69 + 2/ exa_wm_src_affine uses g68 for vl already + + This commit changes the generated assembly, here's the decoded diff: + + $ intel-gen4disasm -g7 - + - { 0x00600041, 0x208077be, 0x008d03c0, 0x008d0180 }, + + { 0x00600041, 0x288077bd, 0x008d03c0, 0x008d0180 }, + mul(8) m4<1>F g30<8,8,1>F g12<8,8,1>F { align1 }; + mul(8) g68<1>F g30<8,8,1>F g12<8,8,1>F { align1 }; + + Cc: Kenneth Graunke <kenn...@whitecape.org> + Reported-by: Xiang, Haihao <haihao.xi...@intel.com> + Signed-off-by: Damien Lespiau <damien.lesp...@intel.com> + Reviewed-by: Kenneth Graunke <kenn...@whitecape.org> + +commit 43ba22ef4a4142f334e9ae2d926250988ecbe8bc +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Sun Feb 17 09:25:38 2013 +0000 + + Confirm that i915.ko has KMS enabled before binding to the device + + If the kernel has the module, but the KMS module option is not enabled, + we cannot function. So after checking to see if the i915.ko is bound, + then querying whether it provides any KMS resources. If it has no CRTCs + attached, then we need to failover to the VESA/fbdev drivers. Note that + this should have been detected by drmCheckModesettingSupported() + + References: https://bugs.freedesktop.org/show_bug.cgi?id=60987 + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +commit 5a5943e2374a674067e0c48b0fe8a1f2eeff2177 +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Fri Feb 15 12:05:14 2013 +0000 + + NEWS: Xserver 1.6 was not packaged in Xorg 7.7 + + I misinterpreted Sedat Dilek's advice on how to fix my confusing + changelog, so drop the Xorg 7.7 confusion and just refer to the version + of Xserver the driver is first compatible with. + +commit 15e1050ea505c40a288ec197d817d3c6d51693d5 +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Thu Feb 14 21:59:36 2013 +0000 + + NEWS: Fix a couple of typos and factual errors + + Sedat Dilek corrected my spelling and pointed out that what is known as + Xorg 1.6 in the log file is actually better known as releases of + Xserver 1.6 and Xorg 7.7. + +commit 86e025a1842f3c2f319676818b1f4624cd94ebc5 +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Wed Feb 13 22:05:34 2013 +0000 + + sna/gen4: Restore nonrectiinear spans workaround + + Instead of relying on the macro, the intention was simply to use the + prefer_gpu hint. However, I dropped it whilst refactoring ideas from + later generations. So restore both the debug control to force spans as + well as the intended workaround. + + Reported-by: Edward Sheldrake <ejsheldr...@gmail.com> + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +commit f2a64dbdfceac985d235c4873f52013633d6cfd8 +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Wed Feb 13 17:15:46 2013 +0000 + + sna: Avoid stalling on a SHM upload when otherwise idle + + Fixes regresion from + + commit 09ea1f4402b3bd0e411b90eb5575b3ff066d7356 + Author: Chris Wilson <ch...@chris-wilson.co.uk> + Date: Thu Jan 10 16:26:24 2013 +0000 + + sna: Prefer to use the GPU for copies from SHM onto tiled destinations + + As the stalls on IVB 64-bit machines at least greatly offset the + benefits. As those earlier measurements were made on the same IVB + machine but running in 32-bit mode, I need to double-check whether or + not this is another 32-bit peculiarity. + + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +commit 4bf51ec7bcc7818fbee8643a88aebee0362691b2 +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Wed Feb 13 16:32:18 2013 +0000 + + Revert "sna: Avoid promoting SHM CPU bo to GPU to maintain coherence with SHM clients" + + This reverts commit f743cd5734ca502aa8bdb0e1327fe84d6ce82755. + +commit 9861423a76402c260724a752ada293a03ce1a79b +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Wed Feb 13 15:11:45 2013 +0000 + + sna/dri: Fix typo limiting gen4 to TILING_X depth buffers + + Fixes regression from + + commit 98b312e579385e6e4adf6bf0abe20f8ca84592af + Author: Chris Wilson <ch...@chris-wilson.co.uk> + Date: Wed Jan 23 20:51:35 2013 +0000 + + sna/dri: Stop feeding I915_TILING_Y to mesa i915c + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=60178 + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +commit 38a3506aa1c9c2e07125b54fc319b6de89febff9 +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Wed Feb 13 14:09:38 2013 +0000 + + sna: Handle scanouts still active at the time of destruction + + Basically remove the bogus assert, and reorder the list to + preferentially reuse the still active scanouts. + + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +commit 3b82d93162b9e127c6d055d5007e75fcc31f4af8 +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Tue Feb 12 21:53:38 2013 +0000 + + sna/dri: Validate that the scanout flag is set + + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +commit 04e4805f57fdf0581e5e75c29c275c15c79852a3 +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Tue Feb 12 21:52:35 2013 +0000 + + sna: Prefer inplace readback if the GPU doesn't support cacheable BLTs + + As we must perform the GTT reads anyway, first see if we can copy + directly to the destination. + + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +commit 2c569d22d2d243badc15d5dbcc09e6759f4ff01a +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Tue Feb 12 20:15:33 2013 +0000 + + sna: Only use the inplace read fallback if we have no CPU bo support + + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +commit aeaed0b7810e9c794749a4f59c72790063cddc86 +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Tue Feb 12 19:30:44 2013 +0000 + + sna/dri: Assert that we are not passed deceased DRI2Buffers + + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +commit 5fb165b02d47634ccf9fb72ab6fb4d65b89f78d0 +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Mon Feb 11 22:15:17 2013 +0000 + + sna/dri: Assert that the old scanout is clear before overwriting + + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +commit 2667b821e193c0badf16420f82f8a99a93c27a46 +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Mon Feb 11 22:06:00 2013 +0000 + + sna/dri: Update flush status for tear-free exported GPU bo + + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +commit a4442045df9164651702b166e0de2bfd25e8a76f +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Mon Feb 11 21:16:19 2013 +0000 + + sna/dri: Harden the replacement of the back buffer against alloc failure + + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +commit 75406775b83ca5c320e4bc2d2dbd8f1eb0d1677d +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Mon Feb 11 13:00:13 2013 +0000 + + NEWS: Fix marketing name for 945gm + + The GMA3100 was the desktop G31/G33 which whilst almost identical to the + GMA950, notably does not require the extra unfenced alignment. + + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +commit 0b116a1d023ad7cc148d91f268dbf71452dbd9dd +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Mon Feb 11 12:36:43 2013 +0000 + + sna: Fix inaccurate use of __attribute__((const)) + + 'const' is only allowed to use the function parameters and not allowed + to access global memory - that includes not allowed to deference its + arguments... + + Thanks to Jiri Slaby for spotting my mistake. + + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +commit 47657e5355103b2e61da6f059c560e63fe13b0ed +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Mon Feb 11 12:31:18 2013 +0000 + + sna/dri: Ignore a compiler barf breaking an assertion + + Manual confirmation with gdb says all is fine and things work again + after printing the variables responsible. The curious reader is welcome + to read the disassembly to find where the compiler goofed. + + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +commit 3540554e5a74ccd2ca746482700a9f5657954227 +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Mon Feb 11 11:14:17 2013 +0000 + + sna/dri: Couple up the flush pixmap after checking for allocation failures + + Tidy up the error path not to leave the GPU bo pinned and marked for + flushing. + + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +commit 58b61bcd02467d2b08b2dd194ab6884437b83fa6 +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Mon Feb 11 11:05:02 2013 +0000 + + sna/dri: Tighten the assertions that we have one DRI2Buffer per Pixmap + + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +commit a13f806ae28459a5cf671ccbf9cc8725f541a4ba +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Mon Feb 11 10:50:20 2013 +0000 + + sna: Assert that we do not destroy a GPU bo for an active DRI pixmap + + This is an extra paranoid check that the bo is still pinned. + + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +commit c2eb2db83280ae45b8df8a3b6e488b6a1404391a +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Mon Feb 11 10:47:13 2013 +0000 + + sna: Avoid stalling for changing cache levels on an active scanout + + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +commit 696347a6260f3741ad3e6238db0fd285384bb753 +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Mon Feb 11 09:58:58 2013 +0000 + + sna/dri: Only clear the GPU bo flush flag when the last export is destroyed + + Add various assertions around DRI to be sure that we don't change the + GPU bo for a pixmap that does not match our flush bookkeeping. Then be + more careful during the DRI2Buffer destroy that we don't accidentally + remove the flush flag from a shared bo. + + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + +commit 301aebfa71143fb610eb7b816376a8c1f3e07208 +Author: Chris Wilson <ch...@chris-wilson.co.uk> +Date: Sun Feb 10 18:01:33 2013 +0000 + + configure: Add -lX11 required to link the legacy libI810XvMC.so + + Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> + commit 65c320e677b8ab4d745568b33f381d5865bf8b73 Author: Chris Wilson <ch...@chris-wilson.co.uk> Date: Sun Feb 10 14:20:59 2013 +0000 diff --git a/debian/changelog b/debian/changelog index 3e521d6..fbb4834 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -xserver-xorg-video-intel (2:2.21.2-1) UNRELEASED; urgency=low +xserver-xorg-video-intel (2:2.21.3-1) UNRELEASED; urgency=low * New upstream release. commit d2442c74b8d41018f260f1da13f3fe5d2795792f Author: Chris Wilson <ch...@chris-wilson.co.uk> Date: Wed Feb 20 10:53:57 2013 +0000 2.21.3 release diff --git a/NEWS b/NEWS index f1951a7..4c088bd 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,25 @@ +Release 2.21.3 (2013-02-20) +=========================== +A few minor bugfixes, another point release. + + * Fix tracking of DRI pixmaps and their backing bo across reparenting. If + we tried to execute a SwapBuffers after a Window was reparented, but + before the DRI client has updated its references, then we would end up + manipulating an exported pixmap without a flush flag set. In the worst + case, this would culminate in a segfault in the driver. + https://bugs.launchpad.net/ubuntu/+source/xserver-xorg-video-intel/+bug/1127497 + + * Restore the gen4 workarounds for flickering rendering - a few cases still + remain, as the root cause persists. + https://bugs.freedesktop.org/show_bug.cgi?id=60402 + + * Double check that the device has KMS enabled before claiming. This allows + X to gracefully fallback to VESA/fbdev rather than bailing out. + https://bugs.freedesktop.org/show_bug.cgi?id=60987 + + * Fix the UXA render programs for projective transforms on Ivybridge. + + Release 2.21.2 (2013-02-10) =========================== Pass the brown paper bags, I need half a dozen or so. That seemingly diff --git a/configure.ac b/configure.ac index 6aa0e6c..97daee6 100644 --- a/configure.ac +++ b/configure.ac @@ -23,7 +23,7 @@ # Initialize Autoconf AC_PREREQ([2.60]) AC_INIT([xf86-video-intel], - [2.21.2], + [2.21.3], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], [xf86-video-intel]) AC_CONFIG_SRCDIR([Makefile.am]) commit 2cab7e80eb6955a7f8ea051633f6975a12248b69 Author: Chris Wilson <ch...@chris-wilson.co.uk> Date: Wed Feb 20 12:36:22 2013 +0000 sna/trapezoids: Clamp cells to valid range Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c index d0e1bd1..9396baf 100644 --- a/src/sna/sna_trapezoids.c +++ b/src/sna/sna_trapezoids.c @@ -262,6 +262,7 @@ struct cell_list { /* Points to the left-most cell in the scan line. */ struct cell head, tail; + int16_t x1, x2; int16_t count, size; struct cell *cells; struct cell embedded[256]; @@ -331,7 +332,7 @@ cell_list_rewind(struct cell_list *cells) } static bool -cell_list_init(struct cell_list *cells, int width) +cell_list_init(struct cell_list *cells, int x1, int x2) { cells->tail.next = NULL; cells->tail.x = INT_MAX; @@ -339,7 +340,9 @@ cell_list_init(struct cell_list *cells, int width) cells->head.next = &cells->tail; cell_list_rewind(cells); cells->count = 0; - cells->size = width+1; + cells->x1 = x1; + cells->x2 = x2; + cells->size = x2 - x1 + 1; cells->cells = cells->embedded; if (cells->size > ARRAY_SIZE(cells->embedded)) cells->cells = malloc(cells->size * sizeof(struct cell)); @@ -392,6 +395,15 @@ cell_list_find(struct cell_list *cells, int x) if (tail->x == x) return tail; + if (x >= cells->x2) + return &cells->tail; + + if (x < cells->x1) + x = cells->x1; + + if (tail->x == x) + return tail; + do { if (tail->next->x > x) break; @@ -980,7 +992,7 @@ tor_init(struct tor *converter, const BoxRec *box, int num_edges) converter->xmax = box->x2; converter->ymax = box->y2; - if (!cell_list_init(converter->coverages, box->x2 - box->x1)) + if (!cell_list_init(converter->coverages, box->x1, box->x2)) return false; active_list_reset(converter->active); @@ -1135,32 +1147,21 @@ tor_blt(struct sna *sna, int xmin, int xmax, int unbounded) { - struct cell *cell = cells->head.next; + struct cell *cell; BoxRec box; - int cover = 0; - - /* Skip cells to the left of the clip region. */ - while (cell->x < xmin) { - __DBG(("%s: skipping cell (%d, %d, %d)\n", - __FUNCTION__, - cell->x, cell->covered_height, cell->uncovered_area)); - - cover += cell->covered_height; - cell = cell->next; - } - cover *= FAST_SAMPLES_X*2; + int cover; box.y1 = y; box.y2 = y + height; box.x1 = xmin; /* Form the spans from the coverages and areas. */ - for (; cell != NULL; cell = cell->next) { + cover = 0; + for (cell = cells->head.next; cell != &cells->tail; cell = cell->next) { int x = cell->x; - if (x >= xmax) - break; - + assert(x >= xmin); + assert(x < xmax); __DBG(("%s: cell=(%d, %d, %d), cover=%d, max=%d\n", __FUNCTION__, cell->x, cell->covered_height, cell->uncovered_area, cover, xmax)); commit 14de90b251dd8a6ff106e989580ef01cf5c2944d Author: Chris Wilson <ch...@chris-wilson.co.uk> Date: Wed Feb 20 12:00:54 2013 +0000 sna/trapezoids: Embed a few cells into the stack Avoid an allocation in the common case where the set of trapezoids is fairly narrow. Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c index 4ac8b8b..d0e1bd1 100644 --- a/src/sna/sna_trapezoids.c +++ b/src/sna/sna_trapezoids.c @@ -264,6 +264,7 @@ struct cell_list { int16_t count, size; struct cell *cells; + struct cell embedded[256]; }; /* The active list contains edges in the current scan line ordered by @@ -339,14 +340,17 @@ cell_list_init(struct cell_list *cells, int width) cell_list_rewind(cells); cells->count = 0; cells->size = width+1; - cells->cells = malloc(cells->size * sizeof(struct cell)); + cells->cells = cells->embedded; + if (cells->size > ARRAY_SIZE(cells->embedded)) + cells->cells = malloc(cells->size * sizeof(struct cell)); return cells->cells != NULL; } static void cell_list_fini(struct cell_list *cells) { - free(cells->cells); + if (cells->cells != cells->embedded) + free(cells->cells); } inline static void commit 3eca4ea1a5d8ce04598b8d42e93e0dcb93e42e9a Author: Chris Wilson <ch...@chris-wilson.co.uk> Date: Wed Feb 20 11:20:54 2013 +0000 sna/trapezoids: Perform the cell allocation upfront As we know the maximum extents of the trapezoids, we know the maximum number of cells we will need and so can preallocate them. Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c index c547fb5..4ac8b8b 100644 --- a/src/sna/sna_trapezoids.c +++ b/src/sna/sna_trapezoids.c @@ -160,26 +160,6 @@ struct quorem { int32_t rem; }; -struct _pool_chunk { - size_t size; - struct _pool_chunk *prev_chunk; - /* Actual data starts here. Well aligned for pointers. */ -}; - -/* A memory pool. This is supposed to be embedded on the stack or - * within some other structure. It may optionally be followed by an - * embedded array from which requests are fulfilled until - * malloc needs to be called to allocate a first real chunk. */ -struct pool { - struct _pool_chunk *current; - struct _pool_chunk *first_free; - - /* Header for the sentinel chunk. Directly following the pool - * struct should be some space for embedded elements from which - * the sentinel chunk allocates from. */ - struct _pool_chunk sentinel[1]; -}; - struct edge { struct edge *next, *prev; @@ -277,17 +257,13 @@ struct cell { * ascending x. It is geared towards scanning the cells in order * using an internal cursor. */ struct cell_list { + struct cell *cursor; + /* Points to the left-most cell in the scan line. */ struct cell head, tail; - struct cell *cursor; - - /* Cells in the cell list are owned by the cell list and are - * allocated from this pool. */ - struct { - struct pool base[1]; - struct cell embedded[256]; - } cell_pool; + int16_t count, size; + struct cell *cells; }; /* The active list contains edges in the current scan line ordered by @@ -345,103 +321,6 @@ floored_muldivrem(int32_t x, int32_t a, int32_t b) return qr; } -static inline void -_pool_chunk_init(struct _pool_chunk *p, - struct _pool_chunk *prev_chunk) -{ - p->prev_chunk = prev_chunk; - p->size = sizeof(*p); -} - -static struct _pool_chunk * -_pool_chunk_create(struct _pool_chunk *prev_chunk) -{ - size_t size = 256*sizeof(struct cell); - struct _pool_chunk *p; - - p = malloc(size + sizeof(struct _pool_chunk)); - if (unlikely (p == NULL)) - abort(); - - _pool_chunk_init(p, prev_chunk); - return p; -} - -static void -pool_init(struct pool *pool) -{ - pool->current = pool->sentinel; - pool->first_free = NULL; - _pool_chunk_init(pool->sentinel, NULL); -} - -static void -pool_fini(struct pool *pool) -{ - struct _pool_chunk *p = pool->current; - do { - while (NULL != p) { - struct _pool_chunk *prev = p->prev_chunk; - if (p != pool->sentinel) - free(p); - p = prev; - } - p = pool->first_free; - pool->first_free = NULL; - } while (NULL != p); -} - -static void * -_pool_alloc_from_new_chunk(struct pool *pool) -{ - struct _pool_chunk *chunk; - void *obj; - - chunk = pool->first_free; - if (chunk) { - pool->first_free = chunk->prev_chunk; - _pool_chunk_init(chunk, pool->current); - } else { - chunk = _pool_chunk_create(pool->current); - } - pool->current = chunk; - - obj = (unsigned char*)chunk + chunk->size; - chunk->size += sizeof(struct cell); - return obj; -} - -inline static void * -pool_alloc(struct pool *pool) -{ - struct _pool_chunk *chunk = pool->current; - - if (chunk->size < 256*sizeof(struct cell)+sizeof(*chunk)) { - void *obj = (unsigned char*)chunk + chunk->size; - chunk->size += sizeof(struct cell); - return obj; - } else - return _pool_alloc_from_new_chunk(pool); -} - -static void -pool_reset(struct pool *pool) -{ - /* Transfer all used chunks to the chunk free list. */ - struct _pool_chunk *chunk = pool->current; - if (chunk != pool->sentinel) { - while (chunk->prev_chunk != pool->sentinel) - chunk = chunk->prev_chunk; - - chunk->prev_chunk = pool->first_free; - pool->first_free = pool->current; - } - - /* Reset the sentinel as the current chunk. */ - pool->current = pool->sentinel; - pool->sentinel->size = sizeof(*chunk); -} - /* Rewinds the cell list's cursor to the beginning. After rewinding * we're good to cell_list_find() the cell any x coordinate. */ inline static void @@ -450,21 +329,24 @@ cell_list_rewind(struct cell_list *cells) cells->cursor = &cells->head; } -static void -cell_list_init(struct cell_list *cells) +static bool +cell_list_init(struct cell_list *cells, int width) { - pool_init(cells->cell_pool.base); cells->tail.next = NULL; cells->tail.x = INT_MAX; cells->head.x = INT_MIN; cells->head.next = &cells->tail; cell_list_rewind(cells); + cells->count = 0; + cells->size = width+1; + cells->cells = malloc(cells->size * sizeof(struct cell)); + return cells->cells != NULL; } static void cell_list_fini(struct cell_list *cells) { - pool_fini(cells->cell_pool.base); + free(cells->cells); } inline static void @@ -472,7 +354,7 @@ cell_list_reset(struct cell_list *cells) { cell_list_rewind(cells); cells->head.next = &cells->tail; - pool_reset(cells->cell_pool.base); + cells->count = 0; } inline static struct cell * @@ -482,10 +364,11 @@ cell_list_alloc(struct cell_list *cells, { struct cell *cell; - cell = pool_alloc(cells->cell_pool.base); - + assert(cells->count < cells->size); + cell = cells->cells + cells->count++; cell->next = tail->next; tail->next = cell; + cell->x = x; cell->uncovered_area = 0; cell->covered_height = 0; @@ -594,7 +477,7 @@ polygon_fini(struct polygon *polygon) free(polygon->edges); } -static int +static bool polygon_init(struct polygon *polygon, int num_edges, grid_scaled_y_t ymin, @@ -627,11 +510,11 @@ polygon_init(struct polygon *polygon, polygon->ymin = ymin; polygon->ymax = ymax; - return 0; + return true; bail_no_mem: polygon_fini(polygon); - return -1; + return false; } static void @@ -1079,7 +962,7 @@ tor_fini(struct tor *converter) cell_list_fini(converter->coverages); } -static int +static bool tor_init(struct tor *converter, const BoxRec *box, int num_edges) { __DBG(("%s: (%d, %d),(%d, %d) x (%d, %d), num_edges=%d\n", @@ -1093,12 +976,19 @@ tor_init(struct tor *converter, const BoxRec *box, int num_edges) converter->xmax = box->x2; converter->ymax = box->y2; - cell_list_init(converter->coverages); + if (!cell_list_init(converter->coverages, box->x2 - box->x1)) + return false; + active_list_reset(converter->active); - return polygon_init(converter->polygon, + if (!polygon_init(converter->polygon, num_edges, box->y1 * FAST_SAMPLES_Y, - box->y2 * FAST_SAMPLES_Y); + box->y2 * FAST_SAMPLES_Y)) { + cell_list_fini(converter->coverages); + return false; + } + + return true; } static void @@ -4591,7 +4481,7 @@ span_thread(void *arg) const xTrapezoid *t; int n, y1, y2; - if (tor_init(&tor, &thread->extents, 2*thread->ntrap)) + if (!tor_init(&tor, &thread->extents, 2*thread->ntrap)) return; boxes.op = thread->op; @@ -4753,7 +4643,7 @@ trapezoid_span_converter(struct sna *sna, if (num_threads == 1) { struct tor tor; - if (tor_init(&tor, &extents, 2*ntrap)) + if (!tor_init(&tor, &extents, 2*ntrap)) goto skip; for (n = 0; n < ntrap; n++) { @@ -4774,7 +4664,6 @@ trapezoid_span_converter(struct sna *sna, choose_span(&tmp, dst, maskFormat, &clip), !was_clear && maskFormat && !operator_is_bounded(op)); -skip: tor_fini(&tor); } else { struct span_thread threads[num_threads]; @@ -4815,6 +4704,7 @@ skip: sna_threads_wait(); } +skip: tmp.done(sna, &tmp); REGION_UNINIT(NULL, &clip); @@ -4938,7 +4828,7 @@ trapezoid_mask_converter(CARD8 op, PicturePtr src, PicturePtr dst, DBG(("%s: created buffer %p, stride %d\n", __FUNCTION__, scratch->devPrivate.ptr, scratch->devKind)); - if (tor_init(&tor, &extents, 2*ntrap)) { + if (!tor_init(&tor, &extents, 2*ntrap)) { sna_pixmap_destroy(scratch); return true; } @@ -5690,7 +5580,7 @@ static void inplace_x8r8g8b8_thread(void *arg) RegionPtr clip; int y1, y2, n; - if (tor_init(&tor, &thread->extents, 2*thread->ntrap)) + if (!tor_init(&tor, &thread->extents, 2*thread->ntrap)) return; y1 = thread->extents.y1 - thread->dst->pDrawable->y; @@ -5884,7 +5774,7 @@ trapezoid_span_inplace__x8r8g8b8(CARD8 op, struct tor tor; span_func_t span; - if (tor_init(&tor, ®ion.extents, 2*ntrap)) + if (!tor_init(&tor, ®ion.extents, 2*ntrap)) return true; for (n = 0; n < ntrap; n++) { @@ -6037,7 +5927,7 @@ static void inplace_thread(void *arg) struct tor tor; int n; - if (tor_init(&tor, &thread->extents, 2*thread->ntrap)) + if (!tor_init(&tor, &thread->extents, 2*thread->ntrap)) return; for (n = 0; n < thread->ntrap; n++) { @@ -6247,7 +6137,7 @@ trapezoid_span_inplace(struct sna *sna, if (num_threads == 1) { struct tor tor; - if (tor_init(&tor, ®ion.extents, 2*ntrap)) + if (!tor_init(&tor, ®ion.extents, 2*ntrap)) return true; for (n = 0; n < ntrap; n++) { @@ -6385,7 +6275,7 @@ trapezoid_span_fallback(CARD8 op, PicturePtr src, PicturePtr dst, DBG(("%s: created buffer %p, stride %d\n", __FUNCTION__, scratch->devPrivate.ptr, scratch->devKind)); -- 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/e1u9trd-00018r...@vasks.debian.org