Adds resource manager class.

TRAC #12493 The resource manager class is now in charge of allocation & management of objects which may be shared by multiple contexts. Signed-off-by: Andrew Lewycky Signed-off-by: Nicolas Capens Signed-off-by: Daniel Koch Author: Shannon Woods git-svn-id: https://angleproject.googlecode.com/svn/trunk@360 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 9930531a
......@@ -7,8 +7,8 @@
// Context.h: Defines the gl::Context class, managing all GL state and performing
// rendering operations. It is the GLES2 specific implementation of EGLContext.
#ifndef INCLUDE_CONTEXT_H_
#define INCLUDE_CONTEXT_H_
#ifndef LIBGLESV2_CONTEXT_H_
#define LIBGLESV2_CONTEXT_H_
#define GL_APICALL
#include <GLES2/gl2.h>
......@@ -19,6 +19,7 @@
#include <map>
#include "common/angleutils.h"
#include "libGLESv2/ResourceManager.h"
namespace egl
{
......@@ -71,14 +72,6 @@ const float ALIASED_POINT_SIZE_RANGE_MIN = 1.0f;
const float ALIASED_POINT_SIZE_RANGE_MAX_SM2 = 1.0f;
const float ALIASED_POINT_SIZE_RANGE_MAX_SM3 = 64.0f;
enum SamplerType
{
SAMPLER_2D,
SAMPLER_CUBE,
SAMPLER_TYPE_COUNT
};
struct Color
{
float red;
......@@ -297,19 +290,23 @@ class Context
void setPackAlignment(GLint alignment);
GLint getPackAlignment() const;
// These create and destroy methods are merely pass-throughs to
// ResourceManager, which owns these object types
GLuint createBuffer();
GLuint createShader(GLenum type);
GLuint createProgram();
GLuint createTexture();
GLuint createFramebuffer();
GLuint createRenderbuffer();
void deleteBuffer(GLuint buffer);
void deleteShader(GLuint shader);
void deleteProgram(GLuint program);
void deleteTexture(GLuint texture);
void deleteFramebuffer(GLuint framebuffer);
void deleteRenderbuffer(GLuint renderbuffer);
// Framebuffers are owned by the Context, so these methods do not pass through
GLuint createFramebuffer();
void deleteFramebuffer(GLuint framebuffer);
void bindArrayBuffer(GLuint buffer);
void bindElementArrayBuffer(GLuint buffer);
......@@ -407,24 +404,9 @@ class Context
Colorbuffer *mColorbufferZero;
DepthStencilbuffer *mDepthStencilbufferZero;
typedef std::map<GLuint, Buffer*> BufferMap;
BufferMap mBufferMap;
typedef std::map<GLuint, Shader*> ShaderMap;
ShaderMap mShaderMap;
typedef std::map<GLuint, Program*> ProgramMap;
ProgramMap mProgramMap;
typedef std::map<GLuint, Texture*> TextureMap;
TextureMap mTextureMap;
typedef std::map<GLuint, Framebuffer*> FramebufferMap;
FramebufferMap mFramebufferMap;
typedef std::map<GLuint, Renderbuffer*> RenderbufferMap;
RenderbufferMap mRenderbufferMap;
void initExtensionString();
std::string mExtensionString;
......@@ -433,7 +415,7 @@ class Context
IndexDataManager *mIndexDataManager;
Blit *mBlit;
Texture *mIncompleteTextures[SAMPLER_TYPE_COUNT];
// Recorded errors
......@@ -469,6 +451,8 @@ class Context
IDirect3DStateBlock9 *mMaskedClearSavedState;
D3DCAPS9 mDeviceCaps;
ResourceManager *mResourceManager;
};
}
......
......@@ -45,7 +45,7 @@ UniformLocation::UniformLocation(const std::string &name, unsigned int element,
{
}
Program::Program()
Program::Program(ResourceManager *manager, GLuint handle) : mResourceManager(manager), mHandle(handle)
{
mFragmentShader = NULL;
mVertexShader = NULL;
......@@ -62,6 +62,8 @@ Program::Program()
mDeleteStatus = false;
mRefCount = 0;
mSerial = issueSerial();
}
......@@ -71,12 +73,12 @@ Program::~Program()
if (mVertexShader != NULL)
{
mVertexShader->detach();
mVertexShader->release();
}
if (mFragmentShader != NULL)
{
mFragmentShader->detach();
mFragmentShader->release();
}
}
......@@ -90,7 +92,7 @@ bool Program::attachShader(Shader *shader)
}
mVertexShader = (VertexShader*)shader;
mVertexShader->attach();
mVertexShader->addRef();
}
else if (shader->getType() == GL_FRAGMENT_SHADER)
{
......@@ -100,7 +102,7 @@ bool Program::attachShader(Shader *shader)
}
mFragmentShader = (FragmentShader*)shader;
mFragmentShader->attach();
mFragmentShader->addRef();
}
else UNREACHABLE();
......@@ -116,7 +118,7 @@ bool Program::detachShader(Shader *shader)
return false;
}
mVertexShader->detach();
mVertexShader->release();
mVertexShader = NULL;
}
else if (shader->getType() == GL_FRAGMENT_SHADER)
......@@ -126,7 +128,7 @@ bool Program::detachShader(Shader *shader)
return false;
}
mFragmentShader->detach();
mFragmentShader->release();
mFragmentShader = NULL;
}
else UNREACHABLE();
......@@ -2379,13 +2381,13 @@ void Program::unlink(bool destroy)
{
if (mFragmentShader)
{
mFragmentShader->detach();
mFragmentShader->release();
mFragmentShader = NULL;
}
if (mVertexShader)
{
mVertexShader->detach();
mVertexShader->release();
mVertexShader = NULL;
}
}
......@@ -2462,6 +2464,26 @@ bool Program::isValidated() const
return mValidated;
}
void Program::release()
{
mRefCount--;
if (mRefCount == 0 && mDeleteStatus)
{
mResourceManager->deleteProgram(mHandle);
}
}
void Program::addRef()
{
mRefCount++;
}
unsigned int Program::getRefCount() const
{
return mRefCount;
}
unsigned int Program::getSerial() const
{
return mSerial;
......
......@@ -20,6 +20,7 @@
namespace gl
{
class ResourceManager;
class FragmentShader;
class VertexShader;
......@@ -55,7 +56,7 @@ struct UniformLocation
class Program
{
public:
Program();
Program(ResourceManager *manager, GLuint handle);
~Program();
......@@ -119,6 +120,9 @@ class Program
GLint getActiveUniformCount();
GLint getActiveUniformMaxLength();
void addRef();
void release();
unsigned int getRefCount() const;
void flagForDeletion();
bool isFlaggedForDeletion() const;
......@@ -214,9 +218,14 @@ class Program
char *mInfoLog;
bool mValidated;
unsigned int mRefCount;
unsigned int mSerial;
static unsigned int mCurrentSerial;
ResourceManager *mResourceManager;
const GLuint mHandle;
};
}
......
//
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// ResourceManager.cpp: Implements the gl::ResourceManager class, which tracks and
// retrieves objects which may be shared by multiple Contexts.
#include "libGLESv2/ResourceManager.h"
#include "libGLESv2/Buffer.h"
#include "libGLESv2/Program.h"
#include "libGLESv2/RenderBuffer.h"
#include "libGLESv2/Shader.h"
#include "libGLESv2/Texture.h"
namespace gl
{
ResourceManager::ResourceManager()
{
}
ResourceManager::~ResourceManager()
{
while (!mBufferMap.empty())
{
deleteBuffer(mBufferMap.begin()->first);
}
while (!mProgramMap.empty())
{
deleteProgram(mProgramMap.begin()->first);
}
while (!mShaderMap.empty())
{
deleteShader(mShaderMap.begin()->first);
}
while (!mRenderbufferMap.empty())
{
deleteRenderbuffer(mRenderbufferMap.begin()->first);
}
while (!mTextureMap.empty())
{
deleteTexture(mTextureMap.begin()->first);
}
}
// Returns an unused buffer name
GLuint ResourceManager::createBuffer()
{
unsigned int handle = 1;
while (mBufferMap.find(handle) != mBufferMap.end())
{
handle++;
}
mBufferMap[handle] = NULL;
return handle;
}
// Returns an unused shader/program name
GLuint ResourceManager::createShader(GLenum type)
{
unsigned int handle = 1;
while (mShaderMap.find(handle) != mShaderMap.end() || mProgramMap.find(handle) != mProgramMap.end()) // Shared name space
{
handle++;
}
if (type == GL_VERTEX_SHADER)
{
mShaderMap[handle] = new VertexShader(this, handle);
}
else if (type == GL_FRAGMENT_SHADER)
{
mShaderMap[handle] = new FragmentShader(this, handle);
}
else UNREACHABLE();
return handle;
}
// Returns an unused program/shader name
GLuint ResourceManager::createProgram()
{
unsigned int handle = 1;
while (mProgramMap.find(handle) != mProgramMap.end() || mShaderMap.find(handle) != mShaderMap.end()) // Shared name space
{
handle++;
}
mProgramMap[handle] = new Program(this, handle);
return handle;
}
// Returns an unused texture name
GLuint ResourceManager::createTexture()
{
unsigned int handle = 1;
while (mTextureMap.find(handle) != mTextureMap.end())
{
handle++;
}
mTextureMap[handle] = NULL;
return handle;
}
// Returns an unused renderbuffer name
GLuint ResourceManager::createRenderbuffer()
{
unsigned int handle = 1;
while (mRenderbufferMap.find(handle) != mRenderbufferMap.end())
{
handle++;
}
mRenderbufferMap[handle] = NULL;
return handle;
}
// FIXME: shared object deletion needs handling
void ResourceManager::deleteBuffer(GLuint buffer)
{
BufferMap::iterator bufferObject = mBufferMap.find(buffer);
if (bufferObject != mBufferMap.end())
{
delete bufferObject->second;
mBufferMap.erase(bufferObject);
}
}
void ResourceManager::deleteShader(GLuint shader)
{
ShaderMap::iterator shaderObject = mShaderMap.find(shader);
if (shaderObject != mShaderMap.end())
{
if (shaderObject->second->getRefCount() == 0)
{
delete shaderObject->second;
mShaderMap.erase(shaderObject);
}
else
{
shaderObject->second->flagForDeletion();
}
}
}
void ResourceManager::deleteProgram(GLuint program)
{
ProgramMap::iterator programObject = mProgramMap.find(program);
if (programObject != mProgramMap.end())
{
if (programObject->second->getRefCount() == 0)
{
delete programObject->second;
mProgramMap.erase(programObject);
}
else
{
programObject->second->flagForDeletion();
}
}
}
// FIXME: shared object deletion needs handling
void ResourceManager::deleteTexture(GLuint texture)
{
TextureMap::iterator textureObject = mTextureMap.find(texture);
if (textureObject != mTextureMap.end())
{
if (texture != 0)
{
delete textureObject->second;
}
mTextureMap.erase(textureObject);
}
}
// FIXME: shared object deletion needs handling
void ResourceManager::deleteRenderbuffer(GLuint renderbuffer)
{
RenderbufferMap::iterator renderbufferObject = mRenderbufferMap.find(renderbuffer);
if (renderbufferObject != mRenderbufferMap.end())
{
delete renderbufferObject->second;
mRenderbufferMap.erase(renderbufferObject);
}
}
Buffer *ResourceManager::getBuffer(unsigned int handle)
{
BufferMap::iterator buffer = mBufferMap.find(handle);
if (buffer == mBufferMap.end())
{
return NULL;
}
else
{
return buffer->second;
}
}
Shader *ResourceManager::getShader(unsigned int handle)
{
ShaderMap::iterator shader = mShaderMap.find(handle);
if (shader == mShaderMap.end())
{
return NULL;
}
else
{
return shader->second;
}
}
Texture *ResourceManager::getTexture(unsigned int handle)
{
if (handle == 0) return NULL;
TextureMap::iterator texture = mTextureMap.find(handle);
if (texture == mTextureMap.end())
{
return NULL;
}
else
{
return texture->second;
}
}
Program *ResourceManager::getProgram(unsigned int handle)
{
ProgramMap::iterator program = mProgramMap.find(handle);
if (program == mProgramMap.end())
{
return NULL;
}
else
{
return program->second;
}
}
Renderbuffer *ResourceManager::getRenderbuffer(unsigned int handle)
{
RenderbufferMap::iterator renderbuffer = mRenderbufferMap.find(handle);
if (renderbuffer == mRenderbufferMap.end())
{
return NULL;
}
else
{
return renderbuffer->second;
}
}
void ResourceManager::setRenderbuffer(GLuint handle, Renderbuffer *buffer)
{
mRenderbufferMap[handle] = buffer;
}
void ResourceManager::checkBufferAllocation(unsigned int buffer)
{
if (buffer != 0 && !getBuffer(buffer))
{
mBufferMap[buffer] = new Buffer();
}
}
void ResourceManager::checkTextureAllocation(GLuint texture, SamplerType type)
{
if (!getTexture(texture) && texture != 0)
{
if (type == SAMPLER_2D)
{
mTextureMap[texture] = new Texture2D();
}
else if (type == SAMPLER_CUBE)
{
mTextureMap[texture] = new TextureCubeMap();
}
}
}
void ResourceManager::checkRenderbufferAllocation(GLuint renderbuffer)
{
if (renderbuffer != 0 && !getRenderbuffer(renderbuffer))
{
mRenderbufferMap[renderbuffer] = new Renderbuffer();
}
}
}
//
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// ResourceManager.h : Defines the ResourceManager class, which tracks objects
// shared by multiple GL contexts.
#ifndef LIBGLESV2_RESOURCEMANAGER_H_
#define LIBGLESV2_RESOURCEMANAGER_H_
#define GL_APICALL
#include <GLES2/gl2.h>
#include <map>
#include "common/angleutils.h"
namespace gl
{
class Buffer;
class Shader;
class Program;
class Texture;
class Renderbuffer;
enum SamplerType
{
SAMPLER_2D,
SAMPLER_CUBE,
SAMPLER_TYPE_COUNT
};
class ResourceManager
{
public:
ResourceManager();
~ResourceManager();
GLuint createBuffer();
GLuint createShader(GLenum type);
GLuint createProgram();
GLuint createTexture();
GLuint createRenderbuffer();
void deleteBuffer(GLuint buffer);
void deleteShader(GLuint shader);
void deleteProgram(GLuint program);
void deleteTexture(GLuint texture);
void deleteRenderbuffer(GLuint renderbuffer);
Buffer *getBuffer(GLuint handle);
Shader *getShader(GLuint handle);
Program *getProgram(GLuint handle);
Texture *getTexture(GLuint handle);
Renderbuffer *getRenderbuffer(GLuint handle);
void setRenderbuffer(GLuint handle, Renderbuffer *renderbuffer);
void checkBufferAllocation(unsigned int buffer);
void checkTextureAllocation(GLuint texture, SamplerType type);
void checkRenderbufferAllocation(GLuint renderbuffer);
private:
DISALLOW_COPY_AND_ASSIGN(ResourceManager);
typedef std::map<GLuint, Buffer*> BufferMap;
BufferMap mBufferMap;
typedef std::map<GLuint, Shader*> ShaderMap;
ShaderMap mShaderMap;
typedef std::map<GLuint, Program*> ProgramMap;
ProgramMap mProgramMap;
typedef std::map<GLuint, Texture*> TextureMap;
TextureMap mTextureMap;
typedef std::map<GLuint, Renderbuffer*> RenderbufferMap;
RenderbufferMap mRenderbufferMap;
};
}
#endif // LIBGLESV2_RESOURCEMANAGER_H_
......@@ -21,7 +21,7 @@ namespace gl
void *Shader::mFragmentCompiler = NULL;
void *Shader::mVertexCompiler = NULL;
Shader::Shader(Context *context, GLuint handle) : mHandle(handle), mContext(context)
Shader::Shader(ResourceManager *manager, GLuint handle) : mHandle(handle), mResourceManager(manager)
{
mSource = NULL;
mHlsl = NULL;
......@@ -49,7 +49,7 @@ Shader::Shader(Context *context, GLuint handle) : mHandle(handle), mContext(cont
}
}
mAttachCount = 0;
mRefCount = 0;
mDeleteStatus = false;
}
......@@ -187,24 +187,24 @@ const char *Shader::getHLSL()
return mHlsl;
}
void Shader::attach()
void Shader::addRef()
{
mAttachCount++;
mRefCount++;
}
void Shader::detach()
void Shader::release()
{
mAttachCount--;
mRefCount--;
if (mAttachCount == 0 && mDeleteStatus)
if (mRefCount == 0 && mDeleteStatus)
{
mContext->deleteShader(mHandle);
mResourceManager->deleteShader(mHandle);
}
}
bool Shader::isAttached() const
unsigned int Shader::getRefCount() const
{
return mAttachCount > 0;
return mRefCount;
}
bool Shader::isFlaggedForDeletion() const
......@@ -417,7 +417,7 @@ bool Shader::compareVarying(const Varying &x, const Varying &y)
return false;
}
VertexShader::VertexShader(Context *context, GLuint handle) : Shader(context, handle)
VertexShader::VertexShader(ResourceManager *manager, GLuint handle) : Shader(manager, handle)
{
}
......@@ -481,7 +481,7 @@ void VertexShader::parseAttributes()
}
}
FragmentShader::FragmentShader(Context *context, GLuint handle) : Shader(context, handle)
FragmentShader::FragmentShader(ResourceManager *manager, GLuint handle) : Shader(manager, handle)
{
}
......
......@@ -18,7 +18,7 @@
#include <list>
#include <vector>
#include "libGLESv2/Context.h"
#include "libGLESv2/ResourceManager.h"
namespace gl
{
......@@ -45,7 +45,7 @@ class Shader
friend Program;
public:
Shader(Context *context, GLuint handle);
Shader(ResourceManager *manager, GLuint handle);
virtual ~Shader();
......@@ -63,9 +63,9 @@ class Shader
bool isCompiled();
const char *getHLSL();
void attach();
void detach();
bool isAttached() const;
void addRef();
void release();
unsigned int getRefCount() const;
bool isFlaggedForDeletion() const;
void flagForDeletion();
......@@ -82,8 +82,8 @@ class Shader
static bool compareVarying(const Varying &x, const Varying &y);
const GLuint mHandle;
int mAttachCount; // Number of program objects this shader is attached to
bool mDeleteStatus; // Flag to indicate that the shader can be deleted when no longer in use
unsigned int mRefCount; // Number of program objects this shader is attached to
bool mDeleteStatus; // Flag to indicate that the shader can be deleted when no longer in use
char *mSource;
char *mHlsl;
......@@ -96,7 +96,7 @@ class Shader
bool mUsesPointSize;
bool mUsesPointCoord;
Context *mContext;
ResourceManager *mResourceManager;
static void *mFragmentCompiler;
static void *mVertexCompiler;
......@@ -123,7 +123,7 @@ class VertexShader : public Shader
friend Program;
public:
VertexShader(Context *context, GLuint handle);
VertexShader(ResourceManager *manager, GLuint handle);
~VertexShader();
......@@ -142,7 +142,7 @@ class VertexShader : public Shader
class FragmentShader : public Shader
{
public:
FragmentShader(Context *context, GLuint handle);
FragmentShader(ResourceManager *manager, GLuint handle);
~FragmentShader();
......
......@@ -32,7 +32,7 @@ Texture::Image::~Image()
if (surface) surface->Release();
}
Texture::Texture(Context *context) : mContext(context)
Texture::Texture()
{
mMinFilter = GL_NEAREST_MIPMAP_LINEAR;
mMagFilter = GL_LINEAR;
......@@ -51,7 +51,8 @@ Texture::~Texture()
Blit *Texture::getBlitter()
{
return mContext->getBlitter();
Context *context = getContext();
return context->getBlitter();
}
// Returns true on successful filter state update (valid enum parameter)
......@@ -442,7 +443,7 @@ int Texture::levelCount() const
return mBaseTexture ? mBaseTexture->GetLevelCount() : 0;
}
Texture2D::Texture2D(Context *context) : Texture(context)
Texture2D::Texture2D()
{
mTexture = NULL;
mColorbufferProxy = NULL;
......@@ -898,7 +899,7 @@ IDirect3DSurface9 *Texture2D::getRenderTarget(GLenum target)
return renderTarget;
}
TextureCubeMap::TextureCubeMap(Context *context) : Texture(context)
TextureCubeMap::TextureCubeMap()
{
mTexture = NULL;
......
......@@ -23,7 +23,6 @@
namespace gl
{
class Context;
class Blit;
enum
......@@ -37,7 +36,7 @@ enum
class Texture
{
public:
explicit Texture(Context *context);
explicit Texture();
virtual ~Texture();
......@@ -136,8 +135,6 @@ class Texture
private:
DISALLOW_COPY_AND_ASSIGN(Texture);
Context *mContext;
IDirect3DBaseTexture9 *mBaseTexture; // This is a weak pointer. The derived class is assumed to own a strong pointer.
bool mDirtyMetaData;
bool mIsRenderable;
......@@ -151,7 +148,7 @@ class Texture
class Texture2D : public Texture
{
public:
explicit Texture2D(Context *context);
explicit Texture2D();
~Texture2D();
......@@ -193,7 +190,7 @@ class Texture2D : public Texture
class TextureCubeMap : public Texture
{
public:
explicit TextureCubeMap(Context *context);
explicit TextureCubeMap();
~TextureCubeMap();
......
......@@ -221,6 +221,10 @@
>
</File>
<File
RelativePath=".\ResourceManager.cpp"
>
</File>
<File
RelativePath=".\Shader.cpp"
>
</File>
......@@ -303,6 +307,10 @@
>
</File>
<File
RelativePath=".\ResourceManager.h"
>
</File>
<File
RelativePath=".\Shader.h"
>
</File>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment