blob: 7f963874a095a9256e7135a207ae66b2e67c9cfb [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{
benvanik@google.com1a233342011-04-28 19:44:39 +0000100 GLuint handle = mProgramShaderHandleAllocator.allocate();
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000101
Brandon Jones71620962014-08-20 14:04:59 -0700102 if (type == GL_VERTEX_SHADER || type == GL_FRAGMENT_SHADER)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000103 {
Jamie Madill901b3792016-05-26 09:20:40 -0400104 mShaderMap[handle] = new Shader(this, factory, rendererLimitations, type, handle);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000105 }
106 else UNREACHABLE();
107
108 return handle;
109}
110
111// Returns an unused program/shader name
Jamie Madill901b3792016-05-26 09:20:40 -0400112GLuint ResourceManager::createProgram(rx::GLImplFactory *factory)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000113{
benvanik@google.com1a233342011-04-28 19:44:39 +0000114 GLuint handle = mProgramShaderHandleAllocator.allocate();
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000115
Jamie Madill901b3792016-05-26 09:20:40 -0400116 mProgramMap[handle] = new Program(factory, this, handle);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000117
118 return handle;
119}
120
121// Returns an unused texture name
122GLuint ResourceManager::createTexture()
123{
benvanik@google.com1a233342011-04-28 19:44:39 +0000124 GLuint handle = mTextureHandleAllocator.allocate();
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000125
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500126 mTextureMap[handle] = nullptr;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000127
128 return handle;
129}
130
131// Returns an unused renderbuffer name
132GLuint ResourceManager::createRenderbuffer()
133{
benvanik@google.com1a233342011-04-28 19:44:39 +0000134 GLuint handle = mRenderbufferHandleAllocator.allocate();
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000135
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500136 mRenderbufferMap[handle] = nullptr;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000137
138 return handle;
139}
140
Jamie Madilldc356042013-07-19 16:36:57 -0400141// Returns an unused sampler name
142GLuint ResourceManager::createSampler()
143{
144 GLuint handle = mSamplerHandleAllocator.allocate();
145
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500146 mSamplerMap[handle] = nullptr;
Jamie Madilldc356042013-07-19 16:36:57 -0400147
148 return handle;
149}
150
Jamie Madillcd055f82013-07-26 11:55:15 -0400151// Returns the next unused fence name, and allocates the fence
Jamie Madill901b3792016-05-26 09:20:40 -0400152GLuint ResourceManager::createFenceSync(rx::GLImplFactory *factory)
Jamie Madillcd055f82013-07-26 11:55:15 -0400153{
154 GLuint handle = mFenceSyncHandleAllocator.allocate();
155
Jamie Madill901b3792016-05-26 09:20:40 -0400156 FenceSync *fenceSync = new FenceSync(factory->createFenceSync(), handle);
Jamie Madillcfa33e62014-08-19 15:30:41 -0400157 fenceSync->addRef();
158 mFenceSyncMap[handle] = fenceSync;
Jamie Madillcd055f82013-07-26 11:55:15 -0400159
160 return handle;
161}
162
Sami Väisänene45e53b2016-05-25 10:36:04 +0300163ErrorOrResult<GLuint> ResourceManager::createPaths(rx::GLImplFactory *factory, GLsizei range)
164{
165 // Allocate client side handles.
166 const GLuint client = mPathHandleAllocator.allocateRange(static_cast<GLuint>(range));
167 if (client == HandleRangeAllocator::kInvalidHandle)
168 return gl::Error(GL_OUT_OF_MEMORY, "Failed to allocate path handle range.");
169
170 const auto &paths = factory->createPaths(range);
171 if (paths.empty())
172 {
173 mPathHandleAllocator.releaseRange(client, range);
174 return gl::Error(GL_OUT_OF_MEMORY, "Failed to allocate path objects.");
175 }
176
177 auto hint = mPathMap.begin();
178
179 for (GLsizei i = 0; i < range; ++i)
180 {
181 const auto impl = paths[static_cast<unsigned>(i)];
182 const auto id = client + i;
183 hint = mPathMap.insert(hint, std::make_pair(id, new Path(impl)));
184 }
185 return client;
186}
187
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000188void ResourceManager::deleteBuffer(GLuint buffer)
189{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500190 auto bufferObject = mBufferMap.find(buffer);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000191
192 if (bufferObject != mBufferMap.end())
193 {
benvanik@google.com1a233342011-04-28 19:44:39 +0000194 mBufferHandleAllocator.release(bufferObject->first);
apatrick@chromium.orgff8bdfb2010-09-15 17:27:49 +0000195 if (bufferObject->second) bufferObject->second->release();
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000196 mBufferMap.erase(bufferObject);
197 }
198}
199
200void ResourceManager::deleteShader(GLuint shader)
201{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500202 auto shaderObject = mShaderMap.find(shader);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000203
204 if (shaderObject != mShaderMap.end())
205 {
206 if (shaderObject->second->getRefCount() == 0)
207 {
benvanik@google.com1a233342011-04-28 19:44:39 +0000208 mProgramShaderHandleAllocator.release(shaderObject->first);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000209 delete shaderObject->second;
210 mShaderMap.erase(shaderObject);
211 }
212 else
213 {
214 shaderObject->second->flagForDeletion();
215 }
216 }
217}
218
219void ResourceManager::deleteProgram(GLuint program)
220{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500221 auto programObject = mProgramMap.find(program);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000222
223 if (programObject != mProgramMap.end())
224 {
225 if (programObject->second->getRefCount() == 0)
226 {
benvanik@google.com1a233342011-04-28 19:44:39 +0000227 mProgramShaderHandleAllocator.release(programObject->first);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000228 delete programObject->second;
229 mProgramMap.erase(programObject);
230 }
231 else
Sami Väisänene45e53b2016-05-25 10:36:04 +0300232 {
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000233 programObject->second->flagForDeletion();
234 }
235 }
236}
237
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000238void ResourceManager::deleteTexture(GLuint texture)
239{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500240 auto textureObject = mTextureMap.find(texture);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000241
242 if (textureObject != mTextureMap.end())
243 {
benvanik@google.com1a233342011-04-28 19:44:39 +0000244 mTextureHandleAllocator.release(textureObject->first);
apatrick@chromium.orgff8bdfb2010-09-15 17:27:49 +0000245 if (textureObject->second) textureObject->second->release();
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000246 mTextureMap.erase(textureObject);
247 }
248}
249
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000250void ResourceManager::deleteRenderbuffer(GLuint renderbuffer)
251{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500252 auto renderbufferObject = mRenderbufferMap.find(renderbuffer);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000253
254 if (renderbufferObject != mRenderbufferMap.end())
255 {
benvanik@google.com1a233342011-04-28 19:44:39 +0000256 mRenderbufferHandleAllocator.release(renderbufferObject->first);
apatrick@chromium.orgff8bdfb2010-09-15 17:27:49 +0000257 if (renderbufferObject->second) renderbufferObject->second->release();
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000258 mRenderbufferMap.erase(renderbufferObject);
259 }
260}
261
Jamie Madilldc356042013-07-19 16:36:57 -0400262void ResourceManager::deleteSampler(GLuint sampler)
263{
264 auto samplerObject = mSamplerMap.find(sampler);
265
266 if (samplerObject != mSamplerMap.end())
267 {
Geoff Lang79931902014-02-03 14:29:42 -0500268 mSamplerHandleAllocator.release(samplerObject->first);
Jamie Madilldc356042013-07-19 16:36:57 -0400269 if (samplerObject->second) samplerObject->second->release();
270 mSamplerMap.erase(samplerObject);
271 }
272}
273
Jamie Madillcd055f82013-07-26 11:55:15 -0400274void ResourceManager::deleteFenceSync(GLuint fenceSync)
275{
276 auto fenceObjectIt = mFenceSyncMap.find(fenceSync);
277
278 if (fenceObjectIt != mFenceSyncMap.end())
279 {
280 mFenceSyncHandleAllocator.release(fenceObjectIt->first);
281 if (fenceObjectIt->second) fenceObjectIt->second->release();
282 mFenceSyncMap.erase(fenceObjectIt);
283 }
284}
285
Sami Väisänene45e53b2016-05-25 10:36:04 +0300286void ResourceManager::deletePaths(GLuint first, GLsizei range)
287{
288 for (GLsizei i = 0; i < range; ++i)
289 {
290 const auto id = first + i;
291 const auto it = mPathMap.find(id);
292 if (it == mPathMap.end())
293 continue;
294 Path *p = it->second;
295 delete p;
296 mPathMap.erase(it);
297 }
298 mPathHandleAllocator.releaseRange(first, static_cast<GLuint>(range));
299}
300
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000301Buffer *ResourceManager::getBuffer(unsigned int handle)
302{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500303 auto buffer = mBufferMap.find(handle);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000304
305 if (buffer == mBufferMap.end())
306 {
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500307 return nullptr;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000308 }
309 else
310 {
311 return buffer->second;
312 }
313}
314
315Shader *ResourceManager::getShader(unsigned int handle)
316{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500317 auto shader = mShaderMap.find(handle);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000318
319 if (shader == mShaderMap.end())
320 {
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500321 return nullptr;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000322 }
323 else
324 {
325 return shader->second;
326 }
327}
328
329Texture *ResourceManager::getTexture(unsigned int handle)
330{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500331 if (handle == 0)
332 return nullptr;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000333
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500334 auto texture = mTextureMap.find(handle);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000335
336 if (texture == mTextureMap.end())
337 {
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500338 return nullptr;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000339 }
340 else
341 {
342 return texture->second;
343 }
344}
345
Jamie Madilld9e58302014-11-06 15:27:26 -0500346Program *ResourceManager::getProgram(unsigned int handle) const
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000347{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500348 auto program = mProgramMap.find(handle);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000349
350 if (program == mProgramMap.end())
351 {
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500352 return nullptr;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000353 }
354 else
355 {
356 return program->second;
357 }
358}
359
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400360Renderbuffer *ResourceManager::getRenderbuffer(unsigned int handle)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000361{
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500362 auto renderbuffer = mRenderbufferMap.find(handle);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000363
364 if (renderbuffer == mRenderbufferMap.end())
365 {
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500366 return nullptr;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000367 }
368 else
369 {
370 return renderbuffer->second;
371 }
372}
373
Jamie Madilldc356042013-07-19 16:36:57 -0400374Sampler *ResourceManager::getSampler(unsigned int handle)
375{
376 auto sampler = mSamplerMap.find(handle);
377
378 if (sampler == mSamplerMap.end())
379 {
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500380 return nullptr;
Jamie Madilldc356042013-07-19 16:36:57 -0400381 }
382 else
383 {
384 return sampler->second;
385 }
386}
387
Jamie Madillcd055f82013-07-26 11:55:15 -0400388FenceSync *ResourceManager::getFenceSync(unsigned int handle)
389{
390 auto fenceObjectIt = mFenceSyncMap.find(handle);
391
392 if (fenceObjectIt == mFenceSyncMap.end())
393 {
Jamie Madill4e25a0d2016-03-08 13:53:03 -0500394 return nullptr;
Jamie Madillcd055f82013-07-26 11:55:15 -0400395 }
396 else
397 {
398 return fenceObjectIt->second;
399 }
400}
401
Sami Väisänene45e53b2016-05-25 10:36:04 +0300402const Path *ResourceManager::getPath(GLuint handle) const
403{
404 auto it = mPathMap.find(handle);
405 if (it == std::end(mPathMap))
406 return nullptr;
407 return it->second;
408}
409
410Path *ResourceManager::getPath(GLuint handle)
411{
412 auto it = mPathMap.find(handle);
413 if (it == std::end(mPathMap))
414 return nullptr;
415
416 return it->second;
417}
418
419bool ResourceManager::hasPath(GLuint handle) const
420{
421 return mPathHandleAllocator.isUsed(handle);
422}
423
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400424void ResourceManager::setRenderbuffer(GLuint handle, Renderbuffer *buffer)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000425{
426 mRenderbufferMap[handle] = buffer;
427}
428
Jamie Madill901b3792016-05-26 09:20:40 -0400429Buffer *ResourceManager::checkBufferAllocation(rx::GLImplFactory *factory, GLuint handle)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000430{
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500431 if (handle == 0)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000432 {
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500433 return nullptr;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000434 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500435
436 auto bufferMapIt = mBufferMap.find(handle);
437 bool handleAllocated = (bufferMapIt != mBufferMap.end());
438
439 if (handleAllocated && bufferMapIt->second != nullptr)
440 {
441 return bufferMapIt->second;
442 }
443
Jamie Madill901b3792016-05-26 09:20:40 -0400444 Buffer *buffer = new Buffer(factory->createBuffer(), handle);
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500445 buffer->addRef();
446
447 if (handleAllocated)
448 {
449 bufferMapIt->second = buffer;
450 }
451 else
452 {
453 mBufferHandleAllocator.reserve(handle);
454 mBufferMap[handle] = buffer;
455 }
456
457 return buffer;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000458}
459
Jamie Madill901b3792016-05-26 09:20:40 -0400460Texture *ResourceManager::checkTextureAllocation(rx::GLImplFactory *factory,
461 GLuint handle,
462 GLenum type)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000463{
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500464 if (handle == 0)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000465 {
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500466 return nullptr;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000467 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500468
469 auto textureMapIt = mTextureMap.find(handle);
470 bool handleAllocated = (textureMapIt != mTextureMap.end());
471
472 if (handleAllocated && textureMapIt->second != nullptr)
473 {
474 return textureMapIt->second;
475 }
476
Jamie Madill901b3792016-05-26 09:20:40 -0400477 Texture *texture = new Texture(factory, handle, type);
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500478 texture->addRef();
479
480 if (handleAllocated)
481 {
482 textureMapIt->second = texture;
483 }
484 else
485 {
486 mTextureHandleAllocator.reserve(handle);
487 mTextureMap[handle] = texture;
488 }
489
490 return texture;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000491}
492
Jamie Madill901b3792016-05-26 09:20:40 -0400493Renderbuffer *ResourceManager::checkRenderbufferAllocation(rx::GLImplFactory *factory,
494 GLuint handle)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000495{
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500496 if (handle == 0)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000497 {
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500498 return nullptr;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000499 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500500
501 auto renderbufferMapIt = mRenderbufferMap.find(handle);
502 bool handleAllocated = (renderbufferMapIt != mRenderbufferMap.end());
503
504 if (handleAllocated && renderbufferMapIt->second != nullptr)
505 {
506 return renderbufferMapIt->second;
507 }
508
Jamie Madill901b3792016-05-26 09:20:40 -0400509 Renderbuffer *renderbuffer = new Renderbuffer(factory->createRenderbuffer(), handle);
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500510 renderbuffer->addRef();
511
512 if (handleAllocated)
513 {
514 renderbufferMapIt->second = renderbuffer;
515 }
516 else
517 {
518 mRenderbufferHandleAllocator.reserve(handle);
519 mRenderbufferMap[handle] = renderbuffer;
520 }
521
522 return renderbuffer;
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000523}
524
Jamie Madill901b3792016-05-26 09:20:40 -0400525Sampler *ResourceManager::checkSamplerAllocation(rx::GLImplFactory *factory, GLuint samplerHandle)
Jamie Madilldc356042013-07-19 16:36:57 -0400526{
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500527 // Samplers cannot be created via Bind
528 if (samplerHandle == 0)
Jamie Madilldc356042013-07-19 16:36:57 -0400529 {
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500530 return nullptr;
Jamie Madilldc356042013-07-19 16:36:57 -0400531 }
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500532
533 Sampler *sampler = getSampler(samplerHandle);
534
535 if (!sampler)
536 {
Jamie Madill901b3792016-05-26 09:20:40 -0400537 sampler = new Sampler(factory, samplerHandle);
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500538 mSamplerMap[samplerHandle] = sampler;
539 sampler->addRef();
540 }
541
542 return sampler;
Jamie Madilldc356042013-07-19 16:36:57 -0400543}
544
545bool ResourceManager::isSampler(GLuint sampler)
546{
547 return mSamplerMap.find(sampler) != mSamplerMap.end();
548}
549
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500550} // namespace gl