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