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