blob: 7f0936c603ea28ffb1c567e59b055f72d4c874b0 [file] [log] [blame]
Nicolas Capens0bac2852016-05-07 06:09:58 -04001// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
Nicolas Capensdbf6fc82014-10-23 13:33:20 -04002//
Nicolas Capens0bac2852016-05-07 06:09:58 -04003// 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
Nicolas Capensdbf6fc82014-10-23 13:33:20 -04006//
Nicolas Capens0bac2852016-05-07 06:09:58 -04007// http://www.apache.org/licenses/LICENSE-2.0
Nicolas Capensdbf6fc82014-10-23 13:33:20 -04008//
Nicolas Capens0bac2852016-05-07 06:09:58 -04009// 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.
Nicolas Capensdbf6fc82014-10-23 13:33:20 -040014
Nicolas Capensfddfe9c2016-03-23 00:26:46 -040015// ResourceManager.cpp: Implements the ResourceManager class, which tracks and
Nicolas Capensdbf6fc82014-10-23 13:33:20 -040016// retrieves objects which may be shared by multiple Contexts.
17
18#include "ResourceManager.h"
19
20#include "Buffer.h"
Nicolas Capensdbf6fc82014-10-23 13:33:20 -040021#include "Renderbuffer.h"
Nicolas Capensdbf6fc82014-10-23 13:33:20 -040022#include "Texture.h"
23
Nicolas Capens14ee7622014-10-28 23:48:41 -040024namespace es1
Nicolas Capensdbf6fc82014-10-23 13:33:20 -040025{
26ResourceManager::ResourceManager()
27{
Nicolas Capens0bac2852016-05-07 06:09:58 -040028 mRefCount = 1;
Nicolas Capensdbf6fc82014-10-23 13:33:20 -040029}
30
31ResourceManager::~ResourceManager()
32{
Nicolas Capens0bac2852016-05-07 06:09:58 -040033 while(!mBufferNameSpace.empty())
34 {
35 deleteBuffer(mBufferNameSpace.firstName());
36 }
Nicolas Capensdbf6fc82014-10-23 13:33:20 -040037
Nicolas Capens0bac2852016-05-07 06:09:58 -040038 while(!mRenderbufferNameSpace.empty())
39 {
40 deleteRenderbuffer(mRenderbufferNameSpace.firstName());
41 }
Nicolas Capensdbf6fc82014-10-23 13:33:20 -040042
Nicolas Capens0bac2852016-05-07 06:09:58 -040043 while(!mTextureNameSpace.empty())
44 {
45 deleteTexture(mTextureNameSpace.firstName());
46 }
Nicolas Capensdbf6fc82014-10-23 13:33:20 -040047}
48
49void ResourceManager::addRef()
50{
Nicolas Capens0bac2852016-05-07 06:09:58 -040051 mRefCount++;
Nicolas Capensdbf6fc82014-10-23 13:33:20 -040052}
53
54void ResourceManager::release()
55{
Nicolas Capens0bac2852016-05-07 06:09:58 -040056 if(--mRefCount == 0)
57 {
58 delete this;
59 }
Nicolas Capensdbf6fc82014-10-23 13:33:20 -040060}
61
62// Returns an unused buffer name
63GLuint ResourceManager::createBuffer()
64{
Nicolas Capens0bac2852016-05-07 06:09:58 -040065 return mBufferNameSpace.allocate();
Nicolas Capensdbf6fc82014-10-23 13:33:20 -040066}
67
Nicolas Capensdbf6fc82014-10-23 13:33:20 -040068// Returns an unused texture name
69GLuint ResourceManager::createTexture()
70{
Nicolas Capens0bac2852016-05-07 06:09:58 -040071 return mTextureNameSpace.allocate();
Nicolas Capensdbf6fc82014-10-23 13:33:20 -040072}
73
74// Returns an unused renderbuffer name
75GLuint ResourceManager::createRenderbuffer()
76{
Nicolas Capens0bac2852016-05-07 06:09:58 -040077 return mRenderbufferNameSpace.allocate();
Nicolas Capensdbf6fc82014-10-23 13:33:20 -040078}
79
80void ResourceManager::deleteBuffer(GLuint buffer)
81{
Nicolas Capens0bac2852016-05-07 06:09:58 -040082 Buffer *bufferObject = mBufferNameSpace.remove(buffer);
Nicolas Capensdbf6fc82014-10-23 13:33:20 -040083
Nicolas Capens0bac2852016-05-07 06:09:58 -040084 if(bufferObject)
85 {
Nicolas Capens5669f0d2016-03-23 02:08:57 -040086 bufferObject->release();
Nicolas Capens0bac2852016-05-07 06:09:58 -040087 }
Nicolas Capensdbf6fc82014-10-23 13:33:20 -040088}
89
Nicolas Capensdbf6fc82014-10-23 13:33:20 -040090void ResourceManager::deleteTexture(GLuint texture)
91{
Nicolas Capens0bac2852016-05-07 06:09:58 -040092 Texture *textureObject = mTextureNameSpace.remove(texture);
Nicolas Capensdbf6fc82014-10-23 13:33:20 -040093
Nicolas Capens0bac2852016-05-07 06:09:58 -040094 if(textureObject)
95 {
Nicolas Capens5669f0d2016-03-23 02:08:57 -040096 textureObject->release();
Nicolas Capens0bac2852016-05-07 06:09:58 -040097 }
Nicolas Capensdbf6fc82014-10-23 13:33:20 -040098}
99
100void ResourceManager::deleteRenderbuffer(GLuint renderbuffer)
101{
Nicolas Capens0bac2852016-05-07 06:09:58 -0400102 Renderbuffer *renderbufferObject = mRenderbufferNameSpace.remove(renderbuffer);
Nicolas Capensdbf6fc82014-10-23 13:33:20 -0400103
Nicolas Capens0bac2852016-05-07 06:09:58 -0400104 if(renderbufferObject)
105 {
Nicolas Capens5669f0d2016-03-23 02:08:57 -0400106 renderbufferObject->release();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400107 }
Nicolas Capensdbf6fc82014-10-23 13:33:20 -0400108}
109
110Buffer *ResourceManager::getBuffer(unsigned int handle)
111{
Nicolas Capens0bac2852016-05-07 06:09:58 -0400112 return mBufferNameSpace.find(handle);
Nicolas Capensdbf6fc82014-10-23 13:33:20 -0400113}
114
Nicolas Capensdbf6fc82014-10-23 13:33:20 -0400115Texture *ResourceManager::getTexture(unsigned int handle)
116{
Nicolas Capens0bac2852016-05-07 06:09:58 -0400117 return mTextureNameSpace.find(handle);
Nicolas Capensdbf6fc82014-10-23 13:33:20 -0400118}
119
Nicolas Capensdbf6fc82014-10-23 13:33:20 -0400120Renderbuffer *ResourceManager::getRenderbuffer(unsigned int handle)
121{
Nicolas Capens0bac2852016-05-07 06:09:58 -0400122 return mRenderbufferNameSpace.find(handle);
Nicolas Capensdbf6fc82014-10-23 13:33:20 -0400123}
124
125void ResourceManager::checkBufferAllocation(unsigned int buffer)
126{
Nicolas Capens0bac2852016-05-07 06:09:58 -0400127 if(buffer != 0 && !getBuffer(buffer))
128 {
129 Buffer *bufferObject = new Buffer(buffer);
Nicolas Capensfddfe9c2016-03-23 00:26:46 -0400130 bufferObject->addRef();
131
Nicolas Capens5669f0d2016-03-23 02:08:57 -0400132 mBufferNameSpace.insert(buffer, bufferObject);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400133 }
Nicolas Capensdbf6fc82014-10-23 13:33:20 -0400134}
135
136void ResourceManager::checkTextureAllocation(GLuint texture, TextureType type)
137{
Nicolas Capens0bac2852016-05-07 06:09:58 -0400138 if(!getTexture(texture) && texture != 0)
139 {
140 Texture *textureObject;
Nicolas Capensdbf6fc82014-10-23 13:33:20 -0400141
Nicolas Capens0bac2852016-05-07 06:09:58 -0400142 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 }
Nicolas Capensdbf6fc82014-10-23 13:33:20 -0400155
Nicolas Capensfddfe9c2016-03-23 00:26:46 -0400156 textureObject->addRef();
157
Nicolas Capens5669f0d2016-03-23 02:08:57 -0400158 mTextureNameSpace.insert(texture, textureObject);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400159 }
Nicolas Capensdbf6fc82014-10-23 13:33:20 -0400160}
161
Nicolas Capensfddfe9c2016-03-23 00:26:46 -0400162void 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
Nicolas Capens5669f0d2016-03-23 02:08:57 -0400169 mRenderbufferNameSpace.insert(handle, renderbufferObject);
Nicolas Capensfddfe9c2016-03-23 00:26:46 -0400170 }
171}
172
Nicolas Capensdbf6fc82014-10-23 13:33:20 -0400173}