2
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
3
// Use of this source code is governed by a BSD-style license that can be
4
// found in the LICENSE file.
7
// ResourceManager.cpp: Implements the gl::ResourceManager class, which tracks and
8
// retrieves objects which may be shared by multiple Contexts.
10
#include "libGLESv2/ResourceManager.h"
12
#include "libGLESv2/Buffer.h"
13
#include "libGLESv2/Program.h"
14
#include "libGLESv2/Renderbuffer.h"
15
#include "libGLESv2/Shader.h"
16
#include "libGLESv2/Texture.h"
20
ResourceManager::ResourceManager()
25
ResourceManager::~ResourceManager()
27
while (!mBufferMap.empty())
29
deleteBuffer(mBufferMap.begin()->first);
32
while (!mProgramMap.empty())
34
deleteProgram(mProgramMap.begin()->first);
37
while (!mShaderMap.empty())
39
deleteShader(mShaderMap.begin()->first);
42
while (!mRenderbufferMap.empty())
44
deleteRenderbuffer(mRenderbufferMap.begin()->first);
47
while (!mTextureMap.empty())
49
deleteTexture(mTextureMap.begin()->first);
53
void ResourceManager::addRef()
58
void ResourceManager::release()
66
// Returns an unused buffer name
67
GLuint ResourceManager::createBuffer()
69
GLuint handle = mBufferHandleAllocator.allocate();
71
mBufferMap[handle] = NULL;
76
// Returns an unused shader/program name
77
GLuint ResourceManager::createShader(GLenum type)
79
GLuint handle = mProgramShaderHandleAllocator.allocate();
81
if (type == GL_VERTEX_SHADER)
83
mShaderMap[handle] = new VertexShader(this, handle);
85
else if (type == GL_FRAGMENT_SHADER)
87
mShaderMap[handle] = new FragmentShader(this, handle);
94
// Returns an unused program/shader name
95
GLuint ResourceManager::createProgram()
97
GLuint handle = mProgramShaderHandleAllocator.allocate();
99
mProgramMap[handle] = new Program(this, handle);
104
// Returns an unused texture name
105
GLuint ResourceManager::createTexture()
107
GLuint handle = mTextureHandleAllocator.allocate();
109
mTextureMap[handle] = NULL;
114
// Returns an unused renderbuffer name
115
GLuint ResourceManager::createRenderbuffer()
117
GLuint handle = mRenderbufferHandleAllocator.allocate();
119
mRenderbufferMap[handle] = NULL;
124
void ResourceManager::deleteBuffer(GLuint buffer)
126
BufferMap::iterator bufferObject = mBufferMap.find(buffer);
128
if (bufferObject != mBufferMap.end())
130
mBufferHandleAllocator.release(bufferObject->first);
131
if (bufferObject->second) bufferObject->second->release();
132
mBufferMap.erase(bufferObject);
136
void ResourceManager::deleteShader(GLuint shader)
138
ShaderMap::iterator shaderObject = mShaderMap.find(shader);
140
if (shaderObject != mShaderMap.end())
142
if (shaderObject->second->getRefCount() == 0)
144
mProgramShaderHandleAllocator.release(shaderObject->first);
145
delete shaderObject->second;
146
mShaderMap.erase(shaderObject);
150
shaderObject->second->flagForDeletion();
155
void ResourceManager::deleteProgram(GLuint program)
157
ProgramMap::iterator programObject = mProgramMap.find(program);
159
if (programObject != mProgramMap.end())
161
if (programObject->second->getRefCount() == 0)
163
mProgramShaderHandleAllocator.release(programObject->first);
164
delete programObject->second;
165
mProgramMap.erase(programObject);
169
programObject->second->flagForDeletion();
174
void ResourceManager::deleteTexture(GLuint texture)
176
TextureMap::iterator textureObject = mTextureMap.find(texture);
178
if (textureObject != mTextureMap.end())
180
mTextureHandleAllocator.release(textureObject->first);
181
if (textureObject->second) textureObject->second->release();
182
mTextureMap.erase(textureObject);
186
void ResourceManager::deleteRenderbuffer(GLuint renderbuffer)
188
RenderbufferMap::iterator renderbufferObject = mRenderbufferMap.find(renderbuffer);
190
if (renderbufferObject != mRenderbufferMap.end())
192
mRenderbufferHandleAllocator.release(renderbufferObject->first);
193
if (renderbufferObject->second) renderbufferObject->second->release();
194
mRenderbufferMap.erase(renderbufferObject);
198
Buffer *ResourceManager::getBuffer(unsigned int handle)
200
BufferMap::iterator buffer = mBufferMap.find(handle);
202
if (buffer == mBufferMap.end())
208
return buffer->second;
212
Shader *ResourceManager::getShader(unsigned int handle)
214
ShaderMap::iterator shader = mShaderMap.find(handle);
216
if (shader == mShaderMap.end())
222
return shader->second;
226
Texture *ResourceManager::getTexture(unsigned int handle)
228
if (handle == 0) return NULL;
230
TextureMap::iterator texture = mTextureMap.find(handle);
232
if (texture == mTextureMap.end())
238
return texture->second;
242
Program *ResourceManager::getProgram(unsigned int handle)
244
ProgramMap::iterator program = mProgramMap.find(handle);
246
if (program == mProgramMap.end())
252
return program->second;
256
Renderbuffer *ResourceManager::getRenderbuffer(unsigned int handle)
258
RenderbufferMap::iterator renderbuffer = mRenderbufferMap.find(handle);
260
if (renderbuffer == mRenderbufferMap.end())
266
return renderbuffer->second;
270
void ResourceManager::setRenderbuffer(GLuint handle, Renderbuffer *buffer)
272
mRenderbufferMap[handle] = buffer;
275
void ResourceManager::checkBufferAllocation(unsigned int buffer)
277
if (buffer != 0 && !getBuffer(buffer))
279
Buffer *bufferObject = new Buffer(buffer);
280
mBufferMap[buffer] = bufferObject;
281
bufferObject->addRef();
285
void ResourceManager::checkTextureAllocation(GLuint texture, TextureType type)
287
if (!getTexture(texture) && texture != 0)
289
Texture *textureObject;
291
if (type == TEXTURE_2D)
293
textureObject = new Texture2D(texture);
295
else if (type == TEXTURE_CUBE)
297
textureObject = new TextureCubeMap(texture);
305
mTextureMap[texture] = textureObject;
306
textureObject->addRef();
310
void ResourceManager::checkRenderbufferAllocation(GLuint renderbuffer)
312
if (renderbuffer != 0 && !getRenderbuffer(renderbuffer))
314
Renderbuffer *renderbufferObject = new Renderbuffer(renderbuffer, new Colorbuffer(0, 0, GL_RGBA4, 0));
315
mRenderbufferMap[renderbuffer] = renderbufferObject;
316
renderbufferObject->addRef();