From: Armin Novak Date: Fri, 9 Nov 2018 10:32:28 +0000 (+0100) Subject: Readded loop unrolling. X-Git-Tag: 2.0.0-rc4~22^2~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7e932bbfa29014b7a7ef13ec8aa342ab180998ac;p=platform%2Fupstream%2Ffreerdp.git Readded loop unrolling. --- diff --git a/libfreerdp/codec/include/bitmap.c b/libfreerdp/codec/include/bitmap.c index aedc10a..4cba2d7 100644 --- a/libfreerdp/codec/include/bitmap.c +++ b/libfreerdp/codec/include/bitmap.c @@ -155,12 +155,11 @@ static INLINE BOOL RLEDECOMPRESS(const BYTE* pbSrcBuffer, UINT32 cbSrcBuffer, if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength)) return FALSE; - while (runLength > 0) + UNROLL(runLength, { DESTWRITEPIXEL(pbDest, BLACK_PIXEL); DESTNEXTPIXEL(pbDest); - runLength--; - } + }); } else { @@ -179,13 +178,12 @@ static INLINE BOOL RLEDECOMPRESS(const BYTE* pbSrcBuffer, UINT32 cbSrcBuffer, if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength)) return FALSE; - while (runLength > 0) + UNROLL(runLength, { DESTREADPIXEL(temp, pbDest - rowDelta); DESTWRITEPIXEL(pbDest, temp); DESTNEXTPIXEL(pbDest); - runLength--; - } + }); } /* A follow-on background run order will need a foreground pel inserted. */ @@ -218,22 +216,20 @@ static INLINE BOOL RLEDECOMPRESS(const BYTE* pbSrcBuffer, UINT32 cbSrcBuffer, if (fFirstLine) { - while (runLength > 0) + UNROLL(runLength, { DESTWRITEPIXEL(pbDest, fgPel); DESTNEXTPIXEL(pbDest); - runLength--; - } + }); } else { - while (runLength > 0) + UNROLL(runLength, { DESTREADPIXEL(temp, pbDest - rowDelta); DESTWRITEPIXEL(pbDest, temp ^ fgPel); DESTNEXTPIXEL(pbDest); - runLength--; - } + }); } break; @@ -251,15 +247,13 @@ static INLINE BOOL RLEDECOMPRESS(const BYTE* pbSrcBuffer, UINT32 cbSrcBuffer, if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength * 2)) return FALSE; - while (runLength > 0) + UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); DESTNEXTPIXEL(pbDest); DESTWRITEPIXEL(pbDest, pixelB); DESTNEXTPIXEL(pbDest); - runLength--; - } - + }); break; /* Handle Color Run Orders. */ @@ -273,13 +267,11 @@ static INLINE BOOL RLEDECOMPRESS(const BYTE* pbSrcBuffer, UINT32 cbSrcBuffer, if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength)) return FALSE; - while (runLength > 0) + UNROLL(runLength, { DESTWRITEPIXEL(pbDest, pixelA); DESTNEXTPIXEL(pbDest); - runLength--; - } - + }); break; /* Handle Foreground/Background Image Orders. */ @@ -350,19 +342,13 @@ static INLINE BOOL RLEDECOMPRESS(const BYTE* pbSrcBuffer, UINT32 cbSrcBuffer, case MEGA_MEGA_COLOR_IMAGE: runLength = ExtractRunLength(code, pbSrc, &advance); pbSrc = pbSrc + advance; - - if (!ENSURE_CAPACITY(pbDest, pbDestEnd, runLength)) - return FALSE; - - while (runLength > 0) + UNROLL(runLength, { SRCREADPIXEL(temp, pbSrc); SRCNEXTPIXEL(pbSrc); DESTWRITEPIXEL(pbDest, temp); DESTNEXTPIXEL(pbDest); - runLength--; - } - + }); break; /* Handle Special Order 1. */ diff --git a/libfreerdp/codec/interleaved.c b/libfreerdp/codec/interleaved.c index 4dec1b5..3ac396c 100644 --- a/libfreerdp/codec/interleaved.c +++ b/libfreerdp/codec/interleaved.c @@ -30,6 +30,31 @@ #define TAG FREERDP_TAG("codec") +#define UNROLL_BODY(_exp, _count) do \ + { \ + size_t x; \ + for (x=0; x<(_count); x++) \ + { \ + (_exp); \ + } \ + } while (0) + +#define UNROLL_MULTIPLE(_condition, _exp, _count) do \ + { \ + while ((_condition) >= _count) \ + { \ + UNROLL_BODY(_exp, _count); \ + (_condition) -= _count; \ + } \ + } while (FALSE) + +#define UNROLL(_condition, _exp) do \ + { \ + UNROLL_MULTIPLE(_condition, _exp, 16); \ + UNROLL_MULTIPLE(_condition, _exp, 4); \ + UNROLL_MULTIPLE(_condition, _exp, 1); \ + } while (FALSE) + /* RLE Compressed Bitmap Stream (RLE_BITMAP_STREAM) http://msdn.microsoft.com/en-us/library/cc240895%28v=prot.10%29.aspx