From 7dd98ddb4563951cb2d51850f2e1cce42e1626c2 Mon Sep 17 00:00:00 2001 From: rogerman Date: Sat, 18 Sep 2021 15:44:42 -0700 Subject: [PATCH] GPU Operations: Fix a bug where running 18-bit color, 24-bit color, or a custom framebuffer size would cause a crash on systems without SSE2 or AVX2. (Regression from commit 0db9872.) --- desmume/src/GPU_Operations.cpp | 54 ++++++++++------------------------ 1 file changed, 16 insertions(+), 38 deletions(-) diff --git a/desmume/src/GPU_Operations.cpp b/desmume/src/GPU_Operations.cpp index 160dfdc52..f84ff48c2 100644 --- a/desmume/src/GPU_Operations.cpp +++ b/desmume/src/GPU_Operations.cpp @@ -826,52 +826,30 @@ static FORCEINLINE void CopyLineExpand(void *__restrict dst, const void *__restr } else if (INTEGERSCALEHINT > 1) { - const size_t S = INTEGERSCALEHINT; + const size_t scale = dstWidth / GPU_FRAMEBUFFER_NATIVE_WIDTH; - if (SCALEVERTICAL) + for (size_t srcX = 0, dstX = 0; srcX < GPU_FRAMEBUFFER_NATIVE_WIDTH; srcX++, dstX+=scale) { - for (size_t x = 0; x < GPU_FRAMEBUFFER_NATIVE_WIDTH; x++) + for (size_t lx = 0; lx < scale; lx++) { - for (size_t q = 0; q < S; q++) + if (ELEMENTSIZE == 1) { - for (size_t p = 0; p < S; p++) - { - if (ELEMENTSIZE == 1) - { - ( (u8 *)dst)[(q * (GPU_FRAMEBUFFER_NATIVE_WIDTH * S)) + ((x * S) + p)] = ( (u8 *)src)[x]; - } - else if (ELEMENTSIZE == 2) - { - ((u16 *)dst)[(q * (GPU_FRAMEBUFFER_NATIVE_WIDTH * S)) + ((x * S) + p)] = (NEEDENDIANSWAP) ? LE_TO_LOCAL_16( ((u16 *)src)[x] ) : ((u16 *)src)[x]; - } - else if (ELEMENTSIZE == 4) - { - ((u32 *)dst)[(q * (GPU_FRAMEBUFFER_NATIVE_WIDTH * S)) + ((x * S) + p)] = (NEEDENDIANSWAP) ? LE_TO_LOCAL_32( ((u32 *)src)[x] ) : ((u32 *)src)[x]; - } - } + ( (u8 *)dst)[(srcX * scale) + lx] = ( (u8 *)src)[srcX]; + } + else if (ELEMENTSIZE == 2) + { + ((u16 *)dst)[(srcX * scale) + lx] = (NEEDENDIANSWAP) ? LE_TO_LOCAL_16( ((u16 *)src)[srcX] ) : ((u16 *)src)[srcX]; + } + else if (ELEMENTSIZE == 4) + { + ((u32 *)dst)[(srcX * scale) + lx] = (NEEDENDIANSWAP) ? LE_TO_LOCAL_32( ((u32 *)src)[srcX] ) : ((u32 *)src)[srcX]; } } } - else + + if (SCALEVERTICAL) { - for (size_t x = 0; x < GPU_FRAMEBUFFER_NATIVE_WIDTH; x++) - { - for (size_t p = 0; p < S; p++) - { - if (ELEMENTSIZE == 1) - { - ( (u8 *)dst)[(x * S) + p] = ( (u8 *)src)[x]; - } - else if (ELEMENTSIZE == 2) - { - ((u16 *)dst)[(x * S) + p] = (NEEDENDIANSWAP) ? LE_TO_LOCAL_16( ((u16 *)src)[x] ) : ((u16 *)src)[x]; - } - else if (ELEMENTSIZE == 4) - { - ((u32 *)dst)[(x * S) + p] = (NEEDENDIANSWAP) ? LE_TO_LOCAL_32( ((u32 *)src)[x] ) : ((u32 *)src)[x]; - } - } - } + CopyLinesForVerticalCount(dst, dstWidth, dstLineCount); } } else