blob: cc008cafa4370d14e2b4b9975b306ac2257c1e9e [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"
Sami Väisänene45e53b2016-05-25 10:36:04 +030015#include "libANGLE/Path.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050016#include "libANGLE/Program.h"
Yunchao Hea336b902017-08-02 16:05:21 +080017#include "libANGLE/ProgramPipeline.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050018#include "libANGLE/Renderbuffer.h"
Jamie Madill53ea9cc2016-05-17 10:12:52 -040019#include "libANGLE/Sampler.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050020#include "libANGLE/Shader.h"
21#include "libANGLE/Texture.h"
Jamie Madill526392d2018-11-16 09:35:14 -050022#include "libANGLE/renderer/ContextImpl.h"
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000023
24namespace gl
25{
Geoff Lang4ddf5af2016-12-01 14:30:44 -050026
27namespace
28{
29
30template <typename ResourceType>
31GLuint AllocateEmptyObject(HandleAllocator *handleAllocator, ResourceMap<ResourceType> *objectMap)
32{
Jamie Madill96a483b2017-06-27 16:49:21 -040033 GLuint handle = handleAllocator->allocate();
34 objectMap->assign(handle, nullptr);
Geoff Lang4ddf5af2016-12-01 14:30:44 -050035 return handle;
36}
37
Geoff Lang4ddf5af2016-12-01 14:30:44 -050038} // anonymous namespace
39
40template <typename HandleAllocatorType>
41ResourceManagerBase<HandleAllocatorType>::ResourceManagerBase() : mRefCount(1)
Jamie Madillb980c562018-11-27 11:34:27 -050042{}
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000043
Geoff Lang4ddf5af2016-12-01 14:30:44 -050044template <typename HandleAllocatorType>
45void ResourceManagerBase<HandleAllocatorType>::addRef()
daniel@transgaming.com0d25b002010-07-28 19:21:07 +000046{
47 mRefCount++;
48}
49
Geoff Lang4ddf5af2016-12-01 14:30:44 -050050template <typename HandleAllocatorType>
Jamie Madill6c1f6712017-02-14 19:08:04 -050051void ResourceManagerBase<HandleAllocatorType>::release(const Context *context)
daniel@transgaming.com0d25b002010-07-28 19:21:07 +000052{
53 if (--mRefCount == 0)
54 {
Jamie Madill6c1f6712017-02-14 19:08:04 -050055 reset(context);
daniel@transgaming.com0d25b002010-07-28 19:21:07 +000056 delete this;
57 }
58}
59
Jamie Madill5f45e7c2017-02-10 15:23:28 -080060template <typename ResourceType, typename HandleAllocatorType, typename ImplT>
61TypedResourceManager<ResourceType, HandleAllocatorType, ImplT>::~TypedResourceManager()
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000062{
Jamie Madill6c1f6712017-02-14 19:08:04 -050063 ASSERT(mObjectMap.empty());
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +000064}
65
Jamie Madill5f45e7c2017-02-10 15:23:28 -080066template <typename ResourceType, typename HandleAllocatorType, typename ImplT>
Jamie Madill6c1f6712017-02-14 19:08:04 -050067void TypedResourceManager<ResourceType, HandleAllocatorType, ImplT>::reset(const Context *context)
68{
Jamie Madill96a483b2017-06-27 16:49:21 -040069 this->mHandleAllocator.reset();
70 for (const auto &resource : mObjectMap)
Jamie Madill6c1f6712017-02-14 19:08:04 -050071 {
Jamie Madill96a483b2017-06-27 16:49:21 -040072 if (resource.second)
73 {
74 ImplT::DeleteObject(context, resource.second);
75 }
Jamie Madill6c1f6712017-02-14 19:08:04 -050076 }
77 mObjectMap.clear();
78}
79
80template <typename ResourceType, typename HandleAllocatorType, typename ImplT>
81void TypedResourceManager<ResourceType, HandleAllocatorType, ImplT>::deleteObject(
82 const Context *context,
83 GLuint handle)
Geoff Lang4ddf5af2016-12-01 14:30:44 -050084{
Jamie Madill96a483b2017-06-27 16:49:21 -040085 ResourceType *resource = nullptr;
86 if (!mObjectMap.erase(handle, &resource))
Jamie Madill5f45e7c2017-02-10 15:23:28 -080087 {
88 return;
89 }
90
Jamie Madill5f45e7c2017-02-10 15:23:28 -080091 // Requires an explicit this-> because of C++ template rules.
Jamie Madill96a483b2017-06-27 16:49:21 -040092 this->mHandleAllocator.release(handle);
Geoff Lang4ddf5af2016-12-01 14:30:44 -050093
Jamie Madill96a483b2017-06-27 16:49:21 -040094 if (resource)
Jamie Madill5f45e7c2017-02-10 15:23:28 -080095 {
Jamie Madill96a483b2017-06-27 16:49:21 -040096 ImplT::DeleteObject(context, resource);
Jamie Madill5f45e7c2017-02-10 15:23:28 -080097 }
Jamie Madill5f45e7c2017-02-10 15:23:28 -080098}
99
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500100template class ResourceManagerBase<HandleAllocator>;
101template class ResourceManagerBase<HandleRangeAllocator>;
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800102template class TypedResourceManager<Buffer, HandleAllocator, BufferManager>;
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800103template class TypedResourceManager<Texture, HandleAllocator, TextureManager>;
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800104template class TypedResourceManager<Renderbuffer, HandleAllocator, RenderbufferManager>;
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800105template class TypedResourceManager<Sampler, HandleAllocator, SamplerManager>;
Jamie Madill70b5bb02017-08-28 13:32:37 -0400106template class TypedResourceManager<Sync, HandleAllocator, SyncManager>;
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800107template class TypedResourceManager<Framebuffer, HandleAllocator, FramebufferManager>;
Yunchao Hea336b902017-08-02 16:05:21 +0800108template class TypedResourceManager<ProgramPipeline, HandleAllocator, ProgramPipelineManager>;
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800109
110// BufferManager Implementation.
111
112// static
113Buffer *BufferManager::AllocateNewObject(rx::GLImplFactory *factory, GLuint handle)
114{
115 Buffer *buffer = new Buffer(factory, handle);
116 buffer->addRef();
117 return buffer;
118}
119
120// static
Jamie Madill4928b7c2017-06-20 12:57:39 -0400121void BufferManager::DeleteObject(const Context *context, Buffer *buffer)
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800122{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400123 buffer->release(context);
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800124}
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500125
126GLuint BufferManager::createBuffer()
127{
128 return AllocateEmptyObject(&mHandleAllocator, &mObjectMap);
129}
130
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500131Buffer *BufferManager::getBuffer(GLuint handle) const
132{
Jamie Madill96a483b2017-06-27 16:49:21 -0400133 return mObjectMap.query(handle);
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500134}
135
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800136// ShaderProgramManager Implementation.
137
Jamie Madillb980c562018-11-27 11:34:27 -0500138ShaderProgramManager::ShaderProgramManager() {}
Jamie Madillacf2f3a2017-11-21 19:22:44 -0500139
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500140ShaderProgramManager::~ShaderProgramManager()
141{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500142 ASSERT(mPrograms.empty());
143 ASSERT(mShaders.empty());
144}
145
146void ShaderProgramManager::reset(const Context *context)
147{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500148 while (!mPrograms.empty())
149 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500150 deleteProgram(context, mPrograms.begin()->first);
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500151 }
Jamie Madill6c1f6712017-02-14 19:08:04 -0500152 mPrograms.clear();
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500153 while (!mShaders.empty())
154 {
Jamie Madill6c1f6712017-02-14 19:08:04 -0500155 deleteShader(context, mShaders.begin()->first);
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500156 }
Jamie Madill6c1f6712017-02-14 19:08:04 -0500157 mShaders.clear();
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500158}
159
160GLuint ShaderProgramManager::createShader(rx::GLImplFactory *factory,
161 const gl::Limitations &rendererLimitations,
Jiawei Shao385b3e02018-03-21 09:43:28 +0800162 ShaderType type)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000163{
Jiawei Shao385b3e02018-03-21 09:43:28 +0800164 ASSERT(type != ShaderType::InvalidEnum);
Jamie Madille4634a12018-11-14 09:54:35 -0500165 GLuint handle = mHandleAllocator.allocate();
Jamie Madill96a483b2017-06-27 16:49:21 -0400166 mShaders.assign(handle, new Shader(this, factory, rendererLimitations, type, handle));
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000167 return handle;
168}
169
Jamie Madill6c1f6712017-02-14 19:08:04 -0500170void ShaderProgramManager::deleteShader(const Context *context, GLuint shader)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000171{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500172 deleteObject(context, &mShaders, shader);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000173}
174
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500175Shader *ShaderProgramManager::getShader(GLuint handle) const
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000176{
Jamie Madill96a483b2017-06-27 16:49:21 -0400177 return mShaders.query(handle);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000178}
179
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500180GLuint ShaderProgramManager::createProgram(rx::GLImplFactory *factory)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000181{
Jamie Madill96a483b2017-06-27 16:49:21 -0400182 GLuint handle = mHandleAllocator.allocate();
183 mPrograms.assign(handle, new Program(factory, this, handle));
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000184 return handle;
185}
186
Jamie Madill6c1f6712017-02-14 19:08:04 -0500187void ShaderProgramManager::deleteProgram(const gl::Context *context, GLuint program)
Jamie Madilldc356042013-07-19 16:36:57 -0400188{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500189 deleteObject(context, &mPrograms, program);
Jamie Madilldc356042013-07-19 16:36:57 -0400190}
191
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500192template <typename ObjectType>
Jamie Madill6c1f6712017-02-14 19:08:04 -0500193void ShaderProgramManager::deleteObject(const Context *context,
194 ResourceMap<ObjectType> *objectMap,
195 GLuint id)
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500196{
Jamie Madill96a483b2017-06-27 16:49:21 -0400197 ObjectType *object = objectMap->query(id);
198 if (!object)
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500199 {
200 return;
201 }
202
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500203 if (object->getRefCount() == 0)
204 {
205 mHandleAllocator.release(id);
Jamie Madill4928b7c2017-06-20 12:57:39 -0400206 object->onDestroy(context);
Jamie Madill96a483b2017-06-27 16:49:21 -0400207 objectMap->erase(id, &object);
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500208 }
209 else
210 {
211 object->flagForDeletion();
212 }
213}
214
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800215// TextureManager Implementation.
216
217// static
Corentin Wallez99d492c2018-02-27 15:17:10 -0500218Texture *TextureManager::AllocateNewObject(rx::GLImplFactory *factory,
219 GLuint handle,
220 TextureType type)
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800221{
Corentin Wallez99d492c2018-02-27 15:17:10 -0500222 Texture *texture = new Texture(factory, handle, type);
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800223 texture->addRef();
224 return texture;
225}
226
227// static
Jamie Madill4928b7c2017-06-20 12:57:39 -0400228void TextureManager::DeleteObject(const Context *context, Texture *texture)
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800229{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400230 texture->release(context);
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800231}
232
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500233GLuint TextureManager::createTexture()
234{
235 return AllocateEmptyObject(&mHandleAllocator, &mObjectMap);
236}
237
Jamie Madilld4442552018-02-27 22:03:47 -0500238void TextureManager::signalAllTexturesDirty(const Context *context) const
Geoff Lang9aded172017-04-05 11:07:56 -0400239{
Jamie Madill96a483b2017-06-27 16:49:21 -0400240 for (const auto &texture : mObjectMap)
Geoff Lang9aded172017-04-05 11:07:56 -0400241 {
242 if (texture.second)
243 {
Jamie Madill05b35b22017-10-03 09:01:44 -0400244 // We don't know if the Texture needs init, but that's ok, since it will only force
245 // a re-check, and will not initialize the pixels if it's not needed.
Jamie Madille3e680c2018-12-03 17:49:08 -0500246 texture.second->signalDirtyStorage(context, InitState::MayNeedInit);
Geoff Lang9aded172017-04-05 11:07:56 -0400247 }
248 }
249}
250
Jamie Madillfc3463d2018-01-03 13:46:21 -0500251void TextureManager::enableHandleAllocatorLogging()
252{
253 mHandleAllocator.enableLogging(true);
254}
255
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800256// RenderbufferManager Implementation.
257
258// static
259Renderbuffer *RenderbufferManager::AllocateNewObject(rx::GLImplFactory *factory, GLuint handle)
260{
Jamie Madille703c602018-02-20 10:21:48 -0500261 Renderbuffer *renderbuffer = new Renderbuffer(factory, handle);
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800262 renderbuffer->addRef();
263 return renderbuffer;
264}
265
266// static
Jamie Madill4928b7c2017-06-20 12:57:39 -0400267void RenderbufferManager::DeleteObject(const Context *context, Renderbuffer *renderbuffer)
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800268{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400269 renderbuffer->release(context);
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800270}
271
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500272GLuint RenderbufferManager::createRenderbuffer()
273{
274 return AllocateEmptyObject(&mHandleAllocator, &mObjectMap);
275}
276
Yunchao Hea438f4e2017-08-04 13:42:39 +0800277Renderbuffer *RenderbufferManager::getRenderbuffer(GLuint handle) const
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500278{
Jamie Madill96a483b2017-06-27 16:49:21 -0400279 return mObjectMap.query(handle);
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500280}
281
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800282// SamplerManager Implementation.
283
284// static
285Sampler *SamplerManager::AllocateNewObject(rx::GLImplFactory *factory, GLuint handle)
286{
287 Sampler *sampler = new Sampler(factory, handle);
288 sampler->addRef();
289 return sampler;
290}
291
292// static
Jamie Madill4928b7c2017-06-20 12:57:39 -0400293void SamplerManager::DeleteObject(const Context *context, Sampler *sampler)
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800294{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400295 sampler->release(context);
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800296}
297
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500298GLuint SamplerManager::createSampler()
299{
300 return AllocateEmptyObject(&mHandleAllocator, &mObjectMap);
301}
302
Yunchao Hea438f4e2017-08-04 13:42:39 +0800303Sampler *SamplerManager::getSampler(GLuint handle) const
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500304{
Jamie Madill96a483b2017-06-27 16:49:21 -0400305 return mObjectMap.query(handle);
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500306}
307
Yunchao Hea438f4e2017-08-04 13:42:39 +0800308bool SamplerManager::isSampler(GLuint sampler) const
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500309{
Jamie Madill96a483b2017-06-27 16:49:21 -0400310 return mObjectMap.contains(sampler);
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500311}
312
Jamie Madill70b5bb02017-08-28 13:32:37 -0400313// SyncManager Implementation.
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800314
315// static
Jamie Madill70b5bb02017-08-28 13:32:37 -0400316void SyncManager::DeleteObject(const Context *context, Sync *sync)
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500317{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400318 sync->release(context);
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500319}
320
Jamie Madill70b5bb02017-08-28 13:32:37 -0400321GLuint SyncManager::createSync(rx::GLImplFactory *factory)
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500322{
Jamie Madill70b5bb02017-08-28 13:32:37 -0400323 GLuint handle = mHandleAllocator.allocate();
324 Sync *sync = new Sync(factory->createSync(), handle);
325 sync->addRef();
326 mObjectMap.assign(handle, sync);
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800327 return handle;
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500328}
329
Jamie Madill70b5bb02017-08-28 13:32:37 -0400330Sync *SyncManager::getSync(GLuint handle) const
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500331{
Jamie Madill96a483b2017-06-27 16:49:21 -0400332 return mObjectMap.query(handle);
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500333}
334
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800335// PathManager Implementation.
336
Jamie Madill526392d2018-11-16 09:35:14 -0500337PathManager::PathManager() = default;
Jamie Madillacf2f3a2017-11-21 19:22:44 -0500338
Jamie Madill526392d2018-11-16 09:35:14 -0500339angle::Result PathManager::createPaths(Context *context, GLsizei range, GLuint *createdOut)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300340{
Jamie Madill13951342018-09-30 15:24:28 -0400341 *createdOut = 0;
342
Sami Väisänene45e53b2016-05-25 10:36:04 +0300343 // Allocate client side handles.
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500344 const GLuint client = mHandleAllocator.allocateRange(static_cast<GLuint>(range));
Sami Väisänene45e53b2016-05-25 10:36:04 +0300345 if (client == HandleRangeAllocator::kInvalidHandle)
Jamie Madill526392d2018-11-16 09:35:14 -0500346 {
347 context->handleError(GL_OUT_OF_MEMORY, "Failed to allocate path handle range.", __FILE__,
348 ANGLE_FUNCTION, __LINE__);
Jamie Madill7c985f52018-11-29 18:16:17 -0500349 return angle::Result::Stop;
Jamie Madill526392d2018-11-16 09:35:14 -0500350 }
Sami Väisänene45e53b2016-05-25 10:36:04 +0300351
Jamie Madill526392d2018-11-16 09:35:14 -0500352 const auto &paths = context->getImplementation()->createPaths(range);
Sami Väisänene45e53b2016-05-25 10:36:04 +0300353 if (paths.empty())
354 {
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500355 mHandleAllocator.releaseRange(client, range);
Jamie Madill526392d2018-11-16 09:35:14 -0500356 context->handleError(GL_OUT_OF_MEMORY, "Failed to allocate path objects.", __FILE__,
357 ANGLE_FUNCTION, __LINE__);
Jamie Madill7c985f52018-11-29 18:16:17 -0500358 return angle::Result::Stop;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300359 }
360
Sami Väisänene45e53b2016-05-25 10:36:04 +0300361 for (GLsizei i = 0; i < range; ++i)
362 {
Jamie Madillacf2f3a2017-11-21 19:22:44 -0500363 rx::PathImpl *impl = paths[static_cast<unsigned>(i)];
Jamie Madille4634a12018-11-14 09:54:35 -0500364 const auto id = client + i;
Jamie Madill96a483b2017-06-27 16:49:21 -0400365 mPaths.assign(id, new Path(impl));
Sami Väisänene45e53b2016-05-25 10:36:04 +0300366 }
Jamie Madill13951342018-09-30 15:24:28 -0400367 *createdOut = client;
Jamie Madill7c985f52018-11-29 18:16:17 -0500368 return angle::Result::Continue;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300369}
370
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500371void PathManager::deletePaths(GLuint first, GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +0300372{
373 for (GLsizei i = 0; i < range; ++i)
374 {
375 const auto id = first + i;
Jamie Madill96a483b2017-06-27 16:49:21 -0400376 Path *p = nullptr;
377 if (!mPaths.erase(id, &p))
Sami Väisänene45e53b2016-05-25 10:36:04 +0300378 continue;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300379 delete p;
Sami Väisänene45e53b2016-05-25 10:36:04 +0300380 }
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500381 mHandleAllocator.releaseRange(first, static_cast<GLuint>(range));
Sami Väisänene45e53b2016-05-25 10:36:04 +0300382}
383
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500384Path *PathManager::getPath(GLuint handle) const
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000385{
Jamie Madill96a483b2017-06-27 16:49:21 -0400386 return mPaths.query(handle);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000387}
388
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500389bool PathManager::hasPath(GLuint handle) const
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000390{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500391 return mHandleAllocator.isUsed(handle);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000392}
393
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500394PathManager::~PathManager()
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000395{
Jamie Madill6c1f6712017-02-14 19:08:04 -0500396 ASSERT(mPaths.empty());
397}
398
399void PathManager::reset(const Context *context)
400{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500401 for (auto path : mPaths)
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000402 {
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500403 SafeDelete(path.second);
daniel@transgaming.comda13f3e2010-07-28 19:20:56 +0000404 }
Jamie Madill6c1f6712017-02-14 19:08:04 -0500405 mPaths.clear();
Geoff Langf41a7152016-09-19 15:11:17 -0400406}
407
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800408// FramebufferManager Implementation.
409
410// static
411Framebuffer *FramebufferManager::AllocateNewObject(rx::GLImplFactory *factory,
412 GLuint handle,
413 const Caps &caps)
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500414{
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800415 return new Framebuffer(caps, factory, handle);
416}
417
418// static
Jamie Madill4928b7c2017-06-20 12:57:39 -0400419void FramebufferManager::DeleteObject(const Context *context, Framebuffer *framebuffer)
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800420{
Geoff Langbf7b95d2018-05-01 16:48:21 -0400421 framebuffer->onDestroy(context);
422 delete framebuffer;
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500423}
424
425GLuint FramebufferManager::createFramebuffer()
426{
Jamie Madill5f45e7c2017-02-10 15:23:28 -0800427 return AllocateEmptyObject(&mHandleAllocator, &mObjectMap);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500428}
429
430Framebuffer *FramebufferManager::getFramebuffer(GLuint handle) const
431{
Jamie Madill96a483b2017-06-27 16:49:21 -0400432 return mObjectMap.query(handle);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500433}
434
435void FramebufferManager::setDefaultFramebuffer(Framebuffer *framebuffer)
436{
437 ASSERT(framebuffer == nullptr || framebuffer->id() == 0);
Jamie Madill96a483b2017-06-27 16:49:21 -0400438 mObjectMap.assign(0, framebuffer);
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500439}
440
Jamie Madillb983a4b2018-08-01 11:34:51 -0400441void FramebufferManager::invalidateFramebufferComplenessCache(const Context *context) const
Geoff Lang9aded172017-04-05 11:07:56 -0400442{
Jamie Madill96a483b2017-06-27 16:49:21 -0400443 for (const auto &framebuffer : mObjectMap)
Geoff Lang9aded172017-04-05 11:07:56 -0400444 {
445 if (framebuffer.second)
446 {
Jamie Madillb983a4b2018-08-01 11:34:51 -0400447 framebuffer.second->invalidateCompletenessCache(context);
Geoff Lang9aded172017-04-05 11:07:56 -0400448 }
449 }
450}
451
Yunchao Hea336b902017-08-02 16:05:21 +0800452// ProgramPipelineManager Implementation.
453
454// static
455ProgramPipeline *ProgramPipelineManager::AllocateNewObject(rx::GLImplFactory *factory,
456 GLuint handle)
457{
458 ProgramPipeline *pipeline = new ProgramPipeline(factory, handle);
459 pipeline->addRef();
460 return pipeline;
461}
462
463// static
464void ProgramPipelineManager::DeleteObject(const Context *context, ProgramPipeline *pipeline)
465{
466 pipeline->release(context);
467}
468
469GLuint ProgramPipelineManager::createProgramPipeline()
470{
471 return AllocateEmptyObject(&mHandleAllocator, &mObjectMap);
472}
473
474ProgramPipeline *ProgramPipelineManager::getProgramPipeline(GLuint handle) const
475{
476 return mObjectMap.query(handle);
477}
478
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500479} // namespace gl