1 // Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //    http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 // ResourceManager.h : Defines the ResourceManager class, which tracks objects
16 // shared by multiple GL contexts.
17 
18 #ifndef LIBGLESV2_RESOURCEMANAGER_H_
19 #define LIBGLESV2_RESOURCEMANAGER_H_
20 
21 #include "common/NameSpace.hpp"
22 #include "Common/MutexLock.hpp"
23 
24 #include <GLES2/gl2.h>
25 
26 #include <map>
27 
28 namespace es2
29 {
30 class Buffer;
31 class Shader;
32 class Program;
33 class Texture;
34 class Renderbuffer;
35 class Sampler;
36 class FenceSync;
37 
38 enum TextureType
39 {
40 	TEXTURE_2D,
41 	TEXTURE_3D,
42 	TEXTURE_2D_ARRAY,
43 	TEXTURE_CUBE,
44 	TEXTURE_2D_RECT,
45 	TEXTURE_EXTERNAL,
46 
47 	TEXTURE_TYPE_COUNT,
48 	TEXTURE_UNKNOWN
49 };
50 
51 class ResourceManager
52 {
53 public:
54 	ResourceManager();
55 	~ResourceManager();
56 
57 	void addRef();
58 	void release();
59 
60 	GLuint createBuffer();
61 	GLuint createShader(GLenum type);
62 	GLuint createProgram();
63 	GLuint createTexture();
64 	GLuint createRenderbuffer();
65 	GLuint createSampler();
66 	GLuint createFenceSync(GLenum condition, GLbitfield flags);
67 
68 	void deleteBuffer(GLuint buffer);
69 	void deleteShader(GLuint shader);
70 	void deleteProgram(GLuint program);
71 	void deleteTexture(GLuint texture);
72 	void deleteRenderbuffer(GLuint renderbuffer);
73 	void deleteSampler(GLuint sampler);
74 	void deleteFenceSync(GLuint fenceSync);
75 
76 	Buffer *getBuffer(GLuint handle);
77 	Shader *getShader(GLuint handle);
78 	Program *getProgram(GLuint handle);
79 	Texture *getTexture(GLuint handle);
80 	Renderbuffer *getRenderbuffer(GLuint handle);
81 	Sampler *getSampler(GLuint handle);
82 	FenceSync *getFenceSync(GLuint handle);
83 
84 	void checkBufferAllocation(unsigned int buffer);
85 	void checkTextureAllocation(GLuint texture, TextureType type);
86 	void checkRenderbufferAllocation(GLuint handle);
87 	void checkSamplerAllocation(GLuint sampler);
88 
89 	bool isSampler(GLuint sampler);
getLock()90 	sw::MutexLock *getLock() { return &mMutex; }
91 
92 private:
93 	std::size_t mRefCount;
94 	sw::MutexLock mMutex;
95 
96 	gl::NameSpace<Buffer> mBufferNameSpace;
97 	gl::NameSpace<Program> mProgramNameSpace;
98 	gl::NameSpace<Shader> mShaderNameSpace;
99 	gl::NameSpace<void> mProgramShaderNameSpace;   // Shaders and programs share a namespace
100 	gl::NameSpace<Texture> mTextureNameSpace;
101 	gl::NameSpace<Renderbuffer> mRenderbufferNameSpace;
102 	gl::NameSpace<Sampler> mSamplerNameSpace;
103 	gl::NameSpace<FenceSync> mFenceSyncNameSpace;
104 };
105 
106 }
107 
108 #endif // LIBGLESV2_RESOURCEMANAGER_H_
109