blob: 133cfba48371ad6197d8faab6b4b0f67a7574358 [file] [log] [blame]
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +00001//
Geoff Lang4ddf5af2016-12-01 14:30:44 -05002// Copyright (c) 2002-2016 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
Geoff Lang4ddf5af2016-12-01 14:30:44 -05007// ResourceManager.cpp: Implements the the ResourceManager classes, which handle allocation and
8// lifetime of GL objects.
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +00009
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 Madill526392d2018-11-16 09:35:14 -050013#include "libANGLE/Context.h"
Jamie Madill53ea9cc2016-05-17 10:12:52 -040014#include "libANGLE/Fence.h"
Michael Spangfb201c52019-04-03 14:57:35 -040015#include "libANGLE/MemoryObject.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030016#include "libANGLE/Path.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050017#include "libANGLE/Program.h"
Yunchao Hea336b902017-08-02 16:05:21 +080018#include "libANGLE/ProgramPipeline.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050019#include "libANGLE/Renderbuffer.h"
Jamie Madill53ea9cc2016-05-17 10:12:52 -040020#include "libANGLE/Sampler.h"
Michael Spang5093ba62019-05-14 17:36:36 -040021#include "libANGLE/Semaphore.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050022#include "libANGLE/Shader.h"
23#include "libANGLE/Texture.h"
Jamie Madill526392d2018-11-16 09:35:14 -050024#include "libANGLE/renderer/ContextImpl.h"
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000025
26namespace gl
27{
Geoff Lang4ddf5af2016-12-01 14:30:44 -050028
29namespace
30{
31
32template <typename ResourceType>
33GLuint AllocateEmptyObject(HandleAllocator *handleAllocator, ResourceMap<ResourceType> *objectMap)
34{
Jamie Madill96a483b2017-06-27 16:49:21 -040035 GLuint handle = handleAllocator->allocate();
36 objectMap->assign(handle, nullptr);
Geoff Lang4ddf5af2016-12-01 14:30:44 -050037 return handle;
38}
39
Geoff Lang4ddf5af2016-12-01 14:30:44 -050040} // anonymous namespace
41
42template <typename HandleAllocatorType>
43ResourceManagerBase<HandleAllocatorType>::ResourceManagerBase() : mRefCount(1)
Jamie Madillb980c562018-11-27 11:34:27 -050044{}
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000045
Geoff Lang4ddf5af2016-12-01 14:30:44 -050046template <typename HandleAllocatorType>
47void ResourceManagerBase<HandleAllocatorType>::addRef()
daniel@transgaming.com0d25b002010-07-28 19:21:07 +000048{
49 mRefCount++;
50}
51
Geoff Lang4ddf5af2016-12-01 14:30:44 -050052template <typename HandleAllocatorType>
Jamie Madill6c1f6712017-02-14 19:08:04 -050053void ResourceManagerBase<HandleAllocatorType>::release(const Context *context)
daniel@transgaming.com0d25b002010-07-28 19:21:07 +000054{
55 if (--mRefCount == 0)
56 {
Jamie Madill6c1f6712017-02-14 19:08:04 -050057 reset(context);
daniel@transgaming.com0d25b002010-07-28 19:21:07 +000058 delete this;
59 }
60}
61
Jamie Madill5f45e7c2017-02-10 15:23:28 -080062template <typename ResourceType, typename HandleAllocatorType, typename ImplT>
63TypedResourceManager<ResourceType, HandleAllocatorType, ImplT>::~TypedResourceManager()
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000064{
Jamie Madill6c1f6712017-02-14 19:08:04 -050065 ASSERT(mObjectMap.empty());
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000066}
67
Jamie Madill5f45e7c2017-02-10 15:23:28 -080068template <typename ResourceType, typename HandleAllocatorType, typename ImplT>
Jamie Madill6c1f6712017-02-14 19:08:04 -050069void TypedResourceManager<ResourceType, HandleAllocatorType, ImplT>::reset(const Context *context)
70{
Jamie Madill96a483b2017-06-27 16:49:21 -040071 this->mHandleAllocator.reset();
72 for (const auto &resource : mObjectMap)
Jamie Madill6c1f6712017-02-14 19:08:04 -050073 {
Jamie Madill96a483b2017-06-27 16:49:21 -040074 if (resource.second)
75 {
76 ImplT::DeleteObject(context, resource.second);
77 }
Jamie Madill6c1f6712017-02-14 19:08:04 -050078 }
79 mObjectMap.clear();
80}
81
82template <typename ResourceType, typename HandleAllocatorType, typename ImplT>
83void TypedResourceManager<ResourceType, HandleAllocatorType, ImplT>::deleteObject(
84 const Context *context,
85 GLuint handle)
Geoff Lang4ddf5af2016-12-01 14:30:44 -050086{
Jamie Madill96a483b2017-06-27 16:49:21 -040087 ResourceType *resource = nullptr;
88 if (!mObjectMap.erase(handle, &resource))
Jamie Madill5f45e7c2017-02-10 15:23:28 -080089 {
90 return;
91 }
92
Jamie Madill5f45e7c2017-02-10 15:23:28 -080093 // Requires an explicit this-> because of C++ template rules.
Jamie Madill96a483b2017-06-27 16:49:21 -040094 this->mHandleAllocator.release(handle);
Geoff Lang4ddf5af2016-12-01 14:30:44 -050095
Jamie Madill96a483b2017-06-27 16:49:21 -040096 if (resource)
Jamie Madill5f45e7c2017-02-10 15:23:28 -080097 {
Jamie Madill96a483b2017-06-27 16:49:21 -040098 ImplT::DeleteObject(context, resource);
Jamie Madill5f45e7c2017-02-10 15:23:28 -080099 }
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800100}
101
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500102template class ResourceManagerBase<HandleAllocator>;
103template class ResourceManagerBase<HandleRangeAllocator>;
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800104template class TypedResourceManager<Buffer, HandleAllocator, BufferManager>;
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800105template class TypedResourceManager<Texture, HandleAllocator, TextureManager>;
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800106template class TypedResourceManager<Renderbuffer, HandleAllocator, RenderbufferManager>;
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800107template class TypedResourceManager<Sampler, HandleAllocator, SamplerManager>;
Jamie Madill70b5bb02017-08-28 13:32:37 -0400108template class TypedResourceManager<Sync, HandleAllocator, SyncManager>;
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800109template class TypedResourceManager<Framebuffer, HandleAllocator, FramebufferManager>;
Yunchao Hea336b902017-08-02 16:05:21 +0800110template class TypedResourceManager<ProgramPipeline, HandleAllocator, ProgramPipelineManager>;
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800111
112// BufferManager Implementation.
113
114// static
115Buffer *BufferManager::AllocateNewObject(rx::GLImplFactory *factory, GLuint handle)
116{
117 Buffer *buffer = new Buffer(factory, handle);
118 buffer->addRef();
119 return buffer;
120}
121
122// static
Jamie Madill4928b7c2017-06-20 12:57:39 -0400123void BufferManager::DeleteObject(const Context *context, Buffer *buffer)
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800124{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400125 buffer->release(context);
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800126}
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500127
128GLuint BufferManager::createBuffer()
129{
130 return AllocateEmptyObject(&mHandleAllocator, &mObjectMap);
131}
132
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500133Buffer *BufferManager::getBuffer(GLuint handle) const
134{
Jamie Madill96a483b2017-06-27 16:49:21 -0400135 return mObjectMap.query(handle);
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500136}
137
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800138// ShaderProgramManager Implementation.
139
Jamie Madillb980c562018-11-27 11:34:27 -0500140ShaderProgramManager::ShaderProgramManager() {}
Jamie Madillacf2f3a2017-11-21 19:22:44 -0500141
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500142ShaderProgramManager::~ShaderProgramManager()
143{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500144 ASSERT(mPrograms.empty());
145 ASSERT(mShaders.empty());
146}
147
148void ShaderProgramManager::reset(const Context *context)
149{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500150 while (!mPrograms.empty())
151 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500152 deleteProgram(context, mPrograms.begin()->first);
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500153 }
Jamie Madill6c1f6712017-02-14 19:08:04 -0500154 mPrograms.clear();
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500155 while (!mShaders.empty())
156 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500157 deleteShader(context, mShaders.begin()->first);
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500158 }
Jamie Madill6c1f6712017-02-14 19:08:04 -0500159 mShaders.clear();
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500160}
161
162GLuint ShaderProgramManager::createShader(rx::GLImplFactory *factory,
163 const gl::Limitations &rendererLimitations,
Jiawei Shao385b3e02018-03-21 09:43:28 +0800164 ShaderType type)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000165{
Jiawei Shao385b3e02018-03-21 09:43:28 +0800166 ASSERT(type != ShaderType::InvalidEnum);
Jamie Madille4634a12018-11-14 09:54:35 -0500167 GLuint handle = mHandleAllocator.allocate();
Jamie Madill96a483b2017-06-27 16:49:21 -0400168 mShaders.assign(handle, new Shader(this, factory, rendererLimitations, type, handle));
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000169 return handle;
170}
171
Jamie Madill6c1f6712017-02-14 19:08:04 -0500172void ShaderProgramManager::deleteShader(const Context *context, GLuint shader)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000173{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500174 deleteObject(context, &mShaders, shader);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000175}
176
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500177Shader *ShaderProgramManager::getShader(GLuint handle) const
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000178{
Jamie Madill96a483b2017-06-27 16:49:21 -0400179 return mShaders.query(handle);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000180}
181
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500182GLuint ShaderProgramManager::createProgram(rx::GLImplFactory *factory)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000183{
Jamie Madill96a483b2017-06-27 16:49:21 -0400184 GLuint handle = mHandleAllocator.allocate();
185 mPrograms.assign(handle, new Program(factory, this, handle));
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000186 return handle;
187}
188
Jamie Madill6c1f6712017-02-14 19:08:04 -0500189void ShaderProgramManager::deleteProgram(const gl::Context *context, GLuint program)
Jamie Madilldc356042013-07-19 16:36:57 -0400190{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500191 deleteObject(context, &mPrograms, program);
Jamie Madilldc356042013-07-19 16:36:57 -0400192}
193
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500194template <typename ObjectType>
Jamie Madill6c1f6712017-02-14 19:08:04 -0500195void ShaderProgramManager::deleteObject(const Context *context,
196 ResourceMap<ObjectType> *objectMap,
197 GLuint id)
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500198{
Jamie Madill96a483b2017-06-27 16:49:21 -0400199 ObjectType *object = objectMap->query(id);
200 if (!object)
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500201 {
202 return;
203 }
204
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500205 if (object->getRefCount() == 0)
206 {
207 mHandleAllocator.release(id);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400208 object->onDestroy(context);
Jamie Madill96a483b2017-06-27 16:49:21 -0400209 objectMap->erase(id, &object);
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500210 }
211 else
212 {
213 object->flagForDeletion();
214 }
215}
216
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800217// TextureManager Implementation.
218
219// static
Corentin Wallez99d492c2018-02-27 15:17:10 -0500220Texture *TextureManager::AllocateNewObject(rx::GLImplFactory *factory,
221 GLuint handle,
222 TextureType type)
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800223{
Corentin Wallez99d492c2018-02-27 15:17:10 -0500224 Texture *texture = new Texture(factory, handle, type);
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800225 texture->addRef();
226 return texture;
227}
228
229// static
Jamie Madill4928b7c2017-06-20 12:57:39 -0400230void TextureManager::DeleteObject(const Context *context, Texture *texture)
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800231{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400232 texture->release(context);
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800233}
234
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500235GLuint TextureManager::createTexture()
236{
237 return AllocateEmptyObject(&mHandleAllocator, &mObjectMap);
238}
239
Jamie Madill124f78c2019-06-18 11:48:24 -0400240void TextureManager::signalAllTexturesDirty() const
Geoff Lang9aded172017-04-05 11:07:56 -0400241{
Jamie Madill96a483b2017-06-27 16:49:21 -0400242 for (const auto &texture : mObjectMap)
Geoff Lang9aded172017-04-05 11:07:56 -0400243 {
244 if (texture.second)
245 {
Jamie Madill05b35b22017-10-03 09:01:44 -0400246 // We don't know if the Texture needs init, but that's ok, since it will only force
247 // a re-check, and will not initialize the pixels if it's not needed.
Jamie Madill124f78c2019-06-18 11:48:24 -0400248 texture.second->signalDirtyStorage(InitState::MayNeedInit);
Geoff Lang9aded172017-04-05 11:07:56 -0400249 }
250 }
251}
252
Jamie Madillfc3463d2018-01-03 13:46:21 -0500253void TextureManager::enableHandleAllocatorLogging()
254{
255 mHandleAllocator.enableLogging(true);
256}
257
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800258// RenderbufferManager Implementation.
259
260// static
261Renderbuffer *RenderbufferManager::AllocateNewObject(rx::GLImplFactory *factory, GLuint handle)
262{
Jamie Madille703c602018-02-20 10:21:48 -0500263 Renderbuffer *renderbuffer = new Renderbuffer(factory, handle);
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800264 renderbuffer->addRef();
265 return renderbuffer;
266}
267
268// static
Jamie Madill4928b7c2017-06-20 12:57:39 -0400269void RenderbufferManager::DeleteObject(const Context *context, Renderbuffer *renderbuffer)
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800270{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400271 renderbuffer->release(context);
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800272}
273
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500274GLuint RenderbufferManager::createRenderbuffer()
275{
276 return AllocateEmptyObject(&mHandleAllocator, &mObjectMap);
277}
278
Yunchao Hea438f4e2017-08-04 13:42:39 +0800279Renderbuffer *RenderbufferManager::getRenderbuffer(GLuint handle) const
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500280{
Jamie Madill96a483b2017-06-27 16:49:21 -0400281 return mObjectMap.query(handle);
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500282}
283
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800284// SamplerManager Implementation.
285
286// static
287Sampler *SamplerManager::AllocateNewObject(rx::GLImplFactory *factory, GLuint handle)
288{
289 Sampler *sampler = new Sampler(factory, handle);
290 sampler->addRef();
291 return sampler;
292}
293
294// static
Jamie Madill4928b7c2017-06-20 12:57:39 -0400295void SamplerManager::DeleteObject(const Context *context, Sampler *sampler)
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800296{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400297 sampler->release(context);
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800298}
299
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500300GLuint SamplerManager::createSampler()
301{
302 return AllocateEmptyObject(&mHandleAllocator, &mObjectMap);
303}
304
Yunchao Hea438f4e2017-08-04 13:42:39 +0800305Sampler *SamplerManager::getSampler(GLuint handle) const
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500306{
Jamie Madill96a483b2017-06-27 16:49:21 -0400307 return mObjectMap.query(handle);
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500308}
309
Yunchao Hea438f4e2017-08-04 13:42:39 +0800310bool SamplerManager::isSampler(GLuint sampler) const
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500311{
Jamie Madill96a483b2017-06-27 16:49:21 -0400312 return mObjectMap.contains(sampler);
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500313}
314
Jamie Madill70b5bb02017-08-28 13:32:37 -0400315// SyncManager Implementation.
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800316
317// static
Jamie Madill70b5bb02017-08-28 13:32:37 -0400318void SyncManager::DeleteObject(const Context *context, Sync *sync)
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500319{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400320 sync->release(context);
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500321}
322
Jamie Madill70b5bb02017-08-28 13:32:37 -0400323GLuint SyncManager::createSync(rx::GLImplFactory *factory)
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500324{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400325 GLuint handle = mHandleAllocator.allocate();
326 Sync *sync = new Sync(factory->createSync(), handle);
327 sync->addRef();
328 mObjectMap.assign(handle, sync);
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800329 return handle;
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500330}
331
Jamie Madill70b5bb02017-08-28 13:32:37 -0400332Sync *SyncManager::getSync(GLuint handle) const
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500333{
Jamie Madill96a483b2017-06-27 16:49:21 -0400334 return mObjectMap.query(handle);
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500335}
336
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800337// PathManager Implementation.
338
Jamie Madill526392d2018-11-16 09:35:14 -0500339PathManager::PathManager() = default;
Jamie Madillacf2f3a2017-11-21 19:22:44 -0500340
Jamie Madill526392d2018-11-16 09:35:14 -0500341angle::Result PathManager::createPaths(Context *context, GLsizei range, GLuint *createdOut)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300342{
Jamie Madill13951342018-09-30 15:24:28 -0400343 *createdOut = 0;
344
Sami Väisänene45e53b2016-05-25 10:36:04 +0300345 // Allocate client side handles.
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500346 const GLuint client = mHandleAllocator.allocateRange(static_cast<GLuint>(range));
Sami Väisänene45e53b2016-05-25 10:36:04 +0300347 if (client == HandleRangeAllocator::kInvalidHandle)
Jamie Madill526392d2018-11-16 09:35:14 -0500348 {
349 context->handleError(GL_OUT_OF_MEMORY, "Failed to allocate path handle range.", __FILE__,
350 ANGLE_FUNCTION, __LINE__);
Jamie Madill7c985f52018-11-29 18:16:17 -0500351 return angle::Result::Stop;
Jamie Madill526392d2018-11-16 09:35:14 -0500352 }
Sami Väisänene45e53b2016-05-25 10:36:04 +0300353
Jamie Madill526392d2018-11-16 09:35:14 -0500354 const auto &paths = context->getImplementation()->createPaths(range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300355 if (paths.empty())
356 {
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500357 mHandleAllocator.releaseRange(client, range);
Jamie Madill526392d2018-11-16 09:35:14 -0500358 context->handleError(GL_OUT_OF_MEMORY, "Failed to allocate path objects.", __FILE__,
359 ANGLE_FUNCTION, __LINE__);
Jamie Madill7c985f52018-11-29 18:16:17 -0500360 return angle::Result::Stop;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300361 }
362
Sami Väisänene45e53b2016-05-25 10:36:04 +0300363 for (GLsizei i = 0; i < range; ++i)
364 {
Jamie Madillacf2f3a2017-11-21 19:22:44 -0500365 rx::PathImpl *impl = paths[static_cast<unsigned>(i)];
Jamie Madille4634a12018-11-14 09:54:35 -0500366 const auto id = client + i;
Jamie Madill96a483b2017-06-27 16:49:21 -0400367 mPaths.assign(id, new Path(impl));
Sami Väisänene45e53b2016-05-25 10:36:04 +0300368 }
Jamie Madill13951342018-09-30 15:24:28 -0400369 *createdOut = client;
Jamie Madill7c985f52018-11-29 18:16:17 -0500370 return angle::Result::Continue;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300371}
372
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500373void PathManager::deletePaths(GLuint first, GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300374{
375 for (GLsizei i = 0; i < range; ++i)
376 {
377 const auto id = first + i;
Jamie Madill96a483b2017-06-27 16:49:21 -0400378 Path *p = nullptr;
379 if (!mPaths.erase(id, &p))
Sami Väisänene45e53b2016-05-25 10:36:04 +0300380 continue;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300381 delete p;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300382 }
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500383 mHandleAllocator.releaseRange(first, static_cast<GLuint>(range));
Sami Väisänene45e53b2016-05-25 10:36:04 +0300384}
385
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500386Path *PathManager::getPath(GLuint handle) const
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000387{
Jamie Madill96a483b2017-06-27 16:49:21 -0400388 return mPaths.query(handle);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000389}
390
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500391bool PathManager::hasPath(GLuint handle) const
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000392{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500393 return mHandleAllocator.isUsed(handle);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000394}
395
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500396PathManager::~PathManager()
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000397{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500398 ASSERT(mPaths.empty());
399}
400
401void PathManager::reset(const Context *context)
402{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500403 for (auto path : mPaths)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000404 {
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500405 SafeDelete(path.second);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000406 }
Jamie Madill6c1f6712017-02-14 19:08:04 -0500407 mPaths.clear();
Geoff Langf41a7152016-09-19 15:11:17 -0400408}
409
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800410// FramebufferManager Implementation.
411
412// static
413Framebuffer *FramebufferManager::AllocateNewObject(rx::GLImplFactory *factory,
414 GLuint handle,
415 const Caps &caps)
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500416{
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800417 return new Framebuffer(caps, factory, handle);
418}
419
420// static
Jamie Madill4928b7c2017-06-20 12:57:39 -0400421void FramebufferManager::DeleteObject(const Context *context, Framebuffer *framebuffer)
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800422{
Geoff Langbf7b95d2018-05-01 16:48:21 -0400423 framebuffer->onDestroy(context);
424 delete framebuffer;
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500425}
426
427GLuint FramebufferManager::createFramebuffer()
428{
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800429 return AllocateEmptyObject(&mHandleAllocator, &mObjectMap);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500430}
431
432Framebuffer *FramebufferManager::getFramebuffer(GLuint handle) const
433{
Jamie Madill96a483b2017-06-27 16:49:21 -0400434 return mObjectMap.query(handle);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500435}
436
437void FramebufferManager::setDefaultFramebuffer(Framebuffer *framebuffer)
438{
439 ASSERT(framebuffer == nullptr || framebuffer->id() == 0);
Jamie Madill96a483b2017-06-27 16:49:21 -0400440 mObjectMap.assign(0, framebuffer);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500441}
442
Jamie Madill124f78c2019-06-18 11:48:24 -0400443void FramebufferManager::invalidateFramebufferComplenessCache() const
Geoff Lang9aded172017-04-05 11:07:56 -0400444{
Jamie Madill96a483b2017-06-27 16:49:21 -0400445 for (const auto &framebuffer : mObjectMap)
Geoff Lang9aded172017-04-05 11:07:56 -0400446 {
447 if (framebuffer.second)
448 {
Jamie Madill124f78c2019-06-18 11:48:24 -0400449 framebuffer.second->invalidateCompletenessCache();
Geoff Lang9aded172017-04-05 11:07:56 -0400450 }
451 }
452}
453
Yunchao Hea336b902017-08-02 16:05:21 +0800454// ProgramPipelineManager Implementation.
455
456// static
457ProgramPipeline *ProgramPipelineManager::AllocateNewObject(rx::GLImplFactory *factory,
458 GLuint handle)
459{
460 ProgramPipeline *pipeline = new ProgramPipeline(factory, handle);
461 pipeline->addRef();
462 return pipeline;
463}
464
465// static
466void ProgramPipelineManager::DeleteObject(const Context *context, ProgramPipeline *pipeline)
467{
468 pipeline->release(context);
469}
470
471GLuint ProgramPipelineManager::createProgramPipeline()
472{
473 return AllocateEmptyObject(&mHandleAllocator, &mObjectMap);
474}
475
476ProgramPipeline *ProgramPipelineManager::getProgramPipeline(GLuint handle) const
477{
478 return mObjectMap.query(handle);
479}
480
Michael Spangfb201c52019-04-03 14:57:35 -0400481// MemoryObjectManager Implementation.
482
483MemoryObjectManager::MemoryObjectManager() {}
484
485MemoryObjectManager::~MemoryObjectManager()
486{
487 ASSERT(mMemoryObjects.empty());
488}
489
490void MemoryObjectManager::reset(const Context *context)
491{
492 while (!mMemoryObjects.empty())
493 {
494 deleteMemoryObject(context, mMemoryObjects.begin()->first);
495 }
496 mMemoryObjects.clear();
497}
498
499GLuint MemoryObjectManager::createMemoryObject(rx::GLImplFactory *factory)
500{
Jamie Madill124f78c2019-06-18 11:48:24 -0400501 GLuint handle = mHandleAllocator.allocate();
Michael Spanga0b00e92019-04-09 18:45:22 -0400502 MemoryObject *memoryObject = new MemoryObject(factory, handle);
503 memoryObject->addRef();
504 mMemoryObjects.assign(handle, memoryObject);
Michael Spangfb201c52019-04-03 14:57:35 -0400505 return handle;
506}
507
508void MemoryObjectManager::deleteMemoryObject(const Context *context, GLuint handle)
509{
510 MemoryObject *memoryObject = nullptr;
511 if (!mMemoryObjects.erase(handle, &memoryObject))
512 {
513 return;
514 }
515
516 // Requires an explicit this-> because of C++ template rules.
517 this->mHandleAllocator.release(handle);
518
519 if (memoryObject)
520 {
521 memoryObject->release(context);
522 }
523}
524
525MemoryObject *MemoryObjectManager::getMemoryObject(GLuint handle) const
526{
527 return mMemoryObjects.query(handle);
528}
529
Michael Spang5093ba62019-05-14 17:36:36 -0400530// SemaphoreManager Implementation.
531
532SemaphoreManager::SemaphoreManager() {}
533
534SemaphoreManager::~SemaphoreManager()
535{
536 ASSERT(mSemaphores.empty());
537}
538
539void SemaphoreManager::reset(const Context *context)
540{
541 while (!mSemaphores.empty())
542 {
543 deleteSemaphore(context, mSemaphores.begin()->first);
544 }
545 mSemaphores.clear();
546}
547
548GLuint SemaphoreManager::createSemaphore(rx::GLImplFactory *factory)
549{
550 GLuint handle = mHandleAllocator.allocate();
551 Semaphore *semaphore = new Semaphore(factory, handle);
552 semaphore->addRef();
553 mSemaphores.assign(handle, semaphore);
554 return handle;
555}
556
557void SemaphoreManager::deleteSemaphore(const Context *context, GLuint handle)
558{
559 Semaphore *semaphore = nullptr;
560 if (!mSemaphores.erase(handle, &semaphore))
561 {
562 return;
563 }
564
565 // Requires an explicit this-> because of C++ template rules.
566 this->mHandleAllocator.release(handle);
567
568 if (semaphore)
569 {
570 semaphore->release(context);
571 }
572}
573
574Semaphore *SemaphoreManager::getSemaphore(GLuint handle) const
575{
576 return mSemaphores.query(handle);
577}
578
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500579} // namespace gl