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