Apply the depth texture correctly as the DepthStencil surface in applyRenderTarget

Trac #20875 Signed-off-by: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/trunk@1115 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 63e6afe9
...@@ -1841,13 +1841,31 @@ bool Context::applyRenderTarget(bool ignoreViewport) ...@@ -1841,13 +1841,31 @@ bool Context::applyRenderTarget(bool ignoreViewport)
return error(GL_INVALID_FRAMEBUFFER_OPERATION, false); return error(GL_INVALID_FRAMEBUFFER_OPERATION, false);
} }
// if there is no color attachment we must synthesize a NULL colorattachment
// to keep the D3D runtime happy. This should only be possible if depth texturing.
Renderbuffer *renderbufferObject = NULL;
if (framebufferObject->getColorbufferType() != GL_NONE)
{
renderbufferObject = framebufferObject->getColorbuffer();
}
else
{
renderbufferObject = framebufferObject->getNullColorbuffer();
}
if (!renderbufferObject)
{
ERR("unable to locate renderbuffer for FBO.");
return false;
}
bool renderTargetChanged = false; bool renderTargetChanged = false;
unsigned int renderTargetSerial = framebufferObject->getRenderTargetSerial(); unsigned int renderTargetSerial = renderbufferObject->getSerial();
if (renderTargetSerial != mAppliedRenderTargetSerial) if (renderTargetSerial != mAppliedRenderTargetSerial)
{ {
IDirect3DSurface9 *renderTarget = framebufferObject->getRenderTarget(); IDirect3DSurface9 *renderTarget = renderbufferObject->getRenderTarget();
if (!renderTarget) if (!renderTarget)
{ {
ERR("render target pointer unexpectedly null.");
return false; // Context must be lost return false; // Context must be lost
} }
mDevice->SetRenderTarget(0, renderTarget); mDevice->SetRenderTarget(0, renderTarget);
...@@ -1862,25 +1880,27 @@ bool Context::applyRenderTarget(bool ignoreViewport) ...@@ -1862,25 +1880,27 @@ bool Context::applyRenderTarget(bool ignoreViewport)
unsigned int stencilbufferSerial = 0; unsigned int stencilbufferSerial = 0;
if (framebufferObject->getDepthbufferType() != GL_NONE) if (framebufferObject->getDepthbufferType() != GL_NONE)
{ {
depthStencil = framebufferObject->getDepthbuffer()->getDepthStencil(); Renderbuffer *depthbuffer = framebufferObject->getDepthbuffer();
depthStencil = depthbuffer->getDepthStencil();
if (!depthStencil) if (!depthStencil)
{ {
ERR("Depth stencil pointer unexpectedly null."); ERR("Depth stencil pointer unexpectedly null.");
return false; return false;
} }
depthbufferSerial = framebufferObject->getDepthbuffer()->getSerial(); depthbufferSerial = depthbuffer->getSerial();
} }
else if (framebufferObject->getStencilbufferType() != GL_NONE) else if (framebufferObject->getStencilbufferType() != GL_NONE)
{ {
depthStencil = framebufferObject->getStencilbuffer()->getDepthStencil(); Renderbuffer *stencilbuffer = framebufferObject->getStencilbuffer();
depthStencil = stencilbuffer->getDepthStencil();
if (!depthStencil) if (!depthStencil)
{ {
ERR("Depth stencil pointer unexpectedly null."); ERR("Depth stencil pointer unexpectedly null.");
return false; return false;
} }
stencilbufferSerial = framebufferObject->getStencilbuffer()->getSerial(); stencilbufferSerial = stencilbuffer->getSerial();
} }
if (depthbufferSerial != mAppliedDepthbufferSerial || if (depthbufferSerial != mAppliedDepthbufferSerial ||
...@@ -1900,7 +1920,7 @@ bool Context::applyRenderTarget(bool ignoreViewport) ...@@ -1900,7 +1920,7 @@ bool Context::applyRenderTarget(bool ignoreViewport)
if (!mRenderTargetDescInitialized || renderTargetChanged) if (!mRenderTargetDescInitialized || renderTargetChanged)
{ {
IDirect3DSurface9 *renderTarget = framebufferObject->getRenderTarget(); IDirect3DSurface9 *renderTarget = renderbufferObject->getRenderTarget();
if (!renderTarget) if (!renderTarget)
{ {
return false; // Context must be lost return false; // Context must be lost
......
...@@ -29,6 +29,7 @@ Framebuffer::~Framebuffer() ...@@ -29,6 +29,7 @@ Framebuffer::~Framebuffer()
mColorbufferPointer.set(NULL); mColorbufferPointer.set(NULL);
mDepthbufferPointer.set(NULL); mDepthbufferPointer.set(NULL);
mStencilbufferPointer.set(NULL); mStencilbufferPointer.set(NULL);
mNullColorbufferPointer.set(NULL);
} }
Renderbuffer *Framebuffer::lookupRenderbuffer(GLenum type, GLuint handle) const Renderbuffer *Framebuffer::lookupRenderbuffer(GLenum type, GLuint handle) const
...@@ -200,6 +201,30 @@ Renderbuffer *Framebuffer::getStencilbuffer() ...@@ -200,6 +201,30 @@ Renderbuffer *Framebuffer::getStencilbuffer()
return mStencilbufferPointer.get(); return mStencilbufferPointer.get();
} }
Renderbuffer *Framebuffer::getNullColorbuffer()
{
Renderbuffer *nullbuffer = mNullColorbufferPointer.get();
Renderbuffer *depthbuffer = getDepthbuffer();
if (!depthbuffer)
{
ERR("Unexpected null depthbuffer for depth-only FBO.");
return NULL;
}
GLsizei width = depthbuffer->getWidth();
GLsizei height = depthbuffer->getHeight();
if (!nullbuffer ||
width != nullbuffer->getWidth() || height != nullbuffer->getHeight())
{
nullbuffer = new Renderbuffer(0, new Colorbuffer(width, height, GL_NONE, 0));
mNullColorbufferPointer.set(nullbuffer);
}
return nullbuffer;
}
GLenum Framebuffer::getColorbufferType() GLenum Framebuffer::getColorbufferType()
{ {
return mColorbufferType; return mColorbufferType;
......
...@@ -49,6 +49,7 @@ class Framebuffer ...@@ -49,6 +49,7 @@ class Framebuffer
Renderbuffer *getColorbuffer(); Renderbuffer *getColorbuffer();
Renderbuffer *getDepthbuffer(); Renderbuffer *getDepthbuffer();
Renderbuffer *getStencilbuffer(); Renderbuffer *getStencilbuffer();
Renderbuffer *getNullColorbuffer();
GLenum getColorbufferType(); GLenum getColorbufferType();
GLenum getDepthbufferType(); GLenum getDepthbufferType();
...@@ -73,6 +74,8 @@ class Framebuffer ...@@ -73,6 +74,8 @@ class Framebuffer
GLenum mStencilbufferType; GLenum mStencilbufferType;
BindingPointer<Renderbuffer> mStencilbufferPointer; BindingPointer<Renderbuffer> mStencilbufferPointer;
BindingPointer<Renderbuffer> mNullColorbufferPointer;
private: private:
DISALLOW_COPY_AND_ASSIGN(Framebuffer); DISALLOW_COPY_AND_ASSIGN(Framebuffer);
......
...@@ -98,7 +98,7 @@ IDirect3DSurface9 *RenderbufferTexture2D::getRenderTarget() ...@@ -98,7 +98,7 @@ IDirect3DSurface9 *RenderbufferTexture2D::getRenderTarget()
// caller must Release() the returned surface // caller must Release() the returned surface
IDirect3DSurface9 *RenderbufferTexture2D::getDepthStencil() IDirect3DSurface9 *RenderbufferTexture2D::getDepthStencil()
{ {
return NULL; return mTexture2D->getDepthStencil(mTarget);
} }
GLsizei RenderbufferTexture2D::getWidth() const GLsizei RenderbufferTexture2D::getWidth() const
......
...@@ -2374,6 +2374,33 @@ IDirect3DSurface9 *Texture2D::getRenderTarget(GLenum target) ...@@ -2374,6 +2374,33 @@ IDirect3DSurface9 *Texture2D::getRenderTarget(GLenum target)
updateTexture(); updateTexture();
// ensure this is NOT a depth texture
if (isDepth(0))
{
return NULL;
}
return mTexStorage->getSurfaceLevel(0);
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *Texture2D::getDepthStencil(GLenum target)
{
ASSERT(target == GL_TEXTURE_2D);
// ensure the underlying texture is created
if (getStorage(true) == NULL)
{
return NULL;
}
updateTexture();
// ensure this is actually a depth texture
if (!isDepth(0))
{
return NULL;
}
return mTexStorage->getSurfaceLevel(0); return mTexStorage->getSurfaceLevel(0);
} }
......
...@@ -306,6 +306,7 @@ class Texture2D : public Texture ...@@ -306,6 +306,7 @@ class Texture2D : public Texture
protected: protected:
friend class RenderbufferTexture2D; friend class RenderbufferTexture2D;
virtual IDirect3DSurface9 *getRenderTarget(GLenum target); virtual IDirect3DSurface9 *getRenderTarget(GLenum target);
virtual IDirect3DSurface9 *getDepthStencil(GLenum target);
private: private:
DISALLOW_COPY_AND_ASSIGN(Texture2D); DISALLOW_COPY_AND_ASSIGN(Texture2D);
......
...@@ -795,6 +795,7 @@ D3DFORMAT ConvertRenderbufferFormat(GLenum format) ...@@ -795,6 +795,7 @@ D3DFORMAT ConvertRenderbufferFormat(GLenum format)
{ {
switch (format) switch (format)
{ {
case GL_NONE: return D3DFMT_NULL;
case GL_RGBA4: case GL_RGBA4:
case GL_RGB5_A1: case GL_RGB5_A1:
case GL_RGBA8_OES: return D3DFMT_A8R8G8B8; case GL_RGBA8_OES: return D3DFMT_A8R8G8B8;
......
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