blob: 5abd756cd7d62f0d73dfa7522762e9661bacaacb [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"
apatrick@chromium.org55255022010-09-11 02:12:47 +000015#include "libGLESv2/FrameBuffer.h"
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000016#include "libGLESv2/Shader.h"
17#include "libGLESv2/Texture.h"
18
19namespace gl
20{
21ResourceManager::ResourceManager()
22{
daniel@transgaming.com0d25b002010-07-28 19:21:07 +000023 mRefCount = 1;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000024}
25
26ResourceManager::~ResourceManager()
27{
28 while (!mBufferMap.empty())
29 {
30 deleteBuffer(mBufferMap.begin()->first);
31 }
32
33 while (!mProgramMap.empty())
34 {
35 deleteProgram(mProgramMap.begin()->first);
36 }
37
38 while (!mShaderMap.empty())
39 {
40 deleteShader(mShaderMap.begin()->first);
41 }
42
43 while (!mRenderbufferMap.empty())
44 {
45 deleteRenderbuffer(mRenderbufferMap.begin()->first);
46 }
47
48 while (!mTextureMap.empty())
49 {
50 deleteTexture(mTextureMap.begin()->first);
51 }
52}
53
daniel@transgaming.com0d25b002010-07-28 19:21:07 +000054void ResourceManager::addRef()
55{
56 mRefCount++;
57}
58
59void ResourceManager::release()
60{
61 if (--mRefCount == 0)
62 {
63 delete this;
64 }
65}
66
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000067// Returns an unused buffer name
68GLuint ResourceManager::createBuffer()
69{
70 unsigned int handle = 1;
71
72 while (mBufferMap.find(handle) != mBufferMap.end())
73 {
74 handle++;
75 }
76
77 mBufferMap[handle] = NULL;
78
79 return handle;
80}
81
82// Returns an unused shader/program name
83GLuint ResourceManager::createShader(GLenum type)
84{
85 unsigned int handle = 1;
86
87 while (mShaderMap.find(handle) != mShaderMap.end() || mProgramMap.find(handle) != mProgramMap.end()) // Shared name space
88 {
89 handle++;
90 }
91
92 if (type == GL_VERTEX_SHADER)
93 {
94 mShaderMap[handle] = new VertexShader(this, handle);
95 }
96 else if (type == GL_FRAGMENT_SHADER)
97 {
98 mShaderMap[handle] = new FragmentShader(this, handle);
99 }
100 else UNREACHABLE();
101
102 return handle;
103}
104
105// Returns an unused program/shader name
106GLuint ResourceManager::createProgram()
107{
108 unsigned int handle = 1;
109
110 while (mProgramMap.find(handle) != mProgramMap.end() || mShaderMap.find(handle) != mShaderMap.end()) // Shared name space
111 {
112 handle++;
113 }
114
115 mProgramMap[handle] = new Program(this, handle);
116
117 return handle;
118}
119
120// Returns an unused texture name
121GLuint ResourceManager::createTexture()
122{
123 unsigned int handle = 1;
124
125 while (mTextureMap.find(handle) != mTextureMap.end())
126 {
127 handle++;
128 }
129
130 mTextureMap[handle] = NULL;
131
132 return handle;
133}
134
135// Returns an unused renderbuffer name
136GLuint ResourceManager::createRenderbuffer()
137{
138 unsigned int handle = 1;
139
140 while (mRenderbufferMap.find(handle) != mRenderbufferMap.end())
141 {
142 handle++;
143 }
144
145 mRenderbufferMap[handle] = NULL;
146
147 return handle;
148}
149
apatrick@chromium.org55255022010-09-11 02:12:47 +0000150// Returns an unused framebuffer name
151GLuint ResourceManager::createFramebuffer()
152{
153 unsigned int handle = 1;
154
155 while (mFramebufferMap.find(handle) != mFramebufferMap.end())
156 {
157 handle++;
158 }
159
160 mFramebufferMap[handle] = NULL;
161
162 return handle;
163}
164
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000165void ResourceManager::deleteBuffer(GLuint buffer)
166{
167 BufferMap::iterator bufferObject = mBufferMap.find(buffer);
168
169 if (bufferObject != mBufferMap.end())
170 {
apatrick@chromium.org55255022010-09-11 02:12:47 +0000171 if (bufferObject->second)
172 {
173 bufferObject->second->markAsDeleted();
174 bufferObject->second->release();
175 }
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000176 mBufferMap.erase(bufferObject);
177 }
178}
179
180void ResourceManager::deleteShader(GLuint shader)
181{
182 ShaderMap::iterator shaderObject = mShaderMap.find(shader);
183
184 if (shaderObject != mShaderMap.end())
185 {
186 if (shaderObject->second->getRefCount() == 0)
187 {
188 delete shaderObject->second;
189 mShaderMap.erase(shaderObject);
190 }
191 else
192 {
193 shaderObject->second->flagForDeletion();
194 }
195 }
196}
197
198void ResourceManager::deleteProgram(GLuint program)
199{
200 ProgramMap::iterator programObject = mProgramMap.find(program);
201
202 if (programObject != mProgramMap.end())
203 {
204 if (programObject->second->getRefCount() == 0)
205 {
206 delete programObject->second;
207 mProgramMap.erase(programObject);
208 }
209 else
210 {
211 programObject->second->flagForDeletion();
212 }
213 }
214}
215
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000216void ResourceManager::deleteTexture(GLuint texture)
217{
218 TextureMap::iterator textureObject = mTextureMap.find(texture);
219
220 if (textureObject != mTextureMap.end())
221 {
apatrick@chromium.org55255022010-09-11 02:12:47 +0000222 if (textureObject->second)
223 {
224 textureObject->second->markAsDeleted();
225 textureObject->second->release();
226 }
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000227 mTextureMap.erase(textureObject);
228 }
229}
230
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000231void ResourceManager::deleteRenderbuffer(GLuint renderbuffer)
232{
233 RenderbufferMap::iterator renderbufferObject = mRenderbufferMap.find(renderbuffer);
234
235 if (renderbufferObject != mRenderbufferMap.end())
236 {
apatrick@chromium.org55255022010-09-11 02:12:47 +0000237 if (renderbufferObject->second)
238 {
239 renderbufferObject->second->markAsDeleted();
240 renderbufferObject->second->release();
241 }
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000242 mRenderbufferMap.erase(renderbufferObject);
243 }
244}
245
apatrick@chromium.org55255022010-09-11 02:12:47 +0000246void ResourceManager::deleteFramebuffer(GLuint framebuffer)
247{
248 FramebufferMap::iterator framebufferObject = mFramebufferMap.find(framebuffer);
249
250 if (framebufferObject != mFramebufferMap.end())
251 {
252 if (framebufferObject->second)
253 {
254 framebufferObject->second->markAsDeleted();
255 framebufferObject->second->release();
256 }
257 mFramebufferMap.erase(framebufferObject);
258 }
259}
260
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000261Buffer *ResourceManager::getBuffer(unsigned int handle)
262{
263 BufferMap::iterator buffer = mBufferMap.find(handle);
264
265 if (buffer == mBufferMap.end())
266 {
267 return NULL;
268 }
269 else
270 {
271 return buffer->second;
272 }
273}
274
275Shader *ResourceManager::getShader(unsigned int handle)
276{
277 ShaderMap::iterator shader = mShaderMap.find(handle);
278
279 if (shader == mShaderMap.end())
280 {
281 return NULL;
282 }
283 else
284 {
285 return shader->second;
286 }
287}
288
289Texture *ResourceManager::getTexture(unsigned int handle)
290{
291 if (handle == 0) return NULL;
292
293 TextureMap::iterator texture = mTextureMap.find(handle);
294
295 if (texture == mTextureMap.end())
296 {
297 return NULL;
298 }
299 else
300 {
301 return texture->second;
302 }
303}
304
305Program *ResourceManager::getProgram(unsigned int handle)
306{
307 ProgramMap::iterator program = mProgramMap.find(handle);
308
309 if (program == mProgramMap.end())
310 {
311 return NULL;
312 }
313 else
314 {
315 return program->second;
316 }
317}
318
319Renderbuffer *ResourceManager::getRenderbuffer(unsigned int handle)
320{
321 RenderbufferMap::iterator renderbuffer = mRenderbufferMap.find(handle);
322
323 if (renderbuffer == mRenderbufferMap.end())
324 {
325 return NULL;
326 }
327 else
328 {
329 return renderbuffer->second;
330 }
331}
332
apatrick@chromium.org55255022010-09-11 02:12:47 +0000333Framebuffer *ResourceManager::getFramebuffer(unsigned int handle)
334{
335 FramebufferMap::iterator framebuffer = mFramebufferMap.find(handle);
336
337 if (framebuffer == mFramebufferMap.end())
338 {
339 return NULL;
340 }
341 else
342 {
343 return framebuffer->second;
344 }
345}
346
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000347void ResourceManager::setRenderbuffer(GLuint handle, Renderbuffer *buffer)
348{
349 mRenderbufferMap[handle] = buffer;
350}
351
352void ResourceManager::checkBufferAllocation(unsigned int buffer)
353{
354 if (buffer != 0 && !getBuffer(buffer))
355 {
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000356 Buffer *bufferObject = new Buffer(buffer);
357 mBufferMap[buffer] = bufferObject;
358 bufferObject->addRef();
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000359 }
360}
361
362void ResourceManager::checkTextureAllocation(GLuint texture, SamplerType type)
363{
364 if (!getTexture(texture) && texture != 0)
365 {
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000366 Texture *textureObject;
367
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000368 if (type == SAMPLER_2D)
369 {
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000370 textureObject = new Texture2D(texture);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000371 }
372 else if (type == SAMPLER_CUBE)
373 {
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000374 textureObject = new TextureCubeMap(texture);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000375 }
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000376 else
377 {
378 UNREACHABLE();
379 return;
380 }
381
382 mTextureMap[texture] = textureObject;
383 textureObject->addRef();
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000384 }
385}
386
387void ResourceManager::checkRenderbufferAllocation(GLuint renderbuffer)
388{
389 if (renderbuffer != 0 && !getRenderbuffer(renderbuffer))
390 {
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000391 Renderbuffer *renderbufferObject = new Renderbuffer(renderbuffer, new Colorbuffer(0, 0, GL_RGBA4, 0));
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000392 mRenderbufferMap[renderbuffer] = renderbufferObject;
393 renderbufferObject->addRef();
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000394 }
395}
396
apatrick@chromium.org55255022010-09-11 02:12:47 +0000397void ResourceManager::checkFramebufferAllocation(GLuint framebuffer)
398{
399 if (framebuffer != 0 && !getFramebuffer(framebuffer))
400 {
401 Framebuffer *framebufferObject = new Framebuffer(framebuffer);
402 mFramebufferMap[framebuffer] = framebufferObject;
403 framebufferObject->addRef();
404 }
405}
406
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000407}