diff --git a/GPU/Common/TextureCacheCommon.cpp b/GPU/Common/TextureCacheCommon.cpp index 4bae334af..67938838d 100644 --- a/GPU/Common/TextureCacheCommon.cpp +++ b/GPU/Common/TextureCacheCommon.cpp @@ -230,7 +230,7 @@ void TextureCacheCommon::SetTexture(bool force) { u8 level = 0; if (IsFakeMipmapChange()) - level = (gstate.texlevel >> 20) & 0xF; + level = std::max(0, gstate.getTexLevelOffset16() / 16); u32 texaddr = gstate.getTextureAddress(level); if (!Memory::IsValidAddress(texaddr)) { // Bind a null texture and return. diff --git a/GPU/D3D11/TextureCacheD3D11.cpp b/GPU/D3D11/TextureCacheD3D11.cpp index 7250a34c1..d6149b9bb 100644 --- a/GPU/D3D11/TextureCacheD3D11.cpp +++ b/GPU/D3D11/TextureCacheD3D11.cpp @@ -571,7 +571,8 @@ void TextureCacheD3D11::BuildTexture(TexCacheEntry *const entry, bool replaceIma } if (IsFakeMipmapChange()) { - u8 level = (gstate.texlevel >> 20) & 0xF; + // NOTE: Since the level is not part of the cache key, we assume it never changes. + u8 level = std::max(0, gstate.getTexLevelOffset16() / 16); LoadTextureLevel(*entry, replaced, level, maxLevel, replaceImages, scaleFactor, dstFmt); } else { LoadTextureLevel(*entry, replaced, 0, maxLevel, replaceImages, scaleFactor, dstFmt); @@ -707,7 +708,7 @@ void TextureCacheD3D11::LoadTextureLevel(TexCacheEntry &entry, ReplacedTexture & desc.Width = tw; desc.Height = th; desc.Format = tfmt; - desc.MipLevels = IsFakeMipmapChange() ? 1 :levels; + desc.MipLevels = IsFakeMipmapChange() ? 1 : levels; desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; ASSERT_SUCCESS(device_->CreateTexture2D(&desc, nullptr, &texture)); diff --git a/GPU/Directx9/TextureCacheDX9.cpp b/GPU/Directx9/TextureCacheDX9.cpp index 0a3e82ae3..f7227a8fd 100644 --- a/GPU/Directx9/TextureCacheDX9.cpp +++ b/GPU/Directx9/TextureCacheDX9.cpp @@ -574,7 +574,8 @@ void TextureCacheDX9::BuildTexture(TexCacheEntry *const entry, bool replaceImage } if (IsFakeMipmapChange()) { - u8 level = (gstate.texlevel >> 20) & 0xF; + // NOTE: Since the level is not part of the cache key, we assume it never changes. + u8 level = std::max(0, gstate.getTexLevelOffset16() / 16); LoadTextureLevel(*entry, replaced, level, maxLevel, replaceImages, scaleFactor, dstFmt); } else { LoadTextureLevel(*entry, replaced, 0, maxLevel, replaceImages, scaleFactor, dstFmt); diff --git a/GPU/GLES/TextureCacheGLES.cpp b/GPU/GLES/TextureCacheGLES.cpp index fbbf489bc..044425da1 100644 --- a/GPU/GLES/TextureCacheGLES.cpp +++ b/GPU/GLES/TextureCacheGLES.cpp @@ -688,7 +688,8 @@ void TextureCacheGLES::BuildTexture(TexCacheEntry *const entry, bool replaceImag // Always load base level texture here if (IsFakeMipmapChange()) { - u8 level = (gstate.texlevel >> 20) & 0xF; + // NOTE: Since the level is not part of the cache key, we assume it never changes. + u8 level = std::max(0, gstate.getTexLevelOffset16() / 16); LoadTextureLevel(*entry, replaced, level, replaceImages, scaleFactor, dstFmt); } else LoadTextureLevel(*entry, replaced, 0, replaceImages, scaleFactor, dstFmt); diff --git a/GPU/Vulkan/TextureCacheVulkan.cpp b/GPU/Vulkan/TextureCacheVulkan.cpp index b1fbad234..0b112b89c 100644 --- a/GPU/Vulkan/TextureCacheVulkan.cpp +++ b/GPU/Vulkan/TextureCacheVulkan.cpp @@ -630,7 +630,8 @@ void TextureCacheVulkan::BuildTexture(TexCacheEntry *const entry, bool replaceIm } if (entry->vkTex) { - u8 level = (gstate.texlevel >> 20) & 0xF; + // NOTE: Since the level is not part of the cache key, we assume it never changes. + u8 level = std::max(0, gstate.getTexLevelOffset16() / 16); bool fakeMipmap = IsFakeMipmapChange() && level > 0; // Upload the texture data. for (int i = 0; i <= maxLevel; i++) {