Bug 1388565 - Fix WEBGL_compressed_texture_s3tc_srgb driver requirements. - r=daoshengmu
MozReview-Commit-ID: 5k7m1ebzlCx
--- 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,