/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "RendererSurface.h" #include #include #include "NativeWindowing.h" #define MAX_ATTRIB 100 EGLConfig RendererSurface::getEglConfig(EGLDisplay eglDisplay, SurfaceConfig config) { EGLConfig eglConfig; int nConfigs; EGLint attrib[MAX_ATTRIB]; int pos =0; attrib[pos++] = EGL_SURFACE_TYPE; attrib[pos++] = EGL_WINDOW_BIT; if (config & CONFIG_DEPTH) {attrib[pos++] = EGL_DEPTH_SIZE; attrib[pos++] = 1;} attrib[pos++] = EGL_NONE; if (!eglChooseConfig(eglDisplay, attrib, &eglConfig, 1, &nConfigs)) { return 0; } /***/ int ibuf; if (eglGetConfigAttrib(eglDisplay, eglConfig, EGL_BUFFER_SIZE, &ibuf)) { fprintf(stderr, "EGL COLOR Buffer size: %d\n", ibuf); } else { fprintf(stderr, "eglGetConfigAttrib error: %d\n", eglGetError()); } if (eglGetConfigAttrib(eglDisplay, eglConfig, EGL_DEPTH_SIZE, &ibuf)) { fprintf(stderr, "EGL DEPTH Buffer size: %d\n", ibuf); } else { fprintf(stderr, "eglGetConfigAttrib error: %d\n", eglGetError()); } /***/ if (nConfigs != 1) { return 0; } return eglConfig; } RendererSurface * RendererSurface::create(EGLDisplay eglDisplay, SurfaceConfig config, NativeWindowing *nw) { int width = 0, height = 0; const char* env; env = getenv("ANDROID_WINDOW_WIDTH"); if (env && *env) { width = atoi(env); } env = getenv("ANDROID_WINDOW_HEIGHT"); if (env && *env) { height = atoi(env); } if (width <= 160) width = DEFAULT_WIDTH; if (height <= 160) height = DEFAULT_HEIGHT; printf("%s: Using width=%d height=%d\n", __FUNCTION__, width, height); EGLConfig eglConfig = getEglConfig(eglDisplay, config); if (eglConfig == 0) { return NULL; } NativeWindowType window = nw->createNativeWindow(nw->getNativeDisplay(), width, height); if (window == 0) { return NULL; } EGLSurface eglSurface = eglCreateWindowSurface(eglDisplay, eglConfig, window, NULL); if (eglGetError() != EGL_SUCCESS) { return NULL; } return new RendererSurface(eglDisplay, window, eglSurface, eglConfig); } int RendererSurface::destroy(NativeWindowing *nw) { eglDestroySurface(m_eglDisplay, m_eglSurface); nw->destroyNativeWindow(nw->getNativeDisplay(), m_window); return 1; }