1bdf2d80f459d43f5a6df074431bacf41584f81b7shannon.woods@transgaming.com#include "precompiled.h" 2da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com// 3dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill// Copyright (c) 2002-2013 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" 18dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill#include "libGLESv2/Sampler.h" 19cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill#include "libGLESv2/Fence.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 95da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (type == GL_VERTEX_SHADER) 96da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 97b73964e328243021db10ecd98e3e124e82522c43shannon.woods@transgaming.com mShaderMap[handle] = new VertexShader(this, mRenderer, handle); 98da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 99da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com else if (type == GL_FRAGMENT_SHADER) 100da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 101b73964e328243021db10ecd98e3e124e82522c43shannon.woods@transgaming.com mShaderMap[handle] = new FragmentShader(this, mRenderer, handle); 102da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 103da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com else UNREACHABLE(); 104da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 105da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return handle; 106da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 107da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 108da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com// Returns an unused program/shader name 109da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comGLuint ResourceManager::createProgram() 110da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 1111a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com GLuint handle = mProgramShaderHandleAllocator.allocate(); 112da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 11370062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com mProgramMap[handle] = new Program(mRenderer, this, handle); 114da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 115da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return handle; 116da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 117da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 118da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com// Returns an unused texture name 119da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comGLuint ResourceManager::createTexture() 120da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 1211a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com GLuint handle = mTextureHandleAllocator.allocate(); 122da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 123da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mTextureMap[handle] = NULL; 124da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 125da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return handle; 126da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 127da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 128da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com// Returns an unused renderbuffer name 129da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comGLuint ResourceManager::createRenderbuffer() 130da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 1311a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com GLuint handle = mRenderbufferHandleAllocator.allocate(); 132da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 133da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mRenderbufferMap[handle] = NULL; 134da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 135da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return handle; 136da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 137da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 138dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill// Returns an unused sampler name 139dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie MadillGLuint ResourceManager::createSampler() 140dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill{ 141dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill GLuint handle = mSamplerHandleAllocator.allocate(); 142dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill 143dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill mSamplerMap[handle] = NULL; 144dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill 145dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill return handle; 146dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill} 147dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill 148cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill// Returns the next unused fence name, and allocates the fence 149cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie MadillGLuint ResourceManager::createFenceSync() 150cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill{ 151cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill GLuint handle = mFenceSyncHandleAllocator.allocate(); 152cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill 153cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill mFenceSyncMap[handle] = new FenceSync(mRenderer, handle); 154cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill 155cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill return handle; 156cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill} 157cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill 158da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comvoid ResourceManager::deleteBuffer(GLuint buffer) 159da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 160da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com BufferMap::iterator bufferObject = mBufferMap.find(buffer); 161da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 162da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (bufferObject != mBufferMap.end()) 163da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 1641a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com mBufferHandleAllocator.release(bufferObject->first); 165ff8bdfb065ddd9202cc27df894ad39f1a024fdd4apatrick@chromium.org if (bufferObject->second) bufferObject->second->release(); 166da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mBufferMap.erase(bufferObject); 167da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 168da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 169da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 170da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comvoid ResourceManager::deleteShader(GLuint shader) 171da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 172da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com ShaderMap::iterator shaderObject = mShaderMap.find(shader); 173da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 174da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (shaderObject != mShaderMap.end()) 175da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 176da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (shaderObject->second->getRefCount() == 0) 177da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 1781a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com mProgramShaderHandleAllocator.release(shaderObject->first); 179da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com delete shaderObject->second; 180da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mShaderMap.erase(shaderObject); 181da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 182da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com else 183da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 184da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com shaderObject->second->flagForDeletion(); 185da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 186da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 187da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 188da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 189da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comvoid ResourceManager::deleteProgram(GLuint program) 190da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 191da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com ProgramMap::iterator programObject = mProgramMap.find(program); 192da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 193da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (programObject != mProgramMap.end()) 194da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 195da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (programObject->second->getRefCount() == 0) 196da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 1971a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com mProgramShaderHandleAllocator.release(programObject->first); 198da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com delete programObject->second; 199da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mProgramMap.erase(programObject); 200da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 201da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com else 202da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 203da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com programObject->second->flagForDeletion(); 204da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 205da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 206da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 207da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 208da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comvoid ResourceManager::deleteTexture(GLuint texture) 209da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 210da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com TextureMap::iterator textureObject = mTextureMap.find(texture); 211da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 212da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (textureObject != mTextureMap.end()) 213da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 2141a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com mTextureHandleAllocator.release(textureObject->first); 215ff8bdfb065ddd9202cc27df894ad39f1a024fdd4apatrick@chromium.org if (textureObject->second) textureObject->second->release(); 216da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mTextureMap.erase(textureObject); 217da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 218da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 219da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 220da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comvoid ResourceManager::deleteRenderbuffer(GLuint renderbuffer) 221da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 222da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com RenderbufferMap::iterator renderbufferObject = mRenderbufferMap.find(renderbuffer); 223da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 224da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (renderbufferObject != mRenderbufferMap.end()) 225da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 2261a23334f9536101cb777451bd6e5b9f13dd5c818benvanik@google.com mRenderbufferHandleAllocator.release(renderbufferObject->first); 227ff8bdfb065ddd9202cc27df894ad39f1a024fdd4apatrick@chromium.org if (renderbufferObject->second) renderbufferObject->second->release(); 228da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mRenderbufferMap.erase(renderbufferObject); 229da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 230da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 231da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 232dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madillvoid ResourceManager::deleteSampler(GLuint sampler) 233dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill{ 234dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill auto samplerObject = mSamplerMap.find(sampler); 235dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill 236dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill if (samplerObject != mSamplerMap.end()) 237dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill { 2387993190b891e97dd6b23b9c442817d07892f39aeGeoff Lang mSamplerHandleAllocator.release(samplerObject->first); 239dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill if (samplerObject->second) samplerObject->second->release(); 240dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill mSamplerMap.erase(samplerObject); 241dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill } 242dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill} 243dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill 244cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madillvoid ResourceManager::deleteFenceSync(GLuint fenceSync) 245cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill{ 246cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill auto fenceObjectIt = mFenceSyncMap.find(fenceSync); 247cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill 248cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill if (fenceObjectIt != mFenceSyncMap.end()) 249cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill { 250cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill mFenceSyncHandleAllocator.release(fenceObjectIt->first); 251cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill if (fenceObjectIt->second) fenceObjectIt->second->release(); 252cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill mFenceSyncMap.erase(fenceObjectIt); 253cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill } 254cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill} 255cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill 256da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comBuffer *ResourceManager::getBuffer(unsigned int handle) 257da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 258da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com BufferMap::iterator buffer = mBufferMap.find(handle); 259da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 260da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (buffer == mBufferMap.end()) 261da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 262da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return NULL; 263da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 264da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com else 265da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 266da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return buffer->second; 267da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 268da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 269da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 270da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comShader *ResourceManager::getShader(unsigned int handle) 271da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 272da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com ShaderMap::iterator shader = mShaderMap.find(handle); 273da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 274da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (shader == mShaderMap.end()) 275da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 276da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return NULL; 277da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 278da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com else 279da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 280da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return shader->second; 281da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 282da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 283da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 284da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comTexture *ResourceManager::getTexture(unsigned int handle) 285da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 286da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (handle == 0) return NULL; 287da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 288da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com TextureMap::iterator texture = mTextureMap.find(handle); 289da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 290da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (texture == mTextureMap.end()) 291da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 292da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return NULL; 293da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 294da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com else 295da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 296da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return texture->second; 297da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 298da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 299da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 300da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comProgram *ResourceManager::getProgram(unsigned int handle) 301da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 302da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com ProgramMap::iterator program = mProgramMap.find(handle); 303da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 304da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (program == mProgramMap.end()) 305da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 306da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return NULL; 307da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 308da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com else 309da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 310da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return program->second; 311da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 312da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 313da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 3143c7fa226aeb81469b93142b54e339f13a46ab835Jamie MadillFramebufferAttachment *ResourceManager::getRenderbuffer(unsigned int handle) 315da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 316da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com RenderbufferMap::iterator renderbuffer = mRenderbufferMap.find(handle); 317da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 318da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (renderbuffer == mRenderbufferMap.end()) 319da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 320da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return NULL; 321da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 322da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com else 323da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 324da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return renderbuffer->second; 325da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 326da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 327da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 328dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie MadillSampler *ResourceManager::getSampler(unsigned int handle) 329dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill{ 330dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill auto sampler = mSamplerMap.find(handle); 331dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill 332dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill if (sampler == mSamplerMap.end()) 333dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill { 334dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill return NULL; 335dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill } 336dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill else 337dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill { 338dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill return sampler->second; 339dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill } 340dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill} 341dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill 342cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie MadillFenceSync *ResourceManager::getFenceSync(unsigned int handle) 343cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill{ 344cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill auto fenceObjectIt = mFenceSyncMap.find(handle); 345cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill 346cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill if (fenceObjectIt == mFenceSyncMap.end()) 347cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill { 348cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill return NULL; 349cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill } 350cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill else 351cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill { 352cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill return fenceObjectIt->second; 353cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill } 354cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill} 355cd055f81f941b108b936fa0eaf2523793ddf7b4fJamie Madill 3563c7fa226aeb81469b93142b54e339f13a46ab835Jamie Madillvoid ResourceManager::setRenderbuffer(GLuint handle, FramebufferAttachment *buffer) 357da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 358da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mRenderbufferMap[handle] = buffer; 359da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 360da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 361da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comvoid ResourceManager::checkBufferAllocation(unsigned int buffer) 362da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 363da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (buffer != 0 && !getBuffer(buffer)) 364da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 36570062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com Buffer *bufferObject = new Buffer(mRenderer, buffer); 3669ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com mBufferMap[buffer] = bufferObject; 3679ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com bufferObject->addRef(); 368da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 369da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 370da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 3710e64dd6dc05a4d3e31f6cbc69ceeafc4a863a65edaniel@transgaming.comvoid ResourceManager::checkTextureAllocation(GLuint texture, TextureType type) 372da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 373da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (!getTexture(texture) && texture != 0) 374da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 3759ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com Texture *textureObject; 3769ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com 3770e64dd6dc05a4d3e31f6cbc69ceeafc4a863a65edaniel@transgaming.com if (type == TEXTURE_2D) 378da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 379370482e77de4d88ed2954757bf519f2f8bcd364edaniel@transgaming.com textureObject = new Texture2D(mRenderer, texture); 380da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 3810e64dd6dc05a4d3e31f6cbc69ceeafc4a863a65edaniel@transgaming.com else if (type == TEXTURE_CUBE) 382da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 383370482e77de4d88ed2954757bf519f2f8bcd364edaniel@transgaming.com textureObject = new TextureCubeMap(mRenderer, texture); 384da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 385c416e1cc09f1404d3dbcf23cd55956d37ebe67d2shannon.woods%transgaming.com@gtempaccount.com else if (type == TEXTURE_3D) 386c416e1cc09f1404d3dbcf23cd55956d37ebe67d2shannon.woods%transgaming.com@gtempaccount.com { 387c416e1cc09f1404d3dbcf23cd55956d37ebe67d2shannon.woods%transgaming.com@gtempaccount.com textureObject = new Texture3D(mRenderer, texture); 388c416e1cc09f1404d3dbcf23cd55956d37ebe67d2shannon.woods%transgaming.com@gtempaccount.com } 38990dbc44c79052a9ceaab2c782a67e7d149da5385shannon.woods%transgaming.com@gtempaccount.com else if (type == TEXTURE_2D_ARRAY) 39090dbc44c79052a9ceaab2c782a67e7d149da5385shannon.woods%transgaming.com@gtempaccount.com { 39190dbc44c79052a9ceaab2c782a67e7d149da5385shannon.woods%transgaming.com@gtempaccount.com textureObject = new Texture2DArray(mRenderer, texture); 39290dbc44c79052a9ceaab2c782a67e7d149da5385shannon.woods%transgaming.com@gtempaccount.com } 3939ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com else 3949ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com { 3959ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com UNREACHABLE(); 3969ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com return; 3979ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com } 3989ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com 3999ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com mTextureMap[texture] = textureObject; 4009ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com textureObject->addRef(); 401da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 402da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 403da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 404da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comvoid ResourceManager::checkRenderbufferAllocation(GLuint renderbuffer) 405da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 406da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (renderbuffer != 0 && !getRenderbuffer(renderbuffer)) 407da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 4083c7fa226aeb81469b93142b54e339f13a46ab835Jamie Madill FramebufferAttachment *renderbufferObject = new FramebufferAttachment(mRenderer, renderbuffer, new Colorbuffer(mRenderer, 0, 0, GL_RGBA4, 0)); 4099ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com mRenderbufferMap[renderbuffer] = renderbufferObject; 4109ecb9f9d504e71672a610183c34ae33ab276aef4daniel@transgaming.com renderbufferObject->addRef(); 411da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 412da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 413da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 414dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madillvoid ResourceManager::checkSamplerAllocation(GLuint sampler) 415dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill{ 416dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill if (sampler != 0 && !getSampler(sampler)) 417dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill { 418dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill Sampler *samplerObject = new Sampler(sampler); 419dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill mSamplerMap[sampler] = samplerObject; 420dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill samplerObject->addRef(); 421dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill } 422dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill} 423dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill 424dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madillbool ResourceManager::isSampler(GLuint sampler) 425dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill{ 426dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill return mSamplerMap.find(sampler) != mSamplerMap.end(); 427dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill} 428dc35604b10728a6d85ba8dba7380ed30a92d6850Jamie Madill 429da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 430