Split RenderbufferTexture into 2D and CubeMap specific variants

Issue=306 Signed-off-by: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/trunk@1078 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent bf6e5d4d
......@@ -63,68 +63,136 @@ GLuint RenderbufferInterface::getStencilSize() const
return dx2es::GetStencilSize(getD3DFormat());
}
RenderbufferTexture::RenderbufferTexture(Texture *texture, GLenum target) : mTarget(target)
///// RenderbufferTexture2D Implementation ////////
RenderbufferTexture2D::RenderbufferTexture2D(Texture2D *texture, GLenum target) : mTarget(target)
{
mTexture.set(texture);
mTexture2D.set(texture);
}
RenderbufferTexture::~RenderbufferTexture()
RenderbufferTexture2D::~RenderbufferTexture2D()
{
mTexture.set(NULL);
mTexture2D.set(NULL);
}
// Textures need to maintain their own reference count for references via
// Renderbuffers acting as proxies. Here, we notify the texture of a reference.
void RenderbufferTexture::addProxyRef(const Renderbuffer *proxy)
void RenderbufferTexture2D::addProxyRef(const Renderbuffer *proxy)
{
mTexture->addProxyRef(proxy);
mTexture2D->addProxyRef(proxy);
}
void RenderbufferTexture::releaseProxy(const Renderbuffer *proxy)
void RenderbufferTexture2D::releaseProxy(const Renderbuffer *proxy)
{
mTexture->releaseProxy(proxy);
mTexture2D->releaseProxy(proxy);
}
IDirect3DSurface9 *RenderbufferTexture::getRenderTarget()
IDirect3DSurface9 *RenderbufferTexture2D::getRenderTarget()
{
return mTexture->getRenderTarget(mTarget);
return mTexture2D->getRenderTarget(mTarget);
}
IDirect3DSurface9 *RenderbufferTexture::getDepthStencil()
IDirect3DSurface9 *RenderbufferTexture2D::getDepthStencil()
{
return NULL;
}
GLsizei RenderbufferTexture::getWidth() const
GLsizei RenderbufferTexture2D::getWidth() const
{
return mTexture->getWidth(0);
return mTexture2D->getWidth(0);
}
GLsizei RenderbufferTexture::getHeight() const
GLsizei RenderbufferTexture2D::getHeight() const
{
return mTexture->getHeight(0);
return mTexture2D->getHeight(0);
}
GLenum RenderbufferTexture::getInternalFormat() const
GLenum RenderbufferTexture2D::getInternalFormat() const
{
return mTexture->getInternalFormat();
return mTexture2D->getInternalFormat();
}
D3DFORMAT RenderbufferTexture::getD3DFormat() const
D3DFORMAT RenderbufferTexture2D::getD3DFormat() const
{
return mTexture->getD3DFormat();
return mTexture2D->getD3DFormat();
}
GLsizei RenderbufferTexture::getSamples() const
GLsizei RenderbufferTexture2D::getSamples() const
{
return 0;
}
unsigned int RenderbufferTexture::getSerial() const
unsigned int RenderbufferTexture2D::getSerial() const
{
return mTexture2D->getRenderTargetSerial(mTarget);
}
///// RenderbufferTextureCubeMap Implementation ////////
RenderbufferTextureCubeMap::RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target) : mTarget(target)
{
mTextureCubeMap.set(texture);
}
RenderbufferTextureCubeMap::~RenderbufferTextureCubeMap()
{
return mTexture->getRenderTargetSerial(mTarget);
mTextureCubeMap.set(NULL);
}
// Textures need to maintain their own reference count for references via
// Renderbuffers acting as proxies. Here, we notify the texture of a reference.
void RenderbufferTextureCubeMap::addProxyRef(const Renderbuffer *proxy)
{
mTextureCubeMap->addProxyRef(proxy);
}
void RenderbufferTextureCubeMap::releaseProxy(const Renderbuffer *proxy)
{
mTextureCubeMap->releaseProxy(proxy);
}
IDirect3DSurface9 *RenderbufferTextureCubeMap::getRenderTarget()
{
return mTextureCubeMap->getRenderTarget(mTarget);
}
IDirect3DSurface9 *RenderbufferTextureCubeMap::getDepthStencil()
{
return NULL;
}
GLsizei RenderbufferTextureCubeMap::getWidth() const
{
return mTextureCubeMap->getWidth(0);
}
GLsizei RenderbufferTextureCubeMap::getHeight() const
{
return mTextureCubeMap->getHeight(0);
}
GLenum RenderbufferTextureCubeMap::getInternalFormat() const
{
return mTextureCubeMap->getInternalFormat();
}
D3DFORMAT RenderbufferTextureCubeMap::getD3DFormat() const
{
return mTextureCubeMap->getD3DFormat();
}
GLsizei RenderbufferTextureCubeMap::getSamples() const
{
return 0;
}
unsigned int RenderbufferTextureCubeMap::getSerial() const
{
return mTextureCubeMap->getRenderTargetSerial(mTarget);
}
////// Renderbuffer Implementation //////
Renderbuffer::Renderbuffer(GLuint id, RenderbufferInterface *instance) : RefCountObject(id)
{
ASSERT(instance != NULL);
......
......@@ -21,7 +21,8 @@
namespace gl
{
class Texture;
class Texture2D;
class TextureCubeMap;
class Renderbuffer;
class Colorbuffer;
class DepthStencilbuffer;
......@@ -58,12 +59,12 @@ class RenderbufferInterface
DISALLOW_COPY_AND_ASSIGN(RenderbufferInterface);
};
class RenderbufferTexture : public RenderbufferInterface
class RenderbufferTexture2D : public RenderbufferInterface
{
public:
RenderbufferTexture(Texture *texture, GLenum target);
RenderbufferTexture2D(Texture2D *texture, GLenum target);
virtual ~RenderbufferTexture();
virtual ~RenderbufferTexture2D();
void addProxyRef(const Renderbuffer *proxy);
void releaseProxy(const Renderbuffer *proxy);
......@@ -80,9 +81,37 @@ class RenderbufferTexture : public RenderbufferInterface
virtual unsigned int getSerial() const;
private:
DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture);
DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture2D);
BindingPointer <Texture> mTexture;
BindingPointer <Texture2D> mTexture2D;
GLenum mTarget;
};
class RenderbufferTextureCubeMap : public RenderbufferInterface
{
public:
RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target);
virtual ~RenderbufferTextureCubeMap();
void addProxyRef(const Renderbuffer *proxy);
void releaseProxy(const Renderbuffer *proxy);
IDirect3DSurface9 *getRenderTarget();
IDirect3DSurface9 *getDepthStencil();
virtual GLsizei getWidth() const;
virtual GLsizei getHeight() const;
virtual GLenum getInternalFormat() const;
virtual D3DFORMAT getD3DFormat() const;
virtual GLsizei getSamples() const;
virtual unsigned int getSerial() const;
private:
DISALLOW_COPY_AND_ASSIGN(RenderbufferTextureCubeMap);
BindingPointer <TextureCubeMap> mTextureCubeMap;
GLenum mTarget;
};
......
......@@ -2334,7 +2334,7 @@ Renderbuffer *Texture2D::getRenderbuffer(GLenum target)
if (mColorbufferProxy == NULL)
{
mColorbufferProxy = new Renderbuffer(id(), new RenderbufferTexture(this, target));
mColorbufferProxy = new Renderbuffer(id(), new RenderbufferTexture2D(this, target));
}
return mColorbufferProxy;
......@@ -3067,7 +3067,7 @@ Renderbuffer *TextureCubeMap::getRenderbuffer(GLenum target)
if (mFaceProxies[face] == NULL)
{
mFaceProxies[face] = new Renderbuffer(id(), new RenderbufferTexture(this, target));
mFaceProxies[face] = new Renderbuffer(id(), new RenderbufferTextureCubeMap(this, target));
}
return mFaceProxies[face];
......
......@@ -217,8 +217,6 @@ class Texture : public RefCountObject
static const GLuint INCOMPLETE_TEXTURE_ID = static_cast<GLuint>(-1); // Every texture takes an id at creation time. The value is arbitrary because it is never registered with the resource manager.
protected:
friend class RenderbufferTexture;
void setImage(GLint unpackAlignment, const void *pixels, Image *image);
bool subImage(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, Image *image);
void setCompressedImage(GLsizei imageSize, const void *pixels, Image *image);
......@@ -309,6 +307,10 @@ class Texture2D : public Texture
virtual Renderbuffer *getRenderbuffer(GLenum target);
protected:
friend class RenderbufferTexture2D;
virtual IDirect3DSurface9 *getRenderTarget(GLenum target);
private:
DISALLOW_COPY_AND_ASSIGN(Texture2D);
......@@ -316,7 +318,6 @@ class Texture2D : public Texture
virtual void createTexture();
virtual void updateTexture();
virtual void convertToRenderTarget();
virtual IDirect3DSurface9 *getRenderTarget(GLenum target);
virtual TextureStorage *getStorage(bool renderTarget);
bool isMipmapComplete() const;
......@@ -398,6 +399,10 @@ class TextureCubeMap : public Texture
static unsigned int faceIndex(GLenum face);
protected:
friend class RenderbufferTextureCubeMap;
virtual IDirect3DSurface9 *getRenderTarget(GLenum target);
private:
DISALLOW_COPY_AND_ASSIGN(TextureCubeMap);
......@@ -405,7 +410,6 @@ class TextureCubeMap : public Texture
virtual void createTexture();
virtual void updateTexture();
virtual void convertToRenderTarget();
virtual IDirect3DSurface9 *getRenderTarget(GLenum target);
virtual TextureStorage *getStorage(bool renderTarget);
bool isCubeComplete() const;
......
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