Bug 1388565 - Fix WEBGL_compressed_texture_s3tc_srgb driver requirements. - r=daoshengmu draft
authorJeff Gilbert <jgilbert@mozilla.com>
Tue, 08 Aug 2017 16:32:23 -0700
changeset 646995 f5d9ff7c3c8ff96d1c2bebb2d4721d3e2d22fd77
parent 646994 ebf908c719198941b733c87f7a66c4a19661c2bd
child 646996 16689ec7dca84f1118b714f8ca74664c9c68f284
push id74278
push userbmo:jgilbert@mozilla.com
push dateTue, 15 Aug 2017 23:11:38 +0000
reviewersdaoshengmu
bugs1388565
milestone57.0a1
Bug 1388565 - Fix WEBGL_compressed_texture_s3tc_srgb driver requirements. - r=daoshengmu MozReview-Commit-ID: 5k7m1ebzlCx
dom/canvas/WebGLContextExtensions.cpp
dom/canvas/WebGLExtensionCompressedTextureS3TC.cpp
dom/canvas/WebGLExtensionCompressedTextureS3TC_SRGB.cpp
dom/canvas/WebGLExtensions.h
gfx/gl/GLContext.cpp
gfx/gl/GLContext.h
--- a/dom/canvas/WebGLContextExtensions.cpp
+++ b/dom/canvas/WebGLContextExtensions.cpp
@@ -138,18 +138,17 @@ WebGLContext::IsExtensionSupported(WebGL
     case WebGLExtensionID::WEBGL_compressed_texture_etc1:
         return gl->IsExtensionSupported(gl::GLContext::OES_compressed_ETC1_RGB8_texture) &&
                !gl->IsANGLE();
     case WebGLExtensionID::WEBGL_compressed_texture_pvrtc:
         return gl->IsExtensionSupported(gl::GLContext::IMG_texture_compression_pvrtc);
     case WebGLExtensionID::WEBGL_compressed_texture_s3tc:
         return WebGLExtensionCompressedTextureS3TC::IsSupported(this);
     case WebGLExtensionID::WEBGL_compressed_texture_s3tc_srgb:
-        return WebGLExtensionCompressedTextureS3TC::IsSupported(this) &&
-               gl->IsExtensionSupported(gl::GLContext::EXT_texture_sRGB);
+        return WebGLExtensionCompressedTextureS3TC_SRGB::IsSupported(this);
     case WebGLExtensionID::WEBGL_debug_renderer_info:
         return Preferences::GetBool("webgl.enable-debug-renderer-info", false);
     case WebGLExtensionID::WEBGL_debug_shaders:
         return !nsContentUtils::ShouldResistFingerprinting();
     case WebGLExtensionID::WEBGL_lose_context:
         // We always support this extension.
         return true;
 
--- a/dom/canvas/WebGLExtensionCompressedTextureS3TC.cpp
+++ b/dom/canvas/WebGLExtensionCompressedTextureS3TC.cpp
@@ -40,20 +40,20 @@ WebGLExtensionCompressedTextureS3TC::Web
 
 WebGLExtensionCompressedTextureS3TC::~WebGLExtensionCompressedTextureS3TC()
 {
 }
 
 bool
 WebGLExtensionCompressedTextureS3TC::IsSupported(const WebGLContext* webgl)
 {
-   gl::GLContext* gl = webgl->GL();
-   if (gl->IsExtensionSupported(gl::GLContext::EXT_texture_compression_s3tc))
-      return true;
+    gl::GLContext* gl = webgl->GL();
+    if (gl->IsExtensionSupported(gl::GLContext::EXT_texture_compression_s3tc))
+        return true;
 
-   return gl->IsExtensionSupported(gl::GLContext::EXT_texture_compression_dxt1) &&
-          gl->IsExtensionSupported(gl::GLContext::ANGLE_texture_compression_dxt3) &&
-          gl->IsExtensionSupported(gl::GLContext::ANGLE_texture_compression_dxt5);
+    return gl->IsExtensionSupported(gl::GLContext::EXT_texture_compression_dxt1) &&
+           gl->IsExtensionSupported(gl::GLContext::ANGLE_texture_compression_dxt3) &&
+           gl->IsExtensionSupported(gl::GLContext::ANGLE_texture_compression_dxt5);
 }
 
 IMPL_WEBGL_EXTENSION_GOOP(WebGLExtensionCompressedTextureS3TC, WEBGL_compressed_texture_s3tc)
 
 } // namespace mozilla
--- a/dom/canvas/WebGLExtensionCompressedTextureS3TC_SRGB.cpp
+++ b/dom/canvas/WebGLExtensionCompressedTextureS3TC_SRGB.cpp
@@ -37,11 +37,24 @@ WebGLExtensionCompressedTextureS3TC_SRGB
 
 #undef FOO
 }
 
 WebGLExtensionCompressedTextureS3TC_SRGB::~WebGLExtensionCompressedTextureS3TC_SRGB()
 {
 }
 
+bool
+WebGLExtensionCompressedTextureS3TC_SRGB::IsSupported(const WebGLContext* webgl)
+{
+    gl::GLContext* gl = webgl->GL();
+    if (gl->IsGLES())
+        return gl->IsExtensionSupported(gl::GLContext::EXT_texture_compression_s3tc_srgb);
+
+    // Desktop GL is more complicated: It's EXT_texture_sRGB, when
+    // EXT_texture_compression_s3tc is supported, that enables srgb+s3tc.
+    return gl->IsExtensionSupported(gl::GLContext::EXT_texture_sRGB) &&
+           gl->IsExtensionSupported(gl::GLContext::EXT_texture_compression_s3tc);
+}
+
 IMPL_WEBGL_EXTENSION_GOOP(WebGLExtensionCompressedTextureS3TC_SRGB, WEBGL_compressed_texture_s3tc_srgb)
 
 } // namespace mozilla
--- a/dom/canvas/WebGLExtensions.h
+++ b/dom/canvas/WebGLExtensions.h
@@ -133,16 +133,18 @@ public:
 
 class WebGLExtensionCompressedTextureS3TC_SRGB
     : public WebGLExtensionBase
 {
 public:
     explicit WebGLExtensionCompressedTextureS3TC_SRGB(WebGLContext*);
     virtual ~WebGLExtensionCompressedTextureS3TC_SRGB();
 
+    static bool IsSupported(const WebGLContext*);
+
     DECL_WEBGL_EXTENSION_GOOP
 };
 
 class WebGLExtensionDebugRendererInfo
     : public WebGLExtensionBase
 {
 public:
     explicit WebGLExtensionDebugRendererInfo(WebGLContext*);
--- a/gfx/gl/GLContext.cpp
+++ b/gfx/gl/GLContext.cpp
@@ -146,16 +146,17 @@ static const char* const sExtensionNames
     "GL_EXT_read_format_bgra",
     "GL_EXT_robustness",
     "GL_EXT_sRGB",
     "GL_EXT_sRGB_write_control",
     "GL_EXT_shader_texture_lod",
     "GL_EXT_texture3D",
     "GL_EXT_texture_compression_dxt1",
     "GL_EXT_texture_compression_s3tc",
+    "GL_EXT_texture_compression_s3tc_srgb",
     "GL_EXT_texture_filter_anisotropic",
     "GL_EXT_texture_format_BGRA8888",
     "GL_EXT_texture_sRGB",
     "GL_EXT_texture_storage",
     "GL_EXT_timer_query",
     "GL_EXT_transform_feedback",
     "GL_EXT_unpack_subimage",
     "GL_IMG_read_format",
@@ -1734,16 +1735,23 @@ GLContext::InitExtensions()
         // and Intel HD 5000/Iris that I tested.
         // Bug 1124996: Appears to be the same on OSX Yosemite (10.10)
         if (nsCocoaFeatures::OSXVersionMajor() == 10 &&
             nsCocoaFeatures::OSXVersionMinor() >= 9 &&
             Renderer() == GLRenderer::IntelHD3000)
         {
             MarkExtensionUnsupported(EXT_texture_compression_s3tc);
         }
+
+        // OSX supports EXT_texture_sRGB in Legacy contexts, but not in Core contexts.
+        // Though EXT_texture_sRGB was included into GL2.1, it *excludes* the interactions
+        // with s3tc. Strictly speaking, you must advertize support for EXT_texture_sRGB
+        // in order to allow for srgb+s3tc on desktop GL. The omission of EXT_texture_sRGB
+        // in OSX Core contexts appears to be a bug.
+        MarkExtensionSupported(EXT_texture_sRGB);
 #endif
     }
 
     if (shouldDumpExts) {
         printf_stderr("\nActivated extensions:\n");
 
         for (size_t i = 0; i < mAvailableExtensions.size(); i++) {
             if (!mAvailableExtensions[i])
--- a/gfx/gl/GLContext.h
+++ b/gfx/gl/GLContext.h
@@ -412,16 +412,17 @@ public:
         EXT_read_format_bgra,
         EXT_robustness,
         EXT_sRGB,
         EXT_sRGB_write_control,
         EXT_shader_texture_lod,
         EXT_texture3D,
         EXT_texture_compression_dxt1,
         EXT_texture_compression_s3tc,
+        EXT_texture_compression_s3tc_srgb,
         EXT_texture_filter_anisotropic,
         EXT_texture_format_BGRA8888,
         EXT_texture_sRGB,
         EXT_texture_storage,
         EXT_timer_query,
         EXT_transform_feedback,
         EXT_unpack_subimage,
         IMG_read_format,