1 // SwiftShader Software Renderer
3 // Copyright(c) 2005-2012 TransGaming Inc.
5 // All rights reserved. No part of this software may be copied, distributed, transmitted,
6 // transcribed, stored in a retrieval system, translated into any human or computer
7 // language by any means, or disclosed to third parties without the explicit written
8 // agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express
9 // or implied, including but not limited to any patent rights, are granted to you.
12 // ResourceManager.cpp: Implements the ResourceManager class, which tracks and
13 // retrieves objects which may be shared by multiple Contexts.
15 #include "ResourceManager.h"
19 #include "Renderbuffer.h"
25 ResourceManager::ResourceManager()
30 ResourceManager::~ResourceManager()
32 while(!mBufferMap.empty())
34 deleteBuffer(mBufferMap.begin()->first);
37 while(!mProgramMap.empty())
39 deleteProgram(mProgramMap.begin()->first);
42 while(!mShaderMap.empty())
44 deleteShader(mShaderMap.begin()->first);
47 while(!mRenderbufferMap.empty())
49 deleteRenderbuffer(mRenderbufferMap.begin()->first);
52 while(!mTextureMap.empty())
54 deleteTexture(mTextureMap.begin()->first);
58 void ResourceManager::addRef()
63 void ResourceManager::release()
71 // Returns an unused buffer name
72 GLuint ResourceManager::createBuffer()
74 GLuint handle = mBufferHandleAllocator.allocate();
76 mBufferMap[handle] = NULL;
81 // Returns an unused shader/program name
82 GLuint ResourceManager::createShader(GLenum type)
84 GLuint handle = mProgramShaderHandleAllocator.allocate();
86 if(type == GL_VERTEX_SHADER)
88 mShaderMap[handle] = new VertexShader(this, handle);
90 else if(type == GL_FRAGMENT_SHADER)
92 mShaderMap[handle] = new FragmentShader(this, handle);
99 // Returns an unused program/shader name
100 GLuint ResourceManager::createProgram()
102 GLuint handle = mProgramShaderHandleAllocator.allocate();
104 mProgramMap[handle] = new Program(this, handle);
109 // Returns an unused texture name
110 GLuint ResourceManager::createTexture()
112 GLuint handle = mTextureHandleAllocator.allocate();
114 mTextureMap[handle] = NULL;
119 // Returns an unused renderbuffer name
120 GLuint ResourceManager::createRenderbuffer()
122 GLuint handle = mRenderbufferHandleAllocator.allocate();
124 mRenderbufferMap[handle] = NULL;
129 void ResourceManager::deleteBuffer(GLuint buffer)
131 BufferMap::iterator bufferObject = mBufferMap.find(buffer);
133 if(bufferObject != mBufferMap.end())
135 mBufferHandleAllocator.release(bufferObject->first);
136 if(bufferObject->second) bufferObject->second->release();
137 mBufferMap.erase(bufferObject);
141 void ResourceManager::deleteShader(GLuint shader)
143 ShaderMap::iterator shaderObject = mShaderMap.find(shader);
145 if(shaderObject != mShaderMap.end())
147 if(shaderObject->second->getRefCount() == 0)
149 mProgramShaderHandleAllocator.release(shaderObject->first);
150 delete shaderObject->second;
151 mShaderMap.erase(shaderObject);
155 shaderObject->second->flagForDeletion();
160 void ResourceManager::deleteProgram(GLuint program)
162 ProgramMap::iterator programObject = mProgramMap.find(program);
164 if(programObject != mProgramMap.end())
166 if(programObject->second->getRefCount() == 0)
168 mProgramShaderHandleAllocator.release(programObject->first);
169 delete programObject->second;
170 mProgramMap.erase(programObject);
174 programObject->second->flagForDeletion();
179 void ResourceManager::deleteTexture(GLuint texture)
181 TextureMap::iterator textureObject = mTextureMap.find(texture);
183 if(textureObject != mTextureMap.end())
185 mTextureHandleAllocator.release(textureObject->first);
186 if(textureObject->second) textureObject->second->release();
187 mTextureMap.erase(textureObject);
191 void ResourceManager::deleteRenderbuffer(GLuint renderbuffer)
193 RenderbufferMap::iterator renderbufferObject = mRenderbufferMap.find(renderbuffer);
195 if(renderbufferObject != mRenderbufferMap.end())
197 mRenderbufferHandleAllocator.release(renderbufferObject->first);
198 if(renderbufferObject->second) renderbufferObject->second->release();
199 mRenderbufferMap.erase(renderbufferObject);
203 Buffer *ResourceManager::getBuffer(unsigned int handle)
205 BufferMap::iterator buffer = mBufferMap.find(handle);
207 if(buffer == mBufferMap.end())
213 return buffer->second;
217 Shader *ResourceManager::getShader(unsigned int handle)
219 ShaderMap::iterator shader = mShaderMap.find(handle);
221 if(shader == mShaderMap.end())
227 return shader->second;
231 Texture *ResourceManager::getTexture(unsigned int handle)
233 if(handle == 0) return NULL;
235 TextureMap::iterator texture = mTextureMap.find(handle);
237 if(texture == mTextureMap.end())
243 return texture->second;
247 Program *ResourceManager::getProgram(unsigned int handle)
249 ProgramMap::iterator program = mProgramMap.find(handle);
251 if(program == mProgramMap.end())
257 return program->second;
261 Renderbuffer *ResourceManager::getRenderbuffer(unsigned int handle)
263 RenderbufferMap::iterator renderbuffer = mRenderbufferMap.find(handle);
265 if(renderbuffer == mRenderbufferMap.end())
271 if (!renderbuffer->second)
273 Renderbuffer *renderbufferObject = new Renderbuffer(handle, new Colorbuffer(0, 0, GL_RGBA4_OES, 0));
274 mRenderbufferMap[handle] = renderbufferObject;
275 renderbufferObject->addRef();
277 return renderbuffer->second;
281 void ResourceManager::setRenderbuffer(GLuint handle, Renderbuffer *buffer)
283 mRenderbufferMap[handle] = buffer;
286 void ResourceManager::checkBufferAllocation(unsigned int buffer)
288 if(buffer != 0 && !getBuffer(buffer))
290 Buffer *bufferObject = new Buffer(buffer);
291 mBufferMap[buffer] = bufferObject;
292 bufferObject->addRef();
296 void ResourceManager::checkTextureAllocation(GLuint texture, TextureType type)
298 if(!getTexture(texture) && texture != 0)
300 Texture *textureObject;
302 if(type == TEXTURE_2D)
304 textureObject = new Texture2D(texture);
306 else if(type == TEXTURE_CUBE)
308 textureObject = new TextureCubeMap(texture);
310 else if(type == TEXTURE_EXTERNAL)
312 textureObject = new TextureExternal(texture);
320 mTextureMap[texture] = textureObject;
321 textureObject->addRef();