diff -Nru xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/.lastcommit xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/.lastcommit --- xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/.lastcommit 2013-01-04 17:57:12.000000000 +0000 +++ xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/.lastcommit 2013-01-07 16:10:00.000000000 +0000 @@ -1 +1 @@ -commit b5b3cfb0ad1cc5e66c99035f526946bf41011e13 +commit b8c9598294eaa16e0d1578ad98896f6ec5ba37cf diff -Nru xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/ChangeLog xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/ChangeLog --- xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/ChangeLog 2013-01-04 17:57:31.000000000 +0000 +++ xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/ChangeLog 2013-01-07 16:12:08.000000000 +0000 @@ -1,9 +1,149 @@ -commit 2589f99439cffb01ebd39272edbdc56b85b026d5 +commit cbf8ef758364462dc20cb3f15925419943409639 Author: Robert Hooker -Date: Fri Jan 4 12:57:12 2013 -0500 +Date: Mon Jan 7 11:10:00 2013 -0500 Add debian tree from origin/ubuntu +commit b8c9598294eaa16e0d1578ad98896f6ec5ba37cf +Author: Chris Wilson +Date: Mon Jan 7 13:57:21 2013 +1000 + + sna: fixup damage posting to be done correctly around slave pixmap + + Copied from commit c789d06cf8a0debc67058d7be1483f5b542e2baa + Author: Dave Airlie + Date: Mon Jan 7 13:57:21 2013 +1000 + + This fixes the damage posting to happen in the correct ordering, + not sure if this fixes anything, but it should make things more consistent. + +commit c789d06cf8a0debc67058d7be1483f5b542e2baa +Author: Dave Airlie +Date: Mon Jan 7 13:57:21 2013 +1000 + + intel: fixup damage posting to be done correctly around slave pixmap + + This fixes the damage posting to happen in the correct ordering, + not sure if this fixes anything, but it should make things more consistent. + + Signed-off-by: Dave Airlie + +commit 5891c89ff2be277d1a833d4bc092b65184c1f3d6 +Author: Dave Airlie +Date: Mon Jan 7 13:54:47 2013 +1000 + + intel: drop pointless error printf in the slave pixmap sync code. + + This is left over and spams logs, get rid. + + Signed-off-by: Dave Airlie + +commit 27550e81482229007fa9e0e9769fdd20f3616b23 +Author: Chris Wilson +Date: Sun Jan 6 17:29:19 2013 +0000 + + sna/dri: Transfer the DRI2 reference to the new TearFree pixmap + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=58814 + Signed-off-by: Chris Wilson + +commit 1a5e4fb725da2eb25cf7f476290c02e9880a4efc +Author: Chris Wilson +Date: Sun Jan 6 17:08:56 2013 +0000 + + sna: Only disable upon a failed pageflip after at least one pipe flips + + If we have yet to update a pipe for a pageflip, then the state remains + consistent and we can fallback to a blit without disabling any pipes. If + we fail after flipping a pipe, then unless we disable an output the + state becomes inconsistent (the pipes disagree on what the attached fb + is). + + Signed-off-by: Chris Wilson + +commit dd66ba8e5666a1ce7da0ddc226d074f591e1fa22 +Author: Chris Wilson +Date: Sun Jan 6 16:13:56 2013 +0000 + + sna: Try to create userptr with the unsync'ed flag set first + + Signed-off-by: Chris Wilson + +commit 9051f43fa3c8d011921ac6ff75b763280f26d98f +Author: Chris Wilson +Date: Sun Jan 6 15:20:14 2013 +0000 + + sna/gen4+: Handle solids passed to the general texcoord emitter + + The general texcoord emitter does handle solids (for the case of a + transformed mask) and so we need to be careful to setup the + VERTEX_ELEMENTS accordingly. + + Fixes regression from + commit 2559cfcc4cbc1d0d84b048565cad3bfee61df8da + Author: Chris Wilson + Date: Wed Jan 2 10:22:14 2013 +0000 + + sna/gen4+: Specialise linear vertex emissio + + Signed-off-by: Chris Wilson + +commit 4af910e8be92e0ca241ce1e93e322c712dcbe340 +Author: Chris Wilson +Date: Sun Jan 6 13:43:55 2013 +0000 + + sna/gen4+: Trim the redundant float from the fill vertices + + Signed-off-by: Chris Wilson + +commit 3244e4b23397f54ca76876dd76ebea9a0abd357e +Author: Chris Wilson +Date: Sun Jan 6 13:24:23 2013 +0000 + + Revert "sna/gen4+: Backport tight vertex packing for simple renderblits" + + This reverts commit 8ff76fad1fadc5e309f9a12c30f883460a432049 and + commit 48e4dc4bd4b2980f0f804f572d0e3fc1bb4bc21e. + + I forgot gen4 and gen5 do not have the 'non-normalized' bit in their + sampler states. + +commit d3be77f87916e38af717bafaf2000becd5180d76 +Author: Chris Wilson +Date: Sat Jan 5 18:07:50 2013 +0000 + + sna/trapezoids: filter out cancelling edges upon insertion to edge-list + + Signed-off-by: Chris Wilson + +commit 2b4a2f52c47a24c297312d51f9a8299c9a54a697 +Author: Chris Wilson +Date: Sat Jan 5 17:21:34 2013 +0000 + + sna/trapezoids: filter out zero-length runs + + Signed-off-by: Chris Wilson + +commit 59a7b8b32c694735942fd7e42c1382d91004b0b1 +Author: Chris Wilson +Date: Fri Jan 4 18:22:14 2013 +0000 + + sna: Clear up the caches after handling a request allocation failure + + Signed-off-by: Chris Wilson + +commit 3c31a9fc210221ba8e7922bec80c15ec39cab7bc +Author: Chris Wilson +Date: Fri Jan 4 18:11:12 2013 +0000 + + sna: Embed the pre-allocation of the static request into the device + + So that in the cache where we are driving multiple independent screens + each having their own device, we do not share the global reserved + request in the event of an allocation failure. + + Signed-off-by: Chris Wilson + commit b5b3cfb0ad1cc5e66c99035f526946bf41011e13 Author: Chris Wilson Date: Thu Jan 3 23:33:44 2013 +0000 diff -Nru xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/debian/changelog xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/debian/changelog --- xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/debian/changelog 2013-01-07 16:24:19.000000000 +0000 +++ xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/debian/changelog 2013-01-07 16:24:19.000000000 +0000 @@ -1,11 +1,12 @@ -xserver-xorg-video-intel (2:2.20.17+git20130104.b5b3cfb0-0ubuntu0sarvatt~quantal) quantal; urgency=low +xserver-xorg-video-intel (2:2.20.17+git20130107.b8c95982-0ubuntu0sarvatt~quantal) quantal; urgency=low - * Checkout from git 20130104 (master branch) up to commit - b5b3cfb0ad1cc5e66c99035f526946bf41011e13 + * Checkout from git 20130107 (master branch) up to commit + b8c9598294eaa16e0d1578ad98896f6ec5ba37cf * Only added debian/ tree from origin/ubuntu + * hook: Refresh 0002-Update-manpage-for-new-accelmethod-option.patch * Note: SNA can now be picked via AccelMethod in xorg.conf. - -- Robert Hooker Fri, 04 Jan 2013 12:57:31 -0500 + -- Robert Hooker Mon, 07 Jan 2013 11:12:08 -0500 xserver-xorg-video-intel (2:2.20.16-0ubuntu1) raring; urgency=low diff -Nru xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/debian/patches/0002-Update-manpage-for-new-accelmethod-option.patch xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/debian/patches/0002-Update-manpage-for-new-accelmethod-option.patch --- xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/debian/patches/0002-Update-manpage-for-new-accelmethod-option.patch 2013-01-07 16:24:19.000000000 +0000 +++ xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/debian/patches/0002-Update-manpage-for-new-accelmethod-option.patch 2013-01-07 16:24:19.000000000 +0000 @@ -1,15 +1,13 @@ +diff --git a/man/intel.man b/man/intel.man +index 16db521..b524b0b 100644 --- a/man/intel.man +++ b/man/intel.man -@@ -57,6 +57,12 @@ The following driver - .B Options - are supported - .TP -+.BI "Option \*qAccelMethod\*q \*q" string \*q -+This sets the acceleration method. The legacy method is uxa, the experimental -+one is sna. -+.IP -+Default: uxa. -+.TP - .BI "Option \*qColorKey\*q \*q" integer \*q - This sets the default pixel value for the YUV video overlay key. +@@ -132,7 +132,7 @@ In addition, there are a pair of sub-options to limit the acceleration for + debuging use. Specify \*qoff\*q to disable all acceleration, or \*qblt\*q to + disable render acceleration and only use the BLT engine. .IP +-Default: use UXA (render acceleration) ++Default: use SNA (render acceleration) + .TP + .BI "Option \*qVideoKey\*q \*q" integer \*q + This is the same as the diff -Nru xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/src/intel_driver.c xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/src/intel_driver.c --- xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/src/intel_driver.c 2013-01-04 17:57:12.000000000 +0000 +++ xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/src/intel_driver.c 2013-01-07 16:10:00.000000000 +0000 @@ -696,6 +696,7 @@ PixmapRegionInit(&pixregion, dirty->slave_dst->master_pixmap); + DamageRegionAppend(&dirty->slave_dst->drawable, &pixregion); PixmapSyncDirtyHelper(dirty, &pixregion); intel_batch_submit(scrn); if (!intel->has_prime_vmap_flush) { @@ -704,9 +705,10 @@ drm_intel_bo_map(bo, FALSE); drm_intel_bo_unmap(bo); xf86UnblockSIGIO(was_blocked); - } - DamageRegionAppend(&dirty->slave_dst->drawable, &pixregion); - RegionUninit(&pixregion); + } + DamageRegionProcessPending(&dirty->slave_dst->drawable); + + RegionUninit(&pixregion); return 0; } @@ -719,7 +721,6 @@ if (xorg_list_is_empty(&screen->pixmap_dirty_list)) return; - ErrorF("list is not empty\n"); xorg_list_for_each_entry(ent, &screen->pixmap_dirty_list, ent) { region = DamageRegion(ent->damage); if (RegionNotEmpty(region)) { diff -Nru xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/src/sna/gen4_render.c xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/src/sna/gen4_render.c --- xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/src/sna/gen4_render.c 2013-01-04 17:57:12.000000000 +0000 +++ xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/src/sna/gen4_render.c 2013-01-07 16:10:00.000000000 +0000 @@ -172,8 +172,6 @@ #define SAMPLER_OFFSET(sf, se, mf, me, k) \ ((((((sf) * EXTEND_COUNT + (se)) * FILTER_COUNT + (mf)) * EXTEND_COUNT + (me)) * KERNEL_COUNT + (k)) * 64) -#define VERTEX_2s2s 0 - static void gen4_emit_pipelined_pointers(struct sna *sna, const struct sna_composite_op *op, @@ -2131,6 +2129,28 @@ gen4_emit_state(sna, op, offset | dirty); } +static void +gen4_render_copy_one(struct sna *sna, + const struct sna_composite_op *op, + int sx, int sy, + int w, int h, + int dx, int dy) +{ + gen4_get_rectangles(sna, op, 1, gen4_copy_bind_surfaces); + + OUT_VERTEX(dx+w, dy+h); + OUT_VERTEX_F((sx+w)*op->src.scale[0]); + OUT_VERTEX_F((sy+h)*op->src.scale[1]); + + OUT_VERTEX(dx, dy+h); + OUT_VERTEX_F(sx*op->src.scale[0]); + OUT_VERTEX_F((sy+h)*op->src.scale[1]); + + OUT_VERTEX(dx, dy); + OUT_VERTEX_F(sx*op->src.scale[0]); + OUT_VERTEX_F(sy*op->src.scale[1]); +} + static bool gen4_render_copy_boxes(struct sna *sna, uint8_t alu, PixmapPtr src, struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy, @@ -2233,20 +2253,20 @@ extents.x2 - extents.x1, extents.y2 - extents.y1)) goto fallback_tiled_dst; - - src_dx += tmp.src.offset[0]; - src_dy += tmp.src.offset[1]; } else { tmp.src.bo = kgem_bo_reference(src_bo); tmp.src.width = src->drawable.width; tmp.src.height = src->drawable.height; + tmp.src.offset[0] = tmp.src.offset[1] = 0; + tmp.src.scale[0] = 1.f/src->drawable.width; + tmp.src.scale[1] = 1.f/src->drawable.height; } tmp.is_affine = true; - tmp.floats_per_vertex = 2; - tmp.floats_per_rect = 6; + tmp.floats_per_vertex = 3; + tmp.floats_per_rect = 9; tmp.u.gen4.wm_kernel = WM_KERNEL; - tmp.u.gen4.ve_id = VERTEX_2s2s; + tmp.u.gen4.ve_id = 2; tmp.u.gen4.sf = 0; if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL)) { @@ -2259,33 +2279,19 @@ dst_dy += tmp.dst.y; tmp.dst.x = tmp.dst.y = 0; + src_dx += tmp.src.offset[0]; + src_dy += tmp.src.offset[1]; + gen4_copy_bind_surfaces(sna, &tmp); gen4_align_vertex(sna, &tmp); do { - int n_this_time; - - n_this_time = gen4_get_rectangles(sna, &tmp, n, - gen4_copy_bind_surfaces); - n -= n_this_time; - - do { - DBG((" (%d, %d) -> (%d, %d) + (%d, %d)\n", - box->x1 + src_dx, box->y1 + src_dy, - box->x1 + dst_dx, box->y1 + dst_dy, - box->x2 - box->x1, box->y2 - box->y1)); - OUT_VERTEX(box->x2 + dst_dx, box->y2 + dst_dy); - OUT_VERTEX(box->x2 + src_dx, box->y2 + src_dy); - - OUT_VERTEX(box->x1 + dst_dx, box->y2 + dst_dy); - OUT_VERTEX(box->x1 + src_dx, box->y2 + src_dy); - - OUT_VERTEX(box->x1 + dst_dx, box->y1 + dst_dy); - OUT_VERTEX(box->x1 + src_dx, box->y1 + src_dy); - - box++; - } while (--n_this_time); - } while (n); + gen4_render_copy_one(sna, &tmp, + box->x1 + src_dx, box->y1 + src_dy, + box->x2 - box->x1, box->y2 - box->y1, + box->x1 + dst_dx, box->y1 + dst_dy); + box++; + } while (--n); gen4_vertex_flush(sna); sna_render_composite_redirect_done(sna, &tmp); @@ -2319,19 +2325,7 @@ int16_t w, int16_t h, int16_t dx, int16_t dy) { - DBG(("%s: src=(%d, %d), dst=(%d, %d), size=(%d, %d)\n", __FUNCTION__, - sx, sy, dx, dy, w, h)); - - gen4_get_rectangles(sna, &op->base, 1, gen4_copy_bind_surfaces); - - OUT_VERTEX(dx+w, dy+h); - OUT_VERTEX(sx+w, sy+h); - - OUT_VERTEX(dx, dy+h); - OUT_VERTEX(sx, sy+h); - - OUT_VERTEX(dx, dy); - OUT_VERTEX(sx, sy); + gen4_render_copy_one(sna, &op->base, sx, sy, w, h, dx, dy); } static void @@ -2339,8 +2333,6 @@ { if (sna->render.vertex_offset) gen4_vertex_flush(sna); - - DBG(("%s()\n", __FUNCTION__)); } static bool @@ -2396,14 +2388,16 @@ gen4_get_card_format(op->base.src.pict_format); op->base.src.width = src->drawable.width; op->base.src.height = src->drawable.height; + op->base.src.scale[0] = 1.f/src->drawable.width; + op->base.src.scale[1] = 1.f/src->drawable.height; op->base.src.filter = SAMPLER_FILTER_NEAREST; op->base.src.repeat = SAMPLER_EXTEND_NONE; op->base.is_affine = true; - op->base.floats_per_vertex = 2; - op->base.floats_per_rect = 6; + op->base.floats_per_vertex = 3; + op->base.floats_per_rect = 9; op->base.u.gen4.wm_kernel = WM_KERNEL; - op->base.u.gen4.ve_id = VERTEX_2s2s; + op->base.u.gen4.ve_id = 2; op->base.u.gen4.sf = 0; if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL)) { @@ -2429,6 +2423,23 @@ return true; } +static void +gen4_render_fill_rectangle(struct sna *sna, + const struct sna_composite_op *op, + int x, int y, int w, int h) +{ + gen4_get_rectangles(sna, op, 1, gen4_bind_surfaces); + + OUT_VERTEX(x+w, y+h); + OUT_VERTEX_F(.5); + + OUT_VERTEX(x, y+h); + OUT_VERTEX_F(.5); + + OUT_VERTEX(x, y); + OUT_VERTEX_F(.5); +} + static bool gen4_render_fill_boxes(struct sna *sna, CARD8 op, @@ -2503,7 +2514,7 @@ tmp.floats_per_vertex = 2; tmp.floats_per_rect = 6; tmp.u.gen4.wm_kernel = WM_KERNEL; - tmp.u.gen4.ve_id = VERTEX_2s2s; + tmp.u.gen4.ve_id = 1; tmp.u.gen4.sf = 0; if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) { @@ -2515,27 +2526,12 @@ gen4_align_vertex(sna, &tmp); do { - int n_this_time; - - n_this_time = gen4_get_rectangles(sna, &tmp, n, - gen4_bind_surfaces); - n -= n_this_time; - - do { - DBG((" (%d, %d), (%d, %d)\n", - box->x1, box->y1, box->x2, box->y2)); - OUT_VERTEX(box->x2, box->y2); - OUT_VERTEX(1, 1); - - OUT_VERTEX(box->x1, box->y2); - OUT_VERTEX(0, 1); - - OUT_VERTEX(box->x1, box->y1); - OUT_VERTEX(0, 0); - - box++; - } while (--n_this_time); - } while (n); + gen4_render_fill_rectangle(sna, &tmp, + box->x1, box->y1, + box->x2 - box->x1, + box->y2 - box->y1); + box++; + } while (--n); gen4_vertex_flush(sna); kgem_bo_destroy(&sna->kgem, tmp.src.bo); @@ -2543,22 +2539,10 @@ } static void -gen4_render_fill_op_blt(struct sna *sna, - const struct sna_fill_op *op, +gen4_render_fill_op_blt(struct sna *sna, const struct sna_fill_op *op, int16_t x, int16_t y, int16_t w, int16_t h) { - DBG(("%s (%d, %d)x(%d, %d)\n", __FUNCTION__, x,y,w,h)); - - gen4_get_rectangles(sna, &op->base, 1, gen4_bind_surfaces); - - OUT_VERTEX(x+w, y+h); - OUT_VERTEX(1, 1); - - OUT_VERTEX(x, y+h); - OUT_VERTEX(0, 1); - - OUT_VERTEX(x, y); - OUT_VERTEX(0, 0); + gen4_render_fill_rectangle(sna, &op->base, x, y, w, h); } fastcall static void @@ -2566,19 +2550,9 @@ const struct sna_fill_op *op, const BoxRec *box) { - DBG(("%s: (%d, %d),(%d, %d)\n", __FUNCTION__, - box->x1, box->y1, box->x2, box->y2)); - - gen4_get_rectangles(sna, &op->base, 1, gen4_bind_surfaces); - - OUT_VERTEX(box->x2, box->y2); - OUT_VERTEX(1, 1); - - OUT_VERTEX(box->x1, box->y2); - OUT_VERTEX(0, 1); - - OUT_VERTEX(box->x1, box->y1); - OUT_VERTEX(0, 0); + gen4_render_fill_rectangle(sna, &op->base, + box->x1, box->y1, + box->x2-box->x1, box->y2-box->y1); } fastcall static void @@ -2587,28 +2561,12 @@ const BoxRec *box, int nbox) { - DBG(("%s: (%d, %d),(%d, %d)... x %d\n", __FUNCTION__, - box->x1, box->y1, box->x2, box->y2, nbox)); - do { - int nbox_this_time; - - nbox_this_time = gen4_get_rectangles(sna, &op->base, nbox, - gen4_bind_surfaces); - nbox -= nbox_this_time; - - do { - OUT_VERTEX(box->x2, box->y2); - OUT_VERTEX(1, 1); - - OUT_VERTEX(box->x1, box->y2); - OUT_VERTEX(0, 1); - - OUT_VERTEX(box->x1, box->y1); - OUT_VERTEX(0, 0); - box++; - } while (--nbox_this_time); - } while (nbox); + gen4_render_fill_rectangle(sna, &op->base, + box->x1, box->y1, + box->x2-box->x1, box->y2-box->y1); + box++; + } while (--nbox); } static void @@ -2617,8 +2575,6 @@ if (sna->render.vertex_offset) gen4_vertex_flush(sna); kgem_bo_destroy(&sna->kgem, op->base.src.bo); - - DBG(("%s()\n", __FUNCTION__)); } static bool @@ -2664,7 +2620,7 @@ op->base.floats_per_vertex = 2; op->base.floats_per_rect = 6; op->base.u.gen4.wm_kernel = WM_KERNEL; - op->base.u.gen4.ve_id = VERTEX_2s2s; + op->base.u.gen4.ve_id = 1; op->base.u.gen4.sf = 0; if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) { @@ -2744,7 +2700,7 @@ tmp.need_magic_ca_pass = false; tmp.u.gen4.wm_kernel = WM_KERNEL; - tmp.u.gen4.ve_id = VERTEX_2s2s; + tmp.u.gen4.ve_id = 1; tmp.u.gen4.sf = 0; if (!kgem_check_bo(&sna->kgem, bo, NULL)) { @@ -2755,17 +2711,7 @@ gen4_bind_surfaces(sna, &tmp); gen4_align_vertex(sna, &tmp); - gen4_get_rectangles(sna, &tmp, 1, gen4_bind_surfaces); - - DBG((" (%d, %d), (%d, %d)\n", x1, y1, x2, y2)); - OUT_VERTEX(x2, y2); - OUT_VERTEX(1, 1); - - OUT_VERTEX(x1, y2); - OUT_VERTEX(0, 1); - - OUT_VERTEX(x1, y1); - OUT_VERTEX(0, 0); + gen4_render_fill_rectangle(sna, &tmp, x1, y1, x2 - x1, y2 - y1); gen4_vertex_flush(sna); kgem_bo_destroy(&sna->kgem, tmp.src.bo); diff -Nru xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/src/sna/gen4_source.c xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/src/sna/gen4_source.c --- xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/src/sna/gen4_source.c 2013-01-04 17:57:12.000000000 +0000 +++ xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/src/sna/gen4_source.c 2013-01-07 16:10:00.000000000 +0000 @@ -44,6 +44,7 @@ channel->repeat = RepeatNormal; channel->is_affine = true; channel->is_solid = true; + channel->is_opaque = (color >> 24) == 0xff; channel->transform = NULL; channel->width = 1; channel->height = 1; @@ -57,7 +58,6 @@ return channel->bo != NULL; } - bool gen4_channel_init_linear(struct sna *sna, PicturePtr picture, diff -Nru xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/src/sna/gen4_vertex.c xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/src/sna/gen4_vertex.c --- xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/src/sna/gen4_vertex.c 2013-01-04 17:57:12.000000000 +0000 +++ xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/src/sna/gen4_vertex.c 2013-01-07 16:10:00.000000000 +0000 @@ -780,6 +780,7 @@ tmp->floats_per_vertex = 5; vb = 2 << 2 | 2; } else { + DBG(("%s: projective source, identity mask\n", __FUNCTION__)); tmp->prim_emit = emit_primitive_mask; tmp->floats_per_vertex = 6; vb = 2 << 2 | 3; @@ -787,9 +788,29 @@ } else { tmp->prim_emit = emit_primitive_mask; tmp->floats_per_vertex = 1; - tmp->floats_per_vertex += 2 + !tmp->mask.is_affine; - tmp->floats_per_vertex += 2 + !tmp->src.is_affine; - vb = (2 + !tmp->src.is_affine) | (2 + !tmp->mask.is_affine) << 2; + vb = 0; + if (tmp->mask.is_solid) { + tmp->floats_per_vertex += 1; + vb |= 1 << 2; + } else if (tmp->mask.is_affine) { + tmp->floats_per_vertex += 2; + vb |= 2 << 2; + }else { + tmp->floats_per_vertex += 3; + vb |= 3 << 2; + } + if (tmp->src.is_solid) { + tmp->floats_per_vertex += 1; + vb |= 1; + } else if (tmp->src.is_affine) { + tmp->floats_per_vertex += 2; + vb |= 2 ; + }else { + tmp->floats_per_vertex += 3; + vb |= 3; + } + DBG(("%s: general mask: floats-per-vertex=%d, vb=%x\n", + __FUNCTION__,tmp->floats_per_vertex, vb)); } } else { if (tmp->src.is_solid) { @@ -800,6 +821,7 @@ tmp->floats_per_vertex = 2; vb = 1; } else if (tmp->src.is_linear) { + DBG(("%s: linear, no mask\n", __FUNCTION__)); tmp->prim_emit = emit_primitive_linear; tmp->floats_per_vertex = 2; vb = 1; @@ -821,6 +843,8 @@ tmp->floats_per_vertex = 3; vb = 2; } else { + DBG(("%s: projective src, no mask\n", __FUNCTION__)); + assert(!tmp->src.is_solid); tmp->prim_emit = emit_primitive; tmp->floats_per_vertex = 4; vb = 3; diff -Nru xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/src/sna/gen5_render.c xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/src/sna/gen5_render.c --- xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/src/sna/gen5_render.c 2013-01-04 17:57:12.000000000 +0000 +++ xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/src/sna/gen5_render.c 2013-01-07 16:10:00.000000000 +0000 @@ -166,8 +166,6 @@ #define SAMPLER_OFFSET(sf, se, mf, me, k) \ ((((((sf) * EXTEND_COUNT + (se)) * FILTER_COUNT + (mf)) * EXTEND_COUNT + (me)) * KERNEL_COUNT + (k)) * 64) -#define VERTEX_2s2s 0 - static bool gen5_emit_pipelined_pointers(struct sna *sna, const struct sna_composite_op *op, @@ -807,7 +805,7 @@ uint32_t key; DBG(("%s: has_mask=%d, src=(%d, %d), mask=(%d, %d),kernel=%d, blend=%d, ca=%d, format=%x\n", - __FUNCTION__, op->u.gen4.ve_id & 2, + __FUNCTION__, op->u.gen5.ve_id & 2, op->src.filter, op->src.repeat, op->mask.filter, op->mask.repeat, kernel, blend, op->has_component_alpha, (int)op->dst.format)); @@ -1020,7 +1018,7 @@ op->src.card_format, false); if (op->mask.bo) { - assert(op->u.gen4.ve_id >> 2); + assert(op->u.gen5.ve_id >> 2); binding_table[2] = gen5_bind_bo(sna, op->mask.bo, @@ -2206,20 +2204,20 @@ extents.x2 - extents.x1, extents.y2 - extents.y1)) goto fallback_tiled_dst; - - src_dx += tmp.src.offset[0]; - src_dy += tmp.src.offset[1]; } else { tmp.src.bo = kgem_bo_reference(src_bo); tmp.src.width = src->drawable.width; tmp.src.height = src->drawable.height; + tmp.src.offset[0] = tmp.src.offset[1] = 0; + tmp.src.scale[0] = 1.f/src->drawable.width; + tmp.src.scale[1] = 1.f/src->drawable.height; } tmp.is_affine = true; - tmp.floats_per_vertex = 2; - tmp.floats_per_rect = 6; + tmp.floats_per_vertex = 3; + tmp.floats_per_rect = 9; tmp.u.gen5.wm_kernel = WM_KERNEL; - tmp.u.gen5.ve_id = VERTEX_2s2s; + tmp.u.gen5.ve_id = 2; if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL)) { kgem_submit(&sna->kgem); @@ -2231,6 +2229,9 @@ dst_dy += tmp.dst.y; tmp.dst.x = tmp.dst.y = 0; + src_dx += tmp.src.offset[0]; + src_dy += tmp.src.offset[1]; + gen5_copy_bind_surfaces(sna, &tmp); gen5_align_vertex(sna, &tmp); @@ -2247,13 +2248,16 @@ box->x1 + dst_dx, box->y1 + dst_dy, box->x2 - box->x1, box->y2 - box->y1)); OUT_VERTEX(box->x2 + dst_dx, box->y2 + dst_dy); - OUT_VERTEX(box->x2 + src_dx, box->y2 + src_dy); + OUT_VERTEX_F((box->x2 + src_dx) * tmp.src.scale[0]); + OUT_VERTEX_F((box->y2 + src_dy) * tmp.src.scale[1]); OUT_VERTEX(box->x1 + dst_dx, box->y2 + dst_dy); - OUT_VERTEX(box->x1 + src_dx, box->y2 + src_dy); + OUT_VERTEX_F((box->x1 + src_dx) * tmp.src.scale[0]); + OUT_VERTEX_F((box->y2 + src_dy) * tmp.src.scale[1]); OUT_VERTEX(box->x1 + dst_dx, box->y1 + dst_dy); - OUT_VERTEX(box->x1 + src_dx, box->y1 + src_dy); + OUT_VERTEX_F((box->x1 + src_dx) * tmp.src.scale[0]); + OUT_VERTEX_F((box->y1 + src_dy) * tmp.src.scale[1]); box++; } while (--n_this_time); @@ -2297,13 +2301,16 @@ gen5_get_rectangles(sna, &op->base, 1, gen5_copy_bind_surfaces); OUT_VERTEX(dx+w, dy+h); - OUT_VERTEX(sx+w, sy+h); + OUT_VERTEX_F((sx+w)*op->base.src.scale[0]); + OUT_VERTEX_F((sy+h)*op->base.src.scale[1]); OUT_VERTEX(dx, dy+h); - OUT_VERTEX(sx, sy+h); + OUT_VERTEX_F(sx*op->base.src.scale[0]); + OUT_VERTEX_F((sy+h)*op->base.src.scale[1]); OUT_VERTEX(dx, dy); - OUT_VERTEX(sx, sy); + OUT_VERTEX_F(sx*op->base.src.scale[0]); + OUT_VERTEX_F(sy*op->base.src.scale[1]); } static void @@ -2365,14 +2372,16 @@ gen5_get_card_format(op->base.src.pict_format); op->base.src.width = src->drawable.width; op->base.src.height = src->drawable.height; + op->base.src.scale[0] = 1.f/src->drawable.width; + op->base.src.scale[1] = 1.f/src->drawable.height; op->base.src.filter = SAMPLER_FILTER_NEAREST; op->base.src.repeat = SAMPLER_EXTEND_NONE; op->base.is_affine = true; - op->base.floats_per_vertex = 2; - op->base.floats_per_rect = 6; + op->base.floats_per_vertex = 3; + op->base.floats_per_rect = 9; op->base.u.gen5.wm_kernel = WM_KERNEL; - op->base.u.gen5.ve_id = VERTEX_2s2s; + op->base.u.gen5.ve_id = 2; if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL)) { kgem_submit(&sna->kgem); @@ -2522,7 +2531,7 @@ tmp.floats_per_vertex = 2; tmp.floats_per_rect = 6; tmp.u.gen5.wm_kernel = WM_KERNEL; - tmp.u.gen5.ve_id = VERTEX_2s2s; + tmp.u.gen5.ve_id = 1; if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) { kgem_submit(&sna->kgem); @@ -2543,13 +2552,13 @@ DBG((" (%d, %d), (%d, %d)\n", box->x1, box->y1, box->x2, box->y2)); OUT_VERTEX(box->x2, box->y2); - OUT_VERTEX(1, 1); + OUT_VERTEX_F(.5); OUT_VERTEX(box->x1, box->y2); - OUT_VERTEX(0, 1); + OUT_VERTEX_F(.5); OUT_VERTEX(box->x1, box->y1); - OUT_VERTEX(0, 0); + OUT_VERTEX_F(.5); box++; } while (--n_this_time); @@ -2570,13 +2579,13 @@ gen5_get_rectangles(sna, &op->base, 1, gen5_fill_bind_surfaces); OUT_VERTEX(x+w, y+h); - OUT_VERTEX(1, 1); + OUT_VERTEX_F(.5); OUT_VERTEX(x, y+h); - OUT_VERTEX(0, 1); + OUT_VERTEX_F(.5); OUT_VERTEX(x, y); - OUT_VERTEX(0, 0); + OUT_VERTEX_F(.5); } fastcall static void @@ -2590,13 +2599,13 @@ gen5_get_rectangles(sna, &op->base, 1, gen5_fill_bind_surfaces); OUT_VERTEX(box->x2, box->y2); - OUT_VERTEX(1, 1); + OUT_VERTEX_F(.5); OUT_VERTEX(box->x1, box->y2); - OUT_VERTEX(0, 1); + OUT_VERTEX_F(.5); OUT_VERTEX(box->x1, box->y1); - OUT_VERTEX(0, 0); + OUT_VERTEX_F(.5); } fastcall static void @@ -2617,13 +2626,13 @@ do { OUT_VERTEX(box->x2, box->y2); - OUT_VERTEX(1, 1); + OUT_VERTEX_F(.5); OUT_VERTEX(box->x1, box->y2); - OUT_VERTEX(0, 1); + OUT_VERTEX_F(.5); OUT_VERTEX(box->x1, box->y1); - OUT_VERTEX(0, 0); + OUT_VERTEX_F(.5); box++; } while (--nbox_this_time); } while (nbox); @@ -2692,7 +2701,7 @@ op->base.floats_per_vertex = 2; op->base.floats_per_rect = 6; op->base.u.gen5.wm_kernel = WM_KERNEL; - op->base.u.gen5.ve_id = VERTEX_2s2s; + op->base.u.gen5.ve_id = 1; if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) { kgem_submit(&sna->kgem); @@ -2783,7 +2792,7 @@ tmp.need_magic_ca_pass = false; tmp.u.gen5.wm_kernel = WM_KERNEL; - tmp.u.gen5.ve_id = VERTEX_2s2s; + tmp.u.gen5.ve_id = 1; if (!kgem_check_bo(&sna->kgem, bo, NULL)) { _kgem_submit(&sna->kgem); @@ -2797,13 +2806,13 @@ DBG((" (%d, %d), (%d, %d)\n", x1, y1, x2, y2)); OUT_VERTEX(x2, y2); - OUT_VERTEX(1, 1); + OUT_VERTEX_F(.5); OUT_VERTEX(x1, y2); - OUT_VERTEX(0, 1); + OUT_VERTEX_F(.5); OUT_VERTEX(x1, y1); - OUT_VERTEX(0, 0); + OUT_VERTEX_F(.5); gen4_vertex_flush(sna); kgem_bo_destroy(&sna->kgem, tmp.src.bo); @@ -2890,7 +2899,7 @@ sna->render_state.gen5.needs_invariant = true; sna->render_state.gen5.ve_id = -1; sna->render_state.gen5.last_primitive = -1; - sna->render_state.gen5.last_pipelined_pointers = -1; + sna->render_state.gen5.last_pipelined_pointers = 0; sna->render_state.gen5.drawrect_offset = -1; sna->render_state.gen5.drawrect_limit = -1; diff -Nru xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/src/sna/gen5_render.h xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/src/sna/gen5_render.h --- xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/src/sna/gen5_render.h 2013-01-04 17:57:12.000000000 +0000 +++ xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/src/sna/gen5_render.h 2013-01-07 16:10:00.000000000 +0000 @@ -1989,50 +1989,43 @@ uint8_t color[4]; }; -struct gen5_sampler_state -{ - - struct - { - unsigned int shadow_function:3; - unsigned int lod_bias:11; - unsigned int min_filter:3; - unsigned int mag_filter:3; - unsigned int mip_filter:2; - unsigned int base_level:5; +struct gen5_sampler_state { + struct { + unsigned int shadow_function:3; + unsigned int lod_bias:11; + unsigned int min_filter:3; + unsigned int mag_filter:3; + unsigned int mip_filter:2; + unsigned int base_level:5; unsigned int pad:1; - unsigned int lod_preclamp:1; - unsigned int border_color_mode:1; + unsigned int lod_preclamp:1; + unsigned int border_color_mode:1; unsigned int pad0:1; - unsigned int disable:1; + unsigned int disable:1; } ss0; - struct - { - unsigned int r_wrap_mode:3; - unsigned int t_wrap_mode:3; - unsigned int s_wrap_mode:3; + struct { + unsigned int r_wrap_mode:3; + unsigned int t_wrap_mode:3; + unsigned int s_wrap_mode:3; unsigned int pad:3; - unsigned int max_lod:10; - unsigned int min_lod:10; + unsigned int max_lod:10; + unsigned int min_lod:10; } ss1; - - struct - { + struct { unsigned int pad:5; - unsigned int border_color_pointer:27; + unsigned int border_color_pointer:27; } ss2; - - struct - { - unsigned int pad:19; - unsigned int max_aniso:3; - unsigned int chroma_key_mode:1; - unsigned int chroma_key_index:2; - unsigned int chroma_key_enable:1; - unsigned int monochrome_filter_width:3; - unsigned int monochrome_filter_height:3; + + struct { + uint32_t pad:13; + uint32_t address_round:6; + uint32_t max_aniso:3; + uint32_t chroma_key_mode:1; + uint32_t chroma_key_index:2; + uint32_t chroma_key_enable:1; + uint32_t mbz:6; } ss3; }; diff -Nru xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/src/sna/kgem.c xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/src/sna/kgem.c --- xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/src/sna/kgem.c 2013-01-04 17:57:12.000000000 +0000 +++ xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/src/sna/kgem.c 2013-01-07 16:10:00.000000000 +0000 @@ -125,7 +125,8 @@ uint64_t user_ptr; uint32_t user_size; uint32_t flags; -#define I915_USERPTR_READ_ONLY 0x1 +#define I915_USERPTR_READ_ONLY (1<<0) +#define I915_USERPTR_UNSYNCHRONIZED (1<<31) uint32_t handle; }; @@ -230,14 +231,17 @@ VG_CLEAR(arg); arg.user_ptr = (uintptr_t)ptr; arg.user_size = size; - arg.flags = 0; + arg.flags = I915_USERPTR_UNSYNCHRONIZED; if (read_only) arg.flags |= I915_USERPTR_READ_ONLY; if (drmIoctl(fd, LOCAL_IOCTL_I915_GEM_USERPTR, &arg)) { - DBG(("%s: failed to map %p + %d bytes: %d\n", - __FUNCTION__, ptr, size, errno)); - return 0; + arg.flags &= ~I915_USERPTR_UNSYNCHRONIZED; + if (drmIoctl(fd, LOCAL_IOCTL_I915_GEM_USERPTR, &arg)) { + DBG(("%s: failed to map %p + %d bytes: %d\n", + __FUNCTION__, ptr, size, errno)); + return 0; + } } return arg.handle; @@ -572,9 +576,7 @@ return __kgem_bo_init(bo, handle, num_pages); } -static struct kgem_request _kgem_static_request; - -static struct kgem_request *__kgem_request_alloc(void) +static struct kgem_request *__kgem_request_alloc(struct kgem *kgem) { struct kgem_request *rq; @@ -584,7 +586,7 @@ } else { rq = malloc(sizeof(*rq)); if (rq == NULL) - rq = &_kgem_static_request; + rq = &kgem->static_request; } list_init(&rq->buffers); @@ -1061,7 +1063,7 @@ DBG(("%s: half cpu cache %d pages\n", __FUNCTION__, kgem->half_cpu_cache_pages)); - kgem->next_request = __kgem_request_alloc(); + kgem->next_request = __kgem_request_alloc(kgem); DBG(("%s: cpu bo enabled %d: llc? %d, set-cache-level? %d, userptr? %d\n", __FUNCTION__, !DBG_NO_CPU && (kgem->has_llc | kgem->has_userptr | kgem->has_cacheing), @@ -1553,7 +1555,7 @@ list_del(&bo->list); assert(bo->rq != NULL); - if (bo->rq == &_kgem_static_request) + if (bo->rq == (void *)kgem) list_del(&bo->request); assert(list_is_empty(&bo->vma)); } @@ -1693,7 +1695,7 @@ DBG(("%s: handle=%d is snooped, tracking until free\n", __FUNCTION__, bo->handle)); list_add(&bo->request, &kgem->flushing); - bo->rq = &_kgem_static_request; + bo->rq = (void *)kgem; } } if (bo->rq == NULL) @@ -1770,7 +1772,7 @@ else cache = &kgem->large; list_add(&bo->list, cache); - bo->rq = &_kgem_static_request; + bo->rq = (void *)kgem; return; } @@ -1850,7 +1852,7 @@ bool retired = false; list_for_each_entry_safe(bo, next, &kgem->flushing, request) { - assert(bo->rq == &_kgem_static_request); + assert(bo->rq == (void *)kgem); assert(bo->exec == NULL); if (kgem_busy(kgem, bo->handle)) @@ -1913,7 +1915,7 @@ DBG(("%s: moving %d to flushing\n", __FUNCTION__, bo->handle)); list_add(&bo->request, &kgem->flushing); - bo->rq = &_kgem_static_request; + bo->rq = (void *)kgem; } else { bo->domain = DOMAIN_NONE; bo->rq = NULL; @@ -1925,7 +1927,7 @@ if (bo->snoop) { if (bo->needs_flush) { list_add(&bo->request, &kgem->flushing); - bo->rq = &_kgem_static_request; + bo->rq = (void *)kgem; } else { kgem_bo_move_to_snoop(kgem, bo); } @@ -2104,7 +2106,7 @@ kgem->scanout_busy |= bo->scanout; } - if (rq == &_kgem_static_request) { + if (rq == &kgem->static_request) { struct drm_i915_gem_set_domain set_domain; DBG(("%s: syncing due to allocation failure\n", __FUNCTION__)); @@ -2122,6 +2124,7 @@ assert(list_is_empty(&rq->buffers)); gem_close(kgem->fd, rq->bo->handle); + kgem_cleanup_cache(kgem); } else { list_add_tail(&rq->list, &kgem->requests[rq->ring]); kgem->need_throttle = kgem->need_retire = 1; @@ -2414,7 +2417,7 @@ } } - if (kgem->next_request != &_kgem_static_request) + if (kgem->next_request != &kgem->static_request) free(kgem->next_request); } @@ -2430,7 +2433,7 @@ kgem->flush = 0; kgem->batch_flags = kgem->batch_flags_base; - kgem->next_request = __kgem_request_alloc(); + kgem->next_request = __kgem_request_alloc(kgem); kgem_sna_reset(kgem); } diff -Nru xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/src/sna/kgem.h xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/src/sna/kgem.h --- xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/src/sna/kgem.h 2013-01-04 17:57:12.000000000 +0000 +++ xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/src/sna/kgem.h 2013-01-07 16:10:00.000000000 +0000 @@ -138,6 +138,7 @@ struct list requests[2]; struct kgem_request *next_request; + struct kgem_request static_request; struct { struct list inactive[NUM_CACHE_BUCKETS]; diff -Nru xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/src/sna/sna_accel.c xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/src/sna/sna_accel.c --- xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/src/sna/sna_accel.c 2013-01-04 17:57:12.000000000 +0000 +++ xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/src/sna/sna_accel.c 2013-01-07 16:10:00.000000000 +0000 @@ -13948,6 +13948,8 @@ region.extents.x2, region.extents.y2)); RegionIntersect(®ion, ®ion, damage); + RegionTranslate(®ion, -dirty->x, -dirty->y); + DamageRegionAppend(&dirty->slave_dst->drawable, ®ion); box = REGION_RECTS(®ion); n = REGION_NUM_RECTS(®ion); @@ -13963,30 +13965,31 @@ do { DBG(("%s: copy box (%d, %d)->(%d, %d)x(%d, %d)\n", __FUNCTION__, + box->x1 + dirty->x, box->y1 + dirty->y, box->x1, box->y1, - box->x1 - dirty->x, box->y1 - dirty->y, box->x2 - box->x1, box->y2 - box->y1)); assert(box->x2 > box->x1); assert(box->y2 > box->y1); + assert(box->x1 + dirty->x >= 0); + assert(box->y1 + dirty->y >= 0); + assert(box->x2 + dirty->x <= src->drawable.width); + assert(box->y2 + dirty->y <= src->drawable.height); + assert(box->x1 >= 0); assert(box->y1 >= 0); assert(box->x2 <= src->drawable.width); assert(box->y2 <= src->drawable.height); - assert(box->x1 - dirty->x >= 0); - assert(box->y1 - dirty->y >= 0); - assert(box->x2 - dirty->x <= src->drawable.width); - assert(box->y2 - dirty->y <= src->drawable.height); - memcpy_blt(src->devPrivate.ptr, dst->devPrivate.ptr, src->drawable.bitsPerPixel, src->devKind, dst->devKind, - box->x1, box->y1, - box->x1 - dirty->x, - box->y1 - dirty->y, + box->x1 + dirty->x, + box->y1 + dirty->y, + box->x1, + box->y1, box->x2 - box->x1, box->y2 - box->y1); box++; @@ -13999,17 +14002,15 @@ goto fallback; if (!sna->render.copy_boxes(sna, GXcopy, - src, sna_pixmap_get_bo(src), 0, 0, - dst, sna_pixmap_get_bo(dst), -dirty->x, -dirty->y, + src, sna_pixmap_get_bo(src), dirty->x, dirty->y, + dst, sna_pixmap_get_bo(dst),0, 0, box, n, COPY_LAST)) goto fallback; flush = true; } - RegionTranslate(®ion, -dirty->x, -dirty->y); - DamageRegionAppend(&dirty->slave_dst->drawable, ®ion); - + DamageRegionProcessPending(&dirty->slave_dst->drawable); skip: RegionUninit(®ion); DamageEmpty(dirty->damage); diff -Nru xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/src/sna/sna_display.c xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/src/sna/sna_display.c --- xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/src/sna/sna_display.c 2013-01-04 17:57:12.000000000 +0000 +++ xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/src/sna/sna_display.c 2013-01-07 16:10:00.000000000 +0000 @@ -2539,6 +2539,12 @@ DBG(("%s: flip [fb=%d] on crtc %d [%d] failed - %d\n", __FUNCTION__, arg.fb_id, i, crtc->id, errno)); disable: + if (count == 0) + return 0; + + xf86DrvMsg(sna->scrn->scrnIndex, X_ERROR, + "%s: page flipping failed, disabling CRTC:%d (pipe=%d)\n", + __FUNCTION__, crtc->id, crtc->pipe); sna_crtc_disable(config->crtc[i]); continue; } @@ -3288,6 +3294,9 @@ DBG(("%s: flip [fb=%d] on crtc %d [%d, pipe=%d] failed - %d\n", __FUNCTION__, arg.fb_id, i, crtc->id, crtc->pipe, errno)); disable: + xf86DrvMsg(sna->scrn->scrnIndex, X_ERROR, + "%s: page flipping failed, disabling CRTC:%d (pipe=%d)\n", + __FUNCTION__, crtc->id, crtc->pipe); sna_crtc_disable(config->crtc[i]); continue; } diff -Nru xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/src/sna/sna_dri.c xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/src/sna/sna_dri.c --- xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/src/sna/sna_dri.c 2013-01-04 17:57:12.000000000 +0000 +++ xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/src/sna/sna_dri.c 2013-01-07 16:10:00.000000000 +0000 @@ -225,8 +225,12 @@ assert(private->pixmap == pixmap); bo = sna_pixmap(pixmap)->gpu_bo; + if (private->bo == bo) + return; + + kgem_bo_destroy(&sna->kgem, private->bo); buffer->name = kgem_bo_flink(&sna->kgem, bo); - private->bo = bo; + private->bo = ref(bo); /* XXX DRI2InvalidateDrawable(&pixmap->drawable); */ } diff -Nru xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/src/sna/sna_render.h xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/src/sna/sna_render.h --- xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/src/sna/sna_render.h 2013-01-04 17:57:12.000000000 +0000 +++ xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/src/sna/sna_render.h 2013-01-07 16:10:00.000000000 +0000 @@ -126,8 +126,8 @@ } gen4; struct { - int wm_kernel; - int ve_id; + int16_t wm_kernel; + int16_t ve_id; } gen5; struct { diff -Nru xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/src/sna/sna_trapezoids.c xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/src/sna/sna_trapezoids.c --- xserver-xorg-video-intel-2.20.17+git20130104.b5b3cfb0/src/sna/sna_trapezoids.c 2013-01-04 17:57:12.000000000 +0000 +++ xserver-xorg-video-intel-2.20.17+git20130107.b8c95982/src/sna/sna_trapezoids.c 2013-01-07 16:10:00.000000000 +0000 @@ -532,6 +532,9 @@ int ix1, fx1; int ix2, fx2; + if (x1 == x2) + return; + FAST_SAMPLES_X_TO_INT_FRAC(x1, ix1, fx1); FAST_SAMPLES_X_TO_INT_FRAC(x2, ix2, fx2); @@ -797,6 +800,9 @@ struct edge *head, **next, *prev; int32_t x; + if (head_b == NULL) + return head_a; + prev = head_a->prev; next = &head; if (head_a->x.quo <= head_b->x.quo) { @@ -869,11 +875,39 @@ return remaining; } +static struct edge *filter(struct edge *edges) +{ + struct edge *e; + + e = edges; + do { + struct edge *n = e->next; + if (e->dir == -n->dir && + e->height_left == n->height_left && + *(uint64_t *)&e->x == *(uint64_t *)&n->x && + *(uint64_t *)&e->dxdy == *(uint64_t *)&n->dxdy) { + if (e->prev) + e->prev->next = n->next; + else + edges = n->next; + if (n->next) + n->next->prev = e->prev; + else + break; + + e = n->next; + } else + e = e->next; + } while (e->next); + + return edges; +} + static struct edge * merge_unsorted_edges (struct edge *head, struct edge *unsorted) { sort_edges (unsorted, UINT_MAX, &unsorted); - return merge_sorted_edges (head, unsorted); + return merge_sorted_edges (head, filter(unsorted)); } /* Test if the edges on the active list can be safely advanced by a @@ -881,18 +915,18 @@ inline static bool can_full_step(struct active_list *active) { - const struct edge *e; - /* Recomputes the minimum height of all edges on the active * list if we have been dropping edges. */ if (active->min_height <= 0) { + const struct edge *e; int min_height = INT_MAX; int is_vertical = 1; for (e = active->head.next; &active->tail != e; e = e->next) { if (e->height_left < min_height) min_height = e->height_left; - is_vertical &= e->dy == 0; + if (is_vertical) + is_vertical = e->dy == 0; } active->is_vertical = is_vertical; @@ -929,7 +963,8 @@ *b = edge; if (edge->height_left < min_height) min_height = edge->height_left; - is_vertical &= edge->dy == 0; + if (is_vertical) + is_vertical = edge->dy == 0; edge = next; } @@ -1917,6 +1952,9 @@ struct mono_edge *head, **next, *prev; int32_t x; + if (head_b == NULL) + return head_a; + prev = head_a->prev; next = &head; if (head_a->x.quo <= head_b->x.quo) { @@ -1990,11 +2028,39 @@ return remaining; } +static struct mono_edge *mono_filter(struct mono_edge *edges) +{ + struct mono_edge *e; + + e = edges; + do { + struct mono_edge *n = e->next; + if (e->dir == -n->dir && + e->height_left == n->height_left && + *(uint64_t *)&e->x == *(uint64_t *)&n->x && + *(uint64_t *)&e->dxdy == *(uint64_t *)&n->dxdy) { + if (e->prev) + e->prev->next = n->next; + else + edges = n->next; + if (n->next) + n->next->prev = e->prev; + else + break; + + e = n->next; + } else + e = e->next; + } while (e->next); + + return edges; +} + static struct mono_edge * mono_merge_unsorted_edges(struct mono_edge *head, struct mono_edge *unsorted) { mono_sort_edges(unsorted, UINT_MAX, &unsorted); - return mono_merge_sorted_edges(head, unsorted); + return mono_merge_sorted_edges(head, mono_filter(unsorted)); } #if 0