Commit d665593b by Jamie Madill Committed by Angle LUCI CQ

Update TextureState::getEnabledLevelCount.

Instead of simply returning a count of all non-empty texture desc levels, we iterate the levels from the base level and return the count of levels that make a consistent mip chain. This will fix edge cases where Textures are defined sequentially with inconsistent mip levels, but valid rendering states. Bug: angleproject:4780 Change-Id: Id3ebf2d7ad706070896cb5cdf2a311dba2c88949 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3007135Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 955b4620
......@@ -564,16 +564,36 @@ GLuint TextureState::getEnabledLevelCount() const
// The mip chain will have either one or more sequential levels, or max levels,
// but not a sparse one.
for (size_t descIndex = baseLevel; descIndex < mImageDescs.size();)
Optional<Extents> expectedSize;
for (size_t enabledLevel = baseLevel; enabledLevel <= maxLevel; ++enabledLevel, ++levelCount)
{
if (!mImageDescs[descIndex].size.empty())
// Note: for cube textures, we only check the first face.
TextureTarget target = TextureTypeToTarget(mType, 0);
size_t descIndex = GetImageDescIndex(target, enabledLevel);
const Extents &levelSize = mImageDescs[descIndex].size;
if (levelSize.empty())
{
break;
}
if (expectedSize.valid())
{
levelCount++;
Extents newSize = expectedSize.value();
newSize.width = std::max(1, newSize.width >> 1);
newSize.height = std::max(1, newSize.height >> 1);
if (!IsArrayTextureType(mType))
{
newSize.depth = std::max(1, newSize.depth >> 1);
}
if (newSize != levelSize)
{
break;
}
}
descIndex = (mType == TextureType::CubeMap) ? descIndex + 6 : descIndex + 1;
expectedSize = levelSize;
}
// The original image already takes account into the levelCount.
levelCount = std::min(maxLevel - baseLevel + 1, levelCount);
return levelCount;
}
......
......@@ -8444,9 +8444,6 @@ TEST_P(Texture2DTestES3, GenerateMipmapAndBaseLevelLUMA)
// Incompatible levels with non-mipmap filtering should work.
TEST_P(Texture2DTestES3, IncompatibleMipsButNoMipmapFiltering)
{
// http://anglebug.com/4780
ANGLE_SKIP_TEST_IF(IsVulkan());
// http://anglebug.com/4782
ANGLE_SKIP_TEST_IF(IsOpenGL() && IsWindows() && (IsAMD() || IsIntel()));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment