By providing the new "offer_buffer" iterator method, redundant memcpy combiners are now avoided for compositing with SRC operator in some cases. One good example is src_0565_8888. Running lowlevel-blt-bench on Intel Core-i7 860 @2.8GHz:
before: src_0565_8888 = L1: 931.54 L2: 888.93 M:638.34 after: src_0565_8888 = L1:1031.66 L2:1003.42 M:871.54 The simple fast paths, which exist only to convert between a8r8g8b8 and the other formats, can also be dropped in the future. --- pixman/pixman-fast-path.c | 14 ++++++++------ pixman/pixman-mmx.c | 6 +++--- pixman/pixman-sse2.c | 6 +++--- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/pixman/pixman-fast-path.c b/pixman/pixman-fast-path.c index 2608268..bf32ac3 100644 --- a/pixman/pixman-fast-path.c +++ b/pixman/pixman-fast-path.c @@ -2475,6 +2475,7 @@ fast_bilinear_cover_iter_init (pixman_iter_t *iter, const pixman_iter_info_t *it info->line1.y = -1; info->line1.buffer = &(info->data[width]); + iter->offer_buffer = _pixman_iter_accept_buffer_offers; iter->get_scanline = fast_fetch_bilinear_cover; iter->fini = bilinear_cover_iter_fini; @@ -2499,17 +2500,18 @@ fail: static const pixman_iter_info_t fast_iters[] = { { PIXMAN_r5g6b5, IMAGE_FLAGS, ITER_NARROW | ITER_SRC, - _pixman_iter_init_bits_stride, fast_fetch_r5g6b5, NULL }, + _pixman_iter_init_bits_stride_and_accept_buffer_offers, + fast_fetch_r5g6b5, NULL }, + + { PIXMAN_r5g6b5, FAST_PATH_STD_DEST_FLAGS, + ITER_NARROW | ITER_DEST | ITER_IGNORE_RGB | ITER_IGNORE_ALPHA, + _pixman_iter_init_bits_stride_and_accept_buffer_offers, + fast_dest_fetch_noop, fast_write_back_r5g6b5 }, { PIXMAN_r5g6b5, FAST_PATH_STD_DEST_FLAGS, ITER_NARROW | ITER_DEST, _pixman_iter_init_bits_stride, fast_fetch_r5g6b5, fast_write_back_r5g6b5 }, - - { PIXMAN_r5g6b5, FAST_PATH_STD_DEST_FLAGS, - ITER_NARROW | ITER_DEST | ITER_IGNORE_RGB | ITER_IGNORE_ALPHA, - _pixman_iter_init_bits_stride, - fast_dest_fetch_noop, fast_write_back_r5g6b5 }, { PIXMAN_a8r8g8b8, (FAST_PATH_STANDARD_FLAGS | diff --git a/pixman/pixman-mmx.c b/pixman/pixman-mmx.c index c94d282..4ccd3ab 100644 --- a/pixman/pixman-mmx.c +++ b/pixman/pixman-mmx.c @@ -3929,13 +3929,13 @@ mmx_fetch_a8 (pixman_iter_t *iter, const uint32_t *mask) static const pixman_iter_info_t mmx_iters[] = { { PIXMAN_x8r8g8b8, IMAGE_FLAGS, ITER_NARROW, - _pixman_iter_init_bits_stride, mmx_fetch_x8r8g8b8, NULL + _pixman_iter_init_bits_stride_and_accept_buffer_offers, mmx_fetch_x8r8g8b8, NULL }, { PIXMAN_r5g6b5, IMAGE_FLAGS, ITER_NARROW, - _pixman_iter_init_bits_stride, mmx_fetch_r5g6b5, NULL + _pixman_iter_init_bits_stride_and_accept_buffer_offers, mmx_fetch_r5g6b5, NULL }, { PIXMAN_a8, IMAGE_FLAGS, ITER_NARROW, - _pixman_iter_init_bits_stride, mmx_fetch_a8, NULL + _pixman_iter_init_bits_stride_and_accept_buffer_offers, mmx_fetch_a8, NULL }, { PIXMAN_null }, }; diff --git a/pixman/pixman-sse2.c b/pixman/pixman-sse2.c index dde9235..539096c 100644 --- a/pixman/pixman-sse2.c +++ b/pixman/pixman-sse2.c @@ -6347,13 +6347,13 @@ sse2_fetch_a8 (pixman_iter_t *iter, const uint32_t *mask) static const pixman_iter_info_t sse2_iters[] = { { PIXMAN_x8r8g8b8, IMAGE_FLAGS, ITER_NARROW, - _pixman_iter_init_bits_stride, sse2_fetch_x8r8g8b8, NULL + _pixman_iter_init_bits_stride_and_accept_buffer_offers, sse2_fetch_x8r8g8b8, NULL }, { PIXMAN_r5g6b5, IMAGE_FLAGS, ITER_NARROW, - _pixman_iter_init_bits_stride, sse2_fetch_r5g6b5, NULL + _pixman_iter_init_bits_stride_and_accept_buffer_offers, sse2_fetch_r5g6b5, NULL }, { PIXMAN_a8, IMAGE_FLAGS, ITER_NARROW, - _pixman_iter_init_bits_stride, sse2_fetch_a8, NULL + _pixman_iter_init_bits_stride_and_accept_buffer_offers, sse2_fetch_a8, NULL }, { PIXMAN_null }, }; -- 1.8.1.5 _______________________________________________ Pixman mailing list Pixman@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/pixman