Bug 734081 - Check pixel depth when choosing config on egl, r=cjones
--- a/gfx/gl/GLContextProviderEGL.cpp
+++ b/gfx/gl/GLContextProviderEGL.cpp
@@ -37,16 +37,19 @@
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "mozilla/Preferences.h"
#include "mozilla/Util.h"
+#include "nsIScreen.h"
+#include "nsIScreenManager.h"
+
#if defined(XP_UNIX)
#ifdef MOZ_WIDGET_GTK2
#include <gdk/gdkx.h>
// we're using default display for now
#define GET_NATIVE_WINDOW(aWidget) (EGLNativeWindowType)GDK_WINDOW_XID((GdkWindow *) aWidget->GetNativeData(NS_NATIVE_WINDOW))
#elif defined(MOZ_WIDGET_QT)
#include <QtOpenGL/QGLContext>
@@ -2185,72 +2188,59 @@ static const EGLint kEGLConfigAttribsRGB
LOCAL_EGL_RENDERABLE_TYPE, LOCAL_EGL_OPENGL_ES2_BIT,
LOCAL_EGL_RED_SIZE, 8,
LOCAL_EGL_GREEN_SIZE, 8,
LOCAL_EGL_BLUE_SIZE, 8,
LOCAL_EGL_ALPHA_SIZE, 8,
LOCAL_EGL_NONE
};
-// This struct is used only by CreateConfig below, but ISO C++98 forbids
-// instantiating a template dependent on a locally-defined type. Boo-urns!
-struct EGLAttribs {
- gfxASurface::gfxImageFormat mFormat;
- const EGLint* mAttribs;
-};
-
// Return true if a suitable EGLConfig was found and pass it out
// through aConfig. Return false otherwise.
//
// NB: It's entirely legal for the returned EGLConfig to be valid yet
// have the value null.
static bool
CreateConfig(EGLConfig* aConfig)
{
- EGLAttribs attribsToTry[] = {
-#ifdef MOZ_GFX_OPTIMIZE_MOBILE
- // Prefer r5g6b5 for potential savings in memory bandwidth.
- // This needs to be reevaluated for newer devices.
- { gfxASurface::ImageFormatRGB16_565, kEGLConfigAttribsRGB16 },
-#endif
- { gfxASurface::ImageFormatARGB32, kEGLConfigAttribsRGBA32 },
- };
+ nsCOMPtr<nsIScreenManager> screenMgr = do_GetService("@mozilla.org/gfx/screenmanager;1");
+ nsCOMPtr<nsIScreen> screen;
+ screenMgr->GetPrimaryScreen(getter_AddRefs(screen));
+ PRInt32 depth = 24;
+ screen->GetColorDepth(&depth);
EGLConfig configs[64];
- for (unsigned i = 0; i < ArrayLength(attribsToTry); ++i) {
- const EGLAttribs& attribs = attribsToTry[i];
- EGLint ncfg = ArrayLength(configs);
-
- if (!sEGLLibrary.fChooseConfig(EGL_DISPLAY(), attribs.mAttribs,
- configs, ncfg, &ncfg) ||
- ncfg < 1)
+ gfxASurface::gfxImageFormat format;
+ const EGLint* attribs = depth == 16 ? kEGLConfigAttribsRGB16 :
+ kEGLConfigAttribsRGBA32;
+ EGLint ncfg = ArrayLength(configs);
+
+ if (!sEGLLibrary.fChooseConfig(EGL_DISPLAY(), attribs,
+ configs, ncfg, &ncfg) ||
+ ncfg < 1) {
+ return false;
+ }
+
+ for (int j = 0; j < ncfg; ++j) {
+ EGLConfig config = configs[j];
+ EGLint r, g, b, a;
+
+ if (sEGLLibrary.fGetConfigAttrib(EGL_DISPLAY(), config,
+ LOCAL_EGL_RED_SIZE, &r) &&
+ sEGLLibrary.fGetConfigAttrib(EGL_DISPLAY(), config,
+ LOCAL_EGL_GREEN_SIZE, &g) &&
+ sEGLLibrary.fGetConfigAttrib(EGL_DISPLAY(), config,
+ LOCAL_EGL_BLUE_SIZE, &b) &&
+ sEGLLibrary.fGetConfigAttrib(EGL_DISPLAY(), config,
+ LOCAL_EGL_ALPHA_SIZE, &a) &&
+ ((depth == 16 && r == 5 && g == 6 && b == 5) ||
+ (depth == 24 && r == 8 && g == 8 && b == 8 && a == 8)))
{
- continue;
- }
-
- for (int j = 0; j < ncfg; ++j) {
- EGLConfig config = configs[j];
- EGLint r, g, b, a;
-
- if (sEGLLibrary.fGetConfigAttrib(EGL_DISPLAY(), config,
- LOCAL_EGL_RED_SIZE, &r) &&
- sEGLLibrary.fGetConfigAttrib(EGL_DISPLAY(), config,
- LOCAL_EGL_GREEN_SIZE, &g) &&
- sEGLLibrary.fGetConfigAttrib(EGL_DISPLAY(), config,
- LOCAL_EGL_BLUE_SIZE, &b) &&
- sEGLLibrary.fGetConfigAttrib(EGL_DISPLAY(), config,
- LOCAL_EGL_ALPHA_SIZE, &a) &&
- ((gfxASurface::ImageFormatRGB16_565 == attribs.mFormat &&
- r == 5 && g == 6 && b == 5) ||
- (gfxASurface::ImageFormatARGB32 == attribs.mFormat &&
- r == 8 && g == 8 && b == 8 && a == 8)))
- {
- *aConfig = config;
- return true;
- }
+ *aConfig = config;
+ return true;
}
}
return false;
}
static EGLSurface
CreateSurfaceForWindow(nsIWidget *aWidget, EGLConfig config)
{
--- a/widget/android/nsScreenManagerAndroid.cpp
+++ b/widget/android/nsScreenManagerAndroid.cpp
@@ -73,17 +73,17 @@ nsScreenAndroid::GetAvailRect(PRInt32 *o
NS_IMETHODIMP
nsScreenAndroid::GetPixelDepth(PRInt32 *aPixelDepth)
{
// XXX do we need to lie here about 16bpp? Or
// should we actually check and return the right thing?
- *aPixelDepth = 24;
+ *aPixelDepth = 16;
return NS_OK;
}
NS_IMETHODIMP
nsScreenAndroid::GetColorDepth(PRInt32 *aColorDepth)
{
return GetPixelDepth(aColorDepth);
--- a/widget/gonk/nsWindow.cpp
+++ b/widget/gonk/nsWindow.cpp
@@ -505,19 +505,17 @@ nsScreenGonk::GetAvailRect(PRInt32 *outL
{
return GetRect(outLeft, outTop, outWidth, outHeight);
}
NS_IMETHODIMP
nsScreenGonk::GetPixelDepth(PRInt32 *aPixelDepth)
{
- // XXX do we need to lie here about 16bpp? Or
- // should we actually check and return the right thing?
- *aPixelDepth = 24;
+ *aPixelDepth = gNativeWindow->getDevice()->format == GGL_PIXEL_FORMAT_RGB_565 ? 16 : 24;
return NS_OK;
}
NS_IMETHODIMP
nsScreenGonk::GetColorDepth(PRInt32 *aColorDepth)
{
return GetPixelDepth(aColorDepth);
}