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