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.cpp: Implements the ResourceManager class, which tracks and
16 // retrieves objects which may be shared by multiple Contexts.
17 
18 #include "ResourceManager.h"
19 
20 #include "Buffer.h"
21 #include "Renderbuffer.h"
22 #include "Texture.h"
23 
24 namespace es1
25 {
ResourceManager()26 ResourceManager::ResourceManager()
27 {
28 	mRefCount = 1;
29 }
30 
~ResourceManager()31 ResourceManager::~ResourceManager()
32 {
33 	while(!mBufferNameSpace.empty())
34 	{
35 		deleteBuffer(mBufferNameSpace.firstName());
36 	}
37 
38 	while(!mRenderbufferNameSpace.empty())
39 	{
40 		deleteRenderbuffer(mRenderbufferNameSpace.firstName());
41 	}
42 
43 	while(!mTextureNameSpace.empty())
44 	{
45 		deleteTexture(mTextureNameSpace.firstName());
46 	}
47 }
48 
addRef()49 void ResourceManager::addRef()
50 {
51 	mRefCount++;
52 }
53 
release()54 void ResourceManager::release()
55 {
56 	if(--mRefCount == 0)
57 	{
58 		delete this;
59 	}
60 }
61 
62 // Returns an unused buffer name
createBuffer()63 GLuint ResourceManager::createBuffer()
64 {
65 	return mBufferNameSpace.allocate();
66 }
67 
68 // Returns an unused texture name
createTexture()69 GLuint ResourceManager::createTexture()
70 {
71 	return mTextureNameSpace.allocate();
72 }
73 
74 // Returns an unused renderbuffer name
createRenderbuffer()75 GLuint ResourceManager::createRenderbuffer()
76 {
77 	return mRenderbufferNameSpace.allocate();
78 }
79 
deleteBuffer(GLuint buffer)80 void ResourceManager::deleteBuffer(GLuint buffer)
81 {
82 	Buffer *bufferObject = mBufferNameSpace.remove(buffer);
83 
84 	if(bufferObject)
85 	{
86 		bufferObject->release();
87 	}
88 }
89 
deleteTexture(GLuint texture)90 void ResourceManager::deleteTexture(GLuint texture)
91 {
92 	Texture *textureObject = mTextureNameSpace.remove(texture);
93 
94 	if(textureObject)
95 	{
96 		textureObject->release();
97 	}
98 }
99 
deleteRenderbuffer(GLuint renderbuffer)100 void ResourceManager::deleteRenderbuffer(GLuint renderbuffer)
101 {
102 	Renderbuffer *renderbufferObject = mRenderbufferNameSpace.remove(renderbuffer);
103 
104 	if(renderbufferObject)
105 	{
106 		renderbufferObject->release();
107 	}
108 }
109 
getBuffer(unsigned int handle)110 Buffer *ResourceManager::getBuffer(unsigned int handle)
111 {
112 	return mBufferNameSpace.find(handle);
113 }
114 
getTexture(unsigned int handle)115 Texture *ResourceManager::getTexture(unsigned int handle)
116 {
117 	return mTextureNameSpace.find(handle);
118 }
119 
getRenderbuffer(unsigned int handle)120 Renderbuffer *ResourceManager::getRenderbuffer(unsigned int handle)
121 {
122 	return mRenderbufferNameSpace.find(handle);
123 }
124 
checkBufferAllocation(unsigned int buffer)125 void ResourceManager::checkBufferAllocation(unsigned int buffer)
126 {
127 	if(buffer != 0 && !getBuffer(buffer))
128 	{
129 		Buffer *bufferObject = new Buffer(buffer);
130 		bufferObject->addRef();
131 
132 		mBufferNameSpace.insert(buffer, bufferObject);
133 	}
134 }
135 
checkTextureAllocation(GLuint texture,TextureType type)136 void ResourceManager::checkTextureAllocation(GLuint texture, TextureType type)
137 {
138 	if(!getTexture(texture) && texture != 0)
139 	{
140 		Texture *textureObject;
141 
142 		if(type == TEXTURE_2D)
143 		{
144 			textureObject = new Texture2D(texture);
145 		}
146 		else if(type == TEXTURE_EXTERNAL)
147 		{
148 			textureObject = new TextureExternal(texture);
149 		}
150 		else
151 		{
152 			UNREACHABLE(type);
153 			return;
154 		}
155 
156 		textureObject->addRef();
157 
158 		mTextureNameSpace.insert(texture, textureObject);
159 	}
160 }
161 
checkRenderbufferAllocation(GLuint handle)162 void ResourceManager::checkRenderbufferAllocation(GLuint handle)
163 {
164 	if(handle != 0 && !getRenderbuffer(handle))
165 	{
166 		Renderbuffer *renderbufferObject = new Renderbuffer(handle, new Colorbuffer(0, 0, GL_RGBA4_OES, 0));
167 		renderbufferObject->addRef();
168 
169 		mRenderbufferNameSpace.insert(handle, renderbufferObject);
170 	}
171 }
172 
173 }
174