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
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "libGLESv2/mathutil.h" #include "libGLESv2/mathutil.h"
#include "libGLESv2/utilities.h" #include "libGLESv2/utilities.h"
#include "libGLESv2/Blit.h" #include "libGLESv2/Blit.h"
#include "libGLESv2/ResourceManager.h"
#include "libGLESv2/Buffer.h" #include "libGLESv2/Buffer.h"
#include "libGLESv2/FrameBuffer.h" #include "libGLESv2/FrameBuffer.h"
#include "libGLESv2/Program.h" #include "libGLESv2/Program.h"
...@@ -103,14 +104,17 @@ Context::Context(const egl::Config *config) ...@@ -103,14 +104,17 @@ Context::Context(const egl::Config *config)
mState.colorMaskAlpha = true; mState.colorMaskAlpha = true;
mState.depthMask = true; mState.depthMask = true;
// FIXME: Resource managers should get managed with context sharing
mResourceManager = new ResourceManager();
// [OpenGL ES 2.0.24] section 3.7 page 83: // [OpenGL ES 2.0.24] section 3.7 page 83:
// In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have twodimensional // In the initial state, TEXTURE_2D and TEXTURE_CUBE_MAP have twodimensional
// and cube map texture state vectors respectively associated with them. // and cube map texture state vectors respectively associated with them.
// In order that access to these initial textures not be lost, they are treated as texture // In order that access to these initial textures not be lost, they are treated as texture
// objects all of whose names are 0. // objects all of whose names are 0.
mTexture2DZero = new Texture2D(this); mTexture2DZero = new Texture2D();
mTextureCubeMapZero = new TextureCubeMap(this); mTextureCubeMapZero = new TextureCubeMap();
mColorbufferZero = NULL; mColorbufferZero = NULL;
mDepthStencilbufferZero = NULL; mDepthStencilbufferZero = NULL;
...@@ -160,7 +164,15 @@ Context::Context(const egl::Config *config) ...@@ -160,7 +164,15 @@ Context::Context(const egl::Config *config)
Context::~Context() Context::~Context()
{ {
if (mState.currentProgram != 0)
{
Program *programObject = mResourceManager->getProgram(mState.currentProgram);
if (programObject)
{
programObject->release();
}
mState.currentProgram = 0; mState.currentProgram = 0;
}
for (int type = 0; type < SAMPLER_TYPE_COUNT; type++) for (int type = 0; type < SAMPLER_TYPE_COUNT; type++)
{ {
...@@ -178,40 +190,18 @@ Context::~Context() ...@@ -178,40 +190,18 @@ Context::~Context()
delete mIndexDataManager; delete mIndexDataManager;
delete mBlit; delete mBlit;
while (!mBufferMap.empty())
{
deleteBuffer(mBufferMap.begin()->first);
}
while (!mProgramMap.empty())
{
deleteProgram(mProgramMap.begin()->first);
}
while (!mShaderMap.empty())
{
deleteShader(mShaderMap.begin()->first);
}
while (!mFramebufferMap.empty()) while (!mFramebufferMap.empty())
{ {
deleteFramebuffer(mFramebufferMap.begin()->first); deleteFramebuffer(mFramebufferMap.begin()->first);
} }
while (!mRenderbufferMap.empty())
{
deleteRenderbuffer(mRenderbufferMap.begin()->first);
}
while (!mTextureMap.empty())
{
deleteTexture(mTextureMap.begin()->first);
}
if (mMaskedClearSavedState) if (mMaskedClearSavedState)
{ {
mMaskedClearSavedState->Release(); mMaskedClearSavedState->Release();
} }
// FIXME: Context should not be responsible for resource manager deallocation
delete mResourceManager;
} }
void Context::makeCurrent(egl::Display *display, egl::Surface *surface) void Context::makeCurrent(egl::Display *display, egl::Surface *surface)
...@@ -725,72 +715,29 @@ GLint Context::getUnpackAlignment() const ...@@ -725,72 +715,29 @@ GLint Context::getUnpackAlignment() const
return mState.unpackAlignment; return mState.unpackAlignment;
} }
// Returns an unused buffer name
GLuint Context::createBuffer() GLuint Context::createBuffer()
{ {
unsigned int handle = 1; return mResourceManager->createBuffer();
while (mBufferMap.find(handle) != mBufferMap.end())
{
handle++;
}
mBufferMap[handle] = NULL;
return handle;
} }
// Returns an unused shader/program name GLuint Context::createProgram()
GLuint Context::createShader(GLenum type)
{ {
unsigned int handle = 1; return mResourceManager->createProgram();
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 Context::createShader(GLenum type)
GLuint Context::createProgram()
{ {
unsigned int handle = 1; return mResourceManager->createShader(type);
while (mProgramMap.find(handle) != mProgramMap.end() || mShaderMap.find(handle) != mShaderMap.end()) // Shared name space
{
handle++;
}
mProgramMap[handle] = new Program();
return handle;
} }
// Returns an unused texture name
GLuint Context::createTexture() GLuint Context::createTexture()
{ {
unsigned int handle = 1; return mResourceManager->createTexture();
}
while (mTextureMap.find(handle) != mTextureMap.end())
{
handle++;
}
mTextureMap[handle] = NULL;
return handle; GLuint Context::createRenderbuffer()
{
return mResourceManager->createRenderbuffer();
} }
// Returns an unused framebuffer name // Returns an unused framebuffer name
...@@ -808,85 +755,44 @@ GLuint Context::createFramebuffer() ...@@ -808,85 +755,44 @@ GLuint Context::createFramebuffer()
return handle; return handle;
} }
// Returns an unused renderbuffer name
GLuint Context::createRenderbuffer()
{
unsigned int handle = 1;
while (mRenderbufferMap.find(handle) != mRenderbufferMap.end())
{
handle++;
}
mRenderbufferMap[handle] = NULL;
return handle;
}
void Context::deleteBuffer(GLuint buffer) void Context::deleteBuffer(GLuint buffer)
{ {
BufferMap::iterator bufferObject = mBufferMap.find(buffer); if (mResourceManager->getBuffer(buffer))
if (bufferObject != mBufferMap.end())
{ {
detachBuffer(buffer); detachBuffer(buffer);
delete bufferObject->second;
mBufferMap.erase(bufferObject);
} }
mResourceManager->deleteBuffer(buffer);
} }
void Context::deleteShader(GLuint shader) void Context::deleteShader(GLuint shader)
{ {
ShaderMap::iterator shaderObject = mShaderMap.find(shader); mResourceManager->deleteShader(shader);
if (shaderObject != mShaderMap.end())
{
if (!shaderObject->second->isAttached())
{
delete shaderObject->second;
mShaderMap.erase(shaderObject);
}
else
{
shaderObject->second->flagForDeletion();
}
}
} }
void Context::deleteProgram(GLuint program) void Context::deleteProgram(GLuint program)
{ {
ProgramMap::iterator programObject = mProgramMap.find(program); mResourceManager->deleteProgram(program);
if (programObject != mProgramMap.end())
{
if (program != mState.currentProgram)
{
delete programObject->second;
mProgramMap.erase(programObject);
}
else
{
programObject->second->flagForDeletion();
}
}
} }
void Context::deleteTexture(GLuint texture) void Context::deleteTexture(GLuint texture)
{ {
TextureMap::iterator textureObject = mTextureMap.find(texture); if (mResourceManager->getTexture(texture))
if (textureObject != mTextureMap.end())
{ {
detachTexture(texture); detachTexture(texture);
}
mResourceManager->deleteTexture(texture);
}
if (texture != 0) void Context::deleteRenderbuffer(GLuint renderbuffer)
{
if (mResourceManager->getRenderbuffer(renderbuffer))
{ {
delete textureObject->second; detachRenderbuffer(renderbuffer);
} }
mTextureMap.erase(textureObject); mResourceManager->deleteRenderbuffer(renderbuffer);
}
} }
void Context::deleteFramebuffer(GLuint framebuffer) void Context::deleteFramebuffer(GLuint framebuffer)
...@@ -902,45 +808,53 @@ void Context::deleteFramebuffer(GLuint framebuffer) ...@@ -902,45 +808,53 @@ void Context::deleteFramebuffer(GLuint framebuffer)
} }
} }
void Context::deleteRenderbuffer(GLuint renderbuffer) Buffer *Context::getBuffer(GLuint handle)
{ {
RenderbufferMap::iterator renderbufferObject = mRenderbufferMap.find(renderbuffer); return mResourceManager->getBuffer(handle);
}
if (renderbufferObject != mRenderbufferMap.end()) Shader *Context::getShader(GLuint handle)
{ {
detachRenderbuffer(renderbuffer); return mResourceManager->getShader(handle);
}
delete renderbufferObject->second; Program *Context::getProgram(GLuint handle)
mRenderbufferMap.erase(renderbufferObject); {
} return mResourceManager->getProgram(handle);
}
Texture *Context::getTexture(GLuint handle)
{
return mResourceManager->getTexture(handle);
}
Renderbuffer *Context::getRenderbuffer(GLuint handle)
{
return mResourceManager->getRenderbuffer(handle);
}
Framebuffer *Context::getFramebuffer()
{
return getFramebuffer(mState.framebuffer);
} }
void Context::bindArrayBuffer(unsigned int buffer) void Context::bindArrayBuffer(unsigned int buffer)
{ {
if (buffer != 0 && !getBuffer(buffer)) mResourceManager->checkBufferAllocation(buffer);
{
mBufferMap[buffer] = new Buffer();
}
mState.arrayBuffer = buffer; mState.arrayBuffer = buffer;
} }
void Context::bindElementArrayBuffer(unsigned int buffer) void Context::bindElementArrayBuffer(unsigned int buffer)
{ {
if (buffer != 0 && !getBuffer(buffer)) mResourceManager->checkBufferAllocation(buffer);
{
mBufferMap[buffer] = new Buffer();
}
mState.elementArrayBuffer = buffer; mState.elementArrayBuffer = buffer;
} }
void Context::bindTexture2D(GLuint texture) void Context::bindTexture2D(GLuint texture)
{ {
if (!getTexture(texture) && texture != 0) mResourceManager->checkTextureAllocation(texture, SAMPLER_2D);
{
mTextureMap[texture] = new Texture2D(this);
}
mState.texture2D = texture; mState.texture2D = texture;
...@@ -949,10 +863,7 @@ void Context::bindTexture2D(GLuint texture) ...@@ -949,10 +863,7 @@ void Context::bindTexture2D(GLuint texture)
void Context::bindTextureCubeMap(GLuint texture) void Context::bindTextureCubeMap(GLuint texture)
{ {
if (!getTexture(texture) && texture != 0) mResourceManager->checkTextureAllocation(texture, SAMPLER_CUBE);
{
mTextureMap[texture] = new TextureCubeMap(this);
}
mState.textureCubeMap = texture; mState.textureCubeMap = texture;
...@@ -971,24 +882,28 @@ void Context::bindFramebuffer(GLuint framebuffer) ...@@ -971,24 +882,28 @@ void Context::bindFramebuffer(GLuint framebuffer)
void Context::bindRenderbuffer(GLuint renderbuffer) void Context::bindRenderbuffer(GLuint renderbuffer)
{ {
if (renderbuffer != 0 && !getRenderbuffer(renderbuffer))
{
mRenderbufferMap[renderbuffer] = new Renderbuffer();
}
mState.renderbuffer = renderbuffer; mState.renderbuffer = renderbuffer;
} }
void Context::useProgram(GLuint program) void Context::useProgram(GLuint program)
{ {
Program *programObject = getCurrentProgram();
GLuint priorProgram = mState.currentProgram; GLuint priorProgram = mState.currentProgram;
mState.currentProgram = program; // Must switch before trying to delete, otherwise it only gets flagged. mState.currentProgram = program; // Must switch before trying to delete, otherwise it only gets flagged.
if (programObject && programObject->isFlaggedForDeletion()) if (priorProgram != program)
{
Program *newProgram = mResourceManager->getProgram(program);
Program *oldProgram = mResourceManager->getProgram(priorProgram);
if (newProgram)
{
newProgram->addRef();
}
if (oldProgram)
{ {
deleteProgram(priorProgram); oldProgram->release();
}
} }
} }
...@@ -1010,68 +925,10 @@ void Context::setDepthStencilbufferZero(DepthStencilbuffer *buffer) ...@@ -1010,68 +925,10 @@ void Context::setDepthStencilbufferZero(DepthStencilbuffer *buffer)
mDepthStencilbufferZero = buffer; mDepthStencilbufferZero = buffer;
} }
void Context::setRenderbuffer(Renderbuffer *buffer) void Context::setRenderbuffer(Renderbuffer *renderbuffer)
{
delete mRenderbufferMap[mState.renderbuffer];
mRenderbufferMap[mState.renderbuffer] = buffer;
}
Buffer *Context::getBuffer(unsigned int handle)
{
BufferMap::iterator buffer = mBufferMap.find(handle);
if (buffer == mBufferMap.end())
{
return NULL;
}
else
{
return buffer->second;
}
}
Shader *Context::getShader(unsigned int handle)
{ {
ShaderMap::iterator shader = mShaderMap.find(handle); mResourceManager->deleteRenderbuffer(mState.renderbuffer);
mResourceManager->setRenderbuffer(mState.renderbuffer, renderbuffer);
if (shader == mShaderMap.end())
{
return NULL;
}
else
{
return shader->second;
}
}
Program *Context::getProgram(unsigned int handle)
{
ProgramMap::iterator program = mProgramMap.find(handle);
if (program == mProgramMap.end())
{
return NULL;
}
else
{
return program->second;
}
}
Texture *Context::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;
}
} }
Framebuffer *Context::getFramebuffer(unsigned int handle) Framebuffer *Context::getFramebuffer(unsigned int handle)
...@@ -1088,25 +945,11 @@ Framebuffer *Context::getFramebuffer(unsigned int handle) ...@@ -1088,25 +945,11 @@ Framebuffer *Context::getFramebuffer(unsigned int handle)
} }
} }
Renderbuffer *Context::getRenderbuffer(unsigned int handle)
{
RenderbufferMap::iterator renderbuffer = mRenderbufferMap.find(handle);
if (renderbuffer == mRenderbufferMap.end())
{
return NULL;
}
else
{
return renderbuffer->second;
}
}
Colorbuffer *Context::getColorbuffer(GLuint handle) Colorbuffer *Context::getColorbuffer(GLuint handle)
{ {
if (handle != 0) if (handle != 0)
{ {
Renderbuffer *renderbuffer = getRenderbuffer(handle); Renderbuffer *renderbuffer = mResourceManager->getRenderbuffer(handle);
if (renderbuffer && renderbuffer->isColorbuffer()) if (renderbuffer && renderbuffer->isColorbuffer())
{ {
...@@ -1125,7 +968,7 @@ DepthStencilbuffer *Context::getDepthbuffer(GLuint handle) ...@@ -1125,7 +968,7 @@ DepthStencilbuffer *Context::getDepthbuffer(GLuint handle)
{ {
if (handle != 0) if (handle != 0)
{ {
Renderbuffer *renderbuffer = getRenderbuffer(handle); Renderbuffer *renderbuffer = mResourceManager->getRenderbuffer(handle);
if (renderbuffer && renderbuffer->isDepthbuffer()) if (renderbuffer && renderbuffer->isDepthbuffer())
{ {
...@@ -1144,7 +987,7 @@ DepthStencilbuffer *Context::getStencilbuffer(GLuint handle) ...@@ -1144,7 +987,7 @@ DepthStencilbuffer *Context::getStencilbuffer(GLuint handle)
{ {
if (handle != 0) if (handle != 0)
{ {
Renderbuffer *renderbuffer = getRenderbuffer(handle); Renderbuffer *renderbuffer = mResourceManager->getRenderbuffer(handle);
if (renderbuffer && renderbuffer->isStencilbuffer()) if (renderbuffer && renderbuffer->isStencilbuffer())
{ {
...@@ -1161,17 +1004,17 @@ DepthStencilbuffer *Context::getStencilbuffer(GLuint handle) ...@@ -1161,17 +1004,17 @@ DepthStencilbuffer *Context::getStencilbuffer(GLuint handle)
Buffer *Context::getArrayBuffer() Buffer *Context::getArrayBuffer()
{ {
return getBuffer(mState.arrayBuffer); return mResourceManager->getBuffer(mState.arrayBuffer);
} }
Buffer *Context::getElementArrayBuffer() Buffer *Context::getElementArrayBuffer()
{ {
return getBuffer(mState.elementArrayBuffer); return mResourceManager->getBuffer(mState.elementArrayBuffer);
} }
Program *Context::getCurrentProgram() Program *Context::getCurrentProgram()
{ {
return getProgram(mState.currentProgram); return mResourceManager->getProgram(mState.currentProgram);
} }
Texture2D *Context::getTexture2D() Texture2D *Context::getTexture2D()
...@@ -1181,7 +1024,7 @@ Texture2D *Context::getTexture2D() ...@@ -1181,7 +1024,7 @@ Texture2D *Context::getTexture2D()
return mTexture2DZero; return mTexture2DZero;
} }
return (Texture2D*)getTexture(mState.texture2D); return (Texture2D*)mResourceManager->getTexture(mState.texture2D);
} }
TextureCubeMap *Context::getTextureCubeMap() TextureCubeMap *Context::getTextureCubeMap()
...@@ -1191,7 +1034,7 @@ TextureCubeMap *Context::getTextureCubeMap() ...@@ -1191,7 +1034,7 @@ TextureCubeMap *Context::getTextureCubeMap()
return mTextureCubeMapZero; return mTextureCubeMapZero;
} }
return (TextureCubeMap*)getTexture(mState.textureCubeMap); return (TextureCubeMap*)mResourceManager->getTexture(mState.textureCubeMap);
} }
Texture *Context::getSamplerTexture(unsigned int sampler, SamplerType type) Texture *Context::getSamplerTexture(unsigned int sampler, SamplerType type)
...@@ -1208,12 +1051,7 @@ Texture *Context::getSamplerTexture(unsigned int sampler, SamplerType type) ...@@ -1208,12 +1051,7 @@ Texture *Context::getSamplerTexture(unsigned int sampler, SamplerType type)
} }
} }
return getTexture(texid); return mResourceManager->getTexture(texid);
}
Framebuffer *Context::getFramebuffer()
{
return getFramebuffer(mState.framebuffer);
} }
bool Context::getBooleanv(GLenum pname, GLboolean *params) bool Context::getBooleanv(GLenum pname, GLboolean *params)
...@@ -2002,7 +1840,7 @@ GLenum Context::applyVertexBuffer(const TranslatedIndexData &indexInfo) ...@@ -2002,7 +1840,7 @@ GLenum Context::applyVertexBuffer(const TranslatedIndexData &indexInfo)
// Applies the indices and element array bindings to the Direct3D 9 device // Applies the indices and element array bindings to the Direct3D 9 device
GLenum Context::applyIndexBuffer(const void *indices, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo) GLenum Context::applyIndexBuffer(const void *indices, GLsizei count, GLenum mode, GLenum type, TranslatedIndexData *indexInfo)
{ {
GLenum err = mIndexDataManager->preRenderValidate(mode, type, count, getBuffer(mState.elementArrayBuffer), indices, indexInfo); GLenum err = mIndexDataManager->preRenderValidate(mode, type, count, mResourceManager->getBuffer(mState.elementArrayBuffer), indices, indexInfo);
if (err == GL_NO_ERROR) if (err == GL_NO_ERROR)
{ {
...@@ -2853,7 +2691,7 @@ Texture *Context::getIncompleteTexture(SamplerType type) ...@@ -2853,7 +2691,7 @@ Texture *Context::getIncompleteTexture(SamplerType type)
case SAMPLER_2D: case SAMPLER_2D:
{ {
Texture2D *incomplete2d = new Texture2D(this); Texture2D *incomplete2d = new Texture2D();
incomplete2d->setImage(0, GL_RGBA, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, 1, color); incomplete2d->setImage(0, GL_RGBA, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, 1, color);
t = incomplete2d; t = incomplete2d;
} }
...@@ -2861,7 +2699,7 @@ Texture *Context::getIncompleteTexture(SamplerType type) ...@@ -2861,7 +2699,7 @@ Texture *Context::getIncompleteTexture(SamplerType type)
case SAMPLER_CUBE: case SAMPLER_CUBE:
{ {
TextureCubeMap *incompleteCube = new TextureCubeMap(this); TextureCubeMap *incompleteCube = new TextureCubeMap();
incompleteCube->setImagePosX(0, GL_RGBA, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, 1, color); incompleteCube->setImagePosX(0, GL_RGBA, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, 1, color);
incompleteCube->setImageNegX(0, GL_RGBA, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, 1, color); incompleteCube->setImageNegX(0, GL_RGBA, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, 1, color);
......
...@@ -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,20 +290,24 @@ class Context ...@@ -297,20 +290,24 @@ 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);
void bindTexture2D(GLuint texture); void bindTexture2D(GLuint texture);
...@@ -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;
...@@ -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,7 +82,7 @@ class Shader ...@@ -82,7 +82,7 @@ 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;
...@@ -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