xref: /aosp_15_r20/external/angle/src/libANGLE/ResourceManager.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2002 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker 
7*8975f5c5SAndroid Build Coastguard Worker // ResourceManager.h : Defines the ResourceManager classes, which handle allocation and lifetime of
8*8975f5c5SAndroid Build Coastguard Worker // GL objects.
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RESOURCEMANAGER_H_
11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RESOURCEMANAGER_H_
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include "angle_gl.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "common/angleutils.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Error.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/HandleAllocator.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/ResourceMap.h"
18*8975f5c5SAndroid Build Coastguard Worker 
19*8975f5c5SAndroid Build Coastguard Worker namespace rx
20*8975f5c5SAndroid Build Coastguard Worker {
21*8975f5c5SAndroid Build Coastguard Worker class GLImplFactory;
22*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
23*8975f5c5SAndroid Build Coastguard Worker 
24*8975f5c5SAndroid Build Coastguard Worker namespace egl
25*8975f5c5SAndroid Build Coastguard Worker {
26*8975f5c5SAndroid Build Coastguard Worker class ShareGroup;
27*8975f5c5SAndroid Build Coastguard Worker }  // namespace egl
28*8975f5c5SAndroid Build Coastguard Worker 
29*8975f5c5SAndroid Build Coastguard Worker namespace gl
30*8975f5c5SAndroid Build Coastguard Worker {
31*8975f5c5SAndroid Build Coastguard Worker class Buffer;
32*8975f5c5SAndroid Build Coastguard Worker struct Caps;
33*8975f5c5SAndroid Build Coastguard Worker class Context;
34*8975f5c5SAndroid Build Coastguard Worker class Framebuffer;
35*8975f5c5SAndroid Build Coastguard Worker struct Limitations;
36*8975f5c5SAndroid Build Coastguard Worker class MemoryObject;
37*8975f5c5SAndroid Build Coastguard Worker class Path;
38*8975f5c5SAndroid Build Coastguard Worker class Program;
39*8975f5c5SAndroid Build Coastguard Worker class ProgramPipeline;
40*8975f5c5SAndroid Build Coastguard Worker class Renderbuffer;
41*8975f5c5SAndroid Build Coastguard Worker class Sampler;
42*8975f5c5SAndroid Build Coastguard Worker class Semaphore;
43*8975f5c5SAndroid Build Coastguard Worker class Shader;
44*8975f5c5SAndroid Build Coastguard Worker class Sync;
45*8975f5c5SAndroid Build Coastguard Worker class Texture;
46*8975f5c5SAndroid Build Coastguard Worker 
47*8975f5c5SAndroid Build Coastguard Worker class ResourceManagerBase : angle::NonCopyable
48*8975f5c5SAndroid Build Coastguard Worker {
49*8975f5c5SAndroid Build Coastguard Worker   public:
50*8975f5c5SAndroid Build Coastguard Worker     ResourceManagerBase();
51*8975f5c5SAndroid Build Coastguard Worker 
52*8975f5c5SAndroid Build Coastguard Worker     void addRef();
53*8975f5c5SAndroid Build Coastguard Worker     void release(const Context *context);
54*8975f5c5SAndroid Build Coastguard Worker 
55*8975f5c5SAndroid Build Coastguard Worker   protected:
56*8975f5c5SAndroid Build Coastguard Worker     virtual void reset(const Context *context) = 0;
57*8975f5c5SAndroid Build Coastguard Worker     virtual ~ResourceManagerBase();
58*8975f5c5SAndroid Build Coastguard Worker 
59*8975f5c5SAndroid Build Coastguard Worker     HandleAllocator mHandleAllocator;
60*8975f5c5SAndroid Build Coastguard Worker 
61*8975f5c5SAndroid Build Coastguard Worker   private:
62*8975f5c5SAndroid Build Coastguard Worker     size_t mRefCount;
63*8975f5c5SAndroid Build Coastguard Worker };
64*8975f5c5SAndroid Build Coastguard Worker 
65*8975f5c5SAndroid Build Coastguard Worker template <typename ResourceType, typename ImplT, typename IDType>
66*8975f5c5SAndroid Build Coastguard Worker class TypedResourceManager : public ResourceManagerBase
67*8975f5c5SAndroid Build Coastguard Worker {
68*8975f5c5SAndroid Build Coastguard Worker   public:
TypedResourceManager()69*8975f5c5SAndroid Build Coastguard Worker     TypedResourceManager() {}
70*8975f5c5SAndroid Build Coastguard Worker 
71*8975f5c5SAndroid Build Coastguard Worker     void deleteObject(const Context *context, IDType handle);
isHandleGenerated(IDType handle)72*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE bool isHandleGenerated(IDType handle) const
73*8975f5c5SAndroid Build Coastguard Worker     {
74*8975f5c5SAndroid Build Coastguard Worker         // Zero is always assumed to have been generated implicitly.
75*8975f5c5SAndroid Build Coastguard Worker         return GetIDValue(handle) == 0 || mObjectMap.contains(handle);
76*8975f5c5SAndroid Build Coastguard Worker     }
77*8975f5c5SAndroid Build Coastguard Worker 
getResourcesForCapture()78*8975f5c5SAndroid Build Coastguard Worker     const ResourceMap<ResourceType, IDType> &getResourcesForCapture() const { return mObjectMap; }
79*8975f5c5SAndroid Build Coastguard Worker 
80*8975f5c5SAndroid Build Coastguard Worker   protected:
81*8975f5c5SAndroid Build Coastguard Worker     ~TypedResourceManager() override;
82*8975f5c5SAndroid Build Coastguard Worker 
83*8975f5c5SAndroid Build Coastguard Worker     // Inlined in the header for performance.
84*8975f5c5SAndroid Build Coastguard Worker     template <typename... ArgTypes>
checkObjectAllocation(rx::GLImplFactory * factory,IDType handle,ArgTypes...args)85*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE ResourceType *checkObjectAllocation(rx::GLImplFactory *factory,
86*8975f5c5SAndroid Build Coastguard Worker                                                      IDType handle,
87*8975f5c5SAndroid Build Coastguard Worker                                                      ArgTypes... args)
88*8975f5c5SAndroid Build Coastguard Worker     {
89*8975f5c5SAndroid Build Coastguard Worker         ResourceType *value = mObjectMap.query(handle);
90*8975f5c5SAndroid Build Coastguard Worker         if (value)
91*8975f5c5SAndroid Build Coastguard Worker         {
92*8975f5c5SAndroid Build Coastguard Worker             return value;
93*8975f5c5SAndroid Build Coastguard Worker         }
94*8975f5c5SAndroid Build Coastguard Worker 
95*8975f5c5SAndroid Build Coastguard Worker         if (GetIDValue(handle) == 0)
96*8975f5c5SAndroid Build Coastguard Worker         {
97*8975f5c5SAndroid Build Coastguard Worker             return nullptr;
98*8975f5c5SAndroid Build Coastguard Worker         }
99*8975f5c5SAndroid Build Coastguard Worker 
100*8975f5c5SAndroid Build Coastguard Worker         return checkObjectAllocationImpl(factory, handle, args...);
101*8975f5c5SAndroid Build Coastguard Worker     }
102*8975f5c5SAndroid Build Coastguard Worker 
103*8975f5c5SAndroid Build Coastguard Worker     void reset(const Context *context) override;
104*8975f5c5SAndroid Build Coastguard Worker 
105*8975f5c5SAndroid Build Coastguard Worker     ResourceMap<ResourceType, IDType> mObjectMap;
106*8975f5c5SAndroid Build Coastguard Worker 
107*8975f5c5SAndroid Build Coastguard Worker   private:
108*8975f5c5SAndroid Build Coastguard Worker     template <typename... ArgTypes>
checkObjectAllocationImpl(rx::GLImplFactory * factory,IDType handle,ArgTypes...args)109*8975f5c5SAndroid Build Coastguard Worker     ResourceType *checkObjectAllocationImpl(rx::GLImplFactory *factory,
110*8975f5c5SAndroid Build Coastguard Worker                                             IDType handle,
111*8975f5c5SAndroid Build Coastguard Worker                                             ArgTypes... args)
112*8975f5c5SAndroid Build Coastguard Worker     {
113*8975f5c5SAndroid Build Coastguard Worker         ResourceType *object = ImplT::AllocateNewObject(factory, handle, args...);
114*8975f5c5SAndroid Build Coastguard Worker 
115*8975f5c5SAndroid Build Coastguard Worker         if (!mObjectMap.contains(handle))
116*8975f5c5SAndroid Build Coastguard Worker         {
117*8975f5c5SAndroid Build Coastguard Worker             this->mHandleAllocator.reserve(GetIDValue(handle));
118*8975f5c5SAndroid Build Coastguard Worker         }
119*8975f5c5SAndroid Build Coastguard Worker         mObjectMap.assign(handle, object);
120*8975f5c5SAndroid Build Coastguard Worker 
121*8975f5c5SAndroid Build Coastguard Worker         return object;
122*8975f5c5SAndroid Build Coastguard Worker     }
123*8975f5c5SAndroid Build Coastguard Worker };
124*8975f5c5SAndroid Build Coastguard Worker 
125*8975f5c5SAndroid Build Coastguard Worker class BufferManager : public TypedResourceManager<Buffer, BufferManager, BufferID>
126*8975f5c5SAndroid Build Coastguard Worker {
127*8975f5c5SAndroid Build Coastguard Worker   public:
128*8975f5c5SAndroid Build Coastguard Worker     BufferID createBuffer();
129*8975f5c5SAndroid Build Coastguard Worker     Buffer *getBuffer(BufferID handle) const;
130*8975f5c5SAndroid Build Coastguard Worker 
checkBufferAllocation(rx::GLImplFactory * factory,BufferID handle)131*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE Buffer *checkBufferAllocation(rx::GLImplFactory *factory, BufferID handle)
132*8975f5c5SAndroid Build Coastguard Worker     {
133*8975f5c5SAndroid Build Coastguard Worker         return checkObjectAllocation(factory, handle);
134*8975f5c5SAndroid Build Coastguard Worker     }
135*8975f5c5SAndroid Build Coastguard Worker 
136*8975f5c5SAndroid Build Coastguard Worker     // TODO(jmadill): Investigate design which doesn't expose these methods publicly.
137*8975f5c5SAndroid Build Coastguard Worker     static Buffer *AllocateNewObject(rx::GLImplFactory *factory, BufferID handle);
138*8975f5c5SAndroid Build Coastguard Worker     static void DeleteObject(const Context *context, Buffer *buffer);
139*8975f5c5SAndroid Build Coastguard Worker 
140*8975f5c5SAndroid Build Coastguard Worker   protected:
141*8975f5c5SAndroid Build Coastguard Worker     ~BufferManager() override;
142*8975f5c5SAndroid Build Coastguard Worker };
143*8975f5c5SAndroid Build Coastguard Worker 
144*8975f5c5SAndroid Build Coastguard Worker class ShaderProgramManager : public ResourceManagerBase
145*8975f5c5SAndroid Build Coastguard Worker {
146*8975f5c5SAndroid Build Coastguard Worker   public:
147*8975f5c5SAndroid Build Coastguard Worker     ShaderProgramManager();
148*8975f5c5SAndroid Build Coastguard Worker 
149*8975f5c5SAndroid Build Coastguard Worker     ShaderProgramID createShader(rx::GLImplFactory *factory,
150*8975f5c5SAndroid Build Coastguard Worker                                  const Limitations &rendererLimitations,
151*8975f5c5SAndroid Build Coastguard Worker                                  ShaderType type);
152*8975f5c5SAndroid Build Coastguard Worker     void deleteShader(const Context *context, ShaderProgramID shader);
153*8975f5c5SAndroid Build Coastguard Worker     Shader *getShader(ShaderProgramID handle) const;
154*8975f5c5SAndroid Build Coastguard Worker 
155*8975f5c5SAndroid Build Coastguard Worker     ShaderProgramID createProgram(rx::GLImplFactory *factory);
156*8975f5c5SAndroid Build Coastguard Worker     void deleteProgram(const Context *context, ShaderProgramID program);
157*8975f5c5SAndroid Build Coastguard Worker 
getProgram(ShaderProgramID handle)158*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE Program *getProgram(ShaderProgramID handle) const
159*8975f5c5SAndroid Build Coastguard Worker     {
160*8975f5c5SAndroid Build Coastguard Worker         return mPrograms.query(handle);
161*8975f5c5SAndroid Build Coastguard Worker     }
162*8975f5c5SAndroid Build Coastguard Worker 
163*8975f5c5SAndroid Build Coastguard Worker     // For capture and performance counters only.
getShadersForCapture()164*8975f5c5SAndroid Build Coastguard Worker     const ResourceMap<Shader, ShaderProgramID> &getShadersForCapture() const { return mShaders; }
getProgramsForCaptureAndPerf()165*8975f5c5SAndroid Build Coastguard Worker     const ResourceMap<Program, ShaderProgramID> &getProgramsForCaptureAndPerf() const
166*8975f5c5SAndroid Build Coastguard Worker     {
167*8975f5c5SAndroid Build Coastguard Worker         return mPrograms;
168*8975f5c5SAndroid Build Coastguard Worker     }
169*8975f5c5SAndroid Build Coastguard Worker 
170*8975f5c5SAndroid Build Coastguard Worker   protected:
171*8975f5c5SAndroid Build Coastguard Worker     ~ShaderProgramManager() override;
172*8975f5c5SAndroid Build Coastguard Worker 
173*8975f5c5SAndroid Build Coastguard Worker   private:
174*8975f5c5SAndroid Build Coastguard Worker     template <typename ObjectType, typename IDType>
175*8975f5c5SAndroid Build Coastguard Worker     void deleteObject(const Context *context,
176*8975f5c5SAndroid Build Coastguard Worker                       ResourceMap<ObjectType, IDType> *objectMap,
177*8975f5c5SAndroid Build Coastguard Worker                       IDType id);
178*8975f5c5SAndroid Build Coastguard Worker 
179*8975f5c5SAndroid Build Coastguard Worker     void reset(const Context *context) override;
180*8975f5c5SAndroid Build Coastguard Worker 
181*8975f5c5SAndroid Build Coastguard Worker     ResourceMap<Shader, ShaderProgramID> mShaders;
182*8975f5c5SAndroid Build Coastguard Worker     ResourceMap<Program, ShaderProgramID> mPrograms;
183*8975f5c5SAndroid Build Coastguard Worker };
184*8975f5c5SAndroid Build Coastguard Worker 
185*8975f5c5SAndroid Build Coastguard Worker class TextureManager : public TypedResourceManager<Texture, TextureManager, TextureID>
186*8975f5c5SAndroid Build Coastguard Worker {
187*8975f5c5SAndroid Build Coastguard Worker   public:
188*8975f5c5SAndroid Build Coastguard Worker     TextureID createTexture();
getTexture(TextureID handle)189*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE Texture *getTexture(TextureID handle) const
190*8975f5c5SAndroid Build Coastguard Worker     {
191*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mObjectMap.query({0}) == nullptr);
192*8975f5c5SAndroid Build Coastguard Worker         return mObjectMap.query(handle);
193*8975f5c5SAndroid Build Coastguard Worker     }
194*8975f5c5SAndroid Build Coastguard Worker 
195*8975f5c5SAndroid Build Coastguard Worker     void signalAllTexturesDirty() const;
196*8975f5c5SAndroid Build Coastguard Worker 
checkTextureAllocation(rx::GLImplFactory * factory,TextureID handle,TextureType type)197*8975f5c5SAndroid Build Coastguard Worker     ANGLE_INLINE Texture *checkTextureAllocation(rx::GLImplFactory *factory,
198*8975f5c5SAndroid Build Coastguard Worker                                                  TextureID handle,
199*8975f5c5SAndroid Build Coastguard Worker                                                  TextureType type)
200*8975f5c5SAndroid Build Coastguard Worker     {
201*8975f5c5SAndroid Build Coastguard Worker         return checkObjectAllocation(factory, handle, type);
202*8975f5c5SAndroid Build Coastguard Worker     }
203*8975f5c5SAndroid Build Coastguard Worker 
204*8975f5c5SAndroid Build Coastguard Worker     static Texture *AllocateNewObject(rx::GLImplFactory *factory,
205*8975f5c5SAndroid Build Coastguard Worker                                       TextureID handle,
206*8975f5c5SAndroid Build Coastguard Worker                                       TextureType type);
207*8975f5c5SAndroid Build Coastguard Worker     static void DeleteObject(const Context *context, Texture *texture);
208*8975f5c5SAndroid Build Coastguard Worker 
209*8975f5c5SAndroid Build Coastguard Worker     void enableHandleAllocatorLogging();
210*8975f5c5SAndroid Build Coastguard Worker 
211*8975f5c5SAndroid Build Coastguard Worker   protected:
212*8975f5c5SAndroid Build Coastguard Worker     ~TextureManager() override;
213*8975f5c5SAndroid Build Coastguard Worker };
214*8975f5c5SAndroid Build Coastguard Worker 
215*8975f5c5SAndroid Build Coastguard Worker class RenderbufferManager
216*8975f5c5SAndroid Build Coastguard Worker     : public TypedResourceManager<Renderbuffer, RenderbufferManager, RenderbufferID>
217*8975f5c5SAndroid Build Coastguard Worker {
218*8975f5c5SAndroid Build Coastguard Worker   public:
219*8975f5c5SAndroid Build Coastguard Worker     RenderbufferID createRenderbuffer();
220*8975f5c5SAndroid Build Coastguard Worker     Renderbuffer *getRenderbuffer(RenderbufferID handle) const;
221*8975f5c5SAndroid Build Coastguard Worker 
checkRenderbufferAllocation(rx::GLImplFactory * factory,RenderbufferID handle)222*8975f5c5SAndroid Build Coastguard Worker     Renderbuffer *checkRenderbufferAllocation(rx::GLImplFactory *factory, RenderbufferID handle)
223*8975f5c5SAndroid Build Coastguard Worker     {
224*8975f5c5SAndroid Build Coastguard Worker         return checkObjectAllocation(factory, handle);
225*8975f5c5SAndroid Build Coastguard Worker     }
226*8975f5c5SAndroid Build Coastguard Worker 
227*8975f5c5SAndroid Build Coastguard Worker     static Renderbuffer *AllocateNewObject(rx::GLImplFactory *factory, RenderbufferID handle);
228*8975f5c5SAndroid Build Coastguard Worker     static void DeleteObject(const Context *context, Renderbuffer *renderbuffer);
229*8975f5c5SAndroid Build Coastguard Worker 
230*8975f5c5SAndroid Build Coastguard Worker   protected:
231*8975f5c5SAndroid Build Coastguard Worker     ~RenderbufferManager() override;
232*8975f5c5SAndroid Build Coastguard Worker };
233*8975f5c5SAndroid Build Coastguard Worker 
234*8975f5c5SAndroid Build Coastguard Worker class SamplerManager : public TypedResourceManager<Sampler, SamplerManager, SamplerID>
235*8975f5c5SAndroid Build Coastguard Worker {
236*8975f5c5SAndroid Build Coastguard Worker   public:
237*8975f5c5SAndroid Build Coastguard Worker     SamplerID createSampler();
238*8975f5c5SAndroid Build Coastguard Worker     Sampler *getSampler(SamplerID handle) const;
239*8975f5c5SAndroid Build Coastguard Worker     bool isSampler(SamplerID sampler) const;
240*8975f5c5SAndroid Build Coastguard Worker 
checkSamplerAllocation(rx::GLImplFactory * factory,SamplerID handle)241*8975f5c5SAndroid Build Coastguard Worker     Sampler *checkSamplerAllocation(rx::GLImplFactory *factory, SamplerID handle)
242*8975f5c5SAndroid Build Coastguard Worker     {
243*8975f5c5SAndroid Build Coastguard Worker         return checkObjectAllocation(factory, handle);
244*8975f5c5SAndroid Build Coastguard Worker     }
245*8975f5c5SAndroid Build Coastguard Worker 
246*8975f5c5SAndroid Build Coastguard Worker     static Sampler *AllocateNewObject(rx::GLImplFactory *factory, SamplerID handle);
247*8975f5c5SAndroid Build Coastguard Worker     static void DeleteObject(const Context *context, Sampler *sampler);
248*8975f5c5SAndroid Build Coastguard Worker 
249*8975f5c5SAndroid Build Coastguard Worker   protected:
250*8975f5c5SAndroid Build Coastguard Worker     ~SamplerManager() override;
251*8975f5c5SAndroid Build Coastguard Worker };
252*8975f5c5SAndroid Build Coastguard Worker 
253*8975f5c5SAndroid Build Coastguard Worker class SyncManager : public TypedResourceManager<Sync, SyncManager, SyncID>
254*8975f5c5SAndroid Build Coastguard Worker {
255*8975f5c5SAndroid Build Coastguard Worker   public:
256*8975f5c5SAndroid Build Coastguard Worker     SyncID createSync(rx::GLImplFactory *factory);
257*8975f5c5SAndroid Build Coastguard Worker     Sync *getSync(SyncID handle) const;
258*8975f5c5SAndroid Build Coastguard Worker 
259*8975f5c5SAndroid Build Coastguard Worker     static void DeleteObject(const Context *context, Sync *sync);
260*8975f5c5SAndroid Build Coastguard Worker 
261*8975f5c5SAndroid Build Coastguard Worker   protected:
262*8975f5c5SAndroid Build Coastguard Worker     ~SyncManager() override;
263*8975f5c5SAndroid Build Coastguard Worker };
264*8975f5c5SAndroid Build Coastguard Worker 
265*8975f5c5SAndroid Build Coastguard Worker class FramebufferManager
266*8975f5c5SAndroid Build Coastguard Worker     : public TypedResourceManager<Framebuffer, FramebufferManager, FramebufferID>
267*8975f5c5SAndroid Build Coastguard Worker {
268*8975f5c5SAndroid Build Coastguard Worker   public:
269*8975f5c5SAndroid Build Coastguard Worker     FramebufferID createFramebuffer();
270*8975f5c5SAndroid Build Coastguard Worker     Framebuffer *getFramebuffer(FramebufferID handle) const;
271*8975f5c5SAndroid Build Coastguard Worker     void setDefaultFramebuffer(Framebuffer *framebuffer);
272*8975f5c5SAndroid Build Coastguard Worker     Framebuffer *getDefaultFramebuffer() const;
273*8975f5c5SAndroid Build Coastguard Worker 
274*8975f5c5SAndroid Build Coastguard Worker     void invalidateFramebufferCompletenessCache() const;
275*8975f5c5SAndroid Build Coastguard Worker 
checkFramebufferAllocation(rx::GLImplFactory * factory,const Context * context,FramebufferID handle)276*8975f5c5SAndroid Build Coastguard Worker     Framebuffer *checkFramebufferAllocation(rx::GLImplFactory *factory,
277*8975f5c5SAndroid Build Coastguard Worker                                             const Context *context,
278*8975f5c5SAndroid Build Coastguard Worker                                             FramebufferID handle)
279*8975f5c5SAndroid Build Coastguard Worker     {
280*8975f5c5SAndroid Build Coastguard Worker         return checkObjectAllocation(factory, handle, context);
281*8975f5c5SAndroid Build Coastguard Worker     }
282*8975f5c5SAndroid Build Coastguard Worker 
283*8975f5c5SAndroid Build Coastguard Worker     static Framebuffer *AllocateNewObject(rx::GLImplFactory *factory,
284*8975f5c5SAndroid Build Coastguard Worker                                           FramebufferID handle,
285*8975f5c5SAndroid Build Coastguard Worker                                           const Context *context);
286*8975f5c5SAndroid Build Coastguard Worker     static void DeleteObject(const Context *context, Framebuffer *framebuffer);
287*8975f5c5SAndroid Build Coastguard Worker 
288*8975f5c5SAndroid Build Coastguard Worker   protected:
289*8975f5c5SAndroid Build Coastguard Worker     ~FramebufferManager() override;
290*8975f5c5SAndroid Build Coastguard Worker };
291*8975f5c5SAndroid Build Coastguard Worker 
292*8975f5c5SAndroid Build Coastguard Worker class ProgramPipelineManager
293*8975f5c5SAndroid Build Coastguard Worker     : public TypedResourceManager<ProgramPipeline, ProgramPipelineManager, ProgramPipelineID>
294*8975f5c5SAndroid Build Coastguard Worker {
295*8975f5c5SAndroid Build Coastguard Worker   public:
296*8975f5c5SAndroid Build Coastguard Worker     ProgramPipelineID createProgramPipeline();
297*8975f5c5SAndroid Build Coastguard Worker     ProgramPipeline *getProgramPipeline(ProgramPipelineID handle) const;
298*8975f5c5SAndroid Build Coastguard Worker 
checkProgramPipelineAllocation(rx::GLImplFactory * factory,ProgramPipelineID handle)299*8975f5c5SAndroid Build Coastguard Worker     ProgramPipeline *checkProgramPipelineAllocation(rx::GLImplFactory *factory,
300*8975f5c5SAndroid Build Coastguard Worker                                                     ProgramPipelineID handle)
301*8975f5c5SAndroid Build Coastguard Worker     {
302*8975f5c5SAndroid Build Coastguard Worker         return checkObjectAllocation(factory, handle);
303*8975f5c5SAndroid Build Coastguard Worker     }
304*8975f5c5SAndroid Build Coastguard Worker 
305*8975f5c5SAndroid Build Coastguard Worker     static ProgramPipeline *AllocateNewObject(rx::GLImplFactory *factory, ProgramPipelineID handle);
306*8975f5c5SAndroid Build Coastguard Worker     static void DeleteObject(const Context *context, ProgramPipeline *pipeline);
307*8975f5c5SAndroid Build Coastguard Worker 
308*8975f5c5SAndroid Build Coastguard Worker   protected:
309*8975f5c5SAndroid Build Coastguard Worker     ~ProgramPipelineManager() override;
310*8975f5c5SAndroid Build Coastguard Worker };
311*8975f5c5SAndroid Build Coastguard Worker 
312*8975f5c5SAndroid Build Coastguard Worker class MemoryObjectManager : public ResourceManagerBase
313*8975f5c5SAndroid Build Coastguard Worker {
314*8975f5c5SAndroid Build Coastguard Worker   public:
315*8975f5c5SAndroid Build Coastguard Worker     MemoryObjectManager();
316*8975f5c5SAndroid Build Coastguard Worker 
317*8975f5c5SAndroid Build Coastguard Worker     MemoryObjectID createMemoryObject(rx::GLImplFactory *factory);
318*8975f5c5SAndroid Build Coastguard Worker     void deleteMemoryObject(const Context *context, MemoryObjectID handle);
319*8975f5c5SAndroid Build Coastguard Worker     MemoryObject *getMemoryObject(MemoryObjectID handle) const;
320*8975f5c5SAndroid Build Coastguard Worker 
321*8975f5c5SAndroid Build Coastguard Worker   protected:
322*8975f5c5SAndroid Build Coastguard Worker     ~MemoryObjectManager() override;
323*8975f5c5SAndroid Build Coastguard Worker 
324*8975f5c5SAndroid Build Coastguard Worker   private:
325*8975f5c5SAndroid Build Coastguard Worker     void reset(const Context *context) override;
326*8975f5c5SAndroid Build Coastguard Worker 
327*8975f5c5SAndroid Build Coastguard Worker     ResourceMap<MemoryObject, MemoryObjectID> mMemoryObjects;
328*8975f5c5SAndroid Build Coastguard Worker };
329*8975f5c5SAndroid Build Coastguard Worker 
330*8975f5c5SAndroid Build Coastguard Worker class SemaphoreManager : public ResourceManagerBase
331*8975f5c5SAndroid Build Coastguard Worker {
332*8975f5c5SAndroid Build Coastguard Worker   public:
333*8975f5c5SAndroid Build Coastguard Worker     SemaphoreManager();
334*8975f5c5SAndroid Build Coastguard Worker 
335*8975f5c5SAndroid Build Coastguard Worker     SemaphoreID createSemaphore(rx::GLImplFactory *factory);
336*8975f5c5SAndroid Build Coastguard Worker     void deleteSemaphore(const Context *context, SemaphoreID handle);
337*8975f5c5SAndroid Build Coastguard Worker     Semaphore *getSemaphore(SemaphoreID handle) const;
338*8975f5c5SAndroid Build Coastguard Worker 
339*8975f5c5SAndroid Build Coastguard Worker   protected:
340*8975f5c5SAndroid Build Coastguard Worker     ~SemaphoreManager() override;
341*8975f5c5SAndroid Build Coastguard Worker 
342*8975f5c5SAndroid Build Coastguard Worker   private:
343*8975f5c5SAndroid Build Coastguard Worker     void reset(const Context *context) override;
344*8975f5c5SAndroid Build Coastguard Worker 
345*8975f5c5SAndroid Build Coastguard Worker     ResourceMap<Semaphore, SemaphoreID> mSemaphores;
346*8975f5c5SAndroid Build Coastguard Worker };
347*8975f5c5SAndroid Build Coastguard Worker }  // namespace gl
348*8975f5c5SAndroid Build Coastguard Worker 
349*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_RESOURCEMANAGER_H_
350