1da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com// 2dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved. 3da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com// Use of this source code is governed by a BSD-style license that can be 4da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com// found in the LICENSE file. 5da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com// 6da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 7da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com// ResourceManager.cpp: Implements the gl::ResourceManager class, which tracks and 8da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com// retrieves objects which may be shared by multiple Contexts. 9da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 10da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com#include "libGLESv2/ResourceManager.h" 11da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 12da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com#include "libGLESv2/Buffer.h" 13da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com#include "libGLESv2/Program.h" 1429ab9525407b2e830341a36a28c6074c94cedce5daniel@transgaming.com#include "libGLESv2/Renderbuffer.h" 15da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com#include "libGLESv2/Shader.h" 16da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com#include "libGLESv2/Texture.h" 17dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill#include "libGLESv2/Sampler.h" 18cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill#include "libGLESv2/Fence.h" 19d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones#include "libGLESv2/renderer/Renderer.h" 20da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 21da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comnamespace gl 22da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 23370482e77de4d88ed2954757bf519f2f8bcd364edaniel@transgaming.comResourceManager::ResourceManager(rx::Renderer *renderer) 24da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 250d25b005e33f4a87067bbdec58fe66fe2981df6cdaniel@transgaming.com mRefCount = 1; 26370482e77de4d88ed2954757bf519f2f8bcd364edaniel@transgaming.com mRenderer = renderer; 27da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 28da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 29da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comResourceManager::~ResourceManager() 30da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 31da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com while (!mBufferMap.empty()) 32da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 33da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com deleteBuffer(mBufferMap.begin()->first); 34da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 35da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 36da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com while (!mProgramMap.empty()) 37da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 38da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com deleteProgram(mProgramMap.begin()->first); 39da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 40da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 41da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com while (!mShaderMap.empty()) 42da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 43da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com deleteShader(mShaderMap.begin()->first); 44da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 45da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 46da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com while (!mRenderbufferMap.empty()) 47da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 48da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com deleteRenderbuffer(mRenderbufferMap.begin()->first); 49da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 50da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 51da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com while (!mTextureMap.empty()) 52da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 53da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com deleteTexture(mTextureMap.begin()->first); 54da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 55dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill 56dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill while (!mSamplerMap.empty()) 57dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill { 58dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill deleteSampler(mSamplerMap.begin()->first); 59dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill } 60cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill 61cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill while (!mFenceSyncMap.empty()) 62cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill { 63cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill deleteFenceSync(mFenceSyncMap.begin()->first); 64cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill } 65da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 66da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 670d25b005e33f4a87067bbdec58fe66fe2981df6cdaniel@transgaming.comvoid ResourceManager::addRef() 680d25b005e33f4a87067bbdec58fe66fe2981df6cdaniel@transgaming.com{ 690d25b005e33f4a87067bbdec58fe66fe2981df6cdaniel@transgaming.com mRefCount++; 700d25b005e33f4a87067bbdec58fe66fe2981df6cdaniel@transgaming.com} 710d25b005e33f4a87067bbdec58fe66fe2981df6cdaniel@transgaming.com 720d25b005e33f4a87067bbdec58fe66fe2981df6cdaniel@transgaming.comvoid ResourceManager::release() 730d25b005e33f4a87067bbdec58fe66fe2981df6cdaniel@transgaming.com{ 740d25b005e33f4a87067bbdec58fe66fe2981df6cdaniel@transgaming.com if (--mRefCount == 0) 750d25b005e33f4a87067bbdec58fe66fe2981df6cdaniel@transgaming.com { 760d25b005e33f4a87067bbdec58fe66fe2981df6cdaniel@transgaming.com delete this; 770d25b005e33f4a87067bbdec58fe66fe2981df6cdaniel@transgaming.com } 780d25b005e33f4a87067bbdec58fe66fe2981df6cdaniel@transgaming.com} 790d25b005e33f4a87067bbdec58fe66fe2981df6cdaniel@transgaming.com 80da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com// Returns an unused buffer name 81da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comGLuint ResourceManager::createBuffer() 82da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 831a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com GLuint handle = mBufferHandleAllocator.allocate(); 84da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 85da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mBufferMap[handle] = NULL; 86da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 87da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return handle; 88da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 89da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 90da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com// Returns an unused shader/program name 91da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comGLuint ResourceManager::createShader(GLenum type) 92da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 931a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com GLuint handle = mProgramShaderHandleAllocator.allocate(); 94da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 957162096ee6cfcb0fa797eb3503154f39ec53ef09Brandon Jones if (type == GL_VERTEX_SHADER || type == GL_FRAGMENT_SHADER) 96da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 977162096ee6cfcb0fa797eb3503154f39ec53ef09Brandon Jones mShaderMap[handle] = new Shader(this, mRenderer->createShader(type), type, handle); 98da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 99da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com else UNREACHABLE(); 100da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 101da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return handle; 102da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 103da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 104da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com// Returns an unused program/shader name 105da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comGLuint ResourceManager::createProgram() 106da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 1071a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com GLuint handle = mProgramShaderHandleAllocator.allocate(); 108da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 10970062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com mProgramMap[handle] = new Program(mRenderer, this, handle); 110da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 111da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return handle; 112da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 113da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 114da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com// Returns an unused texture name 115da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comGLuint ResourceManager::createTexture() 116da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 1171a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com GLuint handle = mTextureHandleAllocator.allocate(); 118da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 119da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mTextureMap[handle] = NULL; 120da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 121da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return handle; 122da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 123da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 124da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com// Returns an unused renderbuffer name 125da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comGLuint ResourceManager::createRenderbuffer() 126da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 1271a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com GLuint handle = mRenderbufferHandleAllocator.allocate(); 128da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 129da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mRenderbufferMap[handle] = NULL; 130da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 131da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return handle; 132da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 133da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 134dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill// Returns an unused sampler name 135dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie MadillGLuint ResourceManager::createSampler() 136dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill{ 137dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill GLuint handle = mSamplerHandleAllocator.allocate(); 138dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill 139dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill mSamplerMap[handle] = NULL; 140dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill 141dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill return handle; 142dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill} 143dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill 144cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill// Returns the next unused fence name, and allocates the fence 145cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie MadillGLuint ResourceManager::createFenceSync() 146cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill{ 147cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill GLuint handle = mFenceSyncHandleAllocator.allocate(); 148cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill 149cfa33e62dd7eb0fa43f129b9c996e10c03dddfd2Jamie Madill FenceSync *fenceSync = new FenceSync(mRenderer, handle); 150cfa33e62dd7eb0fa43f129b9c996e10c03dddfd2Jamie Madill fenceSync->addRef(); 151cfa33e62dd7eb0fa43f129b9c996e10c03dddfd2Jamie Madill mFenceSyncMap[handle] = fenceSync; 152cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill 153cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill return handle; 154cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill} 155cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill 156da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comvoid ResourceManager::deleteBuffer(GLuint buffer) 157da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 158da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com BufferMap::iterator bufferObject = mBufferMap.find(buffer); 159da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 160da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (bufferObject != mBufferMap.end()) 161da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 1621a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com mBufferHandleAllocator.release(bufferObject->first); 163ff8bdfb065ddd9202cc27df894ad39f1a024fdd4apatrick@chromium.org if (bufferObject->second) bufferObject->second->release(); 164da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mBufferMap.erase(bufferObject); 165da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 166da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 167da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 168da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comvoid ResourceManager::deleteShader(GLuint shader) 169da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 170da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com ShaderMap::iterator shaderObject = mShaderMap.find(shader); 171da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 172da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (shaderObject != mShaderMap.end()) 173da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 174da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (shaderObject->second->getRefCount() == 0) 175da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 1761a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com mProgramShaderHandleAllocator.release(shaderObject->first); 177da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com delete shaderObject->second; 178da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mShaderMap.erase(shaderObject); 179da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 180da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com else 181da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 182da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com shaderObject->second->flagForDeletion(); 183da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 184da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 185da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 186da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 187da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comvoid ResourceManager::deleteProgram(GLuint program) 188da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 189da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com ProgramMap::iterator programObject = mProgramMap.find(program); 190da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 191da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (programObject != mProgramMap.end()) 192da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 193da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (programObject->second->getRefCount() == 0) 194da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 1951a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com mProgramShaderHandleAllocator.release(programObject->first); 196da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com delete programObject->second; 197da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mProgramMap.erase(programObject); 198da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 199da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com else 200da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 201da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com programObject->second->flagForDeletion(); 202da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 203da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 204da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 205da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 206da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comvoid ResourceManager::deleteTexture(GLuint texture) 207da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 208da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com TextureMap::iterator textureObject = mTextureMap.find(texture); 209da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 210da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (textureObject != mTextureMap.end()) 211da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 2121a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com mTextureHandleAllocator.release(textureObject->first); 213ff8bdfb065ddd9202cc27df894ad39f1a024fdd4apatrick@chromium.org if (textureObject->second) textureObject->second->release(); 214da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mTextureMap.erase(textureObject); 215da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 216da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 217da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 218da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comvoid ResourceManager::deleteRenderbuffer(GLuint renderbuffer) 219da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 220da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com RenderbufferMap::iterator renderbufferObject = mRenderbufferMap.find(renderbuffer); 221da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 222da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (renderbufferObject != mRenderbufferMap.end()) 223da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 2241a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com mRenderbufferHandleAllocator.release(renderbufferObject->first); 225ff8bdfb065ddd9202cc27df894ad39f1a024fdd4apatrick@chromium.org if (renderbufferObject->second) renderbufferObject->second->release(); 226da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mRenderbufferMap.erase(renderbufferObject); 227da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 228da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 229da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 230dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madillvoid ResourceManager::deleteSampler(GLuint sampler) 231dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill{ 232dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill auto samplerObject = mSamplerMap.find(sampler); 233dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill 234dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill if (samplerObject != mSamplerMap.end()) 235dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill { 2367993190b891e97dd6b23b9c442817d07892f39aeGeoff Lang mSamplerHandleAllocator.release(samplerObject->first); 237dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill if (samplerObject->second) samplerObject->second->release(); 238dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill mSamplerMap.erase(samplerObject); 239dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill } 240dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill} 241dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill 242cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madillvoid ResourceManager::deleteFenceSync(GLuint fenceSync) 243cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill{ 244cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill auto fenceObjectIt = mFenceSyncMap.find(fenceSync); 245cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill 246cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill if (fenceObjectIt != mFenceSyncMap.end()) 247cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill { 248cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill mFenceSyncHandleAllocator.release(fenceObjectIt->first); 249cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill if (fenceObjectIt->second) fenceObjectIt->second->release(); 250cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill mFenceSyncMap.erase(fenceObjectIt); 251cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill } 252cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill} 253cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill 254da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comBuffer *ResourceManager::getBuffer(unsigned int handle) 255da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 256da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com BufferMap::iterator buffer = mBufferMap.find(handle); 257da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 258da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (buffer == mBufferMap.end()) 259da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 260da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return NULL; 261da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 262da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com else 263da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 264da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return buffer->second; 265da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 266da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 267da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 268da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comShader *ResourceManager::getShader(unsigned int handle) 269da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 270da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com ShaderMap::iterator shader = mShaderMap.find(handle); 271da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 272da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (shader == mShaderMap.end()) 273da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 274da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return NULL; 275da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 276da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com else 277da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 278da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return shader->second; 279da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 280da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 281da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 282da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comTexture *ResourceManager::getTexture(unsigned int handle) 283da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 284da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (handle == 0) return NULL; 285da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 286da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com TextureMap::iterator texture = mTextureMap.find(handle); 287da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 288da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (texture == mTextureMap.end()) 289da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 290da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return NULL; 291da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 292da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com else 293da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 294da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return texture->second; 295da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 296da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 297da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 298da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comProgram *ResourceManager::getProgram(unsigned int handle) 299da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 300da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com ProgramMap::iterator program = mProgramMap.find(handle); 301da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 302da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (program == mProgramMap.end()) 303da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 304da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return NULL; 305da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 306da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com else 307da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 308da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return program->second; 309da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 310da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 311da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 3126c7b4ada6bcb8ec0d929ff929b33f07c653d8e82Jamie MadillRenderbuffer *ResourceManager::getRenderbuffer(unsigned int handle) 313da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 314da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com RenderbufferMap::iterator renderbuffer = mRenderbufferMap.find(handle); 315da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 316da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (renderbuffer == mRenderbufferMap.end()) 317da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 318da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return NULL; 319da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 320da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com else 321da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 322da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return renderbuffer->second; 323da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 324da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 325da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 326dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie MadillSampler *ResourceManager::getSampler(unsigned int handle) 327dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill{ 328dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill auto sampler = mSamplerMap.find(handle); 329dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill 330dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill if (sampler == mSamplerMap.end()) 331dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill { 332dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill return NULL; 333dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill } 334dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill else 335dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill { 336dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill return sampler->second; 337dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill } 338dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill} 339dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill 340cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie MadillFenceSync *ResourceManager::getFenceSync(unsigned int handle) 341cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill{ 342cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill auto fenceObjectIt = mFenceSyncMap.find(handle); 343cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill 344cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill if (fenceObjectIt == mFenceSyncMap.end()) 345cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill { 346cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill return NULL; 347cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill } 348cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill else 349cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill { 350cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill return fenceObjectIt->second; 351cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill } 352cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill} 353cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill 3546c7b4ada6bcb8ec0d929ff929b33f07c653d8e82Jamie Madillvoid ResourceManager::setRenderbuffer(GLuint handle, Renderbuffer *buffer) 355da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 356da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mRenderbufferMap[handle] = buffer; 357da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 358da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 359da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comvoid ResourceManager::checkBufferAllocation(unsigned int buffer) 360da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 361da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (buffer != 0 && !getBuffer(buffer)) 362da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 363d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones Buffer *bufferObject = new Buffer(mRenderer->createBuffer(), buffer); 3649ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com mBufferMap[buffer] = bufferObject; 3659ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com bufferObject->addRef(); 366da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 367da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 368da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 36976b10c9a9735c27627065d9fe68f78374ef48934Geoff Langvoid ResourceManager::checkTextureAllocation(GLuint texture, GLenum type) 370da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 371da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (!getTexture(texture) && texture != 0) 372da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 3739ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com Texture *textureObject; 3749ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com 37576b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang if (type == GL_TEXTURE_2D) 376da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 3776053a52e8d529c1bc7d35a8f92430bf8d93938b2Brandon Jones textureObject = new Texture2D(mRenderer->createTexture(GL_TEXTURE_2D), texture); 378da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 37976b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang else if (type == GL_TEXTURE_CUBE_MAP) 380da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 3816053a52e8d529c1bc7d35a8f92430bf8d93938b2Brandon Jones textureObject = new TextureCubeMap(mRenderer->createTexture(GL_TEXTURE_CUBE_MAP), texture); 382da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 38376b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang else if (type == GL_TEXTURE_3D) 384c416e1cc09f1404d3dbcf23cd55956d37ebe67d2shannon.woods%transgaming.com@gtempaccount.com { 3856053a52e8d529c1bc7d35a8f92430bf8d93938b2Brandon Jones textureObject = new Texture3D(mRenderer->createTexture(GL_TEXTURE_3D), texture); 386c416e1cc09f1404d3dbcf23cd55956d37ebe67d2shannon.woods%transgaming.com@gtempaccount.com } 38776b10c9a9735c27627065d9fe68f78374ef48934Geoff Lang else if (type == GL_TEXTURE_2D_ARRAY) 38890dbc44c79052a9ceaab2c782a67e7d149da5385shannon.woods%transgaming.com@gtempaccount.com { 3896053a52e8d529c1bc7d35a8f92430bf8d93938b2Brandon Jones textureObject = new Texture2DArray(mRenderer->createTexture(GL_TEXTURE_2D_ARRAY), texture); 39090dbc44c79052a9ceaab2c782a67e7d149da5385shannon.woods%transgaming.com@gtempaccount.com } 3919ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com else 3929ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com { 3939ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com UNREACHABLE(); 3949ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com return; 3959ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com } 3969ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com 3979ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com mTextureMap[texture] = textureObject; 3989ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com textureObject->addRef(); 399da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 400da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 401da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 402da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comvoid ResourceManager::checkRenderbufferAllocation(GLuint renderbuffer) 403da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 404da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (renderbuffer != 0 && !getRenderbuffer(renderbuffer)) 405da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 406e4a492be45f39dffaea53c3523064844ee56e41bGeoff Lang Renderbuffer *renderbufferObject = new Renderbuffer(renderbuffer, new Colorbuffer(mRenderer, 0, 0, GL_RGBA4, 0)); 4079ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com mRenderbufferMap[renderbuffer] = renderbufferObject; 4089ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com renderbufferObject->addRef(); 409da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 410da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 411da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 412dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madillvoid ResourceManager::checkSamplerAllocation(GLuint sampler) 413dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill{ 414dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill if (sampler != 0 && !getSampler(sampler)) 415dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill { 416dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill Sampler *samplerObject = new Sampler(sampler); 417dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill mSamplerMap[sampler] = samplerObject; 418dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill samplerObject->addRef(); 419dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill } 420dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill} 421dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill 422dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madillbool ResourceManager::isSampler(GLuint sampler) 423dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill{ 424dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill return mSamplerMap.find(sampler) != mSamplerMap.end(); 425dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill} 426dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill 427da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 428