• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <map>
17 #include <GLcommon/objectNameManager.h>
18 #include <GLcommon/GLEScontext.h>
19 
20 
NameSpace(NamedObjectType p_type,GlobalNameSpace * globalNameSpace)21 NameSpace::NameSpace(NamedObjectType p_type, GlobalNameSpace *globalNameSpace) :
22     m_nextName(0),
23     m_type(p_type),
24     m_globalNameSpace(globalNameSpace)
25 {
26 }
27 
~NameSpace()28 NameSpace::~NameSpace()
29 {
30     for (NamesMap::iterator n = m_localToGlobalMap.begin();
31          n != m_localToGlobalMap.end();
32          n++) {
33         m_globalNameSpace->deleteName(m_type, (*n).second);
34     }
35 }
36 
37 ObjectLocalName
genName(ObjectLocalName p_localName,bool genGlobal,bool genLocal)38 NameSpace::genName(ObjectLocalName p_localName, bool genGlobal, bool genLocal)
39 {
40 
41     ObjectLocalName localName = p_localName;
42     if (genLocal) {
43         do {
44             localName = ++m_nextName;
45         } while( localName == 0 || m_localToGlobalMap.find(localName) != m_localToGlobalMap.end() );
46     }
47 
48     if (genGlobal) {
49         unsigned int globalName = m_globalNameSpace->genName(m_type);
50         m_localToGlobalMap[localName] = globalName;
51     }
52 
53     return localName;
54 }
55 
56 
57 unsigned int
genGlobalName(void)58 NameSpace::genGlobalName(void)
59 {
60     return m_globalNameSpace->genName(m_type);
61 }
62 
63 unsigned int
getGlobalName(ObjectLocalName p_localName)64 NameSpace::getGlobalName(ObjectLocalName p_localName)
65 {
66     NamesMap::iterator n( m_localToGlobalMap.find(p_localName) );
67     if (n != m_localToGlobalMap.end()) {
68         // object found - return its global name map
69         return (*n).second;
70     }
71 
72     // object does not exist;
73     return 0;
74 }
75 
76 ObjectLocalName
getLocalName(unsigned int p_globalName)77 NameSpace::getLocalName(unsigned int p_globalName)
78 {
79     for(NamesMap::iterator it = m_localToGlobalMap.begin(); it != m_localToGlobalMap.end();it++){
80         if((*it).second == p_globalName){
81             // object found - return its local name
82             return (*it).first;
83         }
84     }
85 
86     // object does not exist;
87     return 0;
88 }
89 
90 void
deleteName(ObjectLocalName p_localName)91 NameSpace::deleteName(ObjectLocalName p_localName)
92 {
93     NamesMap::iterator n( m_localToGlobalMap.find(p_localName) );
94     if (n != m_localToGlobalMap.end()) {
95         m_globalNameSpace->deleteName(m_type, (*n).second);
96         m_localToGlobalMap.erase(p_localName);
97     }
98 }
99 
100 bool
isObject(ObjectLocalName p_localName)101 NameSpace::isObject(ObjectLocalName p_localName)
102 {
103     return (m_localToGlobalMap.find(p_localName) != m_localToGlobalMap.end() );
104 }
105 
106 void
replaceGlobalName(ObjectLocalName p_localName,unsigned int p_globalName)107 NameSpace::replaceGlobalName(ObjectLocalName p_localName, unsigned int p_globalName)
108 {
109     NamesMap::iterator n( m_localToGlobalMap.find(p_localName) );
110     if (n != m_localToGlobalMap.end()) {
111         m_globalNameSpace->deleteName(m_type, (*n).second);
112         (*n).second = p_globalName;
113     }
114 }
115 
116 
GlobalNameSpace()117 GlobalNameSpace::GlobalNameSpace()
118 {
119     mutex_init(&m_lock);
120 }
121 
~GlobalNameSpace()122 GlobalNameSpace::~GlobalNameSpace()
123 {
124     mutex_destroy(&m_lock);
125 }
126 
127 unsigned int
genName(NamedObjectType p_type)128 GlobalNameSpace::genName(NamedObjectType p_type)
129 {
130     if ( p_type >= NUM_OBJECT_TYPES ) return 0;
131     unsigned int name = 0;
132 
133     mutex_lock(&m_lock);
134     switch (p_type) {
135     case VERTEXBUFFER:
136         GLEScontext::dispatcher().glGenBuffers(1,&name);
137         break;
138     case TEXTURE:
139         GLEScontext::dispatcher().glGenTextures(1,&name);
140         break;
141     case RENDERBUFFER:
142         GLEScontext::dispatcher().glGenRenderbuffersEXT(1,&name);
143         break;
144     case FRAMEBUFFER:
145         GLEScontext::dispatcher().glGenFramebuffersEXT(1,&name);
146         break;
147     case SHADER: //objects in shader namepace are not handled
148     default:
149         name = 0;
150     }
151     mutex_unlock(&m_lock);
152     return name;
153 }
154 
155 void
deleteName(NamedObjectType p_type,unsigned int p_name)156 GlobalNameSpace::deleteName(NamedObjectType p_type, unsigned int p_name)
157 {
158 }
159 
160 typedef std::pair<NamedObjectType, ObjectLocalName> ObjectIDPair;
161 typedef std::map<ObjectIDPair, ObjectDataPtr> ObjectDataMap;
162 
ShareGroup(GlobalNameSpace * globalNameSpace)163 ShareGroup::ShareGroup(GlobalNameSpace *globalNameSpace)
164 {
165     mutex_init(&m_lock);
166 
167     for (int i=0; i<NUM_OBJECT_TYPES; i++) {
168         m_nameSpace[i] = new NameSpace((NamedObjectType)i, globalNameSpace);
169     }
170 
171     m_objectsData = NULL;
172 }
173 
~ShareGroup()174 ShareGroup::~ShareGroup()
175 {
176     mutex_lock(&m_lock);
177     for (int t = 0; t < NUM_OBJECT_TYPES; t++) {
178         delete m_nameSpace[t];
179     }
180 
181     ObjectDataMap *map = (ObjectDataMap *)m_objectsData;
182     if (map) delete map;
183 
184     mutex_unlock(&m_lock);
185     mutex_destroy(&m_lock);
186 }
187 
188 ObjectLocalName
genName(NamedObjectType p_type,ObjectLocalName p_localName,bool genLocal)189 ShareGroup::genName(NamedObjectType p_type, ObjectLocalName p_localName, bool genLocal)
190 {
191     if (p_type >= NUM_OBJECT_TYPES) return 0;
192 
193     mutex_lock(&m_lock);
194     ObjectLocalName localName = m_nameSpace[p_type]->genName(p_localName,true,genLocal);
195     mutex_unlock(&m_lock);
196 
197     return localName;
198 }
199 
200 unsigned int
genGlobalName(NamedObjectType p_type)201 ShareGroup::genGlobalName(NamedObjectType p_type)
202 {
203     if (p_type >= NUM_OBJECT_TYPES) return 0;
204 
205     mutex_lock(&m_lock);
206     unsigned int name = m_nameSpace[p_type]->genGlobalName();
207     mutex_unlock(&m_lock);
208 
209     return name;
210 }
211 
212 unsigned int
getGlobalName(NamedObjectType p_type,ObjectLocalName p_localName)213 ShareGroup::getGlobalName(NamedObjectType p_type, ObjectLocalName p_localName)
214 {
215     if (p_type >= NUM_OBJECT_TYPES) return 0;
216 
217     mutex_lock(&m_lock);
218     unsigned int globalName = m_nameSpace[p_type]->getGlobalName(p_localName);
219     mutex_unlock(&m_lock);
220 
221     return globalName;
222 }
223 
224 ObjectLocalName
getLocalName(NamedObjectType p_type,unsigned int p_globalName)225 ShareGroup::getLocalName(NamedObjectType p_type, unsigned int p_globalName)
226 {
227     if (p_type >= NUM_OBJECT_TYPES) return 0;
228 
229     mutex_lock(&m_lock);
230     ObjectLocalName localName = m_nameSpace[p_type]->getLocalName(p_globalName);
231     mutex_unlock(&m_lock);
232 
233     return localName;
234 }
235 
236 void
deleteName(NamedObjectType p_type,ObjectLocalName p_localName)237 ShareGroup::deleteName(NamedObjectType p_type, ObjectLocalName p_localName)
238 {
239     if (p_type >= NUM_OBJECT_TYPES) return;
240 
241     mutex_lock(&m_lock);
242     m_nameSpace[p_type]->deleteName(p_localName);
243     ObjectDataMap *map = (ObjectDataMap *)m_objectsData;
244     if (map) {
245         map->erase( ObjectIDPair(p_type, p_localName) );
246     }
247     mutex_unlock(&m_lock);
248 }
249 
250 bool
isObject(NamedObjectType p_type,ObjectLocalName p_localName)251 ShareGroup::isObject(NamedObjectType p_type, ObjectLocalName p_localName)
252 {
253     if (p_type >= NUM_OBJECT_TYPES) return 0;
254 
255     mutex_lock(&m_lock);
256     bool exist = m_nameSpace[p_type]->isObject(p_localName);
257     mutex_unlock(&m_lock);
258 
259     return exist;
260 }
261 
262 void
replaceGlobalName(NamedObjectType p_type,ObjectLocalName p_localName,unsigned int p_globalName)263 ShareGroup::replaceGlobalName(NamedObjectType p_type, ObjectLocalName p_localName, unsigned int p_globalName)
264 {
265     if (p_type >= NUM_OBJECT_TYPES) return;
266 
267     mutex_lock(&m_lock);
268     m_nameSpace[p_type]->replaceGlobalName(p_localName, p_globalName);
269     mutex_unlock(&m_lock);
270 }
271 
272 void
setObjectData(NamedObjectType p_type,ObjectLocalName p_localName,ObjectDataPtr data)273 ShareGroup::setObjectData(NamedObjectType p_type, ObjectLocalName p_localName, ObjectDataPtr data)
274 {
275     if (p_type >= NUM_OBJECT_TYPES) return;
276 
277     mutex_lock(&m_lock);
278 
279     ObjectDataMap *map = (ObjectDataMap *)m_objectsData;
280     if (!map) {
281         map = new ObjectDataMap();
282         m_objectsData = map;
283     }
284 
285     ObjectIDPair id( p_type, p_localName );
286     map->insert( std::pair<ObjectIDPair, ObjectDataPtr>(id, data) );
287 
288     mutex_unlock(&m_lock);
289 }
290 
291 ObjectDataPtr
getObjectData(NamedObjectType p_type,ObjectLocalName p_localName)292 ShareGroup::getObjectData(NamedObjectType p_type, ObjectLocalName p_localName)
293 {
294     ObjectDataPtr ret;
295 
296     if (p_type >= NUM_OBJECT_TYPES) return ret;
297 
298     mutex_lock(&m_lock);
299 
300     ObjectDataMap *map = (ObjectDataMap *)m_objectsData;
301     if (map) {
302         ObjectDataMap::iterator i = map->find( ObjectIDPair(p_type, p_localName) );
303         if (i != map->end()) ret = (*i).second;
304     }
305 
306     mutex_unlock(&m_lock);
307 
308     return ret;
309 }
310 
ObjectNameManager(GlobalNameSpace * globalNameSpace)311 ObjectNameManager::ObjectNameManager(GlobalNameSpace *globalNameSpace) :
312     m_globalNameSpace(globalNameSpace)
313 {
314     mutex_init(&m_lock);
315 }
316 
~ObjectNameManager()317 ObjectNameManager::~ObjectNameManager()
318 {
319     mutex_destroy(&m_lock);
320 }
321 
322 ShareGroupPtr
createShareGroup(void * p_groupName)323 ObjectNameManager::createShareGroup(void *p_groupName)
324 {
325     mutex_lock(&m_lock);
326 
327     ShareGroupPtr shareGroupReturn;
328 
329     ShareGroupsMap::iterator s( m_groups.find(p_groupName) );
330     if (s != m_groups.end()) {
331         shareGroupReturn = (*s).second;
332     }
333     else {
334         //
335         // Group does not exist, create new group
336         //
337         shareGroupReturn = ShareGroupPtr( new ShareGroup(m_globalNameSpace) );
338         m_groups.insert( std::pair<void *, ShareGroupPtr>(p_groupName, shareGroupReturn) );
339     }
340 
341     mutex_unlock(&m_lock);
342 
343     return shareGroupReturn;
344 }
345 
346 ShareGroupPtr
getShareGroup(void * p_groupName)347 ObjectNameManager::getShareGroup(void *p_groupName)
348 {
349     mutex_lock(&m_lock);
350 
351     ShareGroupPtr shareGroupReturn(NULL);
352 
353     ShareGroupsMap::iterator s( m_groups.find(p_groupName) );
354     if (s != m_groups.end()) {
355         shareGroupReturn = (*s).second;
356     }
357     mutex_unlock(&m_lock);
358 
359     return shareGroupReturn;
360 }
361 
362 ShareGroupPtr
attachShareGroup(void * p_groupName,void * p_existingGroupName)363 ObjectNameManager::attachShareGroup(void *p_groupName, void *p_existingGroupName)
364 {
365     mutex_lock(&m_lock);
366 
367     ShareGroupPtr shareGroupReturn;
368 
369     ShareGroupsMap::iterator s( m_groups.find(p_existingGroupName) );
370     if (s == m_groups.end()) {
371         // ShareGroup did not found !!!
372         mutex_unlock(&m_lock);
373         return ShareGroupPtr(NULL);
374     }
375 
376     shareGroupReturn = (*s).second;
377 
378     if (m_groups.find(p_groupName) == m_groups.end())
379     {
380         m_groups.insert( std::pair<void *, ShareGroupPtr>(p_groupName, shareGroupReturn) );
381     }
382 
383     mutex_unlock(&m_lock);
384 
385     return shareGroupReturn;
386 }
387 
388 void
deleteShareGroup(void * p_groupName)389 ObjectNameManager::deleteShareGroup(void *p_groupName)
390 {
391     mutex_lock(&m_lock);
392 
393     ShareGroupsMap::iterator s( m_groups.find(p_groupName) );
394     if (s != m_groups.end()) {
395         m_groups.erase(s);
396     }
397 
398     mutex_unlock(&m_lock);
399 }
400 
getGlobalContext()401 void *ObjectNameManager::getGlobalContext()
402 {
403     void *ret = NULL;
404 
405     mutex_lock(&m_lock);
406     if (m_groups.size() > 0) ret = (*m_groups.begin()).first;
407     mutex_unlock(&m_lock);
408 
409     return ret;
410 }
411 
412