From 4e1bdab8c714a9deeab37d399db81d2e8aba4497 Mon Sep 17 00:00:00 2001 From: rogerman Date: Sat, 5 Aug 2017 22:45:38 -0700 Subject: [PATCH] Fix some graphical bugs on big-endian systems. (Regressions from commits f8d129b and f97283e.) --- desmume/src/GPU.h | 4 +-- desmume/src/OGLRender.cpp | 30 +++++++++++-------- desmume/src/frontend/cocoa/DeSmuME_Prefix.pch | 6 +++- desmume/src/texcache.cpp | 10 +++---- 4 files changed, 30 insertions(+), 20 deletions(-) diff --git a/desmume/src/GPU.h b/desmume/src/GPU.h index f9aa00517..0c55373b1 100644 --- a/desmume/src/GPU.h +++ b/desmume/src/GPU.h @@ -792,7 +792,7 @@ enum GPUEngineID #define ADDRESS_STEP_512KB 0x80000 #define ADDRESS_MASK_256KB (ADDRESS_STEP_256KB-1) -#ifdef LOCAL_BE +#ifdef MSB_FIRST struct _TILEENTRY { /*14*/ unsigned Palette:4; @@ -823,7 +823,7 @@ typedef union */ struct _COLOR { // abgr x555 -#ifdef LOCAL_BE +#ifdef MSB_FIRST unsigned alpha:1; // sometimes it is unused (pad) unsigned blue:5; unsigned green:5; diff --git a/desmume/src/OGLRender.cpp b/desmume/src/OGLRender.cpp index 292ceaa2f..749f2b109 100755 --- a/desmume/src/OGLRender.cpp +++ b/desmume/src/OGLRender.cpp @@ -36,6 +36,12 @@ #include "./utils/colorspacehandler/colorspacehandler_SSE2.h" #endif +#if MSB_FIRST + #define GL_TEXTURE_SRC_FORMAT GL_UNSIGNED_INT_8_8_8_8 +#else + #define GL_TEXTURE_SRC_FORMAT GL_UNSIGNED_INT_8_8_8_8_REV +#endif + typedef struct { unsigned int major; @@ -758,11 +764,11 @@ void OpenGLTexture::Load(bool isNewTexture) if (isNewTexture) { - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, this->_sizeS, this->_sizeT, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, textureSrc); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, this->_sizeS, this->_sizeT, 0, GL_RGBA, GL_TEXTURE_SRC_FORMAT, textureSrc); } else { - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, this->_sizeS, this->_sizeT, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, textureSrc); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, this->_sizeS, this->_sizeT, GL_RGBA, GL_TEXTURE_SRC_FORMAT, textureSrc); } break; } @@ -776,13 +782,13 @@ void OpenGLTexture::Load(bool isNewTexture) if (isNewTexture) { - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, this->_sizeS*2, this->_sizeT*2, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, this->_upscaleBuffer); - glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, this->_sizeS*1, this->_sizeT*1, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, textureSrc); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, this->_sizeS*2, this->_sizeT*2, 0, GL_RGBA, GL_TEXTURE_SRC_FORMAT, this->_upscaleBuffer); + glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, this->_sizeS*1, this->_sizeT*1, 0, GL_RGBA, GL_TEXTURE_SRC_FORMAT, textureSrc); } else { - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, this->_sizeS*2, this->_sizeT*2, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, this->_upscaleBuffer); - glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, this->_sizeS*1, this->_sizeT*1, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, textureSrc); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, this->_sizeS*2, this->_sizeT*2, GL_RGBA, GL_TEXTURE_SRC_FORMAT, this->_upscaleBuffer); + glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, this->_sizeS*1, this->_sizeT*1, GL_RGBA, GL_TEXTURE_SRC_FORMAT, textureSrc); } break; } @@ -796,21 +802,21 @@ void OpenGLTexture::Load(bool isNewTexture) if (isNewTexture) { - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, this->_sizeS*4, this->_sizeT*4, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, this->_upscaleBuffer); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, this->_sizeS*4, this->_sizeT*4, 0, GL_RGBA, GL_TEXTURE_SRC_FORMAT, this->_upscaleBuffer); this->_Upscale<2>(textureSrc, this->_upscaleBuffer); - glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, this->_sizeS*2, this->_sizeT*2, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, this->_upscaleBuffer); + glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, this->_sizeS*2, this->_sizeT*2, 0, GL_RGBA, GL_TEXTURE_SRC_FORMAT, this->_upscaleBuffer); - glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA, this->_sizeS*1, this->_sizeT*1, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, textureSrc); + glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA, this->_sizeS*1, this->_sizeT*1, 0, GL_RGBA, GL_TEXTURE_SRC_FORMAT, textureSrc); } else { - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, this->_sizeS*4, this->_sizeT*4, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, this->_upscaleBuffer); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, this->_sizeS*4, this->_sizeT*4, GL_RGBA, GL_TEXTURE_SRC_FORMAT, this->_upscaleBuffer); this->_Upscale<2>(textureSrc, this->_upscaleBuffer); - glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, this->_sizeS*2, this->_sizeT*2, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, this->_upscaleBuffer); + glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, this->_sizeS*2, this->_sizeT*2, GL_RGBA, GL_TEXTURE_SRC_FORMAT, this->_upscaleBuffer); - glTexSubImage2D(GL_TEXTURE_2D, 2, 0, 0, this->_sizeS*1, this->_sizeT*1, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, textureSrc); + glTexSubImage2D(GL_TEXTURE_2D, 2, 0, 0, this->_sizeS*1, this->_sizeT*1, GL_RGBA, GL_TEXTURE_SRC_FORMAT, textureSrc); } break; } diff --git a/desmume/src/frontend/cocoa/DeSmuME_Prefix.pch b/desmume/src/frontend/cocoa/DeSmuME_Prefix.pch index 9ce43b793..e55e67068 100644 --- a/desmume/src/frontend/cocoa/DeSmuME_Prefix.pch +++ b/desmume/src/frontend/cocoa/DeSmuME_Prefix.pch @@ -1,6 +1,6 @@ /* Copyright (C) 2011 Roger Manuel - Copyright (C) 2012 DeSmuME team + Copyright (C) 2012-2017 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -32,5 +32,9 @@ #define HAVE_JIT #endif +#if defined(__ppc__) || defined(__ppc64__) + #define MSB_FIRST 1 +#endif + #define PORT_VERSION "Cocoa" #define PORT_VERSION_OS_X_APP diff --git a/desmume/src/texcache.cpp b/desmume/src/texcache.cpp index 7e8382de7..1c71820f4 100644 --- a/desmume/src/texcache.cpp +++ b/desmume/src/texcache.cpp @@ -472,7 +472,7 @@ TextureStore::TextureStore(const u32 texAttributes, const u32 palAttributes) { MemSpan currentPaletteMS = MemSpan_TexPalette(_paletteAddress, _paletteSize, false); -#ifdef WORDS_BIGENDIAN +#ifdef MSB_FIRST currentPaletteMS.dump16(_paletteColorTable); #else currentPaletteMS.dump(_paletteColorTable); @@ -594,7 +594,7 @@ void TextureStore::SetTexturePalette(const MemSpan &packedPalette) { if (this->_paletteSize > 0) { -#ifdef WORDS_BIGENDIAN +#ifdef MSB_FIRST packedPalette.dump16(this->_paletteColorTable); #else packedPalette.dump(this->_paletteColorTable); @@ -783,7 +783,7 @@ void TextureStore::VRAMCompareAndUpdate() currentPackedTexIndexMS.dump(this->_workingData + this->_packSize); } -#ifdef WORDS_BIGENDIAN +#ifdef MSB_FIRST currentPaletteMS.dump16(this->_workingData + this->_packSize + this->_packIndexSize); #else currentPaletteMS.dump(this->_workingData + this->_packSize + this->_packIndexSize); @@ -1210,7 +1210,7 @@ void NDSTextureUnpack4x4(const size_t srcSize, const u32 *__restrict srcData, co break; case 1: -#ifdef LOCAL_BE +#ifdef MSB_FIRST tmp_col[2] = ( (((tmp_col[0] & 0xFF000000) >> 1)+((tmp_col[1] & 0xFF000000) >> 1)) & 0xFF000000 ) | ( (((tmp_col[0] & 0x00FF0000) + (tmp_col[1] & 0x00FF0000)) >> 1) & 0x00FF0000 ) | ( (((tmp_col[0] & 0x0000FF00) + (tmp_col[1] & 0x0000FF00)) >> 1) & 0x0000FF00 ) | @@ -1231,7 +1231,7 @@ void NDSTextureUnpack4x4(const size_t srcSize, const u32 *__restrict srcData, co case 3: { -#ifdef LOCAL_BE +#ifdef MSB_FIRST const u32 r0 = (tmp_col[0]>>24) & 0x000000FF; const u32 r1 = (tmp_col[1]>>24) & 0x000000FF; const u32 g0 = (tmp_col[0]>>16) & 0x000000FF;