From 40c035f9860b48d15f636cb035c5cfdfafa7d27d Mon Sep 17 00:00:00 2001 From: rogerman Date: Tue, 22 Jul 2025 17:59:49 -0700 Subject: [PATCH] GPU: Fix remaining issues with display capture giving incorrect colors on big-endian systems. - This commit effectively reverts commit 6bcf70d, since this commit fixes the problem in the correct location this time. --- desmume/src/GPU.cpp | 7 +++++ .../colorspacehandler_AltiVec.cpp | 27 +++---------------- 2 files changed, 10 insertions(+), 24 deletions(-) diff --git a/desmume/src/GPU.cpp b/desmume/src/GPU.cpp index d99238b1c..7ad7c8e33 100644 --- a/desmume/src/GPU.cpp +++ b/desmume/src/GPU.cpp @@ -3986,6 +3986,13 @@ void GPUEngineA::_RenderLine_DisplayCapture(const GPUEngineCompositorInfo &compI } ColorspaceConvertBuffer8888To5551(dstNative32, dstNative16, GPU_FRAMEBUFFER_NATIVE_WIDTH); + +#if defined(MSB_FIRST) + for (size_t i = 0; i < GPU_FRAMEBUFFER_NATIVE_WIDTH; i++) + { + dstNative16[i] = LE_TO_LOCAL_16(dstNative16[i]); + } +#endif needCaptureNative = false; } } diff --git a/desmume/src/utils/colorspacehandler/colorspacehandler_AltiVec.cpp b/desmume/src/utils/colorspacehandler/colorspacehandler_AltiVec.cpp index 9c20dbd5e..e646eb72f 100644 --- a/desmume/src/utils/colorspacehandler/colorspacehandler_AltiVec.cpp +++ b/desmume/src/utils/colorspacehandler/colorspacehandler_AltiVec.cpp @@ -207,19 +207,7 @@ FORCEINLINE v128u16 _ConvertColorBaseTo5551_AltiVec(const v128u32 &srcLo, const // Convert alpha dstAlpha = vec_packsu( vec_and(srcLo, ((v128u32){0x000000FF,0x000000FF,0x000000FF,0x000000FF})), vec_and(srcHi, ((v128u32){0x000000FF,0x000000FF,0x000000FF,0x000000FF})) ); dstAlpha = vec_cmpgt( dstAlpha, vec_splat_u16(0) ); - - if (COLORFORMAT == NDSColorFormat_BGR666_Rev) - { - dstAlpha = vec_and( dstAlpha, ((v128u16){0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000}) ); - } - else if (COLORFORMAT == NDSColorFormat_BGR888_Rev) - { - // TODO: Don't know why RGBA8888 colors need to swap bytes for the final 16-bit color - // when RGBA6665 colors don't need to, but real-world testing shows that RGBA8888 colors - // need to do this. Further testing is needed to find out why this byte swap is necessary. - // - rogerman, 2025/07/19 - dstAlpha = vec_and( dstAlpha, ((v128u16){0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080}) ); - } + dstAlpha = vec_and( dstAlpha, ((v128u16){0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000}) ); // Convert RGB if (SWAP_RB) @@ -233,17 +221,8 @@ FORCEINLINE v128u16 _ConvertColorBaseTo5551_AltiVec(const v128u32 &srcLo, const rgbHi = vec_perm( (v128u8)rgbHi, (v128u8)rgbHi, ((v128u8){3,2,1,0, 7,6,5,4, 11,10,9,8, 15,14,13,12}) ); } - // Convert from 32-bit color to 16-bit color using the built-in AltiVec instruction vpkpx. - dstColor = (v128u16)vec_packpx(rgbLo, rgbHi); - - if (COLORFORMAT == NDSColorFormat_BGR666_Rev) - { - dstColor = vec_and( dstColor, ((v128u16){0x7FFF,0x7FFF,0x7FFF,0x7FFF,0x7FFF,0x7FFF,0x7FFF,0x7FFF}) ); - } - else if (COLORFORMAT == NDSColorFormat_BGR888_Rev) - { - dstColor = vec_and( dstColor, ((v128u16){0xFF7F,0xFF7F,0xFF7F,0xFF7F,0xFF7F,0xFF7F,0xFF7F,0xFF7F}) ); - } + dstColor = (v128u16)vec_packpx(rgbLo, rgbHi); // Convert from 32-bit color to 16-bit color using the built-in AltiVec instruction vpkpx. + dstColor = vec_and( dstColor, ((v128u16){0x7FFF,0x7FFF,0x7FFF,0x7FFF,0x7FFF,0x7FFF,0x7FFF,0x7FFF}) ); return (v128u16)vec_or( (v128u8)dstColor, (v128u8)dstAlpha ); }