diff --git a/GPU/Directx9/TextureCacheDX9.cpp b/GPU/Directx9/TextureCacheDX9.cpp index 15dcc55f59..a89447a1cf 100644 --- a/GPU/Directx9/TextureCacheDX9.cpp +++ b/GPU/Directx9/TextureCacheDX9.cpp @@ -474,11 +474,11 @@ void TextureCacheDX9::NotifyFramebuffer(u32 address, VirtualFramebuffer *framebu } } -void *TextureCacheDX9::UnswizzleFromMem(const u8 *texptr, u32 bufw, u32 bytesPerPixel, u32 level) { +void *TextureCacheDX9::UnswizzleFromMem(const u8 *texptr, u32 bufw, u32 height, u32 bytesPerPixel) { const u32 rowWidth = (bytesPerPixel > 0) ? (bufw * bytesPerPixel) : (bufw / 2); const u32 pitch = rowWidth / 4; const int bxc = rowWidth / 16; - int byc = (gstate.getTextureHeight(level) + 7) / 8; + int byc = (height + 7) / 8; if (byc == 0) byc = 1; @@ -559,7 +559,7 @@ void *TextureCacheDX9::ReadIndexedTex(int level, const u8 *texptr, int bytesPerI } } else { tmpTexBuf32.resize(std::max(bufw, w) * h); - UnswizzleFromMem(texptr, bufw, bytesPerIndex, level); + UnswizzleFromMem(texptr, bufw, h, bytesPerIndex); switch (bytesPerIndex) { case 1: DeIndexTexture(tmpTexBuf16.data(), (u8 *) tmpTexBuf32.data(), length, clut); @@ -599,7 +599,7 @@ void *TextureCacheDX9::ReadIndexedTex(int level, const u8 *texptr, int bytesPerI } buf = tmpTexBuf32.data(); } else { - UnswizzleFromMem(texptr, bufw, bytesPerIndex, level); + UnswizzleFromMem(texptr, bufw, h, bytesPerIndex); // Since we had to unswizzle to tmpTexBuf32, let's output to tmpTexBuf16. tmpTexBuf16.resize(std::max(bufw, w) * h * 2); u32 *dest32 = (u32 *) tmpTexBuf16.data(); @@ -1500,7 +1500,7 @@ void *TextureCacheDX9::DecodeTextureLevel(GETextureFormat format, GEPaletteForma } } else { tmpTexBuf32.resize(std::max(bufw, w) * h); - UnswizzleFromMem(texptr, bufw, 0, level); + UnswizzleFromMem(texptr, bufw, h, 0); if (clutAlphaLinear_ && mipmapShareClut) { DeIndexTexture4Optimal(tmpTexBuf16.data(), (const u8 *)tmpTexBuf32.data(), bufw * h, clutAlphaLinearColor_); } else { @@ -1520,7 +1520,7 @@ void *TextureCacheDX9::DecodeTextureLevel(GETextureFormat format, GEPaletteForma DeIndexTexture4(tmpTexBuf32.data(), texptr, bufw * h, clut); finalBuf = tmpTexBuf32.data(); } else { - UnswizzleFromMem(texptr, bufw, 0, level); + UnswizzleFromMem(texptr, bufw, h, 0); // Let's reuse tmpTexBuf16, just need double the space. tmpTexBuf16.resize(std::max(bufw, w) * h * 2); DeIndexTexture4((u32 *)tmpTexBuf16.data(), (u8 *)tmpTexBuf32.data(), bufw * h, clut); @@ -1565,7 +1565,7 @@ void *TextureCacheDX9::DecodeTextureLevel(GETextureFormat format, GEPaletteForma } else { tmpTexBuf32.resize(std::max(bufw, w) * h); - finalBuf = UnswizzleFromMem(texptr, bufw, 2, level); + finalBuf = UnswizzleFromMem(texptr, bufw, h, 2); } break; @@ -1584,7 +1584,7 @@ void *TextureCacheDX9::DecodeTextureLevel(GETextureFormat format, GEPaletteForma } } else { tmpTexBuf32.resize(std::max(bufw, w) * h); - finalBuf = UnswizzleFromMem(texptr, bufw, 4, level); + finalBuf = UnswizzleFromMem(texptr, bufw, h, 4); } break; diff --git a/GPU/Directx9/TextureCacheDX9.h b/GPU/Directx9/TextureCacheDX9.h index 67f8d1d0a3..0948573dea 100644 --- a/GPU/Directx9/TextureCacheDX9.h +++ b/GPU/Directx9/TextureCacheDX9.h @@ -166,7 +166,7 @@ private: void Decimate(); // Run this once per frame to get rid of old textures. void DeleteTexture(TexCache::iterator it); - void *UnswizzleFromMem(const u8 *texptr, u32 bufw, u32 bytesPerPixel, u32 level); + void *UnswizzleFromMem(const u8 *texptr, u32 bufw, u32 height, u32 bytesPerPixel); void *ReadIndexedTex(int level, const u8 *texptr, int bytesPerIndex, u32 dstFmt, int bufw); void GetSamplingParams(int &minFilt, int &magFilt, bool &sClamp, bool &tClamp, float &lodBias, int maxLevel); void UpdateSamplingParams(TexCacheEntry &entry, bool force); diff --git a/GPU/GLES/TextureCache.cpp b/GPU/GLES/TextureCache.cpp index 1bdc049c69..e82a104d27 100644 --- a/GPU/GLES/TextureCache.cpp +++ b/GPU/GLES/TextureCache.cpp @@ -470,11 +470,11 @@ void TextureCache::NotifyFramebuffer(u32 address, VirtualFramebuffer *framebuffe } } -void *TextureCache::UnswizzleFromMem(const u8 *texptr, u32 bufw, u32 bytesPerPixel, u32 level) { +void *TextureCache::UnswizzleFromMem(const u8 *texptr, u32 bufw, u32 height, u32 bytesPerPixel) { const u32 rowWidth = (bytesPerPixel > 0) ? (bufw * bytesPerPixel) : (bufw / 2); const u32 pitch = rowWidth / 4; const int bxc = rowWidth / 16; - int byc = (gstate.getTextureHeight(level) + 7) / 8; + int byc = (height + 7) / 8; if (byc == 0) byc = 1; @@ -555,7 +555,7 @@ void *TextureCache::ReadIndexedTex(int level, const u8 *texptr, int bytesPerInde } } else { tmpTexBuf32.resize(std::max(bufw, w) * h); - UnswizzleFromMem(texptr, bufw, bytesPerIndex, level); + UnswizzleFromMem(texptr, bufw, h, bytesPerIndex); switch (bytesPerIndex) { case 1: DeIndexTexture(tmpTexBuf16.data(), (u8 *) tmpTexBuf32.data(), length, clut); @@ -595,7 +595,7 @@ void *TextureCache::ReadIndexedTex(int level, const u8 *texptr, int bytesPerInde } buf = tmpTexBuf32.data(); } else { - UnswizzleFromMem(texptr, bufw, bytesPerIndex, level); + UnswizzleFromMem(texptr, bufw, h, bytesPerIndex); // Since we had to unswizzle to tmpTexBuf32, let's output to tmpTexBuf16. tmpTexBuf16.resize(std::max(bufw, w) * h * 2); u32 *dest32 = (u32 *) tmpTexBuf16.data(); @@ -1629,7 +1629,7 @@ void *TextureCache::DecodeTextureLevel(GETextureFormat format, GEPaletteFormat c } } else { tmpTexBuf32.resize(std::max(bufw, w) * h); - UnswizzleFromMem(texptr, bufw, 0, level); + UnswizzleFromMem(texptr, bufw, h, 0); if (clutAlphaLinear_ && mipmapShareClut) { DeIndexTexture4Optimal(tmpTexBuf16.data(), (const u8 *)tmpTexBuf32.data(), bufw * h, clutAlphaLinearColor_); } else { @@ -1649,7 +1649,7 @@ void *TextureCache::DecodeTextureLevel(GETextureFormat format, GEPaletteFormat c DeIndexTexture4(tmpTexBuf32.data(), texptr, bufw * h, clut); finalBuf = tmpTexBuf32.data(); } else { - UnswizzleFromMem(texptr, bufw, 0, level); + UnswizzleFromMem(texptr, bufw, h, 0); // Let's reuse tmpTexBuf16, just need double the space. tmpTexBuf16.resize(std::max(bufw, w) * h * 2); DeIndexTexture4((u32 *)tmpTexBuf16.data(), (u8 *)tmpTexBuf32.data(), bufw * h, clut); @@ -1693,7 +1693,7 @@ void *TextureCache::DecodeTextureLevel(GETextureFormat format, GEPaletteFormat c ConvertColors(finalBuf, texptr, dstFmt, bufw * h); } else { tmpTexBuf32.resize(std::max(bufw, w) * h); - finalBuf = UnswizzleFromMem(texptr, bufw, 2, level); + finalBuf = UnswizzleFromMem(texptr, bufw, h, 2); ConvertColors(finalBuf, finalBuf, dstFmt, bufw * h); } break; @@ -1717,7 +1717,7 @@ void *TextureCache::DecodeTextureLevel(GETextureFormat format, GEPaletteFormat c } } else { tmpTexBuf32.resize(std::max(bufw, w) * h); - finalBuf = UnswizzleFromMem(texptr, bufw, 4, level); + finalBuf = UnswizzleFromMem(texptr, bufw, h, 4); ConvertColors(finalBuf, finalBuf, dstFmt, bufw * h); } break; diff --git a/GPU/GLES/TextureCache.h b/GPU/GLES/TextureCache.h index 36bae85fc8..e5d4d6a663 100644 --- a/GPU/GLES/TextureCache.h +++ b/GPU/GLES/TextureCache.h @@ -178,7 +178,7 @@ private: void Decimate(); // Run this once per frame to get rid of old textures. void DeleteTexture(TexCache::iterator it); - void *UnswizzleFromMem(const u8 *texptr, u32 bufw, u32 bytesPerPixel, u32 level); + void *UnswizzleFromMem(const u8 *texptr, u32 bufw, u32 height, u32 bytesPerPixel); void *ReadIndexedTex(int level, const u8 *texptr, int bytesPerIndex, GLuint dstFmt, int bufw); void GetSamplingParams(int &minFilt, int &magFilt, bool &sClamp, bool &tClamp, float &lodBias, int maxLevel); void UpdateSamplingParams(TexCacheEntry &entry, bool force);