1 /* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 18 #define LOG_TAG "EGLUtils" 19 20 #include <cutils/log.h> 21 #include <utils/Errors.h> 22 23 #include <ui/EGLUtils.h> 24 25 #include <EGL/egl.h> 26 27 #include <private/ui/android_natives_priv.h> 28 29 // ---------------------------------------------------------------------------- 30 namespace android { 31 // ---------------------------------------------------------------------------- 32 33 const char *EGLUtils::strerror(EGLint err) 34 { 35 switch (err){ 36 case EGL_SUCCESS: return "EGL_SUCCESS"; 37 case EGL_NOT_INITIALIZED: return "EGL_NOT_INITIALIZED"; 38 case EGL_BAD_ACCESS: return "EGL_BAD_ACCESS"; 39 case EGL_BAD_ALLOC: return "EGL_BAD_ALLOC"; 40 case EGL_BAD_ATTRIBUTE: return "EGL_BAD_ATTRIBUTE"; 41 case EGL_BAD_CONFIG: return "EGL_BAD_CONFIG"; 42 case EGL_BAD_CONTEXT: return "EGL_BAD_CONTEXT"; 43 case EGL_BAD_CURRENT_SURFACE: return "EGL_BAD_CURRENT_SURFACE"; 44 case EGL_BAD_DISPLAY: return "EGL_BAD_DISPLAY"; 45 case EGL_BAD_MATCH: return "EGL_BAD_MATCH"; 46 case EGL_BAD_NATIVE_PIXMAP: return "EGL_BAD_NATIVE_PIXMAP"; 47 case EGL_BAD_NATIVE_WINDOW: return "EGL_BAD_NATIVE_WINDOW"; 48 case EGL_BAD_PARAMETER: return "EGL_BAD_PARAMETER"; 49 case EGL_BAD_SURFACE: return "EGL_BAD_SURFACE"; 50 case EGL_CONTEXT_LOST: return "EGL_CONTEXT_LOST"; 51 default: return "UNKNOWN"; 52 } 53 } 54 55 status_t EGLUtils::selectConfigForPixelFormat( 56 EGLDisplay dpy, 57 EGLint const* attrs, 58 PixelFormat format, 59 EGLConfig* outConfig) 60 { 61 EGLint numConfigs = -1, n=0; 62 63 if (!attrs) 64 return BAD_VALUE; 65 66 if (outConfig == NULL) 67 return BAD_VALUE; 68 69 // Get all the "potential match" configs... 70 if (eglGetConfigs(dpy, NULL, 0, &numConfigs) == EGL_FALSE) 71 return BAD_VALUE; 72 73 EGLConfig* const configs = (EGLConfig*)malloc(sizeof(EGLConfig)*numConfigs); 74 if (eglChooseConfig(dpy, attrs, configs, numConfigs, &n) == EGL_FALSE) { 75 free(configs); 76 return BAD_VALUE; 77 } 78 79 int i; 80 EGLConfig config = NULL; 81 for (i=0 ; i<n ; i++) { 82 EGLint nativeVisualId = 0; 83 eglGetConfigAttrib(dpy, configs[i], EGL_NATIVE_VISUAL_ID, &nativeVisualId); 84 if (nativeVisualId>0 && format == nativeVisualId) { 85 config = configs[i]; 86 break; 87 } 88 } 89 90 free(configs); 91 92 if (i<n) { 93 *outConfig = config; 94 return NO_ERROR; 95 } 96 97 return NAME_NOT_FOUND; 98 } 99 100 status_t EGLUtils::selectConfigForNativeWindow( 101 EGLDisplay dpy, 102 EGLint const* attrs, 103 EGLNativeWindowType window, 104 EGLConfig* outConfig) 105 { 106 int err; 107 int format; 108 109 if (!window) 110 return BAD_VALUE; 111 112 if ((err = window->query(window, NATIVE_WINDOW_FORMAT, &format)) < 0) { 113 return err; 114 } 115 116 return selectConfigForPixelFormat(dpy, attrs, format, outConfig); 117 } 118 119 // ---------------------------------------------------------------------------- 120 }; // namespace android 121 // ---------------------------------------------------------------------------- 122