diff options
author | Kirill Smelkov <kirr@mns.spb.ru> | 2012-11-02 08:10:33 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-12-21 15:25:57 -0500 |
commit | d40fbf8d52ae6c9b7fe9d76eeab624afc3a3f1ea (patch) | |
tree | b227ff245d8911052e1f6dbca65dbb08bdfbba34 | |
parent | 13908f330f91996b6d59355aa7860553dd1093d5 (diff) |
[media] vivi: Optimize precalculate_line()
precalculate_line() is not very high on profile, but it calls expensive
gen_twopix(), so let's polish it too:
call gen_twopix() only once for every color bar and then distribute
the result.
before:
# cmdline : /home/kirr/local/perf/bin/perf record -g -a sleep 20
#
# Samples: 46K of event 'cycles'
# Event count (approx.): 15574200568
#
# Overhead Command Shared Object
# ........ ............... ....................
#
27.99% rawv libc-2.13.so [.] __memcpy_ssse3
23.29% vivi-* [kernel.kallsyms] [k] memcpy
10.30% Xorg [unknown] [.] 0xa75c98f8
5.34% vivi-* [vivi] [k] gen_text.constprop.6
4.61% rawv [vivi] [k] gen_twopix
2.64% rawv [vivi] [k] precalculate_line
1.37% swapper [kernel.kallsyms] [k] read_hpet
after:
# cmdline : /home/kirr/local/perf/bin/perf record -g -a sleep 20
#
# Samples: 45K of event 'cycles'
# Event count (approx.): 15561769214
#
# Overhead Command Shared Object
# ........ ............... ....................
#
30.73% rawv libc-2.13.so [.] __memcpy_ssse3
26.78% vivi-* [kernel.kallsyms] [k] memcpy
10.68% Xorg [unknown] [.] 0xa73015e9
5.55% vivi-* [vivi] [k] gen_text.constprop.6
1.36% swapper [kernel.kallsyms] [k] read_hpet
0.96% Xorg [kernel.kallsyms] [k] read_hpet
...
0.16% rawv [vivi] [k] precalculate_line
...
0.14% rawv [vivi] [k] gen_twopix
(i.e. gen_twopix and precalculate_line overheads are almost gone)
Signed-off-by: Kirill Smelkov <kirr@mns.spb.ru>
Acked-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r-- | drivers/media/platform/vivi.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/drivers/media/platform/vivi.c b/drivers/media/platform/vivi.c index ec832e9461a8..7abb046e0fa5 100644 --- a/drivers/media/platform/vivi.c +++ b/drivers/media/platform/vivi.c | |||
@@ -512,12 +512,22 @@ static void gen_twopix(struct vivi_dev *dev, u8 *buf, int colorpos, bool odd) | |||
512 | 512 | ||
513 | static void precalculate_line(struct vivi_dev *dev) | 513 | static void precalculate_line(struct vivi_dev *dev) |
514 | { | 514 | { |
515 | int w; | 515 | unsigned pixsize = dev->pixelsize; |
516 | 516 | unsigned pixsize2 = 2*pixsize; | |
517 | for (w = 0; w < dev->width * 2; w++) { | 517 | int colorpos; |
518 | int colorpos = w / (dev->width / 8) % 8; | 518 | u8 *pos; |
519 | 519 | ||
520 | gen_twopix(dev, dev->line + w * dev->pixelsize, colorpos, w & 1); | 520 | for (colorpos = 0; colorpos < 16; ++colorpos) { |
521 | u8 pix[8]; | ||
522 | int wstart = colorpos * dev->width / 8; | ||
523 | int wend = (colorpos+1) * dev->width / 8; | ||
524 | int w; | ||
525 | |||
526 | gen_twopix(dev, &pix[0], colorpos % 8, 0); | ||
527 | gen_twopix(dev, &pix[pixsize], colorpos % 8, 1); | ||
528 | |||
529 | for (w = wstart/2*2, pos = dev->line + w*pixsize; w < wend; w += 2, pos += pixsize2) | ||
530 | memcpy(pos, pix, pixsize2); | ||
521 | } | 531 | } |
522 | } | 532 | } |
523 | 533 | ||