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