1291083 - Textures with depth-compare should be filterable. - r=mtseng
draft
1291083 - Textures with depth-compare should be filterable. - r=mtseng
This also makes depth-textures follow filtering rules, whereas before we
allowed filtered depth textures for WEBGL_depth_texture.
MozReview-Commit-ID: LxepCb4WEkr
--- a/dom/canvas/WebGLTexture.cpp
+++ b/dom/canvas/WebGLTexture.cpp
@@ -333,48 +333,42 @@ WebGLTexture::IsComplete(uint32_t texUni
const bool isMinFilteringNearest = (minFilter == LOCAL_GL_NEAREST ||
minFilter == LOCAL_GL_NEAREST_MIPMAP_NEAREST);
const bool isMagFilteringNearest = (magFilter == LOCAL_GL_NEAREST);
const bool isFilteringNearestOnly = (isMinFilteringNearest && isMagFilteringNearest);
if (!isFilteringNearestOnly) {
auto formatUsage = baseImageInfo.mFormat;
auto format = formatUsage->format;
- // "* The effective internal format specified for the texture arrays is a sized
- // internal color format that is not texture-filterable, and either the
- // magnification filter is not NEAREST or the minification filter is neither
- // NEAREST nor NEAREST_MIPMAP_NEAREST."
- // Since all (GLES3) unsized color formats are filterable just like their sized
- // equivalents, we don't have to care whether its sized or not.
- if (format->IsColorFormat() && !formatUsage->isFilterable) {
- *out_reason = "Because minification or magnification filtering is not NEAREST"
- " or NEAREST_MIPMAP_NEAREST, and the texture's format is a"
- " color format, its format must be \"texture-filterable\".";
- return false;
- }
+ bool isFilterable = formatUsage->isFilterable;
// "* The effective internal format specified for the texture arrays is a sized
// internal depth or depth and stencil format, the value of
// TEXTURE_COMPARE_MODE is NONE[1], and either the magnification filter is not
// NEAREST, or the minification filter is neither NEAREST nor
// NEAREST_MIPMAP_NEAREST."
// [1]: This sounds suspect, but is explicitly noted in the change log for GLES
// 3.0.1:
// "* Clarify that a texture is incomplete if it has a depth component, no
// shadow comparison, and linear filtering (also Bug 9481)."
- // As of OES_packed_depth_stencil rev #3, the sample code explicitly samples from
- // a DEPTH_STENCIL_OES texture with a min-filter of LINEAR. Therefore we relax
- // this restriction if WEBGL_depth_texture is enabled.
- if (!mContext->IsExtensionEnabled(WebGLExtensionID::WEBGL_depth_texture)) {
- if (format->d && mTexCompareMode != LOCAL_GL_NONE) {
- *out_reason = "A depth or depth-stencil format with TEXTURE_COMPARE_MODE"
- " of NONE must have minification or magnification filtering"
- " of NEAREST or NEAREST_MIPMAP_NEAREST.";
- return false;
- }
+ if (format->d && mTexCompareMode != LOCAL_GL_NONE) {
+ isFilterable = true;
+ }
+
+ // "* The effective internal format specified for the texture arrays is a sized
+ // internal color format that is not texture-filterable, and either the
+ // magnification filter is not NEAREST or the minification filter is neither
+ // NEAREST nor NEAREST_MIPMAP_NEAREST."
+ // Since all (GLES3) unsized color formats are filterable just like their sized
+ // equivalents, we don't have to care whether its sized or not.
+ if (!isFilterable) {
+ *out_reason = "Because minification or magnification filtering is not NEAREST"
+ " or NEAREST_MIPMAP_NEAREST, and the texture's format must be"
+ " \"texture-filterable\".";
+ return false;
}
}
// Texture completeness is effectively (though not explicitly) amended for GLES2 by
// the "Texture Access" section under $3.8 "Fragment Shaders". This also applies to
// vertex shaders, as noted on GLES 2.0.25, p41.
if (!mContext->IsWebGL2()) {
// GLES 2.0.25, p87-88: