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