diff --git a/dom/canvas/WebGLContextExtensions.cpp b/dom/canvas/WebGLContextExtensions.cpp index 74da9a0290aa..7501b1cd461a 100644 --- a/dom/canvas/WebGLContextExtensions.cpp +++ b/dom/canvas/WebGLContextExtensions.cpp @@ -143,8 +143,7 @@ WebGLContext::IsExtensionSupported(WebGLExtensionID ext) const 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: diff --git a/dom/canvas/WebGLExtensionCompressedTextureS3TC.cpp b/dom/canvas/WebGLExtensionCompressedTextureS3TC.cpp index 52b6edfe02b2..e032a47e99ec 100644 --- a/dom/canvas/WebGLExtensionCompressedTextureS3TC.cpp +++ b/dom/canvas/WebGLExtensionCompressedTextureS3TC.cpp @@ -45,13 +45,13 @@ 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) diff --git a/dom/canvas/WebGLExtensionCompressedTextureS3TC_SRGB.cpp b/dom/canvas/WebGLExtensionCompressedTextureS3TC_SRGB.cpp index 398f19144610..c547928f4e14 100644 --- a/dom/canvas/WebGLExtensionCompressedTextureS3TC_SRGB.cpp +++ b/dom/canvas/WebGLExtensionCompressedTextureS3TC_SRGB.cpp @@ -42,6 +42,19 @@ WebGLExtensionCompressedTextureS3TC_SRGB::~WebGLExtensionCompressedTextureS3TC_S { } +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 diff --git a/dom/canvas/WebGLExtensions.h b/dom/canvas/WebGLExtensions.h index ee10c15ccf73..7966b65f071b 100644 --- a/dom/canvas/WebGLExtensions.h +++ b/dom/canvas/WebGLExtensions.h @@ -138,6 +138,8 @@ public: explicit WebGLExtensionCompressedTextureS3TC_SRGB(WebGLContext*); virtual ~WebGLExtensionCompressedTextureS3TC_SRGB(); + static bool IsSupported(const WebGLContext*); + DECL_WEBGL_EXTENSION_GOOP }; diff --git a/gfx/gl/GLContext.cpp b/gfx/gl/GLContext.cpp index 44f3160bdb97..f5d70e82e390 100644 --- a/gfx/gl/GLContext.cpp +++ b/gfx/gl/GLContext.cpp @@ -151,6 +151,7 @@ static const char* const sExtensionNames[] = { "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", @@ -1739,6 +1740,13 @@ GLContext::InitExtensions() { 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 } diff --git a/gfx/gl/GLContext.h b/gfx/gl/GLContext.h index a469a89f3669..c4f159614479 100644 --- a/gfx/gl/GLContext.h +++ b/gfx/gl/GLContext.h @@ -417,6 +417,7 @@ public: 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,