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
18870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian#ifndef ANDROID_UI_EGLUTILS_H
19870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian#define ANDROID_UI_EGLUTILS_H
206cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
21870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian#include <stdint.h>
22870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian#include <stdlib.h>
236cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
24870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian#include <system/window.h>
25870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian#include <utils/Errors.h>
266cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian#include <EGL/egl.h>
276cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
286cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
296cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian// ----------------------------------------------------------------------------
306cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopiannamespace android {
316cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian// ----------------------------------------------------------------------------
326cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
33870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopianclass EGLUtils
34870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian{
35870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopianpublic:
36870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian
37870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian    static inline const char *strerror(EGLint err);
38870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian
39870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian    static inline status_t selectConfigForPixelFormat(
40870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian            EGLDisplay dpy,
41870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian            EGLint const* attrs,
42870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian            int32_t format,
43870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian            EGLConfig* outConfig);
44870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian
45870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian    static inline status_t selectConfigForNativeWindow(
46870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian            EGLDisplay dpy,
47870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian            EGLint const* attrs,
48870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian            EGLNativeWindowType window,
49870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian            EGLConfig* outConfig);
50870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian};
51870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian
52870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian// ----------------------------------------------------------------------------
53870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian
548c12c7aec3fdbccfa8161c2c12131d590a9b5ce8Mathias Agopianconst char *EGLUtils::strerror(EGLint err)
558c12c7aec3fdbccfa8161c2c12131d590a9b5ce8Mathias Agopian{
568c12c7aec3fdbccfa8161c2c12131d590a9b5ce8Mathias Agopian    switch (err){
578c12c7aec3fdbccfa8161c2c12131d590a9b5ce8Mathias Agopian        case EGL_SUCCESS:           return "EGL_SUCCESS";
588c12c7aec3fdbccfa8161c2c12131d590a9b5ce8Mathias Agopian        case EGL_NOT_INITIALIZED:   return "EGL_NOT_INITIALIZED";
598c12c7aec3fdbccfa8161c2c12131d590a9b5ce8Mathias Agopian        case EGL_BAD_ACCESS:        return "EGL_BAD_ACCESS";
608c12c7aec3fdbccfa8161c2c12131d590a9b5ce8Mathias Agopian        case EGL_BAD_ALLOC:         return "EGL_BAD_ALLOC";
618c12c7aec3fdbccfa8161c2c12131d590a9b5ce8Mathias Agopian        case EGL_BAD_ATTRIBUTE:     return "EGL_BAD_ATTRIBUTE";
628c12c7aec3fdbccfa8161c2c12131d590a9b5ce8Mathias Agopian        case EGL_BAD_CONFIG:        return "EGL_BAD_CONFIG";
638c12c7aec3fdbccfa8161c2c12131d590a9b5ce8Mathias Agopian        case EGL_BAD_CONTEXT:       return "EGL_BAD_CONTEXT";
648c12c7aec3fdbccfa8161c2c12131d590a9b5ce8Mathias Agopian        case EGL_BAD_CURRENT_SURFACE: return "EGL_BAD_CURRENT_SURFACE";
658c12c7aec3fdbccfa8161c2c12131d590a9b5ce8Mathias Agopian        case EGL_BAD_DISPLAY:       return "EGL_BAD_DISPLAY";
668c12c7aec3fdbccfa8161c2c12131d590a9b5ce8Mathias Agopian        case EGL_BAD_MATCH:         return "EGL_BAD_MATCH";
678c12c7aec3fdbccfa8161c2c12131d590a9b5ce8Mathias Agopian        case EGL_BAD_NATIVE_PIXMAP: return "EGL_BAD_NATIVE_PIXMAP";
688c12c7aec3fdbccfa8161c2c12131d590a9b5ce8Mathias Agopian        case EGL_BAD_NATIVE_WINDOW: return "EGL_BAD_NATIVE_WINDOW";
698c12c7aec3fdbccfa8161c2c12131d590a9b5ce8Mathias Agopian        case EGL_BAD_PARAMETER:     return "EGL_BAD_PARAMETER";
708c12c7aec3fdbccfa8161c2c12131d590a9b5ce8Mathias Agopian        case EGL_BAD_SURFACE:       return "EGL_BAD_SURFACE";
718c12c7aec3fdbccfa8161c2c12131d590a9b5ce8Mathias Agopian        case EGL_CONTEXT_LOST:      return "EGL_CONTEXT_LOST";
728c12c7aec3fdbccfa8161c2c12131d590a9b5ce8Mathias Agopian        default: return "UNKNOWN";
738c12c7aec3fdbccfa8161c2c12131d590a9b5ce8Mathias Agopian    }
748c12c7aec3fdbccfa8161c2c12131d590a9b5ce8Mathias Agopian}
758c12c7aec3fdbccfa8161c2c12131d590a9b5ce8Mathias Agopian
766cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopianstatus_t EGLUtils::selectConfigForPixelFormat(
776cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        EGLDisplay dpy,
786cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        EGLint const* attrs,
79870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian        int32_t format,
806cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        EGLConfig* outConfig)
816cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian{
826cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    EGLint numConfigs = -1, n=0;
836cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
8442db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian    if (!attrs)
8542db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian        return BAD_VALUE;
8642db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian
876cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    if (outConfig == NULL)
886cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        return BAD_VALUE;
89870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian
906cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    // Get all the "potential match" configs...
91f9606df42b7b43a6eaa4abd989fef4b7c27a6eaeMathias Agopian    if (eglGetConfigs(dpy, NULL, 0, &numConfigs) == EGL_FALSE)
926cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        return BAD_VALUE;
936cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
94f9606df42b7b43a6eaa4abd989fef4b7c27a6eaeMathias Agopian    EGLConfig* const configs = (EGLConfig*)malloc(sizeof(EGLConfig)*numConfigs);
95f9606df42b7b43a6eaa4abd989fef4b7c27a6eaeMathias Agopian    if (eglChooseConfig(dpy, attrs, configs, numConfigs, &n) == EGL_FALSE) {
96f9606df42b7b43a6eaa4abd989fef4b7c27a6eaeMathias Agopian        free(configs);
97f9606df42b7b43a6eaa4abd989fef4b7c27a6eaeMathias Agopian        return BAD_VALUE;
98f9606df42b7b43a6eaa4abd989fef4b7c27a6eaeMathias Agopian    }
99870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian
100f9606df42b7b43a6eaa4abd989fef4b7c27a6eaeMathias Agopian    int i;
101f9606df42b7b43a6eaa4abd989fef4b7c27a6eaeMathias Agopian    EGLConfig config = NULL;
102f9606df42b7b43a6eaa4abd989fef4b7c27a6eaeMathias Agopian    for (i=0 ; i<n ; i++) {
103f9606df42b7b43a6eaa4abd989fef4b7c27a6eaeMathias Agopian        EGLint nativeVisualId = 0;
104f9606df42b7b43a6eaa4abd989fef4b7c27a6eaeMathias Agopian        eglGetConfigAttrib(dpy, configs[i], EGL_NATIVE_VISUAL_ID, &nativeVisualId);
105f9606df42b7b43a6eaa4abd989fef4b7c27a6eaeMathias Agopian        if (nativeVisualId>0 && format == nativeVisualId) {
106d5ea3db6a3049d6b66a619be08002e90aa38f99fMathias Agopian            config = configs[i];
1076cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian            break;
1086cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        }
109f9606df42b7b43a6eaa4abd989fef4b7c27a6eaeMathias Agopian    }
1106cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
111f9606df42b7b43a6eaa4abd989fef4b7c27a6eaeMathias Agopian    free(configs);
112870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian
113f9606df42b7b43a6eaa4abd989fef4b7c27a6eaeMathias Agopian    if (i<n) {
114f9606df42b7b43a6eaa4abd989fef4b7c27a6eaeMathias Agopian        *outConfig = config;
115f9606df42b7b43a6eaa4abd989fef4b7c27a6eaeMathias Agopian        return NO_ERROR;
1166cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    }
1176cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
1186cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    return NAME_NOT_FOUND;
1196cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian}
1206cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
1216cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopianstatus_t EGLUtils::selectConfigForNativeWindow(
1226cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        EGLDisplay dpy,
1236cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        EGLint const* attrs,
1246cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        EGLNativeWindowType window,
1256cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        EGLConfig* outConfig)
1266cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian{
1276cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    int err;
1286cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    int format;
129870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian
13042db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian    if (!window)
13142db9dcea2e6b9f60f07a3e9e2d6fbc196082284Mathias Agopian        return BAD_VALUE;
132870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian
1336cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    if ((err = window->query(window, NATIVE_WINDOW_FORMAT, &format)) < 0) {
1346cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian        return err;
1356cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    }
1366cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
1376cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian    return selectConfigForPixelFormat(dpy, attrs, format, outConfig);
1386cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian}
1396cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian
1406cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian// ----------------------------------------------------------------------------
1416cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian}; // namespace android
1426cf50a770dabd13cf5b72bb0a6fb9dd002c88db6Mathias Agopian// ----------------------------------------------------------------------------
143870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian
144870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian#endif /* ANDROID_UI_EGLUTILS_H */
145