15abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// 25abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. 35abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// Use of this source code is governed by a BSD-style license that can be 45abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// found in the LICENSE file. 55abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// 65abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 75abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// ResourceManager.cpp: Implements the gl::ResourceManager class, which tracks and 85abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// retrieves objects which may be shared by multiple Contexts. 95abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "libGLESv2/ResourceManager.h" 115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "libGLESv2/Buffer.h" 135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "libGLESv2/Program.h" 145abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "libGLESv2/RenderBuffer.h" 155abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "libGLESv2/Shader.h" 165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "libGLESv2/Texture.h" 175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merricknamespace gl 195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickResourceManager::ResourceManager() 215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mRefCount = 1; 235abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 245abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickResourceManager::~ResourceManager() 265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick while (!mBufferMap.empty()) 285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick deleteBuffer(mBufferMap.begin()->first); 305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick while (!mProgramMap.empty()) 335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick deleteProgram(mProgramMap.begin()->first); 355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick while (!mShaderMap.empty()) 385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 395abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick deleteShader(mShaderMap.begin()->first); 405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick while (!mRenderbufferMap.empty()) 435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick deleteRenderbuffer(mRenderbufferMap.begin()->first); 455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick while (!mTextureMap.empty()) 485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick deleteTexture(mTextureMap.begin()->first); 505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid ResourceManager::addRef() 545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 555abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mRefCount++; 565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 575abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 585abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid ResourceManager::release() 595abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 605abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (--mRefCount == 0) 615abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 625abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick delete this; 635abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 645abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 655abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// Returns an unused buffer name 675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickGLuint ResourceManager::createBuffer() 685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 695abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick unsigned int handle = 1; 705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 715abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick while (mBufferMap.find(handle) != mBufferMap.end()) 725abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 735abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick handle++; 745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mBufferMap[handle] = NULL; 775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return handle; 795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 805abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// Returns an unused shader/program name 825abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickGLuint ResourceManager::createShader(GLenum type) 835abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 845abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick unsigned int handle = 1; 855abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 865abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick while (mShaderMap.find(handle) != mShaderMap.end() || mProgramMap.find(handle) != mProgramMap.end()) // Shared name space 875abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick handle++; 895abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 905abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 915abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (type == GL_VERTEX_SHADER) 925abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 935abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mShaderMap[handle] = new VertexShader(this, handle); 945abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 955abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick else if (type == GL_FRAGMENT_SHADER) 965abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 975abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mShaderMap[handle] = new FragmentShader(this, handle); 985abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 995abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick else UNREACHABLE(); 1005abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1015abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return handle; 1025abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 1035abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1045abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// Returns an unused program/shader name 1055abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickGLuint ResourceManager::createProgram() 1065abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 1075abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick unsigned int handle = 1; 1085abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1095abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick while (mProgramMap.find(handle) != mProgramMap.end() || mShaderMap.find(handle) != mShaderMap.end()) // Shared name space 1105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 1115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick handle++; 1125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 1135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1145abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mProgramMap[handle] = new Program(this, handle); 1155abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return handle; 1175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 1185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// Returns an unused texture name 1205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickGLuint ResourceManager::createTexture() 1215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 1225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick unsigned int handle = 1; 1235abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1245abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick while (mTextureMap.find(handle) != mTextureMap.end()) 1255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 1265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick handle++; 1275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 1285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mTextureMap[handle] = NULL; 1305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return handle; 1325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 1335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// Returns an unused renderbuffer name 1355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickGLuint ResourceManager::createRenderbuffer() 1365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 1375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick unsigned int handle = 1; 1385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1395abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick while (mRenderbufferMap.find(handle) != mRenderbufferMap.end()) 1405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 1415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick handle++; 1425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 1435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mRenderbufferMap[handle] = NULL; 1455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return handle; 1475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 1485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid ResourceManager::deleteBuffer(GLuint buffer) 1505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 1515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick BufferMap::iterator bufferObject = mBufferMap.find(buffer); 1525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (bufferObject != mBufferMap.end()) 1545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 1555abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (bufferObject->second) bufferObject->second->release(); 1565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mBufferMap.erase(bufferObject); 1575abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 1585abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 1595abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1605abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid ResourceManager::deleteShader(GLuint shader) 1615abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 1625abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick ShaderMap::iterator shaderObject = mShaderMap.find(shader); 1635abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1645abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (shaderObject != mShaderMap.end()) 1655abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 1665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (shaderObject->second->getRefCount() == 0) 1675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 1685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick delete shaderObject->second; 1695abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mShaderMap.erase(shaderObject); 1705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 1715abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick else 1725abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 1735abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick shaderObject->second->flagForDeletion(); 1745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 1755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 1765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 1775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid ResourceManager::deleteProgram(GLuint program) 1795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 1805abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick ProgramMap::iterator programObject = mProgramMap.find(program); 1815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1825abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (programObject != mProgramMap.end()) 1835abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 1845abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (programObject->second->getRefCount() == 0) 1855abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 1865abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick delete programObject->second; 1875abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mProgramMap.erase(programObject); 1885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 1895abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick else 1905abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 1915abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick programObject->second->flagForDeletion(); 1925abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 1935abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 1945abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 1955abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1965abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid ResourceManager::deleteTexture(GLuint texture) 1975abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 1985abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick TextureMap::iterator textureObject = mTextureMap.find(texture); 1995abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 2005abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (textureObject != mTextureMap.end()) 2015abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 2025abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (textureObject->second) textureObject->second->release(); 2035abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mTextureMap.erase(textureObject); 2045abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 2055abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 2065abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 2075abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid ResourceManager::deleteRenderbuffer(GLuint renderbuffer) 2085abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 2095abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick RenderbufferMap::iterator renderbufferObject = mRenderbufferMap.find(renderbuffer); 2105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 2115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (renderbufferObject != mRenderbufferMap.end()) 2125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 2135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (renderbufferObject->second) renderbufferObject->second->release(); 2145abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mRenderbufferMap.erase(renderbufferObject); 2155abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 2165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 2175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 2185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickBuffer *ResourceManager::getBuffer(unsigned int handle) 2195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 2205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick BufferMap::iterator buffer = mBufferMap.find(handle); 2215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 2225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (buffer == mBufferMap.end()) 2235abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 2245abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return NULL; 2255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 2265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick else 2275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 2285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return buffer->second; 2295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 2305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 2315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 2325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickShader *ResourceManager::getShader(unsigned int handle) 2335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 2345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick ShaderMap::iterator shader = mShaderMap.find(handle); 2355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 2365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (shader == mShaderMap.end()) 2375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 2385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return NULL; 2395abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 2405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick else 2415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 2425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return shader->second; 2435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 2445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 2455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 2465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickTexture *ResourceManager::getTexture(unsigned int handle) 2475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 2485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (handle == 0) return NULL; 2495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 2505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick TextureMap::iterator texture = mTextureMap.find(handle); 2515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 2525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (texture == mTextureMap.end()) 2535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 2545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return NULL; 2555abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 2565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick else 2575abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 2585abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return texture->second; 2595abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 2605abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 2615abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 2625abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickProgram *ResourceManager::getProgram(unsigned int handle) 2635abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 2645abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick ProgramMap::iterator program = mProgramMap.find(handle); 2655abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 2665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (program == mProgramMap.end()) 2675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 2685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return NULL; 2695abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 2705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick else 2715abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 2725abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return program->second; 2735abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 2745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 2755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 2765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickRenderbuffer *ResourceManager::getRenderbuffer(unsigned int handle) 2775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 2785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick RenderbufferMap::iterator renderbuffer = mRenderbufferMap.find(handle); 2795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 2805abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (renderbuffer == mRenderbufferMap.end()) 2815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 2825abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return NULL; 2835abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 2845abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick else 2855abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 2865abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return renderbuffer->second; 2875abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 2885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 2895abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 2905abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid ResourceManager::setRenderbuffer(GLuint handle, Renderbuffer *buffer) 2915abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 2925abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mRenderbufferMap[handle] = buffer; 2935abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 2945abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 2955abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid ResourceManager::checkBufferAllocation(unsigned int buffer) 2965abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 2975abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (buffer != 0 && !getBuffer(buffer)) 2985abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 2995abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick Buffer *bufferObject = new Buffer(buffer); 3005abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mBufferMap[buffer] = bufferObject; 3015abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick bufferObject->addRef(); 3025abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 3035abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 3045abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 3055abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid ResourceManager::checkTextureAllocation(GLuint texture, SamplerType type) 3065abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 3075abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (!getTexture(texture) && texture != 0) 3085abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 3095abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick Texture *textureObject; 3105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 3115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (type == SAMPLER_2D) 3125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 3135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick textureObject = new Texture2D(texture); 3145abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 3155abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick else if (type == SAMPLER_CUBE) 3165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 3175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick textureObject = new TextureCubeMap(texture); 3185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 3195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick else 3205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 3215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick UNREACHABLE(); 3225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return; 3235abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 3245abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 3255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mTextureMap[texture] = textureObject; 3265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick textureObject->addRef(); 3275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 3285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 3295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 3305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid ResourceManager::checkRenderbufferAllocation(GLuint renderbuffer) 3315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 3325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (renderbuffer != 0 && !getRenderbuffer(renderbuffer)) 3335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 3345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick Renderbuffer *renderbufferObject = new Renderbuffer(renderbuffer, new Colorbuffer(0, 0, GL_RGBA4, 0)); 3355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mRenderbufferMap[renderbuffer] = renderbufferObject; 3365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick renderbufferObject->addRef(); 3375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 3385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 3395abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 3405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 341