diff --git a/recipes-emulators/mame/mame/0005-OSD-OpenGl-Improve-performance-by-moving-calculation.patch b/recipes-emulators/mame/mame/0005-OSD-OpenGl-Improve-performance-by-moving-calculation.patch index 87175ce..8431de2 100644 --- a/recipes-emulators/mame/mame/0005-OSD-OpenGl-Improve-performance-by-moving-calculation.patch +++ b/recipes-emulators/mame/mame/0005-OSD-OpenGl-Improve-performance-by-moving-calculation.patch @@ -1,4 +1,4 @@ -From f2e16fa98a94ed51d04540e7b53ffdf0bc7b5b57 Mon Sep 17 00:00:00 2001 +From 611f9b13acd4c08aa8d36054c5eccdbec237c673 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20M=C3=BCller?= Date: Sat, 2 Mar 2019 23:13:27 +0100 Subject: [PATCH] OSD/OpenGl: Improve performance by moving calculations out of @@ -7,71 +7,114 @@ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -This one was triggered by missile. +This one was triggered by batman. Test case: -mame64 -nothrottle missile +mame64 -nothrottle batman -Before: Average speed: 312.49% (58 seconds) -After: Average speed: 319.34% (58 seconds) +Before: Average speed: 312.11% (20 seconds) +After: Average speed: 327.43% (19 seconds) -I am aware that missile tests copyline_palette16() only. +Upstream-Status: Submitted [1] -Upstream-Status: Pending +[1] https://github.com/mamedev/mame/pull/4717 Signed-off-by: Andreas Müller --- - src/osd/modules/render/drawogl.cpp | 14 ++++++++------ - 1 file changed, 8 insertions(+), 6 deletions(-) + src/osd/modules/render/drawogl.cpp | 32 +++++++++++++++++------------- + 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/osd/modules/render/drawogl.cpp b/src/osd/modules/render/drawogl.cpp -index 98db62fdf1..045dc16954 100644 +index 98db62fdf1..95345878cf 100644 --- a/src/osd/modules/render/drawogl.cpp +++ b/src/osd/modules/render/drawogl.cpp -@@ -2055,9 +2055,9 @@ static inline void copyline_palette16(uint32_t *dst, const uint16_t *src, int wi - *dst++ = 0xff000000 | palette[*src]; +@@ -2056,8 +2056,9 @@ static inline void copyline_palette16(uint32_t *dst, const uint16_t *src, int wi for (x = 0; x < width; x++) { -- int srcpix = *src++; -+ uint32_t palval = palette[*src++]; + int srcpix = *src++; ++ uint32_t dstval = 0xff000000 | palette[srcpix]; for (int x2 = 0; x2 < xprescale; x2++) - *dst++ = 0xff000000 | palette[srcpix]; -+ *dst++ = 0xff000000 | palval; ++ *dst++ = dstval; } if (xborderpix) *dst++ = 0xff000000 | palette[*--src]; -@@ -2078,9 +2078,9 @@ static inline void copyline_palettea16(uint32_t *dst, const uint16_t *src, int w - *dst++ = palette[*src]; +@@ -2079,8 +2080,9 @@ static inline void copyline_palettea16(uint32_t *dst, const uint16_t *src, int w for (x = 0; x < width; x++) { -- int srcpix = *src++; -+ uint32_t palval = palette[*src++]; + int srcpix = *src++; ++ uint32_t dstval = palette[srcpix]; for (int x2 = 0; x2 < xprescale; x2++) - *dst++ = palette[srcpix]; -+ *dst++ = palval; ++ *dst++ = dstval; } if (xborderpix) *dst++ = palette[*--src]; -@@ -2109,9 +2109,10 @@ static inline void copyline_rgb32(uint32_t *dst, const uint32_t *src, int width, +@@ -2109,10 +2111,9 @@ static inline void copyline_rgb32(uint32_t *dst, const uint32_t *src, int width, for (x = 0; x < width; x++) { rgb_t srcpix = *src++; -+ uint32_t palval = palette[0x200 + srcpix.r()] | palette[0x100 + srcpix.g()] | palette[srcpix.b()]; ++ uint32_t dstval = 0xff000000 | palette[0x200 + srcpix.r()] | palette[0x100 + srcpix.g()] | palette[srcpix.b()]; for (int x2 = 0; x2 < xprescale; x2++) - { +- { - *dst++ = 0xff000000 | palette[0x200 + srcpix.r()] | palette[0x100 + srcpix.g()] | palette[srcpix.b()]; -+ *dst++ = 0xff000000 | palval; - } +- } ++ *dst++ = dstval; } if (xborderpix) -@@ -2161,8 +2162,9 @@ static inline void copyline_argb32(uint32_t *dst, const uint32_t *src, int width + { +@@ -2129,11 +2130,9 @@ static inline void copyline_rgb32(uint32_t *dst, const uint32_t *src, int width, for (x = 0; x < width; x++) { rgb_t srcpix = *src++; -+ uint32_t palval = palette[0x200 + srcpix.r()] | palette[0x100 + srcpix.g()] | palette[srcpix.b()]; +- ++ uint32_t dstval = 0xff000000 | srcpix; + for (int x2 = 0; x2 < xprescale; x2++) +- { +- *dst++ = 0xff000000 | srcpix; +- } ++ *dst++ = dstval; + } + if (xborderpix) + *dst++ = 0xff000000 | *--src; +@@ -2161,8 +2160,9 @@ static inline void copyline_argb32(uint32_t *dst, const uint32_t *src, int width + for (x = 0; x < width; x++) + { + rgb_t srcpix = *src++; ++ uint32_t dstval = (srcpix & 0xff000000) | palette[0x200 + srcpix.r()] | palette[0x100 + srcpix.g()] | palette[srcpix.b()]; for (int x2 = 0; x2 < xprescale; x2++) - *dst++ = (srcpix & 0xff000000) | palette[0x200 + srcpix.r()] | palette[0x100 + srcpix.g()] | palette[srcpix.b()]; -+ *dst++ = (srcpix & 0xff000000) | palval; ++ *dst++ = dstval; + } + if (xborderpix) + { +@@ -2257,10 +2257,12 @@ static inline void copyline_yuy16_to_argb(uint32_t *dst, const uint16_t *src, in + uint16_t srcpix1 = *src++; + uint8_t cb = srcpix0 & 0xff; + uint8_t cr = srcpix1 & 0xff; ++ uint32_t dstval0 = ycc_to_rgb(palette[0x000 + (srcpix0 >> 8)], cb, cr); ++ uint32_t dstval1 = ycc_to_rgb(palette[0x000 + (srcpix1 >> 8)], cb, cr); + for (int x2 = 0; x2 < xprescale; x2++) +- *dst++ = ycc_to_rgb(palette[0x000 + (srcpix0 >> 8)], cb, cr); ++ *dst++ = dstval0; + for (int x2 = 0; x2 < xprescale; x2++) +- *dst++ = ycc_to_rgb(palette[0x000 + (srcpix1 >> 8)], cb, cr); ++ *dst++ = dstval1; + } + if (xborderpix) + { +@@ -2291,10 +2293,12 @@ static inline void copyline_yuy16_to_argb(uint32_t *dst, const uint16_t *src, in + uint16_t srcpix1 = *src++; + uint8_t cb = srcpix0 & 0xff; + uint8_t cr = srcpix1 & 0xff; ++ uint32_t dstval0 = ycc_to_rgb(srcpix0 >> 8, cb, cr); ++ uint32_t dstval1 = ycc_to_rgb(srcpix1 >> 8, cb, cr); + for (int x2 = 0; x2 < xprescale; x2++) +- *dst++ = ycc_to_rgb(srcpix0 >> 8, cb, cr); ++ *dst++ = dstval0; + for (int x2 = 0; x2 < xprescale; x2++) +- *dst++ = ycc_to_rgb(srcpix1 >> 8, cb, cr); ++ *dst++ = dstval1; } if (xborderpix) {