Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1382cbb4 authored by Mathias Agopian's avatar Mathias Agopian Committed by Android (Google) Code Review
Browse files

Merge "Fix EGLUtils::selectConfigForPixelFormat()"

parents 5e5e8c3e 6163091a
Loading
Loading
Loading
Loading
+39 −19
Original line number Diff line number Diff line
@@ -24,6 +24,8 @@

#include <EGL/egl.h>

#include <system/graphics.h>

#include <private/ui/android_natives_priv.h>

// ----------------------------------------------------------------------------
@@ -67,32 +69,50 @@ 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 (numConfigs) {
        EGLConfig* const configs = new EGLConfig[numConfigs];
        if (eglChooseConfig(dpy, attrs, configs, numConfigs, &n) == EGL_FALSE) {
        free(configs);
            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;
    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 (!hasAlpha) {
                EGLint alphaSize;
                eglGetConfigAttrib(dpy, configs[i], EGL_ALPHA_SIZE, &alphaSize);
                if (alphaSize > 0) {
                    continue;
                }
            }
            config = configs[i];
            break;
        }
    }

    free(configs);
        delete [] configs;

        if (i<n) {
            *outConfig = config;
            return NO_ERROR;
        }
    }

    return NAME_NOT_FOUND;
}
+39 −6
Original line number Diff line number Diff line
@@ -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,6 +144,8 @@ void DisplayHardware::init(uint32_t dpy)
    EGLint numConfigs=0;
    EGLSurface surface;
    EGLContext context;
    EGLBoolean result;
    status_t err;

    // initialize EGL
    EGLint attribs[] = {
@@ -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(