diff --git a/dom/canvas/WebGL2ContextTextures.cpp b/dom/canvas/WebGL2ContextTextures.cpp index 21028d09e5b6..e134ed100c28 100644 --- a/dom/canvas/WebGL2ContextTextures.cpp +++ b/dom/canvas/WebGL2ContextTextures.cpp @@ -351,8 +351,6 @@ WebGL2Context::GetTexParameterInternal(const TexTarget& target, GLenum pname) { switch (pname) { case LOCAL_GL_TEXTURE_IMMUTABLE_FORMAT: - case LOCAL_GL_TEXTURE_BASE_LEVEL: - case LOCAL_GL_TEXTURE_MAX_LEVEL: { GLint i = 0; gl->fGetTexParameteriv(target.get(), pname, &i); diff --git a/dom/canvas/WebGLContextGL.cpp b/dom/canvas/WebGLContextGL.cpp index 74e67e38a489..cf8be3fed833 100644 --- a/dom/canvas/WebGLContextGL.cpp +++ b/dom/canvas/WebGLContextGL.cpp @@ -922,7 +922,7 @@ WebGLContext::GenerateMipmap(GLenum rawTarget) const TexImageTarget imageTarget = (target == LOCAL_GL_TEXTURE_2D) ? LOCAL_GL_TEXTURE_2D : LOCAL_GL_TEXTURE_CUBE_MAP_POSITIVE_X; - if (!tex->HasImageInfoAt(imageTarget, tex->GetBaseMipmapLevel())) + if (!tex->HasImageInfoAt(imageTarget, 0)) { return ErrorInvalidOperation("generateMipmap: Level zero of texture is not defined."); } @@ -1510,19 +1510,6 @@ void WebGLContext::TexParameter_base(GLenum rawTarget, GLenum pname, bool paramValueInvalid = false; switch (pname) { - case LOCAL_GL_TEXTURE_BASE_LEVEL: - case LOCAL_GL_TEXTURE_MAX_LEVEL: - if (!IsWebGL2()) - return ErrorInvalidEnumInfo("texParameter: pname", pname); - if (intParam < 0) { - paramValueInvalid = true; - break; - } - if (pname == LOCAL_GL_TEXTURE_BASE_LEVEL) - tex->SetBaseMipmapLevel(intParam); - else - tex->SetMaxMipmapLevel(intParam); - break; case LOCAL_GL_TEXTURE_MIN_FILTER: switch (intParam) { case LOCAL_GL_NEAREST: diff --git a/dom/canvas/WebGLTexture.cpp b/dom/canvas/WebGLTexture.cpp index e14bbc4d7c7a..45914f8e9794 100644 --- a/dom/canvas/WebGLTexture.cpp +++ b/dom/canvas/WebGLTexture.cpp @@ -33,8 +33,6 @@ WebGLTexture::WebGLTexture(WebGLContext *context) , mMaxLevelWithCustomImages(0) , mHaveGeneratedMipmap(false) , mImmutable(false) - , mBaseMipmapLevel(0) - , mMaxMipmapLevel(1000) , mFakeBlackStatus(WebGLTextureFakeBlackStatus::IncompleteTexture) { mContext->MakeContextCurrent(); @@ -64,8 +62,22 @@ WebGLTexture::MemoryUsage() const { return 0; size_t result = 0; for(size_t face = 0; face < mFacesCount; face++) { - for(size_t level = 0; level <= mMaxLevelWithCustomImages; level++) - result += ImageInfoAtFace(face, level).MemoryUsage(); + if (mHaveGeneratedMipmap) { + size_t level0MemoryUsage = ImageInfoAtFace(face, 0).MemoryUsage(); + // Each mipmap level is 1/(2^d) the size of the previous level, + // where d is 2 or 3 depending on whether the images are 2D or 3D + // 1 + x + x^2 + ... = 1/(1-x) + // for x = 1/(2^2), we get 1/(1-1/4) = 4/3 + // for x = 1/(2^3), we get 1/(1-1/8) = 8/7 + size_t allLevelsMemoryUsage = + mTarget == LOCAL_GL_TEXTURE_3D + ? level0MemoryUsage * 8 / 7 + : level0MemoryUsage * 4 / 3; + result += allLevelsMemoryUsage; + } else { + for(size_t level = 0; level <= mMaxLevelWithCustomImages; level++) + result += ImageInfoAtFace(face, level).MemoryUsage(); + } } return result; } @@ -76,24 +88,15 @@ WebGLTexture::DoesMipmapHaveAllLevelsConsistentlyDefined(TexImageTarget texImage if (mHaveGeneratedMipmap) return true; - if (GetMaxMipmapLevel() < GetBaseMipmapLevel()) - return false; - // We want a copy here so we can modify it temporarily. - ImageInfo expected = ImageInfoAt(texImageTarget, GetBaseMipmapLevel()); + ImageInfo expected = ImageInfoAt(texImageTarget, 0); // checks if custom level>0 images are all defined up to the highest level defined // and have the expected dimensions - for (size_t level = GetBaseMipmapLevel(); level <= GetMaxMipmapLevel(); ++level) { + for (size_t level = 0; level <= mMaxLevelWithCustomImages; ++level) { const ImageInfo& actual = ImageInfoAt(texImageTarget, level); if (actual != expected) return false; - - // Check the raw value here, not the clamped one, since we don't want - // to terminate early if there aren't enough levels defined. - if (level == mMaxMipmapLevel) - return true; - expected.mWidth = std::max(1, expected.mWidth / 2); expected.mHeight = std::max(1, expected.mHeight / 2); expected.mDepth = std::max(1, expected.mDepth / 2); @@ -182,7 +185,7 @@ WebGLTexture::SetCustomMipmap() { // since we were in GeneratedMipmap mode, we know that the level 0 images all have the same info, // and are power-of-two. - ImageInfo imageInfo = ImageInfoAtFace(0, GetBaseMipmapLevel()); + ImageInfo imageInfo = ImageInfoAtFace(0, 0); NS_ASSERTION(mContext->IsWebGL2() || imageInfo.IsPowerOfTwo(), "this texture is NPOT, so how could GenerateMipmap() ever accept it?"); @@ -195,7 +198,7 @@ WebGLTexture::SetCustomMipmap() { EnsureMaxLevelWithCustomImagesAtLeast(maxLevel); - for (size_t level = GetBaseMipmapLevel() + 1; level <= GetMaxMipmapLevel(); ++level) { + for (size_t level = 1; level <= maxLevel; ++level) { imageInfo.mWidth = std::max(imageInfo.mWidth / 2, 1); imageInfo.mHeight = std::max(imageInfo.mHeight / 2, 1); imageInfo.mDepth = std::max(imageInfo.mDepth / 2, 1); @@ -220,7 +223,7 @@ WebGLTexture::IsMipmapComplete() const { MOZ_ASSERT(mTarget == LOCAL_GL_TEXTURE_2D || mTarget == LOCAL_GL_TEXTURE_3D); - if (!ImageInfoAtFace(0, GetBaseMipmapLevel()).IsPositive()) + if (!ImageInfoAtFace(0, 0).IsPositive()) return false; if (mHaveGeneratedMipmap) return true; @@ -259,7 +262,7 @@ WebGLTexture::ResolvedFakeBlackStatus() { // See 3.8.2 Shader Execution in the OpenGL ES 2.0.24 spec. for (size_t face = 0; face < mFacesCount; ++face) { - if (ImageInfoAtFace(face, GetBaseMipmapLevel()).mImageDataStatus == WebGLImageDataStatus::NoImageData) { + if (ImageInfoAtFace(face, 0).mImageDataStatus == WebGLImageDataStatus::NoImageData) { // In case of undefined texture image, we don't print any message because this is a very common // and often legitimate case (asynchronous texture loading). mFakeBlackStatus = WebGLTextureFakeBlackStatus::IncompleteTexture; diff --git a/dom/canvas/WebGLTexture.h b/dom/canvas/WebGLTexture.h index 134f25094677..b7cca286be05 100644 --- a/dom/canvas/WebGLTexture.h +++ b/dom/canvas/WebGLTexture.h @@ -213,9 +213,6 @@ protected: bool mHaveGeneratedMipmap; // set by generateMipmap bool mImmutable; // set by texStorage* - size_t mBaseMipmapLevel; // set by texParameter (defaults to 0) - size_t mMaxMipmapLevel; // set by texParameter (defaults to 1000) - WebGLTextureFakeBlackStatus mFakeBlackStatus; void EnsureMaxLevelWithCustomImagesAtLeast(size_t aMaxLevelWithCustomImages) { @@ -286,17 +283,6 @@ public: bool IsImmutable() const { return mImmutable; } void SetImmutable() { mImmutable = true; } - void SetBaseMipmapLevel(unsigned level) { mBaseMipmapLevel = level; } - void SetMaxMipmapLevel(unsigned level) { mMaxMipmapLevel = level; } - size_t GetBaseMipmapLevel() const { - // Clamp to [0, levels - 1] - return std::min(mBaseMipmapLevel, mMaxLevelWithCustomImages); - } - size_t GetMaxMipmapLevel() const { - // Clamp to [base, levels - 1] - return std::min(mMaxMipmapLevel, mMaxLevelWithCustomImages); - } - size_t MaxLevelWithCustomImages() const { return mMaxLevelWithCustomImages; } // Returns the current fake-black-status, except if it was Unknown,