1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/angle/src/libGLESv2/ResourceManager.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,322 @@ 1.4 +#include "precompiled.h" 1.5 +// 1.6 +// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. 1.7 +// Use of this source code is governed by a BSD-style license that can be 1.8 +// found in the LICENSE file. 1.9 +// 1.10 + 1.11 +// ResourceManager.cpp: Implements the gl::ResourceManager class, which tracks and 1.12 +// retrieves objects which may be shared by multiple Contexts. 1.13 + 1.14 +#include "libGLESv2/ResourceManager.h" 1.15 + 1.16 +#include "libGLESv2/Buffer.h" 1.17 +#include "libGLESv2/Program.h" 1.18 +#include "libGLESv2/Renderbuffer.h" 1.19 +#include "libGLESv2/Shader.h" 1.20 +#include "libGLESv2/Texture.h" 1.21 + 1.22 +namespace gl 1.23 +{ 1.24 +ResourceManager::ResourceManager(rx::Renderer *renderer) 1.25 +{ 1.26 + mRefCount = 1; 1.27 + mRenderer = renderer; 1.28 +} 1.29 + 1.30 +ResourceManager::~ResourceManager() 1.31 +{ 1.32 + while (!mBufferMap.empty()) 1.33 + { 1.34 + deleteBuffer(mBufferMap.begin()->first); 1.35 + } 1.36 + 1.37 + while (!mProgramMap.empty()) 1.38 + { 1.39 + deleteProgram(mProgramMap.begin()->first); 1.40 + } 1.41 + 1.42 + while (!mShaderMap.empty()) 1.43 + { 1.44 + deleteShader(mShaderMap.begin()->first); 1.45 + } 1.46 + 1.47 + while (!mRenderbufferMap.empty()) 1.48 + { 1.49 + deleteRenderbuffer(mRenderbufferMap.begin()->first); 1.50 + } 1.51 + 1.52 + while (!mTextureMap.empty()) 1.53 + { 1.54 + deleteTexture(mTextureMap.begin()->first); 1.55 + } 1.56 +} 1.57 + 1.58 +void ResourceManager::addRef() 1.59 +{ 1.60 + mRefCount++; 1.61 +} 1.62 + 1.63 +void ResourceManager::release() 1.64 +{ 1.65 + if (--mRefCount == 0) 1.66 + { 1.67 + delete this; 1.68 + } 1.69 +} 1.70 + 1.71 +// Returns an unused buffer name 1.72 +GLuint ResourceManager::createBuffer() 1.73 +{ 1.74 + GLuint handle = mBufferHandleAllocator.allocate(); 1.75 + 1.76 + mBufferMap[handle] = NULL; 1.77 + 1.78 + return handle; 1.79 +} 1.80 + 1.81 +// Returns an unused shader/program name 1.82 +GLuint ResourceManager::createShader(GLenum type) 1.83 +{ 1.84 + GLuint handle = mProgramShaderHandleAllocator.allocate(); 1.85 + 1.86 + if (type == GL_VERTEX_SHADER) 1.87 + { 1.88 + mShaderMap[handle] = new VertexShader(this, mRenderer, handle); 1.89 + } 1.90 + else if (type == GL_FRAGMENT_SHADER) 1.91 + { 1.92 + mShaderMap[handle] = new FragmentShader(this, mRenderer, handle); 1.93 + } 1.94 + else UNREACHABLE(); 1.95 + 1.96 + return handle; 1.97 +} 1.98 + 1.99 +// Returns an unused program/shader name 1.100 +GLuint ResourceManager::createProgram() 1.101 +{ 1.102 + GLuint handle = mProgramShaderHandleAllocator.allocate(); 1.103 + 1.104 + mProgramMap[handle] = new Program(mRenderer, this, handle); 1.105 + 1.106 + return handle; 1.107 +} 1.108 + 1.109 +// Returns an unused texture name 1.110 +GLuint ResourceManager::createTexture() 1.111 +{ 1.112 + GLuint handle = mTextureHandleAllocator.allocate(); 1.113 + 1.114 + mTextureMap[handle] = NULL; 1.115 + 1.116 + return handle; 1.117 +} 1.118 + 1.119 +// Returns an unused renderbuffer name 1.120 +GLuint ResourceManager::createRenderbuffer() 1.121 +{ 1.122 + GLuint handle = mRenderbufferHandleAllocator.allocate(); 1.123 + 1.124 + mRenderbufferMap[handle] = NULL; 1.125 + 1.126 + return handle; 1.127 +} 1.128 + 1.129 +void ResourceManager::deleteBuffer(GLuint buffer) 1.130 +{ 1.131 + BufferMap::iterator bufferObject = mBufferMap.find(buffer); 1.132 + 1.133 + if (bufferObject != mBufferMap.end()) 1.134 + { 1.135 + mBufferHandleAllocator.release(bufferObject->first); 1.136 + if (bufferObject->second) bufferObject->second->release(); 1.137 + mBufferMap.erase(bufferObject); 1.138 + } 1.139 +} 1.140 + 1.141 +void ResourceManager::deleteShader(GLuint shader) 1.142 +{ 1.143 + ShaderMap::iterator shaderObject = mShaderMap.find(shader); 1.144 + 1.145 + if (shaderObject != mShaderMap.end()) 1.146 + { 1.147 + if (shaderObject->second->getRefCount() == 0) 1.148 + { 1.149 + mProgramShaderHandleAllocator.release(shaderObject->first); 1.150 + delete shaderObject->second; 1.151 + mShaderMap.erase(shaderObject); 1.152 + } 1.153 + else 1.154 + { 1.155 + shaderObject->second->flagForDeletion(); 1.156 + } 1.157 + } 1.158 +} 1.159 + 1.160 +void ResourceManager::deleteProgram(GLuint program) 1.161 +{ 1.162 + ProgramMap::iterator programObject = mProgramMap.find(program); 1.163 + 1.164 + if (programObject != mProgramMap.end()) 1.165 + { 1.166 + if (programObject->second->getRefCount() == 0) 1.167 + { 1.168 + mProgramShaderHandleAllocator.release(programObject->first); 1.169 + delete programObject->second; 1.170 + mProgramMap.erase(programObject); 1.171 + } 1.172 + else 1.173 + { 1.174 + programObject->second->flagForDeletion(); 1.175 + } 1.176 + } 1.177 +} 1.178 + 1.179 +void ResourceManager::deleteTexture(GLuint texture) 1.180 +{ 1.181 + TextureMap::iterator textureObject = mTextureMap.find(texture); 1.182 + 1.183 + if (textureObject != mTextureMap.end()) 1.184 + { 1.185 + mTextureHandleAllocator.release(textureObject->first); 1.186 + if (textureObject->second) textureObject->second->release(); 1.187 + mTextureMap.erase(textureObject); 1.188 + } 1.189 +} 1.190 + 1.191 +void ResourceManager::deleteRenderbuffer(GLuint renderbuffer) 1.192 +{ 1.193 + RenderbufferMap::iterator renderbufferObject = mRenderbufferMap.find(renderbuffer); 1.194 + 1.195 + if (renderbufferObject != mRenderbufferMap.end()) 1.196 + { 1.197 + mRenderbufferHandleAllocator.release(renderbufferObject->first); 1.198 + if (renderbufferObject->second) renderbufferObject->second->release(); 1.199 + mRenderbufferMap.erase(renderbufferObject); 1.200 + } 1.201 +} 1.202 + 1.203 +Buffer *ResourceManager::getBuffer(unsigned int handle) 1.204 +{ 1.205 + BufferMap::iterator buffer = mBufferMap.find(handle); 1.206 + 1.207 + if (buffer == mBufferMap.end()) 1.208 + { 1.209 + return NULL; 1.210 + } 1.211 + else 1.212 + { 1.213 + return buffer->second; 1.214 + } 1.215 +} 1.216 + 1.217 +Shader *ResourceManager::getShader(unsigned int handle) 1.218 +{ 1.219 + ShaderMap::iterator shader = mShaderMap.find(handle); 1.220 + 1.221 + if (shader == mShaderMap.end()) 1.222 + { 1.223 + return NULL; 1.224 + } 1.225 + else 1.226 + { 1.227 + return shader->second; 1.228 + } 1.229 +} 1.230 + 1.231 +Texture *ResourceManager::getTexture(unsigned int handle) 1.232 +{ 1.233 + if (handle == 0) return NULL; 1.234 + 1.235 + TextureMap::iterator texture = mTextureMap.find(handle); 1.236 + 1.237 + if (texture == mTextureMap.end()) 1.238 + { 1.239 + return NULL; 1.240 + } 1.241 + else 1.242 + { 1.243 + return texture->second; 1.244 + } 1.245 +} 1.246 + 1.247 +Program *ResourceManager::getProgram(unsigned int handle) 1.248 +{ 1.249 + ProgramMap::iterator program = mProgramMap.find(handle); 1.250 + 1.251 + if (program == mProgramMap.end()) 1.252 + { 1.253 + return NULL; 1.254 + } 1.255 + else 1.256 + { 1.257 + return program->second; 1.258 + } 1.259 +} 1.260 + 1.261 +Renderbuffer *ResourceManager::getRenderbuffer(unsigned int handle) 1.262 +{ 1.263 + RenderbufferMap::iterator renderbuffer = mRenderbufferMap.find(handle); 1.264 + 1.265 + if (renderbuffer == mRenderbufferMap.end()) 1.266 + { 1.267 + return NULL; 1.268 + } 1.269 + else 1.270 + { 1.271 + return renderbuffer->second; 1.272 + } 1.273 +} 1.274 + 1.275 +void ResourceManager::setRenderbuffer(GLuint handle, Renderbuffer *buffer) 1.276 +{ 1.277 + mRenderbufferMap[handle] = buffer; 1.278 +} 1.279 + 1.280 +void ResourceManager::checkBufferAllocation(unsigned int buffer) 1.281 +{ 1.282 + if (buffer != 0 && !getBuffer(buffer)) 1.283 + { 1.284 + Buffer *bufferObject = new Buffer(mRenderer, buffer); 1.285 + mBufferMap[buffer] = bufferObject; 1.286 + bufferObject->addRef(); 1.287 + } 1.288 +} 1.289 + 1.290 +void ResourceManager::checkTextureAllocation(GLuint texture, TextureType type) 1.291 +{ 1.292 + if (!getTexture(texture) && texture != 0) 1.293 + { 1.294 + Texture *textureObject; 1.295 + 1.296 + if (type == TEXTURE_2D) 1.297 + { 1.298 + textureObject = new Texture2D(mRenderer, texture); 1.299 + } 1.300 + else if (type == TEXTURE_CUBE) 1.301 + { 1.302 + textureObject = new TextureCubeMap(mRenderer, texture); 1.303 + } 1.304 + else 1.305 + { 1.306 + UNREACHABLE(); 1.307 + return; 1.308 + } 1.309 + 1.310 + mTextureMap[texture] = textureObject; 1.311 + textureObject->addRef(); 1.312 + } 1.313 +} 1.314 + 1.315 +void ResourceManager::checkRenderbufferAllocation(GLuint renderbuffer) 1.316 +{ 1.317 + if (renderbuffer != 0 && !getRenderbuffer(renderbuffer)) 1.318 + { 1.319 + Renderbuffer *renderbufferObject = new Renderbuffer(mRenderer, renderbuffer, new Colorbuffer(mRenderer, 0, 0, GL_RGBA4, 0)); 1.320 + mRenderbufferMap[renderbuffer] = renderbufferObject; 1.321 + renderbufferObject->addRef(); 1.322 + } 1.323 +} 1.324 + 1.325 +}