blob: 6b4deb1955b400ea2a034ccffe40819b2df29d34 [file] [log] [blame]
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +00001//
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.
5//
6
7// ResourceManager.cpp: Implements the gl::ResourceManager class, which tracks and
8// retrieves objects which may be shared by multiple Contexts.
9
10#include "libGLESv2/ResourceManager.h"
11
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"
17
18namespace gl
19{
20ResourceManager::ResourceManager()
21{
22}
23
24ResourceManager::~ResourceManager()
25{
26 while (!mBufferMap.empty())
27 {
28 deleteBuffer(mBufferMap.begin()->first);
29 }
30
31 while (!mProgramMap.empty())
32 {
33 deleteProgram(mProgramMap.begin()->first);
34 }
35
36 while (!mShaderMap.empty())
37 {
38 deleteShader(mShaderMap.begin()->first);
39 }
40
41 while (!mRenderbufferMap.empty())
42 {
43 deleteRenderbuffer(mRenderbufferMap.begin()->first);
44 }
45
46 while (!mTextureMap.empty())
47 {
48 deleteTexture(mTextureMap.begin()->first);
49 }
50}
51
52// Returns an unused buffer name
53GLuint ResourceManager::createBuffer()
54{
55 unsigned int handle = 1;
56
57 while (mBufferMap.find(handle) != mBufferMap.end())
58 {
59 handle++;
60 }
61
62 mBufferMap[handle] = NULL;
63
64 return handle;
65}
66
67// Returns an unused shader/program name
68GLuint ResourceManager::createShader(GLenum type)
69{
70 unsigned int handle = 1;
71
72 while (mShaderMap.find(handle) != mShaderMap.end() || mProgramMap.find(handle) != mProgramMap.end()) // Shared name space
73 {
74 handle++;
75 }
76
77 if (type == GL_VERTEX_SHADER)
78 {
79 mShaderMap[handle] = new VertexShader(this, handle);
80 }
81 else if (type == GL_FRAGMENT_SHADER)
82 {
83 mShaderMap[handle] = new FragmentShader(this, handle);
84 }
85 else UNREACHABLE();
86
87 return handle;
88}
89
90// Returns an unused program/shader name
91GLuint ResourceManager::createProgram()
92{
93 unsigned int handle = 1;
94
95 while (mProgramMap.find(handle) != mProgramMap.end() || mShaderMap.find(handle) != mShaderMap.end()) // Shared name space
96 {
97 handle++;
98 }
99
100 mProgramMap[handle] = new Program(this, handle);
101
102 return handle;
103}
104
105// Returns an unused texture name
106GLuint ResourceManager::createTexture()
107{
108 unsigned int handle = 1;
109
110 while (mTextureMap.find(handle) != mTextureMap.end())
111 {
112 handle++;
113 }
114
115 mTextureMap[handle] = NULL;
116
117 return handle;
118}
119
120// Returns an unused renderbuffer name
121GLuint ResourceManager::createRenderbuffer()
122{
123 unsigned int handle = 1;
124
125 while (mRenderbufferMap.find(handle) != mRenderbufferMap.end())
126 {
127 handle++;
128 }
129
130 mRenderbufferMap[handle] = NULL;
131
132 return handle;
133}
134
135// FIXME: shared object deletion needs handling
136void ResourceManager::deleteBuffer(GLuint buffer)
137{
138 BufferMap::iterator bufferObject = mBufferMap.find(buffer);
139
140 if (bufferObject != mBufferMap.end())
141 {
142 delete bufferObject->second;
143 mBufferMap.erase(bufferObject);
144 }
145}
146
147void ResourceManager::deleteShader(GLuint shader)
148{
149 ShaderMap::iterator shaderObject = mShaderMap.find(shader);
150
151 if (shaderObject != mShaderMap.end())
152 {
153 if (shaderObject->second->getRefCount() == 0)
154 {
155 delete shaderObject->second;
156 mShaderMap.erase(shaderObject);
157 }
158 else
159 {
160 shaderObject->second->flagForDeletion();
161 }
162 }
163}
164
165void ResourceManager::deleteProgram(GLuint program)
166{
167 ProgramMap::iterator programObject = mProgramMap.find(program);
168
169 if (programObject != mProgramMap.end())
170 {
171 if (programObject->second->getRefCount() == 0)
172 {
173 delete programObject->second;
174 mProgramMap.erase(programObject);
175 }
176 else
177 {
178 programObject->second->flagForDeletion();
179 }
180 }
181}
182
183// FIXME: shared object deletion needs handling
184void ResourceManager::deleteTexture(GLuint texture)
185{
186 TextureMap::iterator textureObject = mTextureMap.find(texture);
187
188 if (textureObject != mTextureMap.end())
189 {
190 if (texture != 0)
191 {
192 delete textureObject->second;
193 }
194
195 mTextureMap.erase(textureObject);
196 }
197}
198
199// FIXME: shared object deletion needs handling
200void ResourceManager::deleteRenderbuffer(GLuint renderbuffer)
201{
202 RenderbufferMap::iterator renderbufferObject = mRenderbufferMap.find(renderbuffer);
203
204 if (renderbufferObject != mRenderbufferMap.end())
205 {
206 delete renderbufferObject->second;
207 mRenderbufferMap.erase(renderbufferObject);
208 }
209}
210
211Buffer *ResourceManager::getBuffer(unsigned int handle)
212{
213 BufferMap::iterator buffer = mBufferMap.find(handle);
214
215 if (buffer == mBufferMap.end())
216 {
217 return NULL;
218 }
219 else
220 {
221 return buffer->second;
222 }
223}
224
225Shader *ResourceManager::getShader(unsigned int handle)
226{
227 ShaderMap::iterator shader = mShaderMap.find(handle);
228
229 if (shader == mShaderMap.end())
230 {
231 return NULL;
232 }
233 else
234 {
235 return shader->second;
236 }
237}
238
239Texture *ResourceManager::getTexture(unsigned int handle)
240{
241 if (handle == 0) return NULL;
242
243 TextureMap::iterator texture = mTextureMap.find(handle);
244
245 if (texture == mTextureMap.end())
246 {
247 return NULL;
248 }
249 else
250 {
251 return texture->second;
252 }
253}
254
255Program *ResourceManager::getProgram(unsigned int handle)
256{
257 ProgramMap::iterator program = mProgramMap.find(handle);
258
259 if (program == mProgramMap.end())
260 {
261 return NULL;
262 }
263 else
264 {
265 return program->second;
266 }
267}
268
269Renderbuffer *ResourceManager::getRenderbuffer(unsigned int handle)
270{
271 RenderbufferMap::iterator renderbuffer = mRenderbufferMap.find(handle);
272
273 if (renderbuffer == mRenderbufferMap.end())
274 {
275 return NULL;
276 }
277 else
278 {
279 return renderbuffer->second;
280 }
281}
282
283void ResourceManager::setRenderbuffer(GLuint handle, Renderbuffer *buffer)
284{
285 mRenderbufferMap[handle] = buffer;
286}
287
288void ResourceManager::checkBufferAllocation(unsigned int buffer)
289{
290 if (buffer != 0 && !getBuffer(buffer))
291 {
292 mBufferMap[buffer] = new Buffer();
293 }
294}
295
296void ResourceManager::checkTextureAllocation(GLuint texture, SamplerType type)
297{
298 if (!getTexture(texture) && texture != 0)
299 {
300 if (type == SAMPLER_2D)
301 {
302 mTextureMap[texture] = new Texture2D();
303 }
304 else if (type == SAMPLER_CUBE)
305 {
306 mTextureMap[texture] = new TextureCubeMap();
307 }
308 }
309}
310
311void ResourceManager::checkRenderbufferAllocation(GLuint renderbuffer)
312{
313 if (renderbuffer != 0 && !getRenderbuffer(renderbuffer))
314 {
315 mRenderbufferMap[renderbuffer] = new Renderbuffer();
316 }
317}
318
319}