diff --git a/Common/Data/Convert/ColorConv.cpp b/Common/Data/Convert/ColorConv.cpp index d2ad81b1ff..5404e89bca 100644 --- a/Common/Data/Convert/ColorConv.cpp +++ b/Common/Data/Convert/ColorConv.cpp @@ -172,6 +172,15 @@ void ConvertBGRA8888ToRGBA8888(u32 *dst, const u32 *src, u32 numPixels) { } } +void ConvertBGRA8888ToRGB888(u8 *dst, const u32 *src, u32 numPixels) { + for (uint32_t x = 0; x < numPixels; ++x) { + uint32_t c = src[x]; + dst[x * 3 + 0] = (c >> 16) & 0xFF; + dst[x * 3 + 1] = (c >> 8) & 0xFF; + dst[x * 3 + 2] = (c >> 0) & 0xFF; + } +} + void ConvertRGBA8888ToRGBA5551(u16 *dst, const u32 *src, u32 numPixels) { #if _M_SSE >= 0x401 const __m128i maskAG = _mm_set1_epi32(0x8000F800); @@ -280,6 +289,12 @@ void ConvertRGBA8888ToRGBA4444(u16 *dst, const u32 *src, u32 numPixels) { } } +void ConvertRGBA8888ToRGB888(u8 *dst, const u32 *src, u32 numPixels) { + for (uint32_t x = 0; x < numPixels; ++x) { + memcpy(dst + x * 3, src + x, 3); + } +} + void ConvertRGB565ToRGBA8888(u32 *dst32, const u16 *src, u32 numPixels) { #ifdef _M_SSE const __m128i mask5 = _mm_set1_epi16(0x001f); diff --git a/Common/Data/Convert/ColorConv.h b/Common/Data/Convert/ColorConv.h index 1e20951cdc..e695f3ce8f 100644 --- a/Common/Data/Convert/ColorConv.h +++ b/Common/Data/Convert/ColorConv.h @@ -110,10 +110,12 @@ typedef void (*Convert32bppTo32bppFunc)(u32 *dst, const u32 *src, u32 numPixels) void ConvertBGRA8888ToRGBA8888(u32 *dst, const u32 *src, u32 numPixels); #define ConvertRGBA8888ToBGRA8888 ConvertBGRA8888ToRGBA8888 +void ConvertBGRA8888ToRGB888(u8 *dst, const u32 *src, u32 numPixels); void ConvertRGBA8888ToRGBA5551(u16 *dst, const u32 *src, u32 numPixels); void ConvertRGBA8888ToRGB565(u16 *dst, const u32 *src, u32 numPixels); void ConvertRGBA8888ToRGBA4444(u16 *dst, const u32 *src, u32 numPixels); +void ConvertRGBA8888ToRGB888(u8 *dst, const u32 *src, u32 numPixels); void ConvertBGRA8888ToRGBA5551(u16 *dst, const u32 *src, u32 numPixels); void ConvertBGRA8888ToRGB565(u16 *dst, const u32 *src, u32 numPixels); diff --git a/Common/GPU/thin3d.cpp b/Common/GPU/thin3d.cpp index 06f238c728..312bd91312 100644 --- a/Common/GPU/thin3d.cpp +++ b/Common/GPU/thin3d.cpp @@ -396,8 +396,6 @@ DrawContext::~DrawContext() { DestroyPresets(); } -// TODO: Use the functions we have in Common/ColorConv.cpp. -// Could also make C fake-simd for 64-bit, two 8888 pixels fit in a register :) void ConvertFromRGBA8888(uint8_t *dst, const uint8_t *src, uint32_t dstStride, uint32_t srcStride, uint32_t width, uint32_t height, DataFormat format) { // Must skip stride in the cases below. Some games pack data into the cracks, like MotoGP. const uint32_t *src32 = (const uint32_t *)src; @@ -415,9 +413,7 @@ void ConvertFromRGBA8888(uint8_t *dst, const uint8_t *src, uint32_t dstStride, u } } else if (format == Draw::DataFormat::R8G8B8_UNORM) { for (uint32_t y = 0; y < height; ++y) { - for (uint32_t x = 0; x < width; ++x) { - memcpy(dst + x * 3, src32 + x, 3); - } + ConvertRGBA8888ToRGB888(dst, src32, width); src32 += srcStride; dst += dstStride * 3; } @@ -455,8 +451,6 @@ void ConvertFromRGBA8888(uint8_t *dst, const uint8_t *src, uint32_t dstStride, u } } -// TODO: Use the functions we have in Common/ColorConv.cpp. -// Could also make C fake-simd for 64-bit, two 8888 pixels fit in a register :) void ConvertFromBGRA8888(uint8_t *dst, const uint8_t *src, uint32_t dstStride, uint32_t srcStride, uint32_t width, uint32_t height, DataFormat format) { // Must skip stride in the cases below. Some games pack data into the cracks, like MotoGP. const uint32_t *src32 = (const uint32_t *)src; @@ -481,12 +475,7 @@ void ConvertFromBGRA8888(uint8_t *dst, const uint8_t *src, uint32_t dstStride, u } } else if (format == Draw::DataFormat::R8G8B8_UNORM) { for (uint32_t y = 0; y < height; ++y) { - for (uint32_t x = 0; x < width; ++x) { - uint32_t c = src32[x]; - dst[x * 3 + 0] = (c >> 16) & 0xFF; - dst[x * 3 + 1] = (c >> 8) & 0xFF; - dst[x * 3 + 2] = (c >> 0) & 0xFF; - } + ConvertBGRA8888ToRGB888(dst, src32, width); src32 += srcStride; dst += dstStride * 3; }