blob: d3dc1023cc51a538c3e37a5a984a05715ad7d745 [file] [log] [blame]
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +00001//
Jamie Madilldc356042013-07-19 16:36:57 -04002// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
Sami Väisänene45e53b2016-05-25 10:36:04 +03007// ResourceManager.cpp: Implements the gl::ResourceManager class, which tracks and
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +00008// retrieves objects which may be shared by multiple Contexts.
9
Geoff Lang2b5420c2014-11-19 14:20:15 -050010#include "libANGLE/ResourceManager.h"
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000011
Geoff Lang2b5420c2014-11-19 14:20:15 -050012#include "libANGLE/Buffer.h"
Jamie Madill53ea9cc2016-05-17 10:12:52 -040013#include "libANGLE/Fence.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030014#include "libANGLE/Path.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050015#include "libANGLE/Program.h"
16#include "libANGLE/Renderbuffer.h"
Jamie Madill53ea9cc2016-05-17 10:12:52 -040017#include "libANGLE/Sampler.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050018#include "libANGLE/Shader.h"
19#include "libANGLE/Texture.h"
Jamie Madill53ea9cc2016-05-17 10:12:52 -040020#include "libANGLE/renderer/GLImplFactory.h"
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000021
22namespace gl
23{
Jamie Madill901b3792016-05-26 09:20:40 -040024ResourceManager::ResourceManager() : mRefCount(1)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000025{
26}
27
28ResourceManager::~ResourceManager()
29{
30 while (!mBufferMap.empty())
31 {
32 deleteBuffer(mBufferMap.begin()->first);
33 }
34
35 while (!mProgramMap.empty())
36 {
37 deleteProgram(mProgramMap.begin()->first);
38 }
39
40 while (!mShaderMap.empty())
41 {
42 deleteShader(mShaderMap.begin()->first);
43 }
44
45 while (!mRenderbufferMap.empty())
46 {
47 deleteRenderbuffer(mRenderbufferMap.begin()->first);
48 }
49
50 while (!mTextureMap.empty())
51 {
52 deleteTexture(mTextureMap.begin()->first);
53 }
Jamie Madilldc356042013-07-19 16:36:57 -040054
55 while (!mSamplerMap.empty())
56 {
57 deleteSampler(mSamplerMap.begin()->first);
58 }
Jamie Madillcd055f82013-07-26 11:55:15 -040059
60 while (!mFenceSyncMap.empty())
61 {
62 deleteFenceSync(mFenceSyncMap.begin()->first);
63 }
Sami Väisänene45e53b2016-05-25 10:36:04 +030064
65 for (auto it = mPathMap.begin(); it != mPathMap.end(); ++it)
66 {
67 const auto *p = it->second;
68 delete p;
69 }
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000070}
71
daniel@transgaming.com0d25b002010-07-28 19:21:07 +000072void ResourceManager::addRef()
73{
74 mRefCount++;
75}
76
77void ResourceManager::release()
78{
79 if (--mRefCount == 0)
80 {
81 delete this;
82 }
83}
84
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000085// Returns an unused buffer name
86GLuint ResourceManager::createBuffer()
87{
benvanik@google.com1a233342011-04-28 19:44:39 +000088 GLuint handle = mBufferHandleAllocator.allocate();
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000089
Jamie Madill4e25a0d2016-03-08 13:53:03 -050090 mBufferMap[handle] = nullptr;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000091
92 return handle;
93}
94
95// Returns an unused shader/program name
Jamie Madill901b3792016-05-26 09:20:40 -040096GLuint ResourceManager::createShader(rx::GLImplFactory *factory,
97 const gl::Limitations &rendererLimitations,
98 GLenum type)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000099{
Martin Radev4c4c8e72016-08-04 12:25:34 +0300100 ASSERT(type == GL_VERTEX_SHADER || type == GL_FRAGMENT_SHADER || type == GL_COMPUTE_SHADER);
benvanik@google.com1a233342011-04-28 19:44:39 +0000101 GLuint handle = mProgramShaderHandleAllocator.allocate();
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000102
Martin Radev4c4c8e72016-08-04 12:25:34 +0300103 mShaderMap[handle] = new Shader(this, factory, rendererLimitations, type, handle);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000104
105 return handle;
106}
107
108// Returns an unused program/shader name
Jamie Madill901b3792016-05-26 09:20:40 -0400109GLuint ResourceManager::createProgram(rx::GLImplFactory *factory)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000110{
benvanik@google.com1a233342011-04-28 19:44:39 +0000111 GLuint handle = mProgramShaderHandleAllocator.allocate();
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000112
Jamie Madill901b3792016-05-26 09:20:40 -0400113 mProgramMap[handle] = new Program(factory, this, handle);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000114
115 return handle;
116}
117
118// Returns an unused texture name
119GLuint ResourceManager::createTexture()
120{
benvanik@google.com1a233342011-04-28 19:44:39 +0000121 GLuint handle = mTextureHandleAllocator.allocate();
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000122
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500123 mTextureMap[handle] = nullptr;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000124
125 return handle;
126}
127
128// Returns an unused renderbuffer name
129GLuint ResourceManager::createRenderbuffer()
130{
benvanik@google.com1a233342011-04-28 19:44:39 +0000131 GLuint handle = mRenderbufferHandleAllocator.allocate();
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000132
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500133 mRenderbufferMap[handle] = nullptr;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000134
135 return handle;
136}
137
Jamie Madilldc356042013-07-19 16:36:57 -0400138// Returns an unused sampler name
139GLuint ResourceManager::createSampler()
140{
141 GLuint handle = mSamplerHandleAllocator.allocate();
142
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500143 mSamplerMap[handle] = nullptr;
Jamie Madilldc356042013-07-19 16:36:57 -0400144
145 return handle;
146}
147
Jamie Madillcd055f82013-07-26 11:55:15 -0400148// Returns the next unused fence name, and allocates the fence
Jamie Madill901b3792016-05-26 09:20:40 -0400149GLuint ResourceManager::createFenceSync(rx::GLImplFactory *factory)
Jamie Madillcd055f82013-07-26 11:55:15 -0400150{
151 GLuint handle = mFenceSyncHandleAllocator.allocate();
152
Jamie Madill901b3792016-05-26 09:20:40 -0400153 FenceSync *fenceSync = new FenceSync(factory->createFenceSync(), handle);
Jamie Madillcfa33e62014-08-19 15:30:41 -0400154 fenceSync->addRef();
155 mFenceSyncMap[handle] = fenceSync;
Jamie Madillcd055f82013-07-26 11:55:15 -0400156
157 return handle;
158}
159
Sami Väisänene45e53b2016-05-25 10:36:04 +0300160ErrorOrResult<GLuint> ResourceManager::createPaths(rx::GLImplFactory *factory, GLsizei range)
161{
162 // Allocate client side handles.
163 const GLuint client = mPathHandleAllocator.allocateRange(static_cast<GLuint>(range));
164 if (client == HandleRangeAllocator::kInvalidHandle)
165 return gl::Error(GL_OUT_OF_MEMORY, "Failed to allocate path handle range.");
166
167 const auto &paths = factory->createPaths(range);
168 if (paths.empty())
169 {
170 mPathHandleAllocator.releaseRange(client, range);
171 return gl::Error(GL_OUT_OF_MEMORY, "Failed to allocate path objects.");
172 }
173
174 auto hint = mPathMap.begin();
175
176 for (GLsizei i = 0; i < range; ++i)
177 {
178 const auto impl = paths[static_cast<unsigned>(i)];
179 const auto id = client + i;
180 hint = mPathMap.insert(hint, std::make_pair(id, new Path(impl)));
181 }
182 return client;
183}
184
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000185void ResourceManager::deleteBuffer(GLuint buffer)
186{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500187 auto bufferObject = mBufferMap.find(buffer);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000188
189 if (bufferObject != mBufferMap.end())
190 {
benvanik@google.com1a233342011-04-28 19:44:39 +0000191 mBufferHandleAllocator.release(bufferObject->first);
apatrick@chromium.orgff8bdfb2010-09-15 17:27:49 +0000192 if (bufferObject->second) bufferObject->second->release();
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000193 mBufferMap.erase(bufferObject);
194 }
195}
196
197void ResourceManager::deleteShader(GLuint shader)
198{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500199 auto shaderObject = mShaderMap.find(shader);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000200
201 if (shaderObject != mShaderMap.end())
202 {
203 if (shaderObject->second->getRefCount() == 0)
204 {
benvanik@google.com1a233342011-04-28 19:44:39 +0000205 mProgramShaderHandleAllocator.release(shaderObject->first);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000206 delete shaderObject->second;
207 mShaderMap.erase(shaderObject);
208 }
209 else
210 {
211 shaderObject->second->flagForDeletion();
212 }
213 }
214}
215
216void ResourceManager::deleteProgram(GLuint program)
217{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500218 auto programObject = mProgramMap.find(program);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000219
220 if (programObject != mProgramMap.end())
221 {
222 if (programObject->second->getRefCount() == 0)
223 {
benvanik@google.com1a233342011-04-28 19:44:39 +0000224 mProgramShaderHandleAllocator.release(programObject->first);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000225 delete programObject->second;
226 mProgramMap.erase(programObject);
227 }
228 else
Sami Väisänene45e53b2016-05-25 10:36:04 +0300229 {
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000230 programObject->second->flagForDeletion();
231 }
232 }
233}
234
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000235void ResourceManager::deleteTexture(GLuint texture)
236{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500237 auto textureObject = mTextureMap.find(texture);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000238
239 if (textureObject != mTextureMap.end())
240 {
benvanik@google.com1a233342011-04-28 19:44:39 +0000241 mTextureHandleAllocator.release(textureObject->first);
apatrick@chromium.orgff8bdfb2010-09-15 17:27:49 +0000242 if (textureObject->second) textureObject->second->release();
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000243 mTextureMap.erase(textureObject);
244 }
245}
246
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000247void ResourceManager::deleteRenderbuffer(GLuint renderbuffer)
248{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500249 auto renderbufferObject = mRenderbufferMap.find(renderbuffer);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000250
251 if (renderbufferObject != mRenderbufferMap.end())
252 {
benvanik@google.com1a233342011-04-28 19:44:39 +0000253 mRenderbufferHandleAllocator.release(renderbufferObject->first);
apatrick@chromium.orgff8bdfb2010-09-15 17:27:49 +0000254 if (renderbufferObject->second) renderbufferObject->second->release();
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000255 mRenderbufferMap.erase(renderbufferObject);
256 }
257}
258
Jamie Madilldc356042013-07-19 16:36:57 -0400259void ResourceManager::deleteSampler(GLuint sampler)
260{
261 auto samplerObject = mSamplerMap.find(sampler);
262
263 if (samplerObject != mSamplerMap.end())
264 {
Geoff Lang79931902014-02-03 14:29:42 -0500265 mSamplerHandleAllocator.release(samplerObject->first);
Jamie Madilldc356042013-07-19 16:36:57 -0400266 if (samplerObject->second) samplerObject->second->release();
267 mSamplerMap.erase(samplerObject);
268 }
269}
270
Jamie Madillcd055f82013-07-26 11:55:15 -0400271void ResourceManager::deleteFenceSync(GLuint fenceSync)
272{
273 auto fenceObjectIt = mFenceSyncMap.find(fenceSync);
274
275 if (fenceObjectIt != mFenceSyncMap.end())
276 {
277 mFenceSyncHandleAllocator.release(fenceObjectIt->first);
278 if (fenceObjectIt->second) fenceObjectIt->second->release();
279 mFenceSyncMap.erase(fenceObjectIt);
280 }
281}
282
Sami Väisänene45e53b2016-05-25 10:36:04 +0300283void ResourceManager::deletePaths(GLuint first, GLsizei range)
284{
285 for (GLsizei i = 0; i < range; ++i)
286 {
287 const auto id = first + i;
288 const auto it = mPathMap.find(id);
289 if (it == mPathMap.end())
290 continue;
291 Path *p = it->second;
292 delete p;
293 mPathMap.erase(it);
294 }
295 mPathHandleAllocator.releaseRange(first, static_cast<GLuint>(range));
296}
297
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000298Buffer *ResourceManager::getBuffer(unsigned int handle)
299{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500300 auto buffer = mBufferMap.find(handle);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000301
302 if (buffer == mBufferMap.end())
303 {
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500304 return nullptr;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000305 }
306 else
307 {
308 return buffer->second;
309 }
310}
311
Jamie Madillef300b12016-10-07 15:12:09 -0400312Shader *ResourceManager::getShader(unsigned int handle) const
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000313{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500314 auto shader = mShaderMap.find(handle);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000315
316 if (shader == mShaderMap.end())
317 {
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500318 return nullptr;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000319 }
320 else
321 {
322 return shader->second;
323 }
324}
325
326Texture *ResourceManager::getTexture(unsigned int handle)
327{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500328 if (handle == 0)
329 return nullptr;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000330
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500331 auto texture = mTextureMap.find(handle);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000332
333 if (texture == mTextureMap.end())
334 {
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500335 return nullptr;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000336 }
337 else
338 {
339 return texture->second;
340 }
341}
342
Jamie Madilld9e58302014-11-06 15:27:26 -0500343Program *ResourceManager::getProgram(unsigned int handle) const
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000344{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500345 auto program = mProgramMap.find(handle);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000346
347 if (program == mProgramMap.end())
348 {
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500349 return nullptr;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000350 }
351 else
352 {
353 return program->second;
354 }
355}
356
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400357Renderbuffer *ResourceManager::getRenderbuffer(unsigned int handle)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000358{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500359 auto renderbuffer = mRenderbufferMap.find(handle);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000360
361 if (renderbuffer == mRenderbufferMap.end())
362 {
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500363 return nullptr;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000364 }
365 else
366 {
367 return renderbuffer->second;
368 }
369}
370
Jamie Madilldc356042013-07-19 16:36:57 -0400371Sampler *ResourceManager::getSampler(unsigned int handle)
372{
373 auto sampler = mSamplerMap.find(handle);
374
375 if (sampler == mSamplerMap.end())
376 {
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500377 return nullptr;
Jamie Madilldc356042013-07-19 16:36:57 -0400378 }
379 else
380 {
381 return sampler->second;
382 }
383}
384
Jamie Madillcd055f82013-07-26 11:55:15 -0400385FenceSync *ResourceManager::getFenceSync(unsigned int handle)
386{
387 auto fenceObjectIt = mFenceSyncMap.find(handle);
388
389 if (fenceObjectIt == mFenceSyncMap.end())
390 {
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500391 return nullptr;
Jamie Madillcd055f82013-07-26 11:55:15 -0400392 }
393 else
394 {
395 return fenceObjectIt->second;
396 }
397}
398
Sami Väisänene45e53b2016-05-25 10:36:04 +0300399const Path *ResourceManager::getPath(GLuint handle) const
400{
401 auto it = mPathMap.find(handle);
402 if (it == std::end(mPathMap))
403 return nullptr;
404 return it->second;
405}
406
407Path *ResourceManager::getPath(GLuint handle)
408{
409 auto it = mPathMap.find(handle);
410 if (it == std::end(mPathMap))
411 return nullptr;
412
413 return it->second;
414}
415
416bool ResourceManager::hasPath(GLuint handle) const
417{
418 return mPathHandleAllocator.isUsed(handle);
419}
420
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400421void ResourceManager::setRenderbuffer(GLuint handle, Renderbuffer *buffer)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000422{
423 mRenderbufferMap[handle] = buffer;
424}
425
Jamie Madill901b3792016-05-26 09:20:40 -0400426Buffer *ResourceManager::checkBufferAllocation(rx::GLImplFactory *factory, GLuint handle)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000427{
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500428 if (handle == 0)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000429 {
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500430 return nullptr;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000431 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500432
433 auto bufferMapIt = mBufferMap.find(handle);
434 bool handleAllocated = (bufferMapIt != mBufferMap.end());
435
436 if (handleAllocated && bufferMapIt->second != nullptr)
437 {
438 return bufferMapIt->second;
439 }
440
Jamie Madill901b3792016-05-26 09:20:40 -0400441 Buffer *buffer = new Buffer(factory->createBuffer(), handle);
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500442 buffer->addRef();
443
444 if (handleAllocated)
445 {
446 bufferMapIt->second = buffer;
447 }
448 else
449 {
450 mBufferHandleAllocator.reserve(handle);
451 mBufferMap[handle] = buffer;
452 }
453
454 return buffer;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000455}
456
Jamie Madill901b3792016-05-26 09:20:40 -0400457Texture *ResourceManager::checkTextureAllocation(rx::GLImplFactory *factory,
458 GLuint handle,
459 GLenum type)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000460{
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500461 if (handle == 0)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000462 {
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500463 return nullptr;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000464 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500465
466 auto textureMapIt = mTextureMap.find(handle);
467 bool handleAllocated = (textureMapIt != mTextureMap.end());
468
469 if (handleAllocated && textureMapIt->second != nullptr)
470 {
471 return textureMapIt->second;
472 }
473
Jamie Madill901b3792016-05-26 09:20:40 -0400474 Texture *texture = new Texture(factory, handle, type);
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500475 texture->addRef();
476
477 if (handleAllocated)
478 {
479 textureMapIt->second = texture;
480 }
481 else
482 {
483 mTextureHandleAllocator.reserve(handle);
484 mTextureMap[handle] = texture;
485 }
486
487 return texture;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000488}
489
Jamie Madill901b3792016-05-26 09:20:40 -0400490Renderbuffer *ResourceManager::checkRenderbufferAllocation(rx::GLImplFactory *factory,
491 GLuint handle)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000492{
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500493 if (handle == 0)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000494 {
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500495 return nullptr;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000496 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500497
498 auto renderbufferMapIt = mRenderbufferMap.find(handle);
499 bool handleAllocated = (renderbufferMapIt != mRenderbufferMap.end());
500
501 if (handleAllocated && renderbufferMapIt->second != nullptr)
502 {
503 return renderbufferMapIt->second;
504 }
505
Jamie Madill901b3792016-05-26 09:20:40 -0400506 Renderbuffer *renderbuffer = new Renderbuffer(factory->createRenderbuffer(), handle);
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500507 renderbuffer->addRef();
508
509 if (handleAllocated)
510 {
511 renderbufferMapIt->second = renderbuffer;
512 }
513 else
514 {
515 mRenderbufferHandleAllocator.reserve(handle);
516 mRenderbufferMap[handle] = renderbuffer;
517 }
518
519 return renderbuffer;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000520}
521
Jamie Madill901b3792016-05-26 09:20:40 -0400522Sampler *ResourceManager::checkSamplerAllocation(rx::GLImplFactory *factory, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -0400523{
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500524 // Samplers cannot be created via Bind
525 if (samplerHandle == 0)
Jamie Madilldc356042013-07-19 16:36:57 -0400526 {
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500527 return nullptr;
Jamie Madilldc356042013-07-19 16:36:57 -0400528 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500529
530 Sampler *sampler = getSampler(samplerHandle);
531
532 if (!sampler)
533 {
Jamie Madill901b3792016-05-26 09:20:40 -0400534 sampler = new Sampler(factory, samplerHandle);
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500535 mSamplerMap[samplerHandle] = sampler;
536 sampler->addRef();
537 }
538
539 return sampler;
Jamie Madilldc356042013-07-19 16:36:57 -0400540}
541
542bool ResourceManager::isSampler(GLuint sampler)
543{
544 return mSamplerMap.find(sampler) != mSamplerMap.end();
545}
546
Geoff Langf41a7152016-09-19 15:11:17 -0400547bool ResourceManager::isTextureGenerated(GLuint texture) const
548{
549 return texture == 0 || mTextureMap.find(texture) != mTextureMap.end();
550}
551
552bool ResourceManager::isBufferGenerated(GLuint buffer) const
553{
554 return buffer == 0 || mBufferMap.find(buffer) != mBufferMap.end();
555}
556
557bool ResourceManager::isRenderbufferGenerated(GLuint renderbuffer) const
558{
559 return renderbuffer == 0 || mRenderbufferMap.find(renderbuffer) != mRenderbufferMap.end();
560}
561
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500562} // namespace gl