From 8091477f8d8f497eba97049545e35c4ab3a90b24 Mon Sep 17 00:00:00 2001 From: William Wilgus Date: Sat, 21 Dec 2024 18:19:38 -0500 Subject: [PATCH] Optimize 16 bit lcd_fillrect() move switch outside loop adds ~10000 ops/s in test_gfx Change-Id: I2204d637282aae4bbc0dde31395c6cc0568f3247 --- firmware/drivers/lcd-16bit-common.c | 49 +++++++++++++++++------------ 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/firmware/drivers/lcd-16bit-common.c b/firmware/drivers/lcd-16bit-common.c index be65efb4e7..6108832cb4 100644 --- a/firmware/drivers/lcd-16bit-common.c +++ b/firmware/drivers/lcd-16bit-common.c @@ -169,32 +169,41 @@ void lcd_fillrect(int x, int y, int width, int height) len = STRIDE_MAIN(width, height); step = STRIDE_MAIN(ROW_INC, COL_INC); - do + switch (fillopt) { - switch (fillopt) + case OPT_SET: { - case OPT_SET: - memset16(dst, bits, len); - break; - - case OPT_COPY: - memcpy(dst, PTR_ADD(dst, lcd_backdrop_offset), - len * sizeof(fb_data)); - break; - - case OPT_NONE: /* DRMODE_COMPLEMENT */ - { - fb_data *start = dst; - fb_data *end = start + len; do - *start = ~(*start); - while (++start < end); + { + memset16(dst, bits, len); + dst += step; + } while (dst <= dst_end); + break; + } + case OPT_COPY: + { + do + { + memcpy(dst, PTR_ADD(dst, lcd_backdrop_offset), + len * sizeof(fb_data)); + dst += step; + } while (dst <= dst_end); + break; + } + case OPT_NONE: /* DRMODE_COMPLEMENT */ + { + do + { + fb_data *start = dst; + fb_data *end = start + len; + do + *start = ~(*start); + while (++start < end); + dst += step; + } while (dst <= dst_end); break; - } } - dst += step; } - while (dst <= dst_end); } /* About Rockbox' internal monochrome bitmap format: