15abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick//
25abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
35abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// Use of this source code is governed by a BSD-style license that can be
45abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// found in the LICENSE file.
55abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick//
65abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
75abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// ResourceManager.cpp: Implements the gl::ResourceManager class, which tracks and
85abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// retrieves objects which may be shared by multiple Contexts.
95abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "libGLESv2/ResourceManager.h"
115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "libGLESv2/Buffer.h"
135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "libGLESv2/Program.h"
145abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "libGLESv2/RenderBuffer.h"
155abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "libGLESv2/Shader.h"
165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "libGLESv2/Texture.h"
175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merricknamespace gl
195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickResourceManager::ResourceManager()
215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    mRefCount = 1;
235abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
245abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickResourceManager::~ResourceManager()
265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    while (!mBufferMap.empty())
285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        deleteBuffer(mBufferMap.begin()->first);
305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    while (!mProgramMap.empty())
335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        deleteProgram(mProgramMap.begin()->first);
355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    while (!mShaderMap.empty())
385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
395abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        deleteShader(mShaderMap.begin()->first);
405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    while (!mRenderbufferMap.empty())
435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        deleteRenderbuffer(mRenderbufferMap.begin()->first);
455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    while (!mTextureMap.empty())
485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        deleteTexture(mTextureMap.begin()->first);
505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid ResourceManager::addRef()
545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
555abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    mRefCount++;
565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
575abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
585abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid ResourceManager::release()
595abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
605abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (--mRefCount == 0)
615abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
625abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        delete this;
635abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
645abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
655abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// Returns an unused buffer name
675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickGLuint ResourceManager::createBuffer()
685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
695abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    unsigned int handle = 1;
705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
715abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    while (mBufferMap.find(handle) != mBufferMap.end())
725abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
735abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        handle++;
745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    mBufferMap[handle] = NULL;
775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return handle;
795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
805abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// Returns an unused shader/program name
825abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickGLuint ResourceManager::createShader(GLenum type)
835abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
845abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    unsigned int handle = 1;
855abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
865abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    while (mShaderMap.find(handle) != mShaderMap.end() || mProgramMap.find(handle) != mProgramMap.end())   // Shared name space
875abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        handle++;
895abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
905abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
915abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (type == GL_VERTEX_SHADER)
925abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
935abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        mShaderMap[handle] = new VertexShader(this, handle);
945abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
955abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    else if (type == GL_FRAGMENT_SHADER)
965abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
975abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        mShaderMap[handle] = new FragmentShader(this, handle);
985abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
995abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    else UNREACHABLE();
1005abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1015abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return handle;
1025abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
1035abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1045abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// Returns an unused program/shader name
1055abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickGLuint ResourceManager::createProgram()
1065abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
1075abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    unsigned int handle = 1;
1085abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1095abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    while (mProgramMap.find(handle) != mProgramMap.end() || mShaderMap.find(handle) != mShaderMap.end())   // Shared name space
1105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
1115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        handle++;
1125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
1135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1145abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    mProgramMap[handle] = new Program(this, handle);
1155abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return handle;
1175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
1185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// Returns an unused texture name
1205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickGLuint ResourceManager::createTexture()
1215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
1225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    unsigned int handle = 1;
1235abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1245abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    while (mTextureMap.find(handle) != mTextureMap.end())
1255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
1265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        handle++;
1275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
1285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    mTextureMap[handle] = NULL;
1305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return handle;
1325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
1335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// Returns an unused renderbuffer name
1355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickGLuint ResourceManager::createRenderbuffer()
1365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
1375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    unsigned int handle = 1;
1385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1395abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    while (mRenderbufferMap.find(handle) != mRenderbufferMap.end())
1405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
1415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        handle++;
1425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
1435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    mRenderbufferMap[handle] = NULL;
1455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return handle;
1475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
1485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid ResourceManager::deleteBuffer(GLuint buffer)
1505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
1515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    BufferMap::iterator bufferObject = mBufferMap.find(buffer);
1525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (bufferObject != mBufferMap.end())
1545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
1555abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (bufferObject->second) bufferObject->second->release();
1565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        mBufferMap.erase(bufferObject);
1575abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
1585abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
1595abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1605abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid ResourceManager::deleteShader(GLuint shader)
1615abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
1625abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    ShaderMap::iterator shaderObject = mShaderMap.find(shader);
1635abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1645abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (shaderObject != mShaderMap.end())
1655abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
1665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (shaderObject->second->getRefCount() == 0)
1675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        {
1685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            delete shaderObject->second;
1695abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            mShaderMap.erase(shaderObject);
1705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        }
1715abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        else
1725abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        {
1735abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            shaderObject->second->flagForDeletion();
1745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        }
1755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
1765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
1775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid ResourceManager::deleteProgram(GLuint program)
1795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
1805abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    ProgramMap::iterator programObject = mProgramMap.find(program);
1815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1825abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (programObject != mProgramMap.end())
1835abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
1845abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (programObject->second->getRefCount() == 0)
1855abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        {
1865abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            delete programObject->second;
1875abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            mProgramMap.erase(programObject);
1885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        }
1895abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        else
1905abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        {
1915abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            programObject->second->flagForDeletion();
1925abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        }
1935abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
1945abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
1955abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1965abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid ResourceManager::deleteTexture(GLuint texture)
1975abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
1985abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    TextureMap::iterator textureObject = mTextureMap.find(texture);
1995abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
2005abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (textureObject != mTextureMap.end())
2015abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
2025abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (textureObject->second) textureObject->second->release();
2035abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        mTextureMap.erase(textureObject);
2045abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
2055abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
2065abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
2075abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid ResourceManager::deleteRenderbuffer(GLuint renderbuffer)
2085abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
2095abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    RenderbufferMap::iterator renderbufferObject = mRenderbufferMap.find(renderbuffer);
2105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
2115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (renderbufferObject != mRenderbufferMap.end())
2125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
2135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (renderbufferObject->second) renderbufferObject->second->release();
2145abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        mRenderbufferMap.erase(renderbufferObject);
2155abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
2165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
2175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
2185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickBuffer *ResourceManager::getBuffer(unsigned int handle)
2195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
2205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    BufferMap::iterator buffer = mBufferMap.find(handle);
2215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
2225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (buffer == mBufferMap.end())
2235abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
2245abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return NULL;
2255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
2265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    else
2275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
2285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return buffer->second;
2295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
2305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
2315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
2325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickShader *ResourceManager::getShader(unsigned int handle)
2335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
2345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    ShaderMap::iterator shader = mShaderMap.find(handle);
2355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
2365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (shader == mShaderMap.end())
2375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
2385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return NULL;
2395abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
2405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    else
2415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
2425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return shader->second;
2435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
2445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
2455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
2465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickTexture *ResourceManager::getTexture(unsigned int handle)
2475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
2485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (handle == 0) return NULL;
2495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
2505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    TextureMap::iterator texture = mTextureMap.find(handle);
2515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
2525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (texture == mTextureMap.end())
2535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
2545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return NULL;
2555abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
2565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    else
2575abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
2585abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return texture->second;
2595abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
2605abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
2615abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
2625abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickProgram *ResourceManager::getProgram(unsigned int handle)
2635abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
2645abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    ProgramMap::iterator program = mProgramMap.find(handle);
2655abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
2665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (program == mProgramMap.end())
2675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
2685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return NULL;
2695abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
2705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    else
2715abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
2725abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return program->second;
2735abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
2745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
2755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
2765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickRenderbuffer *ResourceManager::getRenderbuffer(unsigned int handle)
2775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
2785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    RenderbufferMap::iterator renderbuffer = mRenderbufferMap.find(handle);
2795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
2805abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (renderbuffer == mRenderbufferMap.end())
2815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
2825abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return NULL;
2835abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
2845abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    else
2855abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
2865abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return renderbuffer->second;
2875abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
2885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
2895abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
2905abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid ResourceManager::setRenderbuffer(GLuint handle, Renderbuffer *buffer)
2915abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
2925abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    mRenderbufferMap[handle] = buffer;
2935abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
2945abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
2955abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid ResourceManager::checkBufferAllocation(unsigned int buffer)
2965abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
2975abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (buffer != 0 && !getBuffer(buffer))
2985abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
2995abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        Buffer *bufferObject = new Buffer(buffer);
3005abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        mBufferMap[buffer] = bufferObject;
3015abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        bufferObject->addRef();
3025abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
3035abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
3045abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
3055abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid ResourceManager::checkTextureAllocation(GLuint texture, SamplerType type)
3065abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
3075abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (!getTexture(texture) && texture != 0)
3085abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
3095abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        Texture *textureObject;
3105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
3115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (type == SAMPLER_2D)
3125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        {
3135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            textureObject = new Texture2D(texture);
3145abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        }
3155abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        else if (type == SAMPLER_CUBE)
3165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        {
3175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            textureObject = new TextureCubeMap(texture);
3185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        }
3195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        else
3205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        {
3215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            UNREACHABLE();
3225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            return;
3235abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        }
3245abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
3255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        mTextureMap[texture] = textureObject;
3265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        textureObject->addRef();
3275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
3285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
3295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
3305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid ResourceManager::checkRenderbufferAllocation(GLuint renderbuffer)
3315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
3325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (renderbuffer != 0 && !getRenderbuffer(renderbuffer))
3335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
3345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        Renderbuffer *renderbufferObject = new Renderbuffer(renderbuffer, new Colorbuffer(0, 0, GL_RGBA4, 0));
3355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        mRenderbufferMap[renderbuffer] = renderbufferObject;
3365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        renderbufferObject->addRef();
3375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
3385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
3395abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
3405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
341