/* * 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 "EglWindowSurface.h" #include "EglGlobalInfo.h" #include "EglOsApi.h" // this static member is accessed from a function registered in onexit() // for the emulator cleanup. As all static C++ objects are also being freed // from a system handler registered in onexit(), we can't have a class object // by value here - it would be prone to unstable deinitialization order issue; static std::set* s_associatedWins() { static std::set* ws = new std::set; return ws; } bool EglWindowSurface::alreadyAssociatedWithConfig(EGLNativeWindowType win) { return s_associatedWins()->find(win) != s_associatedWins()->end(); } EglWindowSurface::EglWindowSurface(EglDisplay* dpy, EGLNativeWindowType win, EglConfig* config, unsigned int width, unsigned int height) : EglSurface(dpy, WINDOW, config, width, height), m_win(win) { s_associatedWins()->insert(win); EglOS::Engine* engine = EglGlobalInfo::getInstance()->getOsEngine(); m_native = engine->createWindowSurface(config->nativeFormat(), win); } EglWindowSurface::~EglWindowSurface() { s_associatedWins()->erase(m_win); } bool EglWindowSurface::getAttrib(EGLint attrib,EGLint* val) { switch(attrib) { case EGL_CONFIG_ID: *val = m_config->id(); break; case EGL_WIDTH: *val = m_width; break; case EGL_HEIGHT: *val = m_height; break; case EGL_LARGEST_PBUFFER: case EGL_TEXTURE_FORMAT: case EGL_TEXTURE_TARGET: case EGL_MIPMAP_TEXTURE: break; default: return false; } return true; }