void WebGLTexture::GenerateMipmap(TexTarget texTarget) { const TexImageTarget imageTarget = (texTarget == LOCAL_GL_TEXTURE_2D) ? LOCAL_GL_TEXTURE_2D : LOCAL_GL_TEXTURE_CUBE_MAP_POSITIVE_X; if (!IsMipmapRangeValid()) { return mContext->ErrorInvalidOperation("generateMipmap: Texture does not have a valid mipmap range."); } if (!HasImageInfoAt(imageTarget, EffectiveBaseMipmapLevel())) { return mContext->ErrorInvalidOperation("generateMipmap: Level zero of texture is not defined."); } if (!mContext->IsWebGL2() && !IsFirstImagePowerOfTwo()) return mContext->ErrorInvalidOperation("generateMipmap: Level zero of texture does not have power-of-two width and height."); TexInternalFormat internalformat = ImageInfoAt(imageTarget, 0).EffectiveInternalFormat(); if (IsTextureFormatCompressed(internalformat)) return mContext->ErrorInvalidOperation("generateMipmap: Texture data at level zero is compressed."); if (mContext->IsExtensionEnabled(WebGLExtensionID::WEBGL_depth_texture) && (IsGLDepthFormat(internalformat) || IsGLDepthStencilFormat(internalformat))) { return mContext->ErrorInvalidOperation("generateMipmap: " "A texture that has a base internal format of " "DEPTH_COMPONENT or DEPTH_STENCIL isn't supported"); } if (!AreAllLevel0ImageInfosEqual()) return mContext->ErrorInvalidOperation("generateMipmap: The six faces of this cube map have different dimensions, format, or type."); SetGeneratedMipmap(); mContext->MakeContextCurrent(); gl::GLContext* gl = mContext->gl; if (gl->WorkAroundDriverBugs()) { // bug 696495 - to work around failures in the texture-mips.html test on various drivers, we // set the minification filter before calling glGenerateMipmap. This should not carry a significant performance // overhead so we do it unconditionally. // // note that the choice of GL_NEAREST_MIPMAP_NEAREST really matters. See Chromium bug 101105. gl->fTexParameteri(texTarget.get(), LOCAL_GL_TEXTURE_MIN_FILTER, LOCAL_GL_NEAREST_MIPMAP_NEAREST); gl->fGenerateMipmap(texTarget.get()); gl->fTexParameteri(texTarget.get(), LOCAL_GL_TEXTURE_MIN_FILTER, MinFilter().get()); } else { gl->fGenerateMipmap(texTarget.get()); } }
static inline bool IsValidFBOTextureDepthStencilFormat(GLenum internalformat) { return IsGLDepthStencilFormat(internalformat); }