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