Separate Colorbuffer into storage and texture variants, implementing a common interface.

TRAC #16284 Signed-off-by: Daniel Koch Author: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/trunk@840 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent bbeffbb6
......@@ -1375,7 +1375,7 @@ bool Context::getIntegerv(GLenum pname, GLint *params)
case GL_ALPHA_BITS:
{
gl::Framebuffer *framebuffer = getDrawFramebuffer();
gl::Colorbuffer *colorbuffer = framebuffer->getColorbuffer();
gl::Renderbuffer *colorbuffer = framebuffer->getColorbuffer();
if (colorbuffer)
{
......@@ -1396,7 +1396,7 @@ bool Context::getIntegerv(GLenum pname, GLint *params)
case GL_DEPTH_BITS:
{
gl::Framebuffer *framebuffer = getDrawFramebuffer();
gl::DepthStencilbuffer *depthbuffer = framebuffer->getDepthbuffer();
gl::Renderbuffer *depthbuffer = framebuffer->getDepthbuffer();
if (depthbuffer)
{
......@@ -1411,7 +1411,7 @@ bool Context::getIntegerv(GLenum pname, GLint *params)
case GL_STENCIL_BITS:
{
gl::Framebuffer *framebuffer = getDrawFramebuffer();
gl::DepthStencilbuffer *stencilbuffer = framebuffer->getStencilbuffer();
gl::Renderbuffer *stencilbuffer = framebuffer->getStencilbuffer();
if (stencilbuffer)
{
......@@ -1911,7 +1911,7 @@ void Context::applyState(GLenum drawMode)
}
// get the maximum size of the stencil ref
gl::DepthStencilbuffer *stencilbuffer = framebufferObject->getStencilbuffer();
gl::Renderbuffer *stencilbuffer = framebufferObject->getStencilbuffer();
GLuint maxStencil = (1 << stencilbuffer->getStencilSize()) - 1;
mDevice->SetRenderState(adjustedFrontFace == GL_CCW ? D3DRS_STENCILWRITEMASK : D3DRS_CCW_STENCILWRITEMASK, mState.stencilWritemask);
......@@ -1978,7 +1978,7 @@ void Context::applyState(GLenum drawMode)
{
if (mState.polygonOffsetFill)
{
gl::DepthStencilbuffer *depthbuffer = framebufferObject->getDepthbuffer();
gl::Renderbuffer *depthbuffer = framebufferObject->getDepthbuffer();
if (depthbuffer)
{
mDevice->SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, *((DWORD*)&mState.polygonOffsetFactor));
......@@ -3616,8 +3616,8 @@ void Context::blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1
if (mask & (GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT))
{
DepthStencilbuffer *readDSBuffer = NULL;
DepthStencilbuffer *drawDSBuffer = NULL;
Renderbuffer *readDSBuffer = NULL;
Renderbuffer *drawDSBuffer = NULL;
// We support OES_packed_depth_stencil, and do not support a separately attached depth and stencil buffer, so if we have
// both a depth and stencil buffer, it will be the same buffer.
......
......@@ -181,40 +181,19 @@ unsigned int Framebuffer::getStencilbufferSerial()
return 0;
}
Colorbuffer *Framebuffer::getColorbuffer()
Renderbuffer *Framebuffer::getColorbuffer()
{
Renderbuffer *renderbuffer = mColorbufferPointer.get();
if (renderbuffer)
{
return renderbuffer->getColorbuffer();
}
return NULL;
return mColorbufferPointer.get();
}
DepthStencilbuffer *Framebuffer::getDepthbuffer()
Renderbuffer *Framebuffer::getDepthbuffer()
{
Renderbuffer *renderbuffer = mDepthbufferPointer.get();
if (renderbuffer)
{
return renderbuffer->getDepthbuffer();
}
return NULL;
return mDepthbufferPointer.get();
}
DepthStencilbuffer *Framebuffer::getStencilbuffer()
Renderbuffer *Framebuffer::getStencilbuffer()
{
Renderbuffer *renderbuffer = mStencilbufferPointer.get();
if (renderbuffer)
{
return renderbuffer->getStencilbuffer();
}
return NULL;
return mStencilbufferPointer.get();
}
GLenum Framebuffer::getColorbufferType()
......@@ -251,7 +230,7 @@ bool Framebuffer::hasStencil()
{
if (mStencilbufferType != GL_NONE)
{
DepthStencilbuffer *stencilbufferObject = getStencilbuffer();
Renderbuffer *stencilbufferObject = getStencilbuffer();
if (stencilbufferObject)
{
......@@ -270,7 +249,7 @@ GLenum Framebuffer::completeness()
if (mColorbufferType != GL_NONE)
{
Colorbuffer *colorbuffer = getColorbuffer();
Renderbuffer *colorbuffer = getColorbuffer();
if (!colorbuffer)
{
......@@ -296,8 +275,8 @@ GLenum Framebuffer::completeness()
return GL_FRAMEBUFFER_UNSUPPORTED;
}
if ((colorbuffer->getType() == GL_FLOAT && !getContext()->supportsFloat32RenderableTextures()) ||
(colorbuffer->getType() == GL_HALF_FLOAT_OES && !getContext()->supportsFloat16RenderableTextures()))
if ((dx2es::IsFloat32Format(colorbuffer->getD3DFormat()) && !getContext()->supportsFloat32RenderableTextures()) ||
(dx2es::IsFloat16Format(colorbuffer->getD3DFormat()) && !getContext()->supportsFloat16RenderableTextures()))
{
return GL_FRAMEBUFFER_UNSUPPORTED;
}
......@@ -318,8 +297,8 @@ GLenum Framebuffer::completeness()
return GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;
}
DepthStencilbuffer *depthbuffer = NULL;
DepthStencilbuffer *stencilbuffer = NULL;
Renderbuffer *depthbuffer = NULL;
Renderbuffer *stencilbuffer = NULL;
if (mDepthbufferType != GL_NONE)
{
......@@ -412,17 +391,17 @@ GLenum Framebuffer::completeness()
return GL_FRAMEBUFFER_COMPLETE;
}
DefaultFramebuffer::DefaultFramebuffer(Colorbuffer *color, DepthStencilbuffer *depthStencil)
DefaultFramebuffer::DefaultFramebuffer(Colorbuffer *colorbuffer, DepthStencilbuffer *depthStencil)
{
mColorbufferType = GL_RENDERBUFFER;
mDepthbufferType = (depthStencil->getDepthSize() != 0) ? GL_RENDERBUFFER : GL_NONE;
mStencilbufferType = (depthStencil->getStencilSize() != 0) ? GL_RENDERBUFFER : GL_NONE;
mColorbufferPointer.set(new Renderbuffer(0, color));
mColorbufferPointer.set(new Renderbuffer(0, colorbuffer));
Renderbuffer *depthStencilRenderbuffer = new Renderbuffer(0, depthStencil);
mDepthbufferPointer.set(depthStencilRenderbuffer);
mStencilbufferPointer.set(depthStencilRenderbuffer);
mColorbufferType = GL_RENDERBUFFER;
mDepthbufferType = (depthStencilRenderbuffer->getDepthSize() != 0) ? GL_RENDERBUFFER : GL_NONE;
mStencilbufferType = (depthStencilRenderbuffer->getStencilSize() != 0) ? GL_RENDERBUFFER : GL_NONE;
}
int Framebuffer::getSamples()
......
......@@ -46,9 +46,9 @@ class Framebuffer
unsigned int getDepthbufferSerial();
unsigned int getStencilbufferSerial();
Colorbuffer *getColorbuffer();
DepthStencilbuffer *getDepthbuffer();
DepthStencilbuffer *getStencilbuffer();
Renderbuffer *getColorbuffer();
Renderbuffer *getDepthbuffer();
Renderbuffer *getStencilbuffer();
GLenum getColorbufferType();
GLenum getDepthbufferType();
......@@ -82,7 +82,7 @@ class Framebuffer
class DefaultFramebuffer : public Framebuffer
{
public:
DefaultFramebuffer(Colorbuffer *color, DepthStencilbuffer *depthStencil);
DefaultFramebuffer(Colorbuffer *colorbuffer, DepthStencilbuffer *depthStencil);
virtual GLenum completeness();
......
......@@ -16,108 +16,185 @@
namespace gl
{
unsigned int RenderbufferStorage::mCurrentSerial = 1;
unsigned int RenderbufferInterface::mCurrentSerial = 1;
Renderbuffer::Renderbuffer(GLuint id, RenderbufferStorage *storage) : RefCountObject(id)
RenderbufferInterface::RenderbufferInterface() : mSerial(issueSerial())
{
ASSERT(storage != NULL);
mStorage = storage;
}
Renderbuffer::~Renderbuffer()
GLuint RenderbufferInterface::getRedSize() const
{
return dx2es::GetRedSize(getD3DFormat());
}
GLuint RenderbufferInterface::getGreenSize() const
{
return dx2es::GetGreenSize(getD3DFormat());
}
GLuint RenderbufferInterface::getBlueSize() const
{
return dx2es::GetBlueSize(getD3DFormat());
}
GLuint RenderbufferInterface::getAlphaSize() const
{
delete mStorage;
return dx2es::GetAlphaSize(getD3DFormat());
}
Colorbuffer *Renderbuffer::getColorbuffer()
GLuint RenderbufferInterface::getDepthSize() const
{
return mStorage->getColorbuffer();
return dx2es::GetDepthSize(getD3DFormat());
}
DepthStencilbuffer *Renderbuffer::getDepthbuffer()
GLuint RenderbufferInterface::getStencilSize() const
{
return mStorage->getDepthbuffer();
return dx2es::GetStencilSize(getD3DFormat());
}
DepthStencilbuffer *Renderbuffer::getStencilbuffer()
unsigned int RenderbufferInterface::getSerial() const
{
return mSerial;
}
unsigned int RenderbufferInterface::issueSerial()
{
return mCurrentSerial++;
}
RenderbufferTexture::RenderbufferTexture(Texture *texture, GLenum target) : mTexture(texture), mTarget(target)
{
}
RenderbufferTexture::~RenderbufferTexture()
{
}
IDirect3DSurface9 *RenderbufferTexture::getRenderTarget()
{
return mTexture->getRenderTarget(mTarget);
}
IDirect3DSurface9 *RenderbufferTexture::getDepthStencil()
{
return NULL;
}
GLsizei RenderbufferTexture::getWidth() const
{
return mTexture->getWidth();
}
GLsizei RenderbufferTexture::getHeight() const
{
return mTexture->getHeight();
}
GLenum RenderbufferTexture::getInternalFormat() const
{
return mTexture->getInternalFormat();
}
GLsizei RenderbufferTexture::getSamples() const
{
return mStorage->getStencilbuffer();
return 0;
}
D3DFORMAT RenderbufferTexture::getD3DFormat() const
{
return mTexture->getD3DFormat();
}
Renderbuffer::Renderbuffer(GLuint id, RenderbufferInterface *instance) : RefCountObject(id)
{
ASSERT(instance != NULL);
mInstance = instance;
}
Renderbuffer::~Renderbuffer()
{
delete mInstance;
}
IDirect3DSurface9 *Renderbuffer::getRenderTarget()
{
return mStorage->getRenderTarget();
return mInstance->getRenderTarget();
}
IDirect3DSurface9 *Renderbuffer::getDepthStencil()
{
return mStorage->getDepthStencil();
return mInstance->getDepthStencil();
}
GLsizei Renderbuffer::getWidth() const
{
return mStorage->getWidth();
return mInstance->getWidth();
}
GLsizei Renderbuffer::getHeight() const
{
return mStorage->getHeight();
return mInstance->getHeight();
}
GLenum Renderbuffer::getInternalFormat() const
{
return mStorage->getInternalFormat();
return mInstance->getInternalFormat();
}
D3DFORMAT Renderbuffer::getD3DFormat() const
{
return mInstance->getD3DFormat();
}
GLuint Renderbuffer::getRedSize() const
{
return mStorage->getRedSize();
return mInstance->getRedSize();
}
GLuint Renderbuffer::getGreenSize() const
{
return mStorage->getGreenSize();
return mInstance->getGreenSize();
}
GLuint Renderbuffer::getBlueSize() const
{
return mStorage->getBlueSize();
return mInstance->getBlueSize();
}
GLuint Renderbuffer::getAlphaSize() const
{
return mStorage->getAlphaSize();
return mInstance->getAlphaSize();
}
GLuint Renderbuffer::getDepthSize() const
{
return mStorage->getDepthSize();
return mInstance->getDepthSize();
}
GLuint Renderbuffer::getStencilSize() const
{
return mStorage->getStencilSize();
return mInstance->getStencilSize();
}
GLsizei Renderbuffer::getSamples() const
{
return mStorage->getSamples();
return mInstance->getSamples();
}
unsigned int Renderbuffer::getSerial() const
{
return mStorage->getSerial();
return mInstance->getSerial();
}
void Renderbuffer::setStorage(RenderbufferStorage *newStorage)
{
ASSERT(newStorage != NULL);
delete mStorage;
mStorage = newStorage;
delete mInstance;
mInstance = newStorage;
}
RenderbufferStorage::RenderbufferStorage() : mSerial(issueSerial())
RenderbufferStorage::RenderbufferStorage()
{
mWidth = 0;
mHeight = 0;
......@@ -130,21 +207,6 @@ RenderbufferStorage::~RenderbufferStorage()
{
}
Colorbuffer *RenderbufferStorage::getColorbuffer()
{
return NULL;
}
DepthStencilbuffer *RenderbufferStorage::getDepthbuffer()
{
return NULL;
}
DepthStencilbuffer *RenderbufferStorage::getStencilbuffer()
{
return NULL;
}
IDirect3DSurface9 *RenderbufferStorage::getRenderTarget()
{
return NULL;
......@@ -170,36 +232,6 @@ GLenum RenderbufferStorage::getInternalFormat() const
return mInternalFormat;
}
GLuint RenderbufferStorage::getRedSize() const
{
return dx2es::GetRedSize(getD3DFormat());
}
GLuint RenderbufferStorage::getGreenSize() const
{
return dx2es::GetGreenSize(getD3DFormat());
}
GLuint RenderbufferStorage::getBlueSize() const
{
return dx2es::GetBlueSize(getD3DFormat());
}
GLuint RenderbufferStorage::getAlphaSize() const
{
return dx2es::GetAlphaSize(getD3DFormat());
}
GLuint RenderbufferStorage::getDepthSize() const
{
return dx2es::GetDepthSize(getD3DFormat());
}
GLuint RenderbufferStorage::getStencilSize() const
{
return dx2es::GetStencilSize(getD3DFormat());
}
GLsizei RenderbufferStorage::getSamples() const
{
return mSamples;
......@@ -210,17 +242,7 @@ D3DFORMAT RenderbufferStorage::getD3DFormat() const
return mD3DFormat;
}
unsigned int RenderbufferStorage::getSerial() const
{
return mSerial;
}
unsigned int RenderbufferStorage::issueSerial()
{
return mCurrentSerial++;
}
Colorbuffer::Colorbuffer(IDirect3DSurface9 *renderTarget) : mRenderTarget(renderTarget), mTexture(NULL)
Colorbuffer::Colorbuffer(IDirect3DSurface9 *renderTarget) : mRenderTarget(renderTarget)
{
if (renderTarget)
{
......@@ -237,21 +259,7 @@ Colorbuffer::Colorbuffer(IDirect3DSurface9 *renderTarget) : mRenderTarget(render
}
}
Colorbuffer::Colorbuffer(Texture *texture, GLenum target) : mRenderTarget(NULL), mTexture(texture), mTarget(target)
{
if (texture)
{
mWidth = texture->getWidth();
mHeight = texture->getHeight();
mInternalFormat = texture->getInternalFormat();
mD3DFormat = texture->getD3DFormat();
mSamples = 0;
mRenderTarget = texture->getRenderTarget(target);
}
}
Colorbuffer::Colorbuffer(int width, int height, GLenum format, GLsizei samples) : mRenderTarget(NULL), mTexture(NULL)
Colorbuffer::Colorbuffer(int width, int height, GLenum format, GLsizei samples) : mRenderTarget(NULL)
{
IDirect3DDevice9 *device = getDevice();
......@@ -295,73 +303,8 @@ Colorbuffer::~Colorbuffer()
}
}
GLsizei Colorbuffer::getWidth() const
{
if (mTexture)
{
return mTexture->getWidth();
}
return mWidth;
}
GLsizei Colorbuffer::getHeight() const
{
if (mTexture)
{
return mTexture->getHeight();
}
return mHeight;
}
GLenum Colorbuffer::getInternalFormat() const
{
if (mTexture)
{
return mTexture->getInternalFormat();
}
return mInternalFormat;
}
GLenum Colorbuffer::getType() const
{
if (mTexture)
{
return mTexture->getType();
}
return GL_UNSIGNED_BYTE;
}
D3DFORMAT Colorbuffer::getD3DFormat() const
{
if (mTexture)
{
return mTexture->getD3DFormat();
}
return mD3DFormat;
}
Colorbuffer *Colorbuffer::getColorbuffer()
{
return this;
}
IDirect3DSurface9 *Colorbuffer::getRenderTarget()
{
if (mTexture)
{
if (mRenderTarget)
{
mRenderTarget->Release();
}
mRenderTarget = mTexture->getRenderTarget(mTarget);
}
return mRenderTarget;
}
......@@ -427,16 +370,6 @@ DepthStencilbuffer::~DepthStencilbuffer()
}
}
DepthStencilbuffer *DepthStencilbuffer::getDepthbuffer()
{
return this;
}
DepthStencilbuffer *DepthStencilbuffer::getStencilbuffer()
{
return this;
}
IDirect3DSurface9 *DepthStencilbuffer::getDepthStencil()
{
return mDepthStencil;
......@@ -454,7 +387,7 @@ Depthbuffer::Depthbuffer(IDirect3DSurface9 *depthStencil) : DepthStencilbuffer(d
Depthbuffer::Depthbuffer(int width, int height, GLsizei samples) : DepthStencilbuffer(width, height, samples)
{
if (getDepthStencil())
if (mDepthStencil)
{
mInternalFormat = GL_DEPTH_COMPONENT16; // If the renderbuffer parameters are queried, the calling function
// will expect one of the valid renderbuffer formats for use in
......@@ -466,16 +399,6 @@ Depthbuffer::~Depthbuffer()
{
}
DepthStencilbuffer *Depthbuffer::getDepthbuffer()
{
return this;
}
DepthStencilbuffer *Depthbuffer::getStencilbuffer()
{
return NULL;
}
Stencilbuffer::Stencilbuffer(IDirect3DSurface9 *depthStencil) : DepthStencilbuffer(depthStencil)
{
if (depthStencil)
......@@ -488,7 +411,7 @@ Stencilbuffer::Stencilbuffer(IDirect3DSurface9 *depthStencil) : DepthStencilbuff
Stencilbuffer::Stencilbuffer(int width, int height, GLsizei samples) : DepthStencilbuffer(width, height, samples)
{
if (getDepthStencil())
if (mDepthStencil)
{
mInternalFormat = GL_STENCIL_INDEX8; // If the renderbuffer parameters are queried, the calling function
// will expect one of the valid renderbuffer formats for use in
......@@ -500,13 +423,4 @@ Stencilbuffer::~Stencilbuffer()
{
}
DepthStencilbuffer *Stencilbuffer::getDepthbuffer()
{
return NULL;
}
DepthStencilbuffer *Stencilbuffer::getStencilbuffer()
{
return this;
}
}
......@@ -25,37 +25,82 @@ class Texture;
class Colorbuffer;
class DepthStencilbuffer;
class RenderbufferInterface
{
public:
RenderbufferInterface();
virtual ~RenderbufferInterface() {};
virtual IDirect3DSurface9 *getRenderTarget() = 0;
virtual IDirect3DSurface9 *getDepthStencil() = 0;
virtual GLsizei getWidth() const = 0;
virtual GLsizei getHeight() const = 0;
virtual GLenum getInternalFormat() const = 0;
virtual D3DFORMAT getD3DFormat() const = 0;
virtual GLsizei getSamples() const = 0;
GLuint getRedSize() const;
GLuint getGreenSize() const;
GLuint getBlueSize() const;
GLuint getAlphaSize() const;
GLuint getDepthSize() const;
GLuint getStencilSize() const;
unsigned int getSerial() const;
private:
DISALLOW_COPY_AND_ASSIGN(RenderbufferInterface);
static unsigned int issueSerial();
const unsigned int mSerial;
static unsigned int mCurrentSerial;
};
class RenderbufferTexture : public RenderbufferInterface
{
public:
RenderbufferTexture(Texture *texture, GLenum target);
virtual ~RenderbufferTexture();
IDirect3DSurface9 *getRenderTarget();
IDirect3DSurface9 *getDepthStencil();
GLsizei getWidth() const;
GLsizei getHeight() const;
GLenum getInternalFormat() const;
D3DFORMAT getD3DFormat() const;
GLsizei getSamples() const;
private:
DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture);
Texture *mTexture;
GLenum mTarget;
};
// A class derived from RenderbufferStorage is created whenever glRenderbufferStorage
// is called. The specific concrete type depends on whether the internal format is
// colour depth, stencil or packed depth/stencil.
class RenderbufferStorage
class RenderbufferStorage : public RenderbufferInterface
{
public:
RenderbufferStorage();
virtual ~RenderbufferStorage() = 0;
virtual Colorbuffer *getColorbuffer();
virtual DepthStencilbuffer *getDepthbuffer();
virtual DepthStencilbuffer *getStencilbuffer();
virtual IDirect3DSurface9 *getRenderTarget();
virtual IDirect3DSurface9 *getDepthStencil();
virtual GLsizei getWidth() const;
virtual GLsizei getHeight() const;
virtual GLenum getInternalFormat() const;
GLuint getRedSize() const;
GLuint getGreenSize() const;
GLuint getBlueSize() const;
GLuint getAlphaSize() const;
GLuint getDepthSize() const;
GLuint getStencilSize() const;
virtual GLsizei getSamples() const;
virtual D3DFORMAT getD3DFormat() const;
unsigned int getSerial() const;
virtual GLsizei getSamples() const;
protected:
GLsizei mWidth;
......@@ -66,27 +111,17 @@ class RenderbufferStorage
private:
DISALLOW_COPY_AND_ASSIGN(RenderbufferStorage);
static unsigned int issueSerial();
const unsigned int mSerial;
static unsigned int mCurrentSerial;
};
// Renderbuffer implements the GL renderbuffer object.
// It's only a proxy for a RenderbufferStorage instance; the internal object
// It's only a proxy for a RenderbufferInterface instance; the internal object
// can change whenever glRenderbufferStorage is called.
class Renderbuffer : public RefCountObject
{
public:
Renderbuffer(GLuint id, RenderbufferStorage *storage);
~Renderbuffer();
Renderbuffer(GLuint id, RenderbufferInterface *storage);
Colorbuffer *getColorbuffer();
DepthStencilbuffer *getDepthbuffer();
DepthStencilbuffer *getStencilbuffer();
virtual ~Renderbuffer();
IDirect3DSurface9 *getRenderTarget();
IDirect3DSurface9 *getDepthStencil();
......@@ -106,40 +141,27 @@ class Renderbuffer : public RefCountObject
unsigned int getSerial() const;
void setStorage(RenderbufferStorage *newStorage);
RenderbufferStorage *getStorage() { return mStorage; }
private:
DISALLOW_COPY_AND_ASSIGN(Renderbuffer);
RenderbufferStorage *mStorage;
RenderbufferInterface *mInstance;
};
class Colorbuffer : public RenderbufferStorage
{
public:
explicit Colorbuffer(IDirect3DSurface9 *renderTarget);
Colorbuffer(Texture *texture, GLenum target);
Colorbuffer(GLsizei width, GLsizei height, GLenum format, GLsizei samples);
virtual ~Colorbuffer();
virtual Colorbuffer *getColorbuffer();
virtual IDirect3DSurface9 *getRenderTarget();
virtual GLsizei getWidth() const;
virtual GLsizei getHeight() const;
virtual GLenum getInternalFormat() const;
virtual GLenum getType() const;
virtual D3DFORMAT getD3DFormat() const;
private:
DISALLOW_COPY_AND_ASSIGN(Colorbuffer);
IDirect3DSurface9 *mRenderTarget;
Texture *mTexture;
GLenum mTarget;
};
class DepthStencilbuffer : public RenderbufferStorage
......@@ -150,14 +172,13 @@ class DepthStencilbuffer : public RenderbufferStorage
~DepthStencilbuffer();
virtual DepthStencilbuffer *getDepthbuffer();
virtual DepthStencilbuffer *getStencilbuffer();
virtual IDirect3DSurface9 *getDepthStencil();
protected:
IDirect3DSurface9 *mDepthStencil;
private:
DISALLOW_COPY_AND_ASSIGN(DepthStencilbuffer);
IDirect3DSurface9 *mDepthStencil;
};
class Depthbuffer : public DepthStencilbuffer
......@@ -168,9 +189,6 @@ class Depthbuffer : public DepthStencilbuffer
virtual ~Depthbuffer();
virtual DepthStencilbuffer *getDepthbuffer();
virtual DepthStencilbuffer *getStencilbuffer();
private:
DISALLOW_COPY_AND_ASSIGN(Depthbuffer);
};
......@@ -183,9 +201,6 @@ class Stencilbuffer : public DepthStencilbuffer
virtual ~Stencilbuffer();
virtual DepthStencilbuffer *getDepthbuffer();
virtual DepthStencilbuffer *getStencilbuffer();
private:
DISALLOW_COPY_AND_ASSIGN(Stencilbuffer);
};
......
......@@ -1622,6 +1622,7 @@ void Texture2D::bindTexImage(egl::Surface *surface)
mTexture = surface->getOffscreenTexture();
mSerial = issueSerial();
mColorbufferProxy.set(NULL);
mDirtyImages = true;
mIsRenderable = true;
mSurface = surface;
......@@ -1640,6 +1641,7 @@ void Texture2D::releaseTexImage()
mTexture->Release();
mTexture = NULL;
mSerial = 0;
mColorbufferProxy.set(NULL);
}
for (int i = 0; i < IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
......@@ -1913,6 +1915,7 @@ void Texture2D::createTexture()
mTexture = texture;
mSerial = issueSerial();
mColorbufferProxy.set(NULL);
mDirtyImages = true;
mIsRenderable = false;
}
......@@ -2008,6 +2011,7 @@ void Texture2D::convertToRenderTarget()
mTexture = texture;
mSerial = issueSerial();
mColorbufferProxy.set(NULL);
mDirtyImages = true;
mIsRenderable = true;
}
......@@ -2081,7 +2085,7 @@ Renderbuffer *Texture2D::getRenderbuffer(GLenum target)
if (mColorbufferProxy.get() == NULL)
{
mColorbufferProxy.set(new Renderbuffer(id(), new Colorbuffer(this, target)));
mColorbufferProxy.set(new Renderbuffer(id(), new RenderbufferTexture(this, target)));
}
return mColorbufferProxy.get();
......@@ -2363,6 +2367,7 @@ void TextureCubeMap::createTexture()
mTexture = texture;
mSerial = issueSerial();
for(int face = 0; face < 6; face++) mFaceProxies[face].set(NULL);
mDirtyImages = true;
mIsRenderable = false;
}
......@@ -2463,6 +2468,7 @@ void TextureCubeMap::convertToRenderTarget()
mTexture = texture;
mSerial = issueSerial();
for(int face = 0; face < 6; face++) mFaceProxies[face].set(NULL);
mDirtyImages = true;
mIsRenderable = true;
}
......@@ -2515,6 +2521,7 @@ void TextureCubeMap::redefineImage(int face, GLint level, GLenum format, GLsizei
mTexture->Release();
mTexture = NULL;
mSerial = 0;
for(int face = 0; face < 6; face++) mFaceProxies[face].set(NULL);
mDirtyImages = true;
}
}
......@@ -2733,7 +2740,7 @@ Renderbuffer *TextureCubeMap::getRenderbuffer(GLenum target)
if (mFaceProxies[face].get() == NULL)
{
mFaceProxies[face].set(new Renderbuffer(id(), new Colorbuffer(this, target)));
mFaceProxies[face].set(new Renderbuffer(id(), new RenderbufferTexture(this, target)));
}
return mFaceProxies[face].get();
......
......@@ -177,7 +177,7 @@ 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 Colorbuffer;
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);
......
......@@ -1092,7 +1092,7 @@ void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalforma
return error(GL_INVALID_OPERATION);
}
gl::Colorbuffer *source = framebuffer->getColorbuffer();
gl::Renderbuffer *source = framebuffer->getColorbuffer();
GLenum colorbufferFormat = source->getInternalFormat();
// [OpenGL ES 2.0.24] table 3.9
......@@ -1246,7 +1246,7 @@ void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GL
return error(GL_INVALID_OPERATION);
}
gl::Colorbuffer *source = framebuffer->getColorbuffer();
gl::Renderbuffer *source = framebuffer->getColorbuffer();
GLenum colorbufferFormat = source->getInternalFormat();
gl::Texture *texture = NULL;
......
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