Fix base level for generateMipmap in blink

Don't do base level clamp for generateMipmap. Generate error message for
generateMipmap if base level texture is not specified.

BUG=295792

Review URL: https://codereview.chromium.org/1306343007

git-svn-id: svn://svn.chromium.org/blink/trunk@201975 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent aa316dce
...@@ -2381,7 +2381,7 @@ void WebGLRenderingContextBase::generateMipmap(GLenum target) ...@@ -2381,7 +2381,7 @@ void WebGLRenderingContextBase::generateMipmap(GLenum target)
if (!tex) if (!tex)
return; return;
if (!tex->canGenerateMipmaps()) { if (!tex->canGenerateMipmaps()) {
synthesizeGLError(GL_INVALID_OPERATION, "generateMipmap", "level 0 not power of 2 or not all the same size"); synthesizeGLError(GL_INVALID_OPERATION, "generateMipmap", "cannot generate mipmaps");
return; return;
} }
if (tex->getInternalFormat(target, 0) == GL_SRGB_EXT || tex->getInternalFormat(target, 0) == GL_SRGB_ALPHA_EXT) { if (tex->getInternalFormat(target, 0) == GL_SRGB_EXT || tex->getInternalFormat(target, 0) == GL_SRGB_ALPHA_EXT) {
......
...@@ -214,15 +214,15 @@ void WebGLTexture::generateMipmapLevelInfo() ...@@ -214,15 +214,15 @@ void WebGLTexture::generateMipmapLevelInfo()
if (!canGenerateMipmaps()) if (!canGenerateMipmaps())
return; return;
if (!m_isComplete) { 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) { 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 width = info0.width;
GLsizei height = info0.height; GLsizei height = info0.height;
GLsizei depth = info0.depth; GLsizei depth = info0.depth;
GLint levelCount = computeLevelCount(width, height, depth); GLint levelCount = computeLevelCount(width, height, depth);
size_t maxLevel = m_isWebGL2OrHigher ? std::min(m_maxLevel, baseLevel + levelCount - 1) : baseLevel + levelCount - 1; size_t maxLevel = m_isWebGL2OrHigher ? std::min(m_maxLevel, m_baseLevel + levelCount - 1) : m_baseLevel + levelCount - 1;
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); width = std::max(1, width >> 1);
height = std::max(1, height >> 1); height = std::max(1, height >> 1);
depth = std::max(1, depth >> 1); depth = std::max(1, depth >> 1);
...@@ -354,10 +354,11 @@ bool WebGLTexture::canGenerateMipmaps() ...@@ -354,10 +354,11 @@ bool WebGLTexture::canGenerateMipmaps()
if (!m_isWebGL2OrHigher && isNPOT()) if (!m_isWebGL2OrHigher && isNPOT())
return false; return false;
size_t baseLevel = std::min(m_baseLevel, m_info[0].size() - 1); if (m_baseLevel >= m_info[0].size())
const LevelInfo& base = m_info[0][baseLevel]; return false;
const LevelInfo& base = m_info[0][m_baseLevel];
for (size_t ii = 0; ii < m_info.size(); ++ii) { 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 if (!info.valid
|| info.width != base.width || info.height != base.height || info.depth != base.depth || info.width != base.width || info.height != base.height || info.depth != base.depth
|| info.internalFormat != base.internalFormat || info.type != base.type || info.internalFormat != base.internalFormat || info.type != base.type
...@@ -399,17 +400,15 @@ void WebGLTexture::update() ...@@ -399,17 +400,15 @@ void WebGLTexture::update()
m_isComplete = true; m_isComplete = true;
m_isCubeComplete = true; m_isCubeComplete = true;
size_t baseLevel = std::min(m_baseLevel, m_info[0].size() - 1); if (m_baseLevel > m_maxLevel || m_baseLevel >= m_info[0].size()) {
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) {
m_isComplete = false; m_isComplete = false;
} }
else { 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) { 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 if (!info0.valid
|| info0.width != base.width || info0.height != base.height || info0.depth != base.depth || info0.width != base.width || info0.height != base.height || info0.depth != base.depth
|| info0.internalFormat != base.internalFormat || info0.type != base.type || info0.internalFormat != base.internalFormat || info0.type != base.type
...@@ -422,7 +421,8 @@ void WebGLTexture::update() ...@@ -422,7 +421,8 @@ void WebGLTexture::update()
GLsizei width = info0.width; GLsizei width = info0.width;
GLsizei height = info0.height; GLsizei height = info0.height;
GLsizei depth = info0.depth; 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); width = std::max(1, width >> 1);
height = std::max(1, height >> 1); height = std::max(1, height >> 1);
depth = std::max(1, depth >> 1); depth = std::max(1, depth >> 1);
......
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