blob: a8cda1b86e2bc3ac882c6058955e18fd0914f09c [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"
Geoff Lang2b5420c2014-11-19 14:20:15 -050021#include "libANGLE/Shader.h"
22#include "libANGLE/Texture.h"
Jamie Madill526392d2018-11-16 09:35:14 -050023#include "libANGLE/renderer/ContextImpl.h"
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000024
25namespace gl
26{
Geoff Lang4ddf5af2016-12-01 14:30:44 -050027
28namespace
29{
30
31template <typename ResourceType>
32GLuint AllocateEmptyObject(HandleAllocator *handleAllocator, ResourceMap<ResourceType> *objectMap)
33{
Jamie Madill96a483b2017-06-27 16:49:21 -040034 GLuint handle = handleAllocator->allocate();
35 objectMap->assign(handle, nullptr);
Geoff Lang4ddf5af2016-12-01 14:30:44 -050036 return handle;
37}
38
Geoff Lang4ddf5af2016-12-01 14:30:44 -050039} // anonymous namespace
40
41template <typename HandleAllocatorType>
42ResourceManagerBase<HandleAllocatorType>::ResourceManagerBase() : mRefCount(1)
Jamie Madillb980c562018-11-27 11:34:27 -050043{}
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000044
Geoff Lang4ddf5af2016-12-01 14:30:44 -050045template <typename HandleAllocatorType>
46void ResourceManagerBase<HandleAllocatorType>::addRef()
daniel@transgaming.com0d25b002010-07-28 19:21:07 +000047{
48 mRefCount++;
49}
50
Geoff Lang4ddf5af2016-12-01 14:30:44 -050051template <typename HandleAllocatorType>
Jamie Madill6c1f6712017-02-14 19:08:04 -050052void ResourceManagerBase<HandleAllocatorType>::release(const Context *context)
daniel@transgaming.com0d25b002010-07-28 19:21:07 +000053{
54 if (--mRefCount == 0)
55 {
Jamie Madill6c1f6712017-02-14 19:08:04 -050056 reset(context);
daniel@transgaming.com0d25b002010-07-28 19:21:07 +000057 delete this;
58 }
59}
60
Jamie Madill5f45e7c2017-02-10 15:23:28 -080061template <typename ResourceType, typename HandleAllocatorType, typename ImplT>
62TypedResourceManager<ResourceType, HandleAllocatorType, ImplT>::~TypedResourceManager()
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000063{
Jamie Madill6c1f6712017-02-14 19:08:04 -050064 ASSERT(mObjectMap.empty());
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000065}
66
Jamie Madill5f45e7c2017-02-10 15:23:28 -080067template <typename ResourceType, typename HandleAllocatorType, typename ImplT>
Jamie Madill6c1f6712017-02-14 19:08:04 -050068void TypedResourceManager<ResourceType, HandleAllocatorType, ImplT>::reset(const Context *context)
69{
Jamie Madill96a483b2017-06-27 16:49:21 -040070 this->mHandleAllocator.reset();
71 for (const auto &resource : mObjectMap)
Jamie Madill6c1f6712017-02-14 19:08:04 -050072 {
Jamie Madill96a483b2017-06-27 16:49:21 -040073 if (resource.second)
74 {
75 ImplT::DeleteObject(context, resource.second);
76 }
Jamie Madill6c1f6712017-02-14 19:08:04 -050077 }
78 mObjectMap.clear();
79}
80
81template <typename ResourceType, typename HandleAllocatorType, typename ImplT>
82void TypedResourceManager<ResourceType, HandleAllocatorType, ImplT>::deleteObject(
83 const Context *context,
84 GLuint handle)
Geoff Lang4ddf5af2016-12-01 14:30:44 -050085{
Jamie Madill96a483b2017-06-27 16:49:21 -040086 ResourceType *resource = nullptr;
87 if (!mObjectMap.erase(handle, &resource))
Jamie Madill5f45e7c2017-02-10 15:23:28 -080088 {
89 return;
90 }
91
Jamie Madill5f45e7c2017-02-10 15:23:28 -080092 // Requires an explicit this-> because of C++ template rules.
Jamie Madill96a483b2017-06-27 16:49:21 -040093 this->mHandleAllocator.release(handle);
Geoff Lang4ddf5af2016-12-01 14:30:44 -050094
Jamie Madill96a483b2017-06-27 16:49:21 -040095 if (resource)
Jamie Madill5f45e7c2017-02-10 15:23:28 -080096 {
Jamie Madill96a483b2017-06-27 16:49:21 -040097 ImplT::DeleteObject(context, resource);
Jamie Madill5f45e7c2017-02-10 15:23:28 -080098 }
Jamie Madill5f45e7c2017-02-10 15:23:28 -080099}
100
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500101template class ResourceManagerBase<HandleAllocator>;
102template class ResourceManagerBase<HandleRangeAllocator>;
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800103template class TypedResourceManager<Buffer, HandleAllocator, BufferManager>;
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800104template class TypedResourceManager<Texture, HandleAllocator, TextureManager>;
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800105template class TypedResourceManager<Renderbuffer, HandleAllocator, RenderbufferManager>;
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800106template class TypedResourceManager<Sampler, HandleAllocator, SamplerManager>;
Jamie Madill70b5bb02017-08-28 13:32:37 -0400107template class TypedResourceManager<Sync, HandleAllocator, SyncManager>;
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800108template class TypedResourceManager<Framebuffer, HandleAllocator, FramebufferManager>;
Yunchao Hea336b902017-08-02 16:05:21 +0800109template class TypedResourceManager<ProgramPipeline, HandleAllocator, ProgramPipelineManager>;
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800110
111// BufferManager Implementation.
112
113// static
114Buffer *BufferManager::AllocateNewObject(rx::GLImplFactory *factory, GLuint handle)
115{
116 Buffer *buffer = new Buffer(factory, handle);
117 buffer->addRef();
118 return buffer;
119}
120
121// static
Jamie Madill4928b7c2017-06-20 12:57:39 -0400122void BufferManager::DeleteObject(const Context *context, Buffer *buffer)
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800123{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400124 buffer->release(context);
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800125}
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500126
127GLuint BufferManager::createBuffer()
128{
129 return AllocateEmptyObject(&mHandleAllocator, &mObjectMap);
130}
131
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500132Buffer *BufferManager::getBuffer(GLuint handle) const
133{
Jamie Madill96a483b2017-06-27 16:49:21 -0400134 return mObjectMap.query(handle);
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500135}
136
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800137// ShaderProgramManager Implementation.
138
Jamie Madillb980c562018-11-27 11:34:27 -0500139ShaderProgramManager::ShaderProgramManager() {}
Jamie Madillacf2f3a2017-11-21 19:22:44 -0500140
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500141ShaderProgramManager::~ShaderProgramManager()
142{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500143 ASSERT(mPrograms.empty());
144 ASSERT(mShaders.empty());
145}
146
147void ShaderProgramManager::reset(const Context *context)
148{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500149 while (!mPrograms.empty())
150 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500151 deleteProgram(context, mPrograms.begin()->first);
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500152 }
Jamie Madill6c1f6712017-02-14 19:08:04 -0500153 mPrograms.clear();
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500154 while (!mShaders.empty())
155 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500156 deleteShader(context, mShaders.begin()->first);
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500157 }
Jamie Madill6c1f6712017-02-14 19:08:04 -0500158 mShaders.clear();
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500159}
160
161GLuint ShaderProgramManager::createShader(rx::GLImplFactory *factory,
162 const gl::Limitations &rendererLimitations,
Jiawei Shao385b3e02018-03-21 09:43:28 +0800163 ShaderType type)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000164{
Jiawei Shao385b3e02018-03-21 09:43:28 +0800165 ASSERT(type != ShaderType::InvalidEnum);
Jamie Madille4634a12018-11-14 09:54:35 -0500166 GLuint handle = mHandleAllocator.allocate();
Jamie Madill96a483b2017-06-27 16:49:21 -0400167 mShaders.assign(handle, new Shader(this, factory, rendererLimitations, type, handle));
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000168 return handle;
169}
170
Jamie Madill6c1f6712017-02-14 19:08:04 -0500171void ShaderProgramManager::deleteShader(const Context *context, GLuint shader)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000172{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500173 deleteObject(context, &mShaders, shader);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000174}
175
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500176Shader *ShaderProgramManager::getShader(GLuint handle) const
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000177{
Jamie Madill96a483b2017-06-27 16:49:21 -0400178 return mShaders.query(handle);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000179}
180
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500181GLuint ShaderProgramManager::createProgram(rx::GLImplFactory *factory)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000182{
Jamie Madill96a483b2017-06-27 16:49:21 -0400183 GLuint handle = mHandleAllocator.allocate();
184 mPrograms.assign(handle, new Program(factory, this, handle));
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000185 return handle;
186}
187
Jamie Madill6c1f6712017-02-14 19:08:04 -0500188void ShaderProgramManager::deleteProgram(const gl::Context *context, GLuint program)
Jamie Madilldc356042013-07-19 16:36:57 -0400189{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500190 deleteObject(context, &mPrograms, program);
Jamie Madilldc356042013-07-19 16:36:57 -0400191}
192
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500193template <typename ObjectType>
Jamie Madill6c1f6712017-02-14 19:08:04 -0500194void ShaderProgramManager::deleteObject(const Context *context,
195 ResourceMap<ObjectType> *objectMap,
196 GLuint id)
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500197{
Jamie Madill96a483b2017-06-27 16:49:21 -0400198 ObjectType *object = objectMap->query(id);
199 if (!object)
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500200 {
201 return;
202 }
203
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500204 if (object->getRefCount() == 0)
205 {
206 mHandleAllocator.release(id);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400207 object->onDestroy(context);
Jamie Madill96a483b2017-06-27 16:49:21 -0400208 objectMap->erase(id, &object);
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500209 }
210 else
211 {
212 object->flagForDeletion();
213 }
214}
215
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800216// TextureManager Implementation.
217
218// static
Corentin Wallez99d492c2018-02-27 15:17:10 -0500219Texture *TextureManager::AllocateNewObject(rx::GLImplFactory *factory,
220 GLuint handle,
221 TextureType type)
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800222{
Corentin Wallez99d492c2018-02-27 15:17:10 -0500223 Texture *texture = new Texture(factory, handle, type);
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800224 texture->addRef();
225 return texture;
226}
227
228// static
Jamie Madill4928b7c2017-06-20 12:57:39 -0400229void TextureManager::DeleteObject(const Context *context, Texture *texture)
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800230{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400231 texture->release(context);
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800232}
233
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500234GLuint TextureManager::createTexture()
235{
236 return AllocateEmptyObject(&mHandleAllocator, &mObjectMap);
237}
238
Jamie Madilld4442552018-02-27 22:03:47 -0500239void TextureManager::signalAllTexturesDirty(const Context *context) const
Geoff Lang9aded172017-04-05 11:07:56 -0400240{
Jamie Madill96a483b2017-06-27 16:49:21 -0400241 for (const auto &texture : mObjectMap)
Geoff Lang9aded172017-04-05 11:07:56 -0400242 {
243 if (texture.second)
244 {
Jamie Madill05b35b22017-10-03 09:01:44 -0400245 // We don't know if the Texture needs init, but that's ok, since it will only force
246 // a re-check, and will not initialize the pixels if it's not needed.
Jamie Madille3e680c2018-12-03 17:49:08 -0500247 texture.second->signalDirtyStorage(context, InitState::MayNeedInit);
Geoff Lang9aded172017-04-05 11:07:56 -0400248 }
249 }
250}
251
Jamie Madillfc3463d2018-01-03 13:46:21 -0500252void TextureManager::enableHandleAllocatorLogging()
253{
254 mHandleAllocator.enableLogging(true);
255}
256
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800257// RenderbufferManager Implementation.
258
259// static
260Renderbuffer *RenderbufferManager::AllocateNewObject(rx::GLImplFactory *factory, GLuint handle)
261{
Jamie Madille703c602018-02-20 10:21:48 -0500262 Renderbuffer *renderbuffer = new Renderbuffer(factory, handle);
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800263 renderbuffer->addRef();
264 return renderbuffer;
265}
266
267// static
Jamie Madill4928b7c2017-06-20 12:57:39 -0400268void RenderbufferManager::DeleteObject(const Context *context, Renderbuffer *renderbuffer)
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800269{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400270 renderbuffer->release(context);
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800271}
272
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500273GLuint RenderbufferManager::createRenderbuffer()
274{
275 return AllocateEmptyObject(&mHandleAllocator, &mObjectMap);
276}
277
Yunchao Hea438f4e2017-08-04 13:42:39 +0800278Renderbuffer *RenderbufferManager::getRenderbuffer(GLuint handle) const
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500279{
Jamie Madill96a483b2017-06-27 16:49:21 -0400280 return mObjectMap.query(handle);
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500281}
282
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800283// SamplerManager Implementation.
284
285// static
286Sampler *SamplerManager::AllocateNewObject(rx::GLImplFactory *factory, GLuint handle)
287{
288 Sampler *sampler = new Sampler(factory, handle);
289 sampler->addRef();
290 return sampler;
291}
292
293// static
Jamie Madill4928b7c2017-06-20 12:57:39 -0400294void SamplerManager::DeleteObject(const Context *context, Sampler *sampler)
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800295{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400296 sampler->release(context);
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800297}
298
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500299GLuint SamplerManager::createSampler()
300{
301 return AllocateEmptyObject(&mHandleAllocator, &mObjectMap);
302}
303
Yunchao Hea438f4e2017-08-04 13:42:39 +0800304Sampler *SamplerManager::getSampler(GLuint handle) const
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500305{
Jamie Madill96a483b2017-06-27 16:49:21 -0400306 return mObjectMap.query(handle);
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500307}
308
Yunchao Hea438f4e2017-08-04 13:42:39 +0800309bool SamplerManager::isSampler(GLuint sampler) const
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500310{
Jamie Madill96a483b2017-06-27 16:49:21 -0400311 return mObjectMap.contains(sampler);
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500312}
313
Jamie Madill70b5bb02017-08-28 13:32:37 -0400314// SyncManager Implementation.
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800315
316// static
Jamie Madill70b5bb02017-08-28 13:32:37 -0400317void SyncManager::DeleteObject(const Context *context, Sync *sync)
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500318{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400319 sync->release(context);
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500320}
321
Jamie Madill70b5bb02017-08-28 13:32:37 -0400322GLuint SyncManager::createSync(rx::GLImplFactory *factory)
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500323{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400324 GLuint handle = mHandleAllocator.allocate();
325 Sync *sync = new Sync(factory->createSync(), handle);
326 sync->addRef();
327 mObjectMap.assign(handle, sync);
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800328 return handle;
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500329}
330
Jamie Madill70b5bb02017-08-28 13:32:37 -0400331Sync *SyncManager::getSync(GLuint handle) const
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500332{
Jamie Madill96a483b2017-06-27 16:49:21 -0400333 return mObjectMap.query(handle);
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500334}
335
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800336// PathManager Implementation.
337
Jamie Madill526392d2018-11-16 09:35:14 -0500338PathManager::PathManager() = default;
Jamie Madillacf2f3a2017-11-21 19:22:44 -0500339
Jamie Madill526392d2018-11-16 09:35:14 -0500340angle::Result PathManager::createPaths(Context *context, GLsizei range, GLuint *createdOut)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300341{
Jamie Madill13951342018-09-30 15:24:28 -0400342 *createdOut = 0;
343
Sami Väisänene45e53b2016-05-25 10:36:04 +0300344 // Allocate client side handles.
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500345 const GLuint client = mHandleAllocator.allocateRange(static_cast<GLuint>(range));
Sami Väisänene45e53b2016-05-25 10:36:04 +0300346 if (client == HandleRangeAllocator::kInvalidHandle)
Jamie Madill526392d2018-11-16 09:35:14 -0500347 {
348 context->handleError(GL_OUT_OF_MEMORY, "Failed to allocate path handle range.", __FILE__,
349 ANGLE_FUNCTION, __LINE__);
Jamie Madill7c985f52018-11-29 18:16:17 -0500350 return angle::Result::Stop;
Jamie Madill526392d2018-11-16 09:35:14 -0500351 }
Sami Väisänene45e53b2016-05-25 10:36:04 +0300352
Jamie Madill526392d2018-11-16 09:35:14 -0500353 const auto &paths = context->getImplementation()->createPaths(range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300354 if (paths.empty())
355 {
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500356 mHandleAllocator.releaseRange(client, range);
Jamie Madill526392d2018-11-16 09:35:14 -0500357 context->handleError(GL_OUT_OF_MEMORY, "Failed to allocate path objects.", __FILE__,
358 ANGLE_FUNCTION, __LINE__);
Jamie Madill7c985f52018-11-29 18:16:17 -0500359 return angle::Result::Stop;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300360 }
361
Sami Väisänene45e53b2016-05-25 10:36:04 +0300362 for (GLsizei i = 0; i < range; ++i)
363 {
Jamie Madillacf2f3a2017-11-21 19:22:44 -0500364 rx::PathImpl *impl = paths[static_cast<unsigned>(i)];
Jamie Madille4634a12018-11-14 09:54:35 -0500365 const auto id = client + i;
Jamie Madill96a483b2017-06-27 16:49:21 -0400366 mPaths.assign(id, new Path(impl));
Sami Väisänene45e53b2016-05-25 10:36:04 +0300367 }
Jamie Madill13951342018-09-30 15:24:28 -0400368 *createdOut = client;
Jamie Madill7c985f52018-11-29 18:16:17 -0500369 return angle::Result::Continue;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300370}
371
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500372void PathManager::deletePaths(GLuint first, GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300373{
374 for (GLsizei i = 0; i < range; ++i)
375 {
376 const auto id = first + i;
Jamie Madill96a483b2017-06-27 16:49:21 -0400377 Path *p = nullptr;
378 if (!mPaths.erase(id, &p))
Sami Väisänene45e53b2016-05-25 10:36:04 +0300379 continue;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300380 delete p;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300381 }
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500382 mHandleAllocator.releaseRange(first, static_cast<GLuint>(range));
Sami Väisänene45e53b2016-05-25 10:36:04 +0300383}
384
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500385Path *PathManager::getPath(GLuint handle) const
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000386{
Jamie Madill96a483b2017-06-27 16:49:21 -0400387 return mPaths.query(handle);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000388}
389
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500390bool PathManager::hasPath(GLuint handle) const
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000391{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500392 return mHandleAllocator.isUsed(handle);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000393}
394
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500395PathManager::~PathManager()
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000396{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500397 ASSERT(mPaths.empty());
398}
399
400void PathManager::reset(const Context *context)
401{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500402 for (auto path : mPaths)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000403 {
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500404 SafeDelete(path.second);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000405 }
Jamie Madill6c1f6712017-02-14 19:08:04 -0500406 mPaths.clear();
Geoff Langf41a7152016-09-19 15:11:17 -0400407}
408
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800409// FramebufferManager Implementation.
410
411// static
412Framebuffer *FramebufferManager::AllocateNewObject(rx::GLImplFactory *factory,
413 GLuint handle,
414 const Caps &caps)
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500415{
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800416 return new Framebuffer(caps, factory, handle);
417}
418
419// static
Jamie Madill4928b7c2017-06-20 12:57:39 -0400420void FramebufferManager::DeleteObject(const Context *context, Framebuffer *framebuffer)
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800421{
Geoff Langbf7b95d2018-05-01 16:48:21 -0400422 framebuffer->onDestroy(context);
423 delete framebuffer;
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500424}
425
426GLuint FramebufferManager::createFramebuffer()
427{
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800428 return AllocateEmptyObject(&mHandleAllocator, &mObjectMap);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500429}
430
431Framebuffer *FramebufferManager::getFramebuffer(GLuint handle) const
432{
Jamie Madill96a483b2017-06-27 16:49:21 -0400433 return mObjectMap.query(handle);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500434}
435
436void FramebufferManager::setDefaultFramebuffer(Framebuffer *framebuffer)
437{
438 ASSERT(framebuffer == nullptr || framebuffer->id() == 0);
Jamie Madill96a483b2017-06-27 16:49:21 -0400439 mObjectMap.assign(0, framebuffer);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500440}
441
Jamie Madillb983a4b2018-08-01 11:34:51 -0400442void FramebufferManager::invalidateFramebufferComplenessCache(const Context *context) const
Geoff Lang9aded172017-04-05 11:07:56 -0400443{
Jamie Madill96a483b2017-06-27 16:49:21 -0400444 for (const auto &framebuffer : mObjectMap)
Geoff Lang9aded172017-04-05 11:07:56 -0400445 {
446 if (framebuffer.second)
447 {
Jamie Madillb983a4b2018-08-01 11:34:51 -0400448 framebuffer.second->invalidateCompletenessCache(context);
Geoff Lang9aded172017-04-05 11:07:56 -0400449 }
450 }
451}
452
Yunchao Hea336b902017-08-02 16:05:21 +0800453// ProgramPipelineManager Implementation.
454
455// static
456ProgramPipeline *ProgramPipelineManager::AllocateNewObject(rx::GLImplFactory *factory,
457 GLuint handle)
458{
459 ProgramPipeline *pipeline = new ProgramPipeline(factory, handle);
460 pipeline->addRef();
461 return pipeline;
462}
463
464// static
465void ProgramPipelineManager::DeleteObject(const Context *context, ProgramPipeline *pipeline)
466{
467 pipeline->release(context);
468}
469
470GLuint ProgramPipelineManager::createProgramPipeline()
471{
472 return AllocateEmptyObject(&mHandleAllocator, &mObjectMap);
473}
474
475ProgramPipeline *ProgramPipelineManager::getProgramPipeline(GLuint handle) const
476{
477 return mObjectMap.query(handle);
478}
479
Michael Spangfb201c52019-04-03 14:57:35 -0400480// MemoryObjectManager Implementation.
481
482MemoryObjectManager::MemoryObjectManager() {}
483
484MemoryObjectManager::~MemoryObjectManager()
485{
486 ASSERT(mMemoryObjects.empty());
487}
488
489void MemoryObjectManager::reset(const Context *context)
490{
491 while (!mMemoryObjects.empty())
492 {
493 deleteMemoryObject(context, mMemoryObjects.begin()->first);
494 }
495 mMemoryObjects.clear();
496}
497
498GLuint MemoryObjectManager::createMemoryObject(rx::GLImplFactory *factory)
499{
500 GLuint handle = mHandleAllocator.allocate();
501 mMemoryObjects.assign(handle, new MemoryObject(factory, handle));
502 return handle;
503}
504
505void MemoryObjectManager::deleteMemoryObject(const Context *context, GLuint handle)
506{
507 MemoryObject *memoryObject = nullptr;
508 if (!mMemoryObjects.erase(handle, &memoryObject))
509 {
510 return;
511 }
512
513 // Requires an explicit this-> because of C++ template rules.
514 this->mHandleAllocator.release(handle);
515
516 if (memoryObject)
517 {
518 memoryObject->release(context);
519 }
520}
521
522MemoryObject *MemoryObjectManager::getMemoryObject(GLuint handle) const
523{
524 return mMemoryObjects.query(handle);
525}
526
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500527} // namespace gl