Chromium Code Reviews| Index: Source/modules/webgl/WebGLTexture.cpp |
| diff --git a/Source/modules/webgl/WebGLTexture.cpp b/Source/modules/webgl/WebGLTexture.cpp |
| index 16b651875b1ab555d8a3a9da1afc1fecb2a02618..40a4b682a614e3c30635d42552e18c548ab14a66 100644 |
| --- a/Source/modules/webgl/WebGLTexture.cpp |
| +++ b/Source/modules/webgl/WebGLTexture.cpp |
| @@ -214,15 +214,14 @@ 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; |
|
Ken Russell (switch to Gerrit)
2015/09/09 01:30:26
Is this code correct? It looks to me like it's pos
Zhenyao Mo
2015/09/09 01:34:48
in canGenerateMipmaps() the case where m_maxLevel
Ken Russell (switch to Gerrit)
2015/09/09 01:59:33
Sorry, could you please point me to that code? Loo
qiankun
2015/09/09 02:09:32
As we discussed in https://github.com/KhronosGroup
Ken Russell (switch to Gerrit)
2015/09/09 02:14:19
The question is what the loop below will do if max
Zhenyao Mo
2015/09/09 02:27:19
My bad. The check is in update(), unrelated to ge
qiankun
2015/09/09 04:36:06
WebGLRenderingContextBase::validateTexFuncDimensio
|
| + 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 +353,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 +399,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 +420,7 @@ void WebGLTexture::update() |
| GLsizei width = info0.width; |
| GLsizei height = info0.height; |
| GLsizei depth = info0.depth; |
| - for (size_t level = baseLevel + 1; level <= maxLevel; ++level) { |
| + 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); |