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