1bdf2d80f459d43f5a6df074431bacf41584f81b7shannon.woods@transgaming.com#include "precompiled.h" 2da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com// 3da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. 4da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com// Use of this source code is governed by a BSD-style license that can be 5da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com// found in the LICENSE file. 6da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com// 7da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 8da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com// ResourceManager.cpp: Implements the gl::ResourceManager class, which tracks and 9da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com// retrieves objects which may be shared by multiple Contexts. 10da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 11da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com#include "libGLESv2/ResourceManager.h" 12da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 13da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com#include "libGLESv2/Buffer.h" 14da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com#include "libGLESv2/Program.h" 1529ab9525407b2e830341a36a28c6074c94cedce5daniel@transgaming.com#include "libGLESv2/Renderbuffer.h" 16da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com#include "libGLESv2/Shader.h" 17da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com#include "libGLESv2/Texture.h" 18da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 19da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comnamespace gl 20da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 21370482e77de4d88ed2954757bf519f2f8bcd364edaniel@transgaming.comResourceManager::ResourceManager(rx::Renderer *renderer) 22da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 230d25b005e33f4a87067bbdec58fe66fe2981df6cdaniel@transgaming.com mRefCount = 1; 24370482e77de4d88ed2954757bf519f2f8bcd364edaniel@transgaming.com mRenderer = renderer; 25da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 26da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 27da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comResourceManager::~ResourceManager() 28da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 29da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com while (!mBufferMap.empty()) 30da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 31da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com deleteBuffer(mBufferMap.begin()->first); 32da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 33da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 34da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com while (!mProgramMap.empty()) 35da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 36da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com deleteProgram(mProgramMap.begin()->first); 37da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 38da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 39da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com while (!mShaderMap.empty()) 40da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 41da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com deleteShader(mShaderMap.begin()->first); 42da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 43da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 44da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com while (!mRenderbufferMap.empty()) 45da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 46da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com deleteRenderbuffer(mRenderbufferMap.begin()->first); 47da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 48da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 49da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com while (!mTextureMap.empty()) 50da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 51da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com deleteTexture(mTextureMap.begin()->first); 52da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 53da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 54da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 550d25b005e33f4a87067bbdec58fe66fe2981df6cdaniel@transgaming.comvoid ResourceManager::addRef() 560d25b005e33f4a87067bbdec58fe66fe2981df6cdaniel@transgaming.com{ 570d25b005e33f4a87067bbdec58fe66fe2981df6cdaniel@transgaming.com mRefCount++; 580d25b005e33f4a87067bbdec58fe66fe2981df6cdaniel@transgaming.com} 590d25b005e33f4a87067bbdec58fe66fe2981df6cdaniel@transgaming.com 600d25b005e33f4a87067bbdec58fe66fe2981df6cdaniel@transgaming.comvoid ResourceManager::release() 610d25b005e33f4a87067bbdec58fe66fe2981df6cdaniel@transgaming.com{ 620d25b005e33f4a87067bbdec58fe66fe2981df6cdaniel@transgaming.com if (--mRefCount == 0) 630d25b005e33f4a87067bbdec58fe66fe2981df6cdaniel@transgaming.com { 640d25b005e33f4a87067bbdec58fe66fe2981df6cdaniel@transgaming.com delete this; 650d25b005e33f4a87067bbdec58fe66fe2981df6cdaniel@transgaming.com } 660d25b005e33f4a87067bbdec58fe66fe2981df6cdaniel@transgaming.com} 670d25b005e33f4a87067bbdec58fe66fe2981df6cdaniel@transgaming.com 68da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com// Returns an unused buffer name 69da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comGLuint ResourceManager::createBuffer() 70da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 711a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com GLuint handle = mBufferHandleAllocator.allocate(); 72da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 73da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mBufferMap[handle] = NULL; 74da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 75da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return handle; 76da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 77da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 78da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com// Returns an unused shader/program name 79da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comGLuint ResourceManager::createShader(GLenum type) 80da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 811a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com GLuint handle = mProgramShaderHandleAllocator.allocate(); 82da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 83da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (type == GL_VERTEX_SHADER) 84da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 85b73964e328243021db10ecd98e3e124e82522c43shannon.woods@transgaming.com mShaderMap[handle] = new VertexShader(this, mRenderer, handle); 86da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 87da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com else if (type == GL_FRAGMENT_SHADER) 88da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 89b73964e328243021db10ecd98e3e124e82522c43shannon.woods@transgaming.com mShaderMap[handle] = new FragmentShader(this, mRenderer, handle); 90da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 91da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com else UNREACHABLE(); 92da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 93da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return handle; 94da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 95da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 96da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com// Returns an unused program/shader name 97da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comGLuint ResourceManager::createProgram() 98da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 991a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com GLuint handle = mProgramShaderHandleAllocator.allocate(); 100da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 10170062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com mProgramMap[handle] = new Program(mRenderer, this, handle); 102da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 103da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return handle; 104da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 105da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 106da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com// Returns an unused texture name 107da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comGLuint ResourceManager::createTexture() 108da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 1091a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com GLuint handle = mTextureHandleAllocator.allocate(); 110da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 111da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mTextureMap[handle] = NULL; 112da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 113da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return handle; 114da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 115da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 116da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com// Returns an unused renderbuffer name 117da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comGLuint ResourceManager::createRenderbuffer() 118da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 1191a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com GLuint handle = mRenderbufferHandleAllocator.allocate(); 120da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 121da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mRenderbufferMap[handle] = NULL; 122da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 123da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return handle; 124da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 125da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 126da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comvoid ResourceManager::deleteBuffer(GLuint buffer) 127da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 128da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com BufferMap::iterator bufferObject = mBufferMap.find(buffer); 129da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 130da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (bufferObject != mBufferMap.end()) 131da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 1321a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com mBufferHandleAllocator.release(bufferObject->first); 133ff8bdfb065ddd9202cc27df894ad39f1a024fdd4apatrick@chromium.org if (bufferObject->second) bufferObject->second->release(); 134da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mBufferMap.erase(bufferObject); 135da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 136da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 137da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 138da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comvoid ResourceManager::deleteShader(GLuint shader) 139da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 140da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com ShaderMap::iterator shaderObject = mShaderMap.find(shader); 141da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 142da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (shaderObject != mShaderMap.end()) 143da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 144da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (shaderObject->second->getRefCount() == 0) 145da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 1461a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com mProgramShaderHandleAllocator.release(shaderObject->first); 147da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com delete shaderObject->second; 148da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mShaderMap.erase(shaderObject); 149da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 150da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com else 151da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 152da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com shaderObject->second->flagForDeletion(); 153da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 154da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 155da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 156da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 157da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comvoid ResourceManager::deleteProgram(GLuint program) 158da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 159da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com ProgramMap::iterator programObject = mProgramMap.find(program); 160da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 161da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (programObject != mProgramMap.end()) 162da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 163da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (programObject->second->getRefCount() == 0) 164da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 1651a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com mProgramShaderHandleAllocator.release(programObject->first); 166da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com delete programObject->second; 167da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mProgramMap.erase(programObject); 168da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 169da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com else 170da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 171da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com programObject->second->flagForDeletion(); 172da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 173da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 174da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 175da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 176da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comvoid ResourceManager::deleteTexture(GLuint texture) 177da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 178da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com TextureMap::iterator textureObject = mTextureMap.find(texture); 179da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 180da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (textureObject != mTextureMap.end()) 181da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 1821a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com mTextureHandleAllocator.release(textureObject->first); 183ff8bdfb065ddd9202cc27df894ad39f1a024fdd4apatrick@chromium.org if (textureObject->second) textureObject->second->release(); 184da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mTextureMap.erase(textureObject); 185da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 186da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 187da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 188da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comvoid ResourceManager::deleteRenderbuffer(GLuint renderbuffer) 189da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 190da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com RenderbufferMap::iterator renderbufferObject = mRenderbufferMap.find(renderbuffer); 191da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 192da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (renderbufferObject != mRenderbufferMap.end()) 193da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 1941a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com mRenderbufferHandleAllocator.release(renderbufferObject->first); 195ff8bdfb065ddd9202cc27df894ad39f1a024fdd4apatrick@chromium.org if (renderbufferObject->second) renderbufferObject->second->release(); 196da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mRenderbufferMap.erase(renderbufferObject); 197da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 198da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 199da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 200da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comBuffer *ResourceManager::getBuffer(unsigned int handle) 201da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 202da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com BufferMap::iterator buffer = mBufferMap.find(handle); 203da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 204da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (buffer == mBufferMap.end()) 205da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 206da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return NULL; 207da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 208da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com else 209da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 210da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return buffer->second; 211da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 212da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 213da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 214da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comShader *ResourceManager::getShader(unsigned int handle) 215da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 216da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com ShaderMap::iterator shader = mShaderMap.find(handle); 217da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 218da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (shader == mShaderMap.end()) 219da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 220da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return NULL; 221da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 222da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com else 223da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 224da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return shader->second; 225da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 226da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 227da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 228da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comTexture *ResourceManager::getTexture(unsigned int handle) 229da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 230da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (handle == 0) return NULL; 231da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 232da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com TextureMap::iterator texture = mTextureMap.find(handle); 233da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 234da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (texture == mTextureMap.end()) 235da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 236da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return NULL; 237da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 238da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com else 239da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 240da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return texture->second; 241da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 242da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 243da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 244da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comProgram *ResourceManager::getProgram(unsigned int handle) 245da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 246da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com ProgramMap::iterator program = mProgramMap.find(handle); 247da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 248da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (program == mProgramMap.end()) 249da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 250da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return NULL; 251da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 252da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com else 253da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 254da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return program->second; 255da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 256da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 257da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 258da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comRenderbuffer *ResourceManager::getRenderbuffer(unsigned int handle) 259da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 260da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com RenderbufferMap::iterator renderbuffer = mRenderbufferMap.find(handle); 261da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 262da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (renderbuffer == mRenderbufferMap.end()) 263da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 264da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return NULL; 265da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 266da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com else 267da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 268da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return renderbuffer->second; 269da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 270da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 271da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 272da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comvoid ResourceManager::setRenderbuffer(GLuint handle, Renderbuffer *buffer) 273da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 274da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mRenderbufferMap[handle] = buffer; 275da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 276da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 277da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comvoid ResourceManager::checkBufferAllocation(unsigned int buffer) 278da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 279da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (buffer != 0 && !getBuffer(buffer)) 280da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 28170062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com Buffer *bufferObject = new Buffer(mRenderer, buffer); 2829ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com mBufferMap[buffer] = bufferObject; 2839ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com bufferObject->addRef(); 284da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 285da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 286da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 2870e64dd6dc05a4d3e31f6cbc69ceeafc4a863a65edaniel@transgaming.comvoid ResourceManager::checkTextureAllocation(GLuint texture, TextureType type) 288da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 289da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (!getTexture(texture) && texture != 0) 290da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 2919ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com Texture *textureObject; 2929ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com 2930e64dd6dc05a4d3e31f6cbc69ceeafc4a863a65edaniel@transgaming.com if (type == TEXTURE_2D) 294da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 295370482e77de4d88ed2954757bf519f2f8bcd364edaniel@transgaming.com textureObject = new Texture2D(mRenderer, texture); 296da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 2970e64dd6dc05a4d3e31f6cbc69ceeafc4a863a65edaniel@transgaming.com else if (type == TEXTURE_CUBE) 298da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 299370482e77de4d88ed2954757bf519f2f8bcd364edaniel@transgaming.com textureObject = new TextureCubeMap(mRenderer, texture); 300da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 3019ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com else 3029ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com { 3039ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com UNREACHABLE(); 3049ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com return; 3059ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com } 3069ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com 3079ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com mTextureMap[texture] = textureObject; 3089ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com textureObject->addRef(); 309da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 310da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 311da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 312da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comvoid ResourceManager::checkRenderbufferAllocation(GLuint renderbuffer) 313da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 314da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (renderbuffer != 0 && !getRenderbuffer(renderbuffer)) 315da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 31670062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com Renderbuffer *renderbufferObject = new Renderbuffer(mRenderer, renderbuffer, new Colorbuffer(mRenderer, 0, 0, GL_RGBA4, 0)); 3179ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com mRenderbufferMap[renderbuffer] = renderbufferObject; 3189ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com renderbufferObject->addRef(); 319da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 320da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 321da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 322da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 323