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