EGLUtils.h revision 42db9dcea2e6b9f60f07a3e9e2d6fbc196082284
16cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian/*
26cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian * Copyright (C) 2009 The Android Open Source Project
36cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian *
46cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
56cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian * you may not use this file except in compliance with the License.
66cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian * You may obtain a copy of the License at
76cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian *
86cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
96cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian *
106cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian * Unless required by applicable law or agreed to in writing, software
116cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
126cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian * See the License for the specific language governing permissions and
146cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian * limitations under the License.
156cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian */
166cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
176cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
186cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian#define LOG_TAG "EGLUtils"
196cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
206cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian#include <utils/Errors.h>
216cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
226cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian#include <ui/EGLUtils.h>
236cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
246cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian#include <EGL/egl.h>
256cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
266cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian#include <private/ui/android_natives_priv.h>
276cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
286cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian// ----------------------------------------------------------------------------
296cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopiannamespace android {
306cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian// ----------------------------------------------------------------------------
316cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
326cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopianstatus_t EGLUtils::selectConfigForPixelFormat(
336cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        EGLDisplay dpy,
346cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        EGLint const* attrs,
356cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        PixelFormat format,
366cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        EGLConfig* outConfig)
376cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian{
386cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    EGLint numConfigs = -1, n=0;
396cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
4042db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian    if (!attrs)
4142db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian        return BAD_VALUE;
4242db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian
436cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    if (outConfig == NULL)
446cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        return BAD_VALUE;
456cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
466cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    int err;
476cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    PixelFormatInfo fbFormatInfo;
486cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    if ((err = getPixelFormatInfo(PixelFormat(format), &fbFormatInfo)) < 0) {
496cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        return err;
506cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    }
516cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
526cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    // Get all the "potential match" configs...
536cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    if (eglGetConfigs(dpy, NULL, 0, &numConfigs) == EGL_FALSE)
546cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        return BAD_VALUE;
556cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
566cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    EGLConfig* const configs = (EGLConfig*)malloc(sizeof(EGLConfig)*numConfigs);
576cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    if (eglChooseConfig(dpy, attrs, configs, numConfigs, &n) == EGL_FALSE) {
586cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        free(configs);
596cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        return BAD_VALUE;
606cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    }
616cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
626cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    const int fbSzA = fbFormatInfo.getSize(PixelFormatInfo::INDEX_ALPHA);
636cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    const int fbSzR = fbFormatInfo.getSize(PixelFormatInfo::INDEX_RED);
646cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    const int fbSzG = fbFormatInfo.getSize(PixelFormatInfo::INDEX_GREEN);
656cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    const int fbSzB = fbFormatInfo.getSize(PixelFormatInfo::INDEX_BLUE);
666cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
67b97603dcf01792b3d5610ef9a8f0a4c9e1af8b02Mathias Agopian    int i;
686cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    EGLConfig config = NULL;
69b97603dcf01792b3d5610ef9a8f0a4c9e1af8b02Mathias Agopian    for (i=0 ; i<n ; i++) {
706cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        EGLint r,g,b,a;
716cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        eglGetConfigAttrib(dpy, configs[i], EGL_RED_SIZE,   &r);
726cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        eglGetConfigAttrib(dpy, configs[i], EGL_GREEN_SIZE, &g);
736cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        eglGetConfigAttrib(dpy, configs[i], EGL_BLUE_SIZE,  &b);
746cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        eglGetConfigAttrib(dpy, configs[i], EGL_ALPHA_SIZE, &a);
756cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        if (fbSzA == a && fbSzR == r && fbSzG == g && fbSzB  == b) {
766cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian            config = configs[i];
776cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian            break;
786cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        }
796cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    }
806cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
816cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    free(configs);
826cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
83b97603dcf01792b3d5610ef9a8f0a4c9e1af8b02Mathias Agopian    if (i<n) {
846cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        *outConfig = config;
856cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        return NO_ERROR;
866cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    }
876cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
886cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    return NAME_NOT_FOUND;
896cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian}
906cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
916cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopianstatus_t EGLUtils::selectConfigForNativeWindow(
926cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        EGLDisplay dpy,
936cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        EGLint const* attrs,
946cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        EGLNativeWindowType window,
956cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        EGLConfig* outConfig)
966cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian{
976cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    int err;
986cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    int format;
9942db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian
10042db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian    if (!window)
10142db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian        return BAD_VALUE;
10242db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian
1036cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    if ((err = window->query(window, NATIVE_WINDOW_FORMAT, &format)) < 0) {
1046cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        return err;
1056cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    }
1066cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
1076cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    return selectConfigForPixelFormat(dpy, attrs, format, outConfig);
1086cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian}
1096cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
1106cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian// ----------------------------------------------------------------------------
1116cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian}; // namespace android
1126cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian// ----------------------------------------------------------------------------
113