summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/HiresTextures.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/VideoCommon/HiresTextures.cpp')
-rw-r--r--Source/Core/VideoCommon/HiresTextures.cpp55
1 files changed, 38 insertions, 17 deletions
diff --git a/Source/Core/VideoCommon/HiresTextures.cpp b/Source/Core/VideoCommon/HiresTextures.cpp
index 02c328c922..d601370fb5 100644
--- a/Source/Core/VideoCommon/HiresTextures.cpp
+++ b/Source/Core/VideoCommon/HiresTextures.cpp
@@ -366,6 +366,21 @@ std::string HiresTexture::GenBaseName(const u8* texture, size_t texture_size, co
return name;
}
+u32 HiresTexture::CalculateMipCount(u32 width, u32 height)
+{
+ u32 mip_width = width;
+ u32 mip_height = height;
+ u32 mip_count = 1;
+ while (mip_width > 1 || mip_height > 1)
+ {
+ mip_width = std::max(mip_width / 2, 1u);
+ mip_height = std::max(mip_height / 2, 1u);
+ mip_count++;
+ }
+
+ return mip_count;
+}
+
std::shared_ptr<HiresTexture> HiresTexture::Search(const u8* texture, size_t texture_size,
const u8* tlut, size_t tlut_size, u32 width,
u32 height, int format, bool has_mipmaps)
@@ -453,39 +468,45 @@ std::unique_ptr<HiresTexture> HiresTexture::Load(const std::string& base_filenam
// Same deal if the custom texture isn't a multiple of the native size.
if (width != 0 && height != 0 && (first_mip.width % width || first_mip.height % height))
{
- WARN_LOG(VIDEO, "Invalid custom texture size %ux%u for texture %s. Please use an integer "
- "upscaling factor based on the native size %ux%u.",
- first_mip.width, first_mip.height, first_mip_filename.c_str(), width, height);
+ ERROR_LOG(VIDEO, "Invalid custom texture size %ux%u for texture %s. Please use an integer "
+ "upscaling factor based on the native size %ux%u.",
+ first_mip.width, first_mip.height, first_mip_filename.c_str(), width, height);
}
// Verify that each mip level is the correct size (divide by 2 each time).
- u32 current_mip_width = std::max(first_mip.width / 2, 1u);
- u32 current_mip_height = std::max(first_mip.height / 2, 1u);
+ u32 current_mip_width = first_mip.width;
+ u32 current_mip_height = first_mip.height;
for (u32 mip_level = 1; mip_level < static_cast<u32>(ret->m_levels.size()); mip_level++)
{
- const Level& level = ret->m_levels[mip_level];
- if (current_mip_width == level.width && current_mip_height == level.height)
+ if (current_mip_width != 1 || current_mip_height != 1)
{
current_mip_width = std::max(current_mip_width / 2, 1u);
current_mip_height = std::max(current_mip_height / 2, 1u);
- continue;
- }
- ERROR_LOG(VIDEO,
- "Invalid custom texture size %dx%d for texture %s. Mipmap level %u _must_ be %dx%d.",
- level.width, level.height, first_mip_filename.c_str(), mip_level, current_mip_width,
- current_mip_height);
+ const Level& level = ret->m_levels[mip_level];
+ if (current_mip_width == level.width && current_mip_height == level.height)
+ continue;
+
+ ERROR_LOG(VIDEO,
+ "Invalid custom texture size %dx%d for texture %s. Mipmap level %u must be %dx%d.",
+ level.width, level.height, first_mip_filename.c_str(), mip_level, current_mip_width,
+ current_mip_height);
+ }
+ else
+ {
+ // It is invalid to have more than a single 1x1 mipmap.
+ ERROR_LOG(VIDEO, "Custom texture %s has too many 1x1 mipmaps. Skipping extra levels.",
+ first_mip_filename.c_str());
+ }
// Drop this mip level and any others after it.
while (ret->m_levels.size() > mip_level)
ret->m_levels.pop_back();
-
- break;
}
// All levels have to have the same format.
- if (ret && std::any_of(ret->m_levels.begin(), ret->m_levels.end(),
- [&ret](const Level& l) { return l.format != ret->m_levels[0].format; }))
+ if (std::any_of(ret->m_levels.begin(), ret->m_levels.end(),
+ [&ret](const Level& l) { return l.format != ret->m_levels[0].format; }))
{
ERROR_LOG(VIDEO, "Custom texture %s has inconsistent formats across mip levels.",
first_mip_filename.c_str());