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