Index: Source/modules/webgl/WebGLTexture.cpp |
diff --git a/Source/modules/webgl/WebGLTexture.cpp b/Source/modules/webgl/WebGLTexture.cpp |
index 16b651875b1ab555d8a3a9da1afc1fecb2a02618..338c83ad086575051e2ffeaeeda529f78a9e7925 100644 |
--- a/Source/modules/webgl/WebGLTexture.cpp |
+++ b/Source/modules/webgl/WebGLTexture.cpp |
@@ -214,15 +214,15 @@ void WebGLTexture::generateMipmapLevelInfo() |
if (!canGenerateMipmaps()) |
return; |
if (!m_isComplete) { |
- size_t baseLevel = std::min(m_baseLevel, m_info[0].size() - 1); |
for (size_t ii = 0; ii < m_info.size(); ++ii) { |
- const LevelInfo& info0 = m_info[ii][baseLevel]; |
+ const LevelInfo& info0 = m_info[ii][m_baseLevel]; |
GLsizei width = info0.width; |
GLsizei height = info0.height; |
GLsizei depth = info0.depth; |
GLint levelCount = computeLevelCount(width, height, depth); |
- size_t maxLevel = m_isWebGL2OrHigher ? std::min(m_maxLevel, baseLevel + levelCount - 1) : baseLevel + levelCount - 1; |
- for (size_t level = baseLevel + 1; level <= maxLevel; ++level) { |
+ size_t maxLevel = m_isWebGL2OrHigher ? std::min(m_maxLevel, m_baseLevel + levelCount - 1) : m_baseLevel + levelCount - 1; |
+ ASSERT(maxLevel < m_info[ii].size()); |
+ for (size_t level = m_baseLevel + 1; level <= maxLevel; ++level) { |
width = std::max(1, width >> 1); |
height = std::max(1, height >> 1); |
depth = std::max(1, depth >> 1); |
@@ -354,10 +354,11 @@ bool WebGLTexture::canGenerateMipmaps() |
if (!m_isWebGL2OrHigher && isNPOT()) |
return false; |
- size_t baseLevel = std::min(m_baseLevel, m_info[0].size() - 1); |
- const LevelInfo& base = m_info[0][baseLevel]; |
+ if (m_baseLevel >= m_info[0].size()) |
+ return false; |
+ const LevelInfo& base = m_info[0][m_baseLevel]; |
for (size_t ii = 0; ii < m_info.size(); ++ii) { |
- const LevelInfo& info = m_info[ii][baseLevel]; |
+ const LevelInfo& info = m_info[ii][m_baseLevel]; |
if (!info.valid |
|| info.width != base.width || info.height != base.height || info.depth != base.depth |
|| info.internalFormat != base.internalFormat || info.type != base.type |
@@ -399,17 +400,15 @@ void WebGLTexture::update() |
m_isComplete = true; |
m_isCubeComplete = true; |
- size_t baseLevel = std::min(m_baseLevel, m_info[0].size() - 1); |
- const LevelInfo& base = m_info[0][baseLevel]; |
- size_t levelCount = computeLevelCount(base.width, base.height, base.depth); |
- size_t maxLevel = m_isWebGL2OrHigher ? std::min(m_maxLevel, baseLevel + levelCount - 1) : baseLevel + levelCount - 1; |
- |
- if (baseLevel > maxLevel) { |
+ if (m_baseLevel > m_maxLevel || m_baseLevel >= m_info[0].size()) { |
m_isComplete = false; |
} |
else { |
+ const LevelInfo& base = m_info[0][m_baseLevel]; |
+ size_t levelCount = computeLevelCount(base.width, base.height, base.depth); |
+ size_t maxLevel = m_isWebGL2OrHigher ? std::min(m_maxLevel, m_baseLevel + levelCount - 1) : m_baseLevel + levelCount - 1; |
for (size_t ii = 0; ii < m_info.size() && m_isComplete; ++ii) { |
- const LevelInfo& info0 = m_info[ii][baseLevel]; |
+ const LevelInfo& info0 = m_info[ii][m_baseLevel]; |
if (!info0.valid |
|| info0.width != base.width || info0.height != base.height || info0.depth != base.depth |
|| info0.internalFormat != base.internalFormat || info0.type != base.type |
@@ -422,7 +421,8 @@ void WebGLTexture::update() |
GLsizei width = info0.width; |
GLsizei height = info0.height; |
GLsizei depth = info0.depth; |
- for (size_t level = baseLevel + 1; level <= maxLevel; ++level) { |
+ ASSERT(maxLevel < m_info[ii].size()); |
+ for (size_t level = m_baseLevel + 1; level <= maxLevel; ++level) { |
width = std::max(1, width >> 1); |
height = std::max(1, height >> 1); |
depth = std::max(1, depth >> 1); |