b=767064; use 4444/565 GL context format for WebGL on mobile; r=jgilbert
☠☠ backed out by 02b26fb307b4 ☠ ☠
authorVladimir Vukicevic <vladimir@pobox.com>
Fri, 06 Jul 2012 09:19:27 -0400
changeset 98705 a516a86f854da9a92976566878010c820458b22d
parent 98704 f1502bb466347a03a8657eec122866967c09a8d3
child 98706 654677c62195ade890271785c1d1d6e05b2332d5
push id11614
push uservladimir@pobox.com
push dateMon, 09 Jul 2012 17:14:14 +0000
treeherdermozilla-inbound@a516a86f854d [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjgilbert
bugs767064
milestone16.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
b=767064; use 4444/565 GL context format for WebGL on mobile; r=jgilbert
content/canvas/src/WebGLContext.cpp
gfx/gl/GLContext.cpp
gfx/thebes/gfxPlatform.cpp
--- a/content/canvas/src/WebGLContext.cpp
+++ b/content/canvas/src/WebGLContext.cpp
@@ -402,26 +402,43 @@ WebGLContext::SetDimensions(PRInt32 widt
     }
 
     if (mOptions.stencil) {
         format.stencil = 8;
         format.minStencil = 8;
     }
 
     if (!mOptions.alpha) {
-        // Select 565; we won't/shouldn't hit this on the desktop,
-        // but let mobile know we're ok with it.
-        format.red = 5;
-        format.green = 6;
-        format.blue = 5;
-
         format.alpha = 0;
         format.minAlpha = 0;
     }
 
+    // Don't do this on Windows, since we might get a 565 config from ANGLE
+    // and end up causing problems with a surface depth mismatch
+#ifndef XP_WIN
+    if (gfxPlatform::GetPlatform()->GetScreenDepth() == 16) {
+        // Select 4444 or 565 on 16-bit displays; we won't/shouldn't
+        // hit this on the desktop, but let mobile know we're ok with
+        // it.  Note that we don't just set this to 4440 if no alpha,
+        // because that might cause us to choose 4444 anyway and we
+        // don't want that.
+        if (mOptions.alpha) {
+            format.red = 4;
+            format.green = 4;
+            format.blue = 4;
+            format.alpha = 4;
+        } else {
+            format.red = 5;
+            format.green = 6;
+            format.blue = 5;
+            format.alpha = 0;
+        }
+    }
+#endif
+
     bool forceMSAA =
         Preferences::GetBool("webgl.msaa-force", false);
 
     PRInt32 status;
     nsCOMPtr<nsIGfxInfo> gfxInfo = do_GetService("@mozilla.org/gfx/info;1");
     if (mOptions.antialias &&
         gfxInfo &&
         NS_SUCCEEDED(gfxInfo->GetFeatureStatus(nsIGfxInfo::FEATURE_WEBGL_MSAA, &status))) {
--- a/gfx/gl/GLContext.cpp
+++ b/gfx/gl/GLContext.cpp
@@ -1273,45 +1273,58 @@ PRUint32 TiledTextureImage::GetTileCount
     return mImages.Length();
 }
 
 GLContext::GLFormats
 GLContext::ChooseGLFormats(ContextFormat& aCF)
 {
     GLFormats formats;
 
-    if (aCF.alpha) {
-        if (mIsGLES2 && IsExtensionSupported(EXT_texture_format_BGRA8888)) {
-            formats.texColor = LOCAL_GL_BGRA;
-        } else {
+    // If we're on ES2 hardware and we have an explicit request for 16 bits of color or less
+    // OR we don't support full 8-bit color, return a 4444 or 565 format.
+    if (mIsGLES2 && (aCF.colorBits() <= 16 || !IsExtensionSupported(OES_rgb8_rgba8))) {
+        if (aCF.alpha) {
             formats.texColor = LOCAL_GL_RGBA;
-        }
-
-        if (mIsGLES2 && !IsExtensionSupported(OES_rgb8_rgba8)) {
+            formats.texColorType = LOCAL_GL_UNSIGNED_SHORT_4_4_4_4;
             formats.rbColor = LOCAL_GL_RGBA4;
+
             aCF.red = aCF.green = aCF.blue = aCF.alpha = 4;
         } else {
-            formats.rbColor = LOCAL_GL_RGBA8;
-            aCF.red = aCF.green = aCF.blue = aCF.alpha = 8;
-        }
-    } else {
-        formats.texColor = LOCAL_GL_RGB;
-        if (mIsGLES2 && !IsExtensionSupported(OES_rgb8_rgba8)) {
+            formats.texColor = LOCAL_GL_RGB;
+            formats.texColorType = LOCAL_GL_UNSIGNED_SHORT_5_6_5;
             formats.rbColor = LOCAL_GL_RGB565;
+
             aCF.red = 5;
             aCF.green = 6;
             aCF.blue = 5;
+            aCF.alpha = 0;
+        }   
+    } else {
+        formats.texColorType = LOCAL_GL_UNSIGNED_BYTE;
+
+        if (aCF.alpha) {
+            // prefer BGRA8888 on ES2 hardware; if the extension is supported, it
+            // should be faster.
+            if (mIsGLES2 && IsExtensionSupported(EXT_texture_format_BGRA8888)) {
+                formats.texColor = LOCAL_GL_BGRA;
+            } else {
+                formats.texColor = LOCAL_GL_RGBA;
+            }
+
+            formats.rbColor = LOCAL_GL_RGBA8;
+
+            aCF.red = aCF.green = aCF.blue = aCF.alpha = 8;
         } else {
+            formats.texColor = LOCAL_GL_RGB;
             formats.rbColor = LOCAL_GL_RGB8;
+
             aCF.red = aCF.green = aCF.blue = 8;
+            aCF.alpha = 0;
         }
-        aCF.alpha = 0;
     }
-    formats.texColorType = LOCAL_GL_UNSIGNED_BYTE;
-
 
     GLsizei samples = aCF.samples;
 
     GLsizei maxSamples = 0;
     if (SupportsFramebufferMultisample())
         fGetIntegerv(LOCAL_GL_MAX_SAMPLES, (GLint*)&maxSamples);
     samples = NS_MIN(samples, maxSamples);
 
--- a/gfx/thebes/gfxPlatform.cpp
+++ b/gfx/thebes/gfxPlatform.cpp
@@ -1453,17 +1453,17 @@ gfxPlatform::GetLog(eGfxLog aWhichLog)
 #else
     return nsnull;
 #endif
 }
 
 int
 gfxPlatform::GetScreenDepth() const
 {
-    MOZ_ASSERT(false, "Not implemented on this platform");
+    NS_WARNING("GetScreenDepth not implemented on this platform -- returning 0!");
     return 0;
 }
 
 mozilla::gfx::SurfaceFormat
 gfxPlatform::Optimal2DFormatForContent(gfxASurface::gfxContentType aContent)
 {
   switch (aContent) {
   case gfxASurface::CONTENT_COLOR: