Merge "Fix EGLUtils::selectConfigForPixelFormat()"

This commit is contained in:
Mathias Agopian 2011-07-08 15:34:23 -07:00 committed by Android (Google) Code Review
commit 1382cbb4b9
2 changed files with 78 additions and 25 deletions

View File

@ -24,6 +24,8 @@
#include <EGL/egl.h>
#include <system/graphics.h>
#include <private/ui/android_natives_priv.h>
// ----------------------------------------------------------------------------
@ -67,31 +69,49 @@ status_t EGLUtils::selectConfigForPixelFormat(
return BAD_VALUE;
// Get all the "potential match" configs...
if (eglGetConfigs(dpy, NULL, 0, &numConfigs) == EGL_FALSE)
if (eglChooseConfig(dpy, attrs, 0, 0, &numConfigs) == EGL_FALSE)
return BAD_VALUE;
EGLConfig* const configs = (EGLConfig*)malloc(sizeof(EGLConfig)*numConfigs);
if (eglChooseConfig(dpy, attrs, configs, numConfigs, &n) == EGL_FALSE) {
free(configs);
return BAD_VALUE;
}
int i;
EGLConfig config = NULL;
for (i=0 ; i<n ; i++) {
EGLint nativeVisualId = 0;
eglGetConfigAttrib(dpy, configs[i], EGL_NATIVE_VISUAL_ID, &nativeVisualId);
if (nativeVisualId>0 && format == nativeVisualId) {
if (numConfigs) {
EGLConfig* const configs = new EGLConfig[numConfigs];
if (eglChooseConfig(dpy, attrs, configs, numConfigs, &n) == EGL_FALSE) {
delete [] configs;
return BAD_VALUE;
}
bool hasAlpha = false;
switch (format) {
case HAL_PIXEL_FORMAT_RGBA_8888:
case HAL_PIXEL_FORMAT_BGRA_8888:
case HAL_PIXEL_FORMAT_RGBA_5551:
case HAL_PIXEL_FORMAT_RGBA_4444:
hasAlpha = true;
break;
}
// The first config is guaranteed to over-satisfy the constraints
EGLConfig config = configs[0];
// go through the list and skip configs that over-satisfy our needs
int i;
for (i=0 ; i<n ; i++) {
if (!hasAlpha) {
EGLint alphaSize;
eglGetConfigAttrib(dpy, configs[i], EGL_ALPHA_SIZE, &alphaSize);
if (alphaSize > 0) {
continue;
}
}
config = configs[i];
break;
}
}
free(configs);
if (i<n) {
*outConfig = config;
return NO_ERROR;
delete [] configs;
if (i<n) {
*outConfig = config;
return NO_ERROR;
}
}
return NAME_NOT_FOUND;

View File

@ -99,6 +99,31 @@ uint32_t DisplayHardware::getMaxViewportDims() const {
mMaxViewportDims[0] : mMaxViewportDims[1];
}
static status_t selectConfigForPixelFormat(
EGLDisplay dpy,
EGLint const* attrs,
PixelFormat format,
EGLConfig* outConfig)
{
EGLConfig config = NULL;
EGLint numConfigs = -1, n=0;
eglGetConfigs(dpy, NULL, 0, &numConfigs);
EGLConfig* const configs = new EGLConfig[numConfigs];
eglChooseConfig(dpy, attrs, configs, numConfigs, &n);
for (int i=0 ; i<n ; i++) {
EGLint nativeVisualId = 0;
eglGetConfigAttrib(dpy, configs[i], EGL_NATIVE_VISUAL_ID, &nativeVisualId);
if (nativeVisualId>0 && format == nativeVisualId) {
*outConfig = configs[i];
delete [] configs;
return NO_ERROR;
}
}
delete [] configs;
return NAME_NOT_FOUND;
}
void DisplayHardware::init(uint32_t dpy)
{
mNativeWindow = new FramebufferNativeWindow();
@ -108,6 +133,9 @@ void DisplayHardware::init(uint32_t dpy)
exit(0);
}
int format;
ANativeWindow const * const window = mNativeWindow.get();
window->query(window, NATIVE_WINDOW_FORMAT, &format);
mDpiX = mNativeWindow->xdpi;
mDpiY = mNativeWindow->ydpi;
mRefreshRate = fbDev->fps;
@ -116,11 +144,13 @@ void DisplayHardware::init(uint32_t dpy)
EGLint numConfigs=0;
EGLSurface surface;
EGLContext context;
EGLBoolean result;
status_t err;
// initialize EGL
EGLint attribs[] = {
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_NONE, 0,
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_NONE, 0,
EGL_NONE
};
@ -141,9 +171,8 @@ void DisplayHardware::init(uint32_t dpy)
eglInitialize(display, NULL, NULL);
eglGetConfigs(display, NULL, 0, &numConfigs);
EGLConfig config;
status_t err = EGLUtils::selectConfigForNativeWindow(
display, attribs, mNativeWindow.get(), &config);
EGLConfig config = NULL;
err = selectConfigForPixelFormat(display, attribs, format, &config);
LOGE_IF(err, "couldn't find an EGLConfig matching the screen format");
EGLint r,g,b,a;
@ -224,7 +253,11 @@ void DisplayHardware::init(uint32_t dpy)
* Gather OpenGL ES extensions
*/
eglMakeCurrent(display, surface, surface, context);
result = eglMakeCurrent(display, surface, surface, context);
if (!result) {
LOGE("Couldn't create a working GLES context. check logs. exiting...");
exit(0);
}
GLExtensions& extensions(GLExtensions::getInstance());
extensions.initWithGLStrings(