1 /*
2 * Copyright (C) 2011 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 #include "EglGlobalInfo.h"
17 #include "EglOsApi.h"
18 #include <string.h>
19 #include "ClientAPIExts.h"
20
21 int EglGlobalInfo::m_refCount = 0;
22 EglGlobalInfo* EglGlobalInfo::m_singleton = NULL;
23
24
EglGlobalInfo()25 EglGlobalInfo::EglGlobalInfo(){
26 m_default = EglOS::getDefaultDisplay();
27 #ifdef _WIN32
28 EglOS::initPtrToWglFunctions();
29 #endif
30 memset(m_gles_ifaces,0,sizeof(m_gles_ifaces));
31 memset(m_gles_extFuncs_inited,0,sizeof(m_gles_extFuncs_inited));
32 }
33
getInstance()34 EglGlobalInfo* EglGlobalInfo::getInstance() {
35 if(!m_singleton) {
36 m_singleton = new EglGlobalInfo();
37 m_refCount = 0;
38 }
39 m_refCount++;
40 return m_singleton;
41 }
42
delInstance()43 void EglGlobalInfo::delInstance() {
44 m_refCount--;
45 if(m_refCount <= 0 && m_singleton) {
46 delete m_singleton;
47 m_singleton = NULL;
48 }
49
50 }
51
addDisplay(EGLNativeDisplayType dpy,EGLNativeInternalDisplayType idpy)52 EglDisplay* EglGlobalInfo::addDisplay(EGLNativeDisplayType dpy,EGLNativeInternalDisplayType idpy) {
53 //search if it is not already exists
54 emugl::Mutex::AutoLock mutex(m_lock);
55 for(DisplaysMap::iterator it = m_displays.begin(); it != m_displays.end() ;it++) {
56 if((*it).second == dpy) return (*it).first;
57 }
58
59 if (!EglOS::validNativeDisplay(idpy))
60 return NULL;
61
62 EglDisplay* p_dpy = new EglDisplay(idpy);
63 if(p_dpy) {
64 m_displays[p_dpy] = dpy;
65 return p_dpy;
66 }
67 return NULL;
68 }
69
removeDisplay(EGLDisplay dpy)70 bool EglGlobalInfo::removeDisplay(EGLDisplay dpy) {
71 emugl::Mutex::AutoLock mutex(m_lock);
72 for(DisplaysMap::iterator it = m_displays.begin(); it != m_displays.end() ;it++) {
73 if(static_cast<EGLDisplay>((*it).first) == dpy) {
74 delete (*it).first;
75 m_displays.erase(it);
76 return true;
77 }
78 }
79 return false;
80 }
81
getDisplay(EGLNativeDisplayType dpy)82 EglDisplay* EglGlobalInfo::getDisplay(EGLNativeDisplayType dpy) {
83 emugl::Mutex::AutoLock mutex(m_lock);
84 for(DisplaysMap::iterator it = m_displays.begin(); it != m_displays.end() ;it++) {
85 if((*it).second == dpy) return (*it).first;
86 }
87 return NULL;
88 }
89
getDisplay(EGLDisplay dpy)90 EglDisplay* EglGlobalInfo::getDisplay(EGLDisplay dpy) {
91 emugl::Mutex::AutoLock mutex(m_lock);
92 DisplaysMap::iterator it = m_displays.find(static_cast<EglDisplay*>(dpy));
93 return (it != m_displays.end() ? (*it).first : NULL);
94 }
95
generateInternalDisplay(EGLNativeDisplayType dpy)96 EGLNativeInternalDisplayType EglGlobalInfo::generateInternalDisplay(EGLNativeDisplayType dpy){
97 return EglOS::getInternalDisplay(dpy);
98 }
99
initClientExtFuncTable(GLESVersion ver)100 void EglGlobalInfo::initClientExtFuncTable(GLESVersion ver)
101 {
102 emugl::Mutex::AutoLock mutex(m_lock);
103 if (!m_gles_extFuncs_inited[ver]) {
104 ClientAPIExts::initClientFuncs(m_gles_ifaces[ver], (int)ver - 1);
105 m_gles_extFuncs_inited[ver] = true;
106 }
107 }
108