1//
2// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// ResourceManager.h : Defines the ResourceManager class, which tracks objects
8// shared by multiple GL contexts.
9
10#ifndef LIBGLESV2_RESOURCEMANAGER_H_
11#define LIBGLESV2_RESOURCEMANAGER_H_
12
13#include "common/angleutils.h"
14#include "libGLESv2/angletypes.h"
15#include "libGLESv2/HandleAllocator.h"
16
17#include "angle_gl.h"
18
19#include <unordered_map>
20
21namespace rx
22{
23class Renderer;
24}
25
26namespace gl
27{
28class Buffer;
29class Shader;
30class Program;
31class Texture;
32class Renderbuffer;
33class Sampler;
34class FenceSync;
35
36class ResourceManager
37{
38  public:
39    explicit ResourceManager(rx::Renderer *renderer);
40    ~ResourceManager();
41
42    void addRef();
43    void release();
44
45    GLuint createBuffer();
46    GLuint createShader(GLenum type);
47    GLuint createProgram();
48    GLuint createTexture();
49    GLuint createRenderbuffer();
50    GLuint createSampler();
51    GLuint createFenceSync();
52
53    void deleteBuffer(GLuint buffer);
54    void deleteShader(GLuint shader);
55    void deleteProgram(GLuint program);
56    void deleteTexture(GLuint texture);
57    void deleteRenderbuffer(GLuint renderbuffer);
58    void deleteSampler(GLuint sampler);
59    void deleteFenceSync(GLuint fenceSync);
60
61    Buffer *getBuffer(GLuint handle);
62    Shader *getShader(GLuint handle);
63    Program *getProgram(GLuint handle);
64    Texture *getTexture(GLuint handle);
65    Renderbuffer *getRenderbuffer(GLuint handle);
66    Sampler *getSampler(GLuint handle);
67    FenceSync *getFenceSync(GLuint handle);
68
69    void setRenderbuffer(GLuint handle, Renderbuffer *renderbuffer);
70
71    void checkBufferAllocation(unsigned int buffer);
72    void checkTextureAllocation(GLuint texture, GLenum type);
73    void checkRenderbufferAllocation(GLuint renderbuffer);
74    void checkSamplerAllocation(GLuint sampler);
75
76    bool isSampler(GLuint sampler);
77
78  private:
79    DISALLOW_COPY_AND_ASSIGN(ResourceManager);
80
81    std::size_t mRefCount;
82    rx::Renderer *mRenderer;
83
84    typedef std::unordered_map<GLuint, Buffer*> BufferMap;
85    BufferMap mBufferMap;
86    HandleAllocator mBufferHandleAllocator;
87
88    typedef std::unordered_map<GLuint, Shader*> ShaderMap;
89    ShaderMap mShaderMap;
90
91    typedef std::unordered_map<GLuint, Program*> ProgramMap;
92    ProgramMap mProgramMap;
93    HandleAllocator mProgramShaderHandleAllocator;
94
95    typedef std::unordered_map<GLuint, Texture*> TextureMap;
96    TextureMap mTextureMap;
97    HandleAllocator mTextureHandleAllocator;
98
99    typedef std::unordered_map<GLuint, Renderbuffer*> RenderbufferMap;
100    RenderbufferMap mRenderbufferMap;
101    HandleAllocator mRenderbufferHandleAllocator;
102
103    typedef std::unordered_map<GLuint, Sampler*> SamplerMap;
104    SamplerMap mSamplerMap;
105    HandleAllocator mSamplerHandleAllocator;
106
107    typedef std::unordered_map<GLuint, FenceSync*> FenceMap;
108    FenceMap mFenceSyncMap;
109    HandleAllocator mFenceSyncHandleAllocator;
110};
111
112}
113
114#endif // LIBGLESV2_RESOURCEMANAGER_H_
115