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