Merge "Fix EGLUtils::selectConfigForPixelFormat()"
This commit is contained in:
commit
1382cbb4b9
|
@ -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;
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Reference in New Issue