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 @@ ...@@ -7,8 +7,8 @@
// Context.h: Defines the gl::Context class, managing all GL state and performing // Context.h: Defines the gl::Context class, managing all GL state and performing
// rendering operations. It is the GLES2 specific implementation of EGLContext. // rendering operations. It is the GLES2 specific implementation of EGLContext.
#ifndef INCLUDE_CONTEXT_H_ #ifndef LIBGLESV2_CONTEXT_H_
#define INCLUDE_CONTEXT_H_ #define LIBGLESV2_CONTEXT_H_
#define GL_APICALL #define GL_APICALL
#include <GLES2/gl2.h> #include <GLES2/gl2.h>
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <map> #include <map>
#include "common/angleutils.h" #include "common/angleutils.h"
#include "libGLESv2/ResourceManager.h"
namespace egl namespace egl
{ {
...@@ -71,14 +72,6 @@ const float ALIASED_POINT_SIZE_RANGE_MIN = 1.0f; ...@@ -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_SM2 = 1.0f;
const float ALIASED_POINT_SIZE_RANGE_MAX_SM3 = 64.0f; const float ALIASED_POINT_SIZE_RANGE_MAX_SM3 = 64.0f;
enum SamplerType
{
SAMPLER_2D,
SAMPLER_CUBE,
SAMPLER_TYPE_COUNT
};
struct Color struct Color
{ {
float red; float red;
...@@ -297,19 +290,23 @@ class Context ...@@ -297,19 +290,23 @@ class Context
void setPackAlignment(GLint alignment); void setPackAlignment(GLint alignment);
GLint getPackAlignment() const; GLint getPackAlignment() const;
// These create and destroy methods are merely pass-throughs to
// ResourceManager, which owns these object types
GLuint createBuffer(); GLuint createBuffer();
GLuint createShader(GLenum type); GLuint createShader(GLenum type);
GLuint createProgram(); GLuint createProgram();
GLuint createTexture(); GLuint createTexture();
GLuint createFramebuffer();
GLuint createRenderbuffer(); GLuint createRenderbuffer();
void deleteBuffer(GLuint buffer); void deleteBuffer(GLuint buffer);
void deleteShader(GLuint shader); void deleteShader(GLuint shader);
void deleteProgram(GLuint program); void deleteProgram(GLuint program);
void deleteTexture(GLuint texture); void deleteTexture(GLuint texture);
void deleteFramebuffer(GLuint framebuffer);
void deleteRenderbuffer(GLuint renderbuffer); 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 bindArrayBuffer(GLuint buffer);
void bindElementArrayBuffer(GLuint buffer); void bindElementArrayBuffer(GLuint buffer);
...@@ -407,24 +404,9 @@ class Context ...@@ -407,24 +404,9 @@ class Context
Colorbuffer *mColorbufferZero; Colorbuffer *mColorbufferZero;
DepthStencilbuffer *mDepthStencilbufferZero; 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; typedef std::map<GLuint, Framebuffer*> FramebufferMap;
FramebufferMap mFramebufferMap; FramebufferMap mFramebufferMap;
typedef std::map<GLuint, Renderbuffer*> RenderbufferMap;
RenderbufferMap mRenderbufferMap;
void initExtensionString(); void initExtensionString();
std::string mExtensionString; std::string mExtensionString;
...@@ -433,7 +415,7 @@ class Context ...@@ -433,7 +415,7 @@ class Context
IndexDataManager *mIndexDataManager; IndexDataManager *mIndexDataManager;
Blit *mBlit; Blit *mBlit;
Texture *mIncompleteTextures[SAMPLER_TYPE_COUNT]; Texture *mIncompleteTextures[SAMPLER_TYPE_COUNT];
// Recorded errors // Recorded errors
...@@ -469,6 +451,8 @@ class Context ...@@ -469,6 +451,8 @@ class Context
IDirect3DStateBlock9 *mMaskedClearSavedState; IDirect3DStateBlock9 *mMaskedClearSavedState;
D3DCAPS9 mDeviceCaps; D3DCAPS9 mDeviceCaps;
ResourceManager *mResourceManager;
}; };
} }
......
...@@ -45,7 +45,7 @@ UniformLocation::UniformLocation(const std::string &name, unsigned int element, ...@@ -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; mFragmentShader = NULL;
mVertexShader = NULL; mVertexShader = NULL;
...@@ -62,6 +62,8 @@ Program::Program() ...@@ -62,6 +62,8 @@ Program::Program()
mDeleteStatus = false; mDeleteStatus = false;
mRefCount = 0;
mSerial = issueSerial(); mSerial = issueSerial();
} }
...@@ -71,12 +73,12 @@ Program::~Program() ...@@ -71,12 +73,12 @@ Program::~Program()
if (mVertexShader != NULL) if (mVertexShader != NULL)
{ {
mVertexShader->detach(); mVertexShader->release();
} }
if (mFragmentShader != NULL) if (mFragmentShader != NULL)
{ {
mFragmentShader->detach(); mFragmentShader->release();
} }
} }
...@@ -90,7 +92,7 @@ bool Program::attachShader(Shader *shader) ...@@ -90,7 +92,7 @@ bool Program::attachShader(Shader *shader)
} }
mVertexShader = (VertexShader*)shader; mVertexShader = (VertexShader*)shader;
mVertexShader->attach(); mVertexShader->addRef();
} }
else if (shader->getType() == GL_FRAGMENT_SHADER) else if (shader->getType() == GL_FRAGMENT_SHADER)
{ {
...@@ -100,7 +102,7 @@ bool Program::attachShader(Shader *shader) ...@@ -100,7 +102,7 @@ bool Program::attachShader(Shader *shader)
} }
mFragmentShader = (FragmentShader*)shader; mFragmentShader = (FragmentShader*)shader;
mFragmentShader->attach(); mFragmentShader->addRef();
} }
else UNREACHABLE(); else UNREACHABLE();
...@@ -116,7 +118,7 @@ bool Program::detachShader(Shader *shader) ...@@ -116,7 +118,7 @@ bool Program::detachShader(Shader *shader)
return false; return false;
} }
mVertexShader->detach(); mVertexShader->release();
mVertexShader = NULL; mVertexShader = NULL;
} }
else if (shader->getType() == GL_FRAGMENT_SHADER) else if (shader->getType() == GL_FRAGMENT_SHADER)
...@@ -126,7 +128,7 @@ bool Program::detachShader(Shader *shader) ...@@ -126,7 +128,7 @@ bool Program::detachShader(Shader *shader)
return false; return false;
} }
mFragmentShader->detach(); mFragmentShader->release();
mFragmentShader = NULL; mFragmentShader = NULL;
} }
else UNREACHABLE(); else UNREACHABLE();
...@@ -2379,13 +2381,13 @@ void Program::unlink(bool destroy) ...@@ -2379,13 +2381,13 @@ void Program::unlink(bool destroy)
{ {
if (mFragmentShader) if (mFragmentShader)
{ {
mFragmentShader->detach(); mFragmentShader->release();
mFragmentShader = NULL; mFragmentShader = NULL;
} }
if (mVertexShader) if (mVertexShader)
{ {
mVertexShader->detach(); mVertexShader->release();
mVertexShader = NULL; mVertexShader = NULL;
} }
} }
...@@ -2462,6 +2464,26 @@ bool Program::isValidated() const ...@@ -2462,6 +2464,26 @@ bool Program::isValidated() const
return mValidated; 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 unsigned int Program::getSerial() const
{ {
return mSerial; return mSerial;
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
namespace gl namespace gl
{ {
class ResourceManager;
class FragmentShader; class FragmentShader;
class VertexShader; class VertexShader;
...@@ -55,7 +56,7 @@ struct UniformLocation ...@@ -55,7 +56,7 @@ struct UniformLocation
class Program class Program
{ {
public: public:
Program(); Program(ResourceManager *manager, GLuint handle);
~Program(); ~Program();
...@@ -119,6 +120,9 @@ class Program ...@@ -119,6 +120,9 @@ class Program
GLint getActiveUniformCount(); GLint getActiveUniformCount();
GLint getActiveUniformMaxLength(); GLint getActiveUniformMaxLength();
void addRef();
void release();
unsigned int getRefCount() const;
void flagForDeletion(); void flagForDeletion();
bool isFlaggedForDeletion() const; bool isFlaggedForDeletion() const;
...@@ -214,9 +218,14 @@ class Program ...@@ -214,9 +218,14 @@ class Program
char *mInfoLog; char *mInfoLog;
bool mValidated; bool mValidated;
unsigned int mRefCount;
unsigned int mSerial; unsigned int mSerial;
static unsigned int mCurrentSerial; 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 ...@@ -21,7 +21,7 @@ namespace gl
void *Shader::mFragmentCompiler = NULL; void *Shader::mFragmentCompiler = NULL;
void *Shader::mVertexCompiler = 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; mSource = NULL;
mHlsl = NULL; mHlsl = NULL;
...@@ -49,7 +49,7 @@ Shader::Shader(Context *context, GLuint handle) : mHandle(handle), mContext(cont ...@@ -49,7 +49,7 @@ Shader::Shader(Context *context, GLuint handle) : mHandle(handle), mContext(cont
} }
} }
mAttachCount = 0; mRefCount = 0;
mDeleteStatus = false; mDeleteStatus = false;
} }
...@@ -187,24 +187,24 @@ const char *Shader::getHLSL() ...@@ -187,24 +187,24 @@ const char *Shader::getHLSL()
return mHlsl; 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 bool Shader::isFlaggedForDeletion() const
...@@ -417,7 +417,7 @@ bool Shader::compareVarying(const Varying &x, const Varying &y) ...@@ -417,7 +417,7 @@ bool Shader::compareVarying(const Varying &x, const Varying &y)
return false; 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() ...@@ -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 @@ ...@@ -18,7 +18,7 @@
#include <list> #include <list>
#include <vector> #include <vector>
#include "libGLESv2/Context.h" #include "libGLESv2/ResourceManager.h"
namespace gl namespace gl
{ {
...@@ -45,7 +45,7 @@ class Shader ...@@ -45,7 +45,7 @@ class Shader
friend Program; friend Program;
public: public:
Shader(Context *context, GLuint handle); Shader(ResourceManager *manager, GLuint handle);
virtual ~Shader(); virtual ~Shader();
...@@ -63,9 +63,9 @@ class Shader ...@@ -63,9 +63,9 @@ class Shader
bool isCompiled(); bool isCompiled();
const char *getHLSL(); const char *getHLSL();
void attach(); void addRef();
void detach(); void release();
bool isAttached() const; unsigned int getRefCount() const;
bool isFlaggedForDeletion() const; bool isFlaggedForDeletion() const;
void flagForDeletion(); void flagForDeletion();
...@@ -82,8 +82,8 @@ class Shader ...@@ -82,8 +82,8 @@ class Shader
static bool compareVarying(const Varying &x, const Varying &y); static bool compareVarying(const Varying &x, const Varying &y);
const GLuint mHandle; const GLuint mHandle;
int mAttachCount; // Number of program objects this shader is attached to 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 bool mDeleteStatus; // Flag to indicate that the shader can be deleted when no longer in use
char *mSource; char *mSource;
char *mHlsl; char *mHlsl;
...@@ -96,7 +96,7 @@ class Shader ...@@ -96,7 +96,7 @@ class Shader
bool mUsesPointSize; bool mUsesPointSize;
bool mUsesPointCoord; bool mUsesPointCoord;
Context *mContext; ResourceManager *mResourceManager;
static void *mFragmentCompiler; static void *mFragmentCompiler;
static void *mVertexCompiler; static void *mVertexCompiler;
...@@ -123,7 +123,7 @@ class VertexShader : public Shader ...@@ -123,7 +123,7 @@ class VertexShader : public Shader
friend Program; friend Program;
public: public:
VertexShader(Context *context, GLuint handle); VertexShader(ResourceManager *manager, GLuint handle);
~VertexShader(); ~VertexShader();
...@@ -142,7 +142,7 @@ class VertexShader : public Shader ...@@ -142,7 +142,7 @@ class VertexShader : public Shader
class FragmentShader : public Shader class FragmentShader : public Shader
{ {
public: public:
FragmentShader(Context *context, GLuint handle); FragmentShader(ResourceManager *manager, GLuint handle);
~FragmentShader(); ~FragmentShader();
......
...@@ -32,7 +32,7 @@ Texture::Image::~Image() ...@@ -32,7 +32,7 @@ Texture::Image::~Image()
if (surface) surface->Release(); if (surface) surface->Release();
} }
Texture::Texture(Context *context) : mContext(context) Texture::Texture()
{ {
mMinFilter = GL_NEAREST_MIPMAP_LINEAR; mMinFilter = GL_NEAREST_MIPMAP_LINEAR;
mMagFilter = GL_LINEAR; mMagFilter = GL_LINEAR;
...@@ -51,7 +51,8 @@ Texture::~Texture() ...@@ -51,7 +51,8 @@ Texture::~Texture()
Blit *Texture::getBlitter() Blit *Texture::getBlitter()
{ {
return mContext->getBlitter(); Context *context = getContext();
return context->getBlitter();
} }
// Returns true on successful filter state update (valid enum parameter) // Returns true on successful filter state update (valid enum parameter)
...@@ -442,7 +443,7 @@ int Texture::levelCount() const ...@@ -442,7 +443,7 @@ int Texture::levelCount() const
return mBaseTexture ? mBaseTexture->GetLevelCount() : 0; return mBaseTexture ? mBaseTexture->GetLevelCount() : 0;
} }
Texture2D::Texture2D(Context *context) : Texture(context) Texture2D::Texture2D()
{ {
mTexture = NULL; mTexture = NULL;
mColorbufferProxy = NULL; mColorbufferProxy = NULL;
...@@ -898,7 +899,7 @@ IDirect3DSurface9 *Texture2D::getRenderTarget(GLenum target) ...@@ -898,7 +899,7 @@ IDirect3DSurface9 *Texture2D::getRenderTarget(GLenum target)
return renderTarget; return renderTarget;
} }
TextureCubeMap::TextureCubeMap(Context *context) : Texture(context) TextureCubeMap::TextureCubeMap()
{ {
mTexture = NULL; mTexture = NULL;
......
...@@ -23,7 +23,6 @@ ...@@ -23,7 +23,6 @@
namespace gl namespace gl
{ {
class Context;
class Blit; class Blit;
enum enum
...@@ -37,7 +36,7 @@ enum ...@@ -37,7 +36,7 @@ enum
class Texture class Texture
{ {
public: public:
explicit Texture(Context *context); explicit Texture();
virtual ~Texture(); virtual ~Texture();
...@@ -136,8 +135,6 @@ class Texture ...@@ -136,8 +135,6 @@ class Texture
private: private:
DISALLOW_COPY_AND_ASSIGN(Texture); DISALLOW_COPY_AND_ASSIGN(Texture);
Context *mContext;
IDirect3DBaseTexture9 *mBaseTexture; // This is a weak pointer. The derived class is assumed to own a strong pointer. IDirect3DBaseTexture9 *mBaseTexture; // This is a weak pointer. The derived class is assumed to own a strong pointer.
bool mDirtyMetaData; bool mDirtyMetaData;
bool mIsRenderable; bool mIsRenderable;
...@@ -151,7 +148,7 @@ class Texture ...@@ -151,7 +148,7 @@ class Texture
class Texture2D : public Texture class Texture2D : public Texture
{ {
public: public:
explicit Texture2D(Context *context); explicit Texture2D();
~Texture2D(); ~Texture2D();
...@@ -193,7 +190,7 @@ class Texture2D : public Texture ...@@ -193,7 +190,7 @@ class Texture2D : public Texture
class TextureCubeMap : public Texture class TextureCubeMap : public Texture
{ {
public: public:
explicit TextureCubeMap(Context *context); explicit TextureCubeMap();
~TextureCubeMap(); ~TextureCubeMap();
......
...@@ -221,6 +221,10 @@ ...@@ -221,6 +221,10 @@
> >
</File> </File>
<File <File
RelativePath=".\ResourceManager.cpp"
>
</File>
<File
RelativePath=".\Shader.cpp" RelativePath=".\Shader.cpp"
> >
</File> </File>
...@@ -303,6 +307,10 @@ ...@@ -303,6 +307,10 @@
> >
</File> </File>
<File <File
RelativePath=".\ResourceManager.h"
>
</File>
<File
RelativePath=".\Shader.h" RelativePath=".\Shader.h"
> >
</File> </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