Pass the RenderTarget, not the D3D surface, up the Renderbuffer heirarchy.

TRAC #22094 Signed-off-by: Nicolas Capens Signed-off-by: Daniel Koch git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1449 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent d2b4702a
......@@ -2145,7 +2145,7 @@ void Context::clear(GLbitfield mask)
mask &= ~GL_STENCIL_BUFFER_BIT;
if (framebufferObject->getStencilbufferType() != GL_NONE)
{
IDirect3DSurface9 *depthStencil = framebufferObject->getStencilbuffer()->getDepthStencil();
IDirect3DSurface9 *depthStencil = framebufferObject->getStencilbuffer()->getDepthStencil()->getSurface();
if (!depthStencil)
{
ERR("Depth stencil pointer unexpectedly null.");
......
......@@ -130,39 +130,6 @@ unsigned int Framebuffer::getRenderTargetSerial()
return 0;
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *Framebuffer::getRenderTarget()
{
Renderbuffer *colorbuffer = mColorbufferPointer.get();
if (colorbuffer)
{
return colorbuffer->getRenderTarget();
}
return NULL;
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *Framebuffer::getDepthStencil()
{
Renderbuffer *depthstencilbuffer = mDepthbufferPointer.get();
if (!depthstencilbuffer)
{
depthstencilbuffer = mStencilbufferPointer.get();
}
if (depthstencilbuffer)
{
return depthstencilbuffer->getDepthStencil();
}
return NULL;
}
unsigned int Framebuffer::getDepthbufferSerial()
{
Renderbuffer *depthbuffer = mDepthbufferPointer.get();
......
......@@ -44,9 +44,6 @@ class Framebuffer
void detachTexture(GLuint texture);
void detachRenderbuffer(GLuint renderbuffer);
IDirect3DSurface9 *getRenderTarget();
IDirect3DSurface9 *getDepthStencil();
unsigned int getRenderTargetSerial();
unsigned int getDepthbufferSerial();
unsigned int getStencilbufferSerial();
......
......@@ -91,16 +91,12 @@ void RenderbufferTexture2D::releaseProxy(const Renderbuffer *proxy)
mTexture2D->releaseProxy(proxy);
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *RenderbufferTexture2D::getRenderTarget()
rx::RenderTarget *RenderbufferTexture2D::getRenderTarget()
{
return mTexture2D->getRenderTarget(mTarget);
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *RenderbufferTexture2D::getDepthStencil()
rx::RenderTarget *RenderbufferTexture2D::getDepthStencil()
{
return mTexture2D->getDepthStencil(mTarget);
}
......@@ -159,16 +155,12 @@ void RenderbufferTextureCubeMap::releaseProxy(const Renderbuffer *proxy)
mTextureCubeMap->releaseProxy(proxy);
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *RenderbufferTextureCubeMap::getRenderTarget()
rx::RenderTarget *RenderbufferTextureCubeMap::getRenderTarget()
{
return mTextureCubeMap->getRenderTarget(mTarget);
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *RenderbufferTextureCubeMap::getDepthStencil()
rx::RenderTarget *RenderbufferTextureCubeMap::getDepthStencil()
{
return NULL;
}
......@@ -232,16 +224,12 @@ void Renderbuffer::release() const
RefCountObject::release();
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *Renderbuffer::getRenderTarget()
rx::RenderTarget *Renderbuffer::getRenderTarget()
{
return mInstance->getRenderTarget();
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *Renderbuffer::getDepthStencil()
rx::RenderTarget *Renderbuffer::getDepthStencil()
{
return mInstance->getDepthStencil();
}
......@@ -327,16 +315,12 @@ RenderbufferStorage::~RenderbufferStorage()
{
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *RenderbufferStorage::getRenderTarget()
rx::RenderTarget *RenderbufferStorage::getRenderTarget()
{
return NULL;
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *RenderbufferStorage::getDepthStencil()
rx::RenderTarget *RenderbufferStorage::getDepthStencil()
{
return NULL;
}
......@@ -420,13 +404,11 @@ Colorbuffer::~Colorbuffer()
}
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *Colorbuffer::getRenderTarget()
rx::RenderTarget *Colorbuffer::getRenderTarget()
{
if (mRenderTarget)
{
return mRenderTarget->getSurface();
return mRenderTarget;
}
return NULL;
......@@ -466,13 +448,11 @@ DepthStencilbuffer::~DepthStencilbuffer()
}
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *DepthStencilbuffer::getDepthStencil()
rx::RenderTarget *DepthStencilbuffer::getDepthStencil()
{
if (mDepthStencil)
{
return mDepthStencil->getSurface();
return mDepthStencil;
}
return NULL;
......
......@@ -45,8 +45,8 @@ class RenderbufferInterface
virtual void addProxyRef(const Renderbuffer *proxy);
virtual void releaseProxy(const Renderbuffer *proxy);
virtual IDirect3DSurface9 *getRenderTarget() = 0;
virtual IDirect3DSurface9 *getDepthStencil() = 0;
virtual rx::RenderTarget *getRenderTarget() = 0;
virtual rx::RenderTarget *getDepthStencil() = 0;
virtual GLsizei getWidth() const = 0;
virtual GLsizei getHeight() const = 0;
......@@ -77,8 +77,8 @@ class RenderbufferTexture2D : public RenderbufferInterface
void addProxyRef(const Renderbuffer *proxy);
void releaseProxy(const Renderbuffer *proxy);
IDirect3DSurface9 *getRenderTarget();
IDirect3DSurface9 *getDepthStencil();
rx::RenderTarget *getRenderTarget();
rx::RenderTarget *getDepthStencil();
virtual GLsizei getWidth() const;
virtual GLsizei getHeight() const;
......@@ -105,8 +105,8 @@ class RenderbufferTextureCubeMap : public RenderbufferInterface
void addProxyRef(const Renderbuffer *proxy);
void releaseProxy(const Renderbuffer *proxy);
IDirect3DSurface9 *getRenderTarget();
IDirect3DSurface9 *getDepthStencil();
rx::RenderTarget *getRenderTarget();
rx::RenderTarget *getDepthStencil();
virtual GLsizei getWidth() const;
virtual GLsizei getHeight() const;
......@@ -133,8 +133,8 @@ class RenderbufferStorage : public RenderbufferInterface
virtual ~RenderbufferStorage() = 0;
virtual IDirect3DSurface9 *getRenderTarget();
virtual IDirect3DSurface9 *getDepthStencil();
virtual rx::RenderTarget *getRenderTarget();
virtual rx::RenderTarget *getDepthStencil();
virtual GLsizei getWidth() const;
virtual GLsizei getHeight() const;
......@@ -179,8 +179,8 @@ class Renderbuffer : public RefCountObject
void addRef() const;
void release() const;
IDirect3DSurface9 *getRenderTarget();
IDirect3DSurface9 *getDepthStencil();
rx::RenderTarget *getRenderTarget();
rx::RenderTarget *getDepthStencil();
GLsizei getWidth() const;
GLsizei getHeight() const;
......@@ -212,7 +212,7 @@ class Colorbuffer : public RenderbufferStorage
virtual ~Colorbuffer();
virtual IDirect3DSurface9 *getRenderTarget();
virtual rx::RenderTarget *getRenderTarget();
private:
DISALLOW_COPY_AND_ASSIGN(Colorbuffer);
......@@ -228,7 +228,7 @@ class DepthStencilbuffer : public RenderbufferStorage
~DepthStencilbuffer();
virtual IDirect3DSurface9 *getDepthStencil();
virtual rx::RenderTarget *getDepthStencil();
protected:
rx::RenderTarget *mDepthStencil;
......
......@@ -843,9 +843,7 @@ Renderbuffer *Texture2D::getRenderbuffer(GLenum target)
return mColorbufferProxy;
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *Texture2D::getRenderTarget(GLenum target)
rx::RenderTarget *Texture2D::getRenderTarget(GLenum target)
{
ASSERT(target == GL_TEXTURE_2D);
......@@ -862,12 +860,10 @@ IDirect3DSurface9 *Texture2D::getRenderTarget(GLenum target)
{
return NULL;
}
return mTexStorage->getSurfaceLevel(0, false);
return mTexStorage->getRenderTarget();
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *Texture2D::getDepthStencil(GLenum target)
rx::RenderTarget *Texture2D::getDepthStencil(GLenum target)
{
ASSERT(target == GL_TEXTURE_2D);
......@@ -884,7 +880,7 @@ IDirect3DSurface9 *Texture2D::getDepthStencil(GLenum target)
{
return NULL;
}
return mTexStorage->getSurfaceLevel(0, false);
return mTexStorage->getRenderTarget();
}
int Texture2D::levelCount()
......@@ -1474,9 +1470,7 @@ Renderbuffer *TextureCubeMap::getRenderbuffer(GLenum target)
return mFaceProxies[face];
}
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *TextureCubeMap::getRenderTarget(GLenum target)
rx::RenderTarget *TextureCubeMap::getRenderTarget(GLenum target)
{
ASSERT(IsCubemapTextureTarget(target));
......@@ -1488,7 +1482,7 @@ IDirect3DSurface9 *TextureCubeMap::getRenderTarget(GLenum target)
updateTexture();
return mTexStorage->getCubeMapSurface(target, 0, false);
return mTexStorage->getRenderTarget(target);
}
int TextureCubeMap::levelCount()
......
......@@ -118,7 +118,7 @@ class Texture : public RefCountObject
virtual void createTexture() = 0;
virtual void updateTexture() = 0;
virtual void convertToRenderTarget() = 0;
virtual IDirect3DSurface9 *getRenderTarget(GLenum target) = 0;
virtual rx::RenderTarget *getRenderTarget(GLenum target) = 0;
virtual int levelCount() = 0;
......@@ -175,8 +175,8 @@ class Texture2D : public Texture
protected:
friend class RenderbufferTexture2D;
virtual IDirect3DSurface9 *getRenderTarget(GLenum target);
virtual IDirect3DSurface9 *getDepthStencil(GLenum target);
virtual rx::RenderTarget *getRenderTarget(GLenum target);
virtual rx::RenderTarget *getDepthStencil(GLenum target);
virtual int levelCount();
private:
......@@ -249,7 +249,7 @@ class TextureCubeMap : public Texture
protected:
friend class RenderbufferTextureCubeMap;
virtual IDirect3DSurface9 *getRenderTarget(GLenum target);
virtual rx::RenderTarget *getRenderTarget(GLenum target);
virtual int levelCount();
private:
......
......@@ -14,6 +14,7 @@
#include "libGLESv2/utilities.h"
#include "libGLESv2/renderer/renderer9_utils.h" // D3D9_REPLACE
#include "libGLESv2/renderer/TextureStorage.h"
#include "libGLESv2/renderer/RenderTarget9.h"
#include "libGLESv2/Framebuffer.h"
namespace
......@@ -215,7 +216,20 @@ bool Blit::boxFilter(IDirect3DSurface9 *source, IDirect3DSurface9 *dest)
bool Blit::copy(gl::Framebuffer *framebuffer, const RECT &sourceRect, GLenum destFormat, GLint xoffset, GLint yoffset, TextureStorage2D *storage, GLint level)
{
// D3D9_REPLACE
IDirect3DSurface9 *source = framebuffer->getRenderTarget();
RenderTarget9 *renderTarget = NULL;
IDirect3DSurface9 *source = NULL;
gl::Renderbuffer *colorbuffer = framebuffer->getColorbuffer();
if (colorbuffer)
{
renderTarget = RenderTarget9::makeRenderTarget9(colorbuffer->getRenderTarget());
}
if (renderTarget)
{
source = renderTarget->getSurface();
}
if (!source)
{
ERR("Failed to retrieve the render target.");
......@@ -238,7 +252,20 @@ bool Blit::copy(gl::Framebuffer *framebuffer, const RECT &sourceRect, GLenum des
bool Blit::copy(gl::Framebuffer *framebuffer, const RECT &sourceRect, GLenum destFormat, GLint xoffset, GLint yoffset, TextureStorageCubeMap *storage, GLenum target, GLint level)
{
// D3D9_REPLACE
IDirect3DSurface9 *source = framebuffer->getRenderTarget();
RenderTarget9 *renderTarget = NULL;
IDirect3DSurface9 *source = NULL;
gl::Renderbuffer *colorbuffer = framebuffer->getColorbuffer();
if (colorbuffer)
{
renderTarget = RenderTarget9::makeRenderTarget9(colorbuffer->getRenderTarget());
}
if (renderTarget)
{
source = renderTarget->getSurface();
}
if (!source)
{
ERR("Failed to retrieve the render target.");
......
......@@ -16,6 +16,7 @@
#include "libGLESv2/utilities.h"
#include "libGLESv2/Texture.h"
#include "libGLESv2/Framebuffer.h"
#include "libGLESv2/renderer/RenderTarget9.h"
#include "libGLESv2/renderer/renderer9_utils.h"
......@@ -984,9 +985,21 @@ void Image::loadCompressedData(GLint xoffset, GLint yoffset, GLsizei width, GLsi
// This implements glCopyTex[Sub]Image2D for non-renderable internal texture formats and incomplete textures
void Image::copy(GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source)
{
IDirect3DSurface9 *renderTarget = source->getRenderTarget();
RenderTarget9 *renderTarget = NULL;
IDirect3DSurface9 *surface = NULL;
gl::Renderbuffer *colorbuffer = source->getColorbuffer();
if (!renderTarget)
if (colorbuffer)
{
renderTarget = RenderTarget9::makeRenderTarget9(colorbuffer->getRenderTarget());
}
if (renderTarget)
{
surface = renderTarget->getSurface();
}
if (!surface)
{
ERR("Failed to retrieve the render target.");
return error(GL_OUT_OF_MEMORY);
......@@ -996,24 +1009,24 @@ void Image::copy(GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width,
IDirect3DSurface9 *renderTargetData = NULL;
D3DSURFACE_DESC description;
renderTarget->GetDesc(&description);
surface->GetDesc(&description);
HRESULT result = device->CreateOffscreenPlainSurface(description.Width, description.Height, description.Format, D3DPOOL_SYSTEMMEM, &renderTargetData, NULL);
if (FAILED(result))
{
ERR("Could not create matching destination surface.");
renderTarget->Release();
surface->Release();
return error(GL_OUT_OF_MEMORY);
}
result = device->GetRenderTargetData(renderTarget, renderTargetData);
result = device->GetRenderTargetData(surface, renderTargetData);
if (FAILED(result))
{
ERR("GetRenderTargetData unexpectedly failed.");
renderTargetData->Release();
renderTarget->Release();
surface->Release();
return error(GL_OUT_OF_MEMORY);
}
......@@ -1027,7 +1040,7 @@ void Image::copy(GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width,
{
ERR("Failed to lock the source surface (rectangle might be invalid).");
renderTargetData->Release();
renderTarget->Release();
surface->Release();
return error(GL_OUT_OF_MEMORY);
}
......@@ -1039,7 +1052,7 @@ void Image::copy(GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width,
ERR("Failed to lock the destination surface (rectangle might be invalid).");
renderTargetData->UnlockRect();
renderTargetData->Release();
renderTarget->Release();
surface->Release();
return error(GL_OUT_OF_MEMORY);
}
......@@ -1214,7 +1227,7 @@ void Image::copy(GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width,
renderTargetData->UnlockRect();
renderTargetData->Release();
renderTarget->Release();
surface->Release();
mDirty = true;
}
......
......@@ -94,6 +94,12 @@ RenderTarget9::~RenderTarget9()
}
}
RenderTarget9 *RenderTarget9::makeRenderTarget9(RenderTarget *target)
{
ASSERT(dynamic_cast<rx::RenderTarget9*>(target) != NULL);
return static_cast<rx::RenderTarget9*>(target);
}
IDirect3DSurface9 *RenderTarget9::getSurface()
{
// Caller is responsible for releasing the returned surface reference.
......
......@@ -26,6 +26,7 @@ class RenderTarget9 : public RenderTarget
RenderTarget9(Renderer *renderer, GLsizei width, GLsizei height, GLenum format, GLsizei samples);
virtual ~RenderTarget9();
static RenderTarget9 *makeRenderTarget9(RenderTarget *renderTarget);
IDirect3DSurface9 *getSurface();
private:
......
......@@ -17,6 +17,7 @@
#include "libGLESv2/renderer/TextureStorage.h"
#include "libGLESv2/renderer/Image.h"
#include "libGLESv2/renderer/Blit.h"
#include "libGLESv2/renderer/RenderTarget9.h"
#include "libEGL/Config.h"
#include "libEGL/Display.h"
......@@ -1446,8 +1447,36 @@ bool Renderer9::blitRect(gl::Framebuffer *readFramebuffer, gl::Rectangle *readRe
if (blitRenderTarget)
{
IDirect3DSurface9* readRenderTarget = readFramebuffer->getRenderTarget();
IDirect3DSurface9* drawRenderTarget = drawFramebuffer->getRenderTarget();
gl::Renderbuffer *readBuffer = readFramebuffer->getColorbuffer();
gl::Renderbuffer *drawBuffer = drawFramebuffer->getColorbuffer();
RenderTarget9 *readRenderTarget = NULL;
RenderTarget9 *drawRenderTarget = NULL;
IDirect3DSurface9* readSurface = NULL;
IDirect3DSurface9* drawSurface = NULL;
if (readBuffer)
{
readRenderTarget = RenderTarget9::makeRenderTarget9(readBuffer->getRenderTarget());
}
if (drawBuffer)
{
drawRenderTarget = RenderTarget9::makeRenderTarget9(drawBuffer->getRenderTarget());
}
if (readRenderTarget)
{
readSurface = readRenderTarget->getSurface();
}
if (drawRenderTarget)
{
drawSurface = drawRenderTarget->getSurface();
}
if (!readSurface || !drawSurface)
{
ERR("Failed to retrieve the render target.");
return error(GL_OUT_OF_MEMORY, false);
}
RECT srcRect, dstRect;
RECT *srcRectPtr = NULL;
......@@ -1471,10 +1500,10 @@ bool Renderer9::blitRect(gl::Framebuffer *readFramebuffer, gl::Rectangle *readRe
dstRectPtr = &dstRect;
}
HRESULT result = mDevice->StretchRect(readRenderTarget, srcRectPtr, drawRenderTarget, dstRectPtr, D3DTEXF_NONE);
HRESULT result = mDevice->StretchRect(readSurface, srcRectPtr, drawSurface, dstRectPtr, D3DTEXF_NONE);
readRenderTarget->Release();
drawRenderTarget->Release();
readSurface->Release();
drawSurface->Release();
if (FAILED(result))
{
......@@ -1485,13 +1514,41 @@ bool Renderer9::blitRect(gl::Framebuffer *readFramebuffer, gl::Rectangle *readRe
if (blitDepthStencil)
{
IDirect3DSurface9* readDepthStencil = readFramebuffer->getDepthStencil();
IDirect3DSurface9* drawDepthStencil = drawFramebuffer->getDepthStencil();
gl::Renderbuffer *readBuffer = readFramebuffer->getDepthOrStencilbuffer();
gl::Renderbuffer *drawBuffer = drawFramebuffer->getDepthOrStencilbuffer();
RenderTarget9 *readDepthStencil = NULL;
RenderTarget9 *drawDepthStencil = NULL;
IDirect3DSurface9* readSurface = NULL;
IDirect3DSurface9* drawSurface = NULL;
HRESULT result = mDevice->StretchRect(readDepthStencil, NULL, drawDepthStencil, NULL, D3DTEXF_NONE);
if (readBuffer)
{
readDepthStencil = RenderTarget9::makeRenderTarget9(readBuffer->getDepthStencil());
}
if (drawBuffer)
{
drawDepthStencil = RenderTarget9::makeRenderTarget9(drawBuffer->getDepthStencil());
}
readDepthStencil->Release();
drawDepthStencil->Release();
if (readDepthStencil)
{
readSurface = readDepthStencil->getSurface();
}
if (drawDepthStencil)
{
drawSurface = drawDepthStencil->getSurface();
}
if (!readSurface || !drawSurface)
{
ERR("Failed to retrieve the render target.");
return error(GL_OUT_OF_MEMORY, false);
}
HRESULT result = mDevice->StretchRect(readSurface, NULL, drawSurface, NULL, D3DTEXF_NONE);
readSurface->Release();
drawSurface->Release();
if (FAILED(result))
{
......@@ -1506,19 +1563,33 @@ bool Renderer9::blitRect(gl::Framebuffer *readFramebuffer, gl::Rectangle *readRe
void Renderer9::readPixels(gl::Framebuffer *framebuffer, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type,
GLsizei outputPitch, bool packReverseRowOrder, GLint packAlignment, void* pixels)
{
IDirect3DSurface9 *renderTarget = framebuffer->getRenderTarget();
if (!renderTarget)
RenderTarget9 *renderTarget = NULL;
IDirect3DSurface9 *surface = NULL;
gl::Renderbuffer *colorbuffer = framebuffer->getColorbuffer();
if (colorbuffer)
{
renderTarget = RenderTarget9::makeRenderTarget9(colorbuffer->getRenderTarget());
}
if (renderTarget)
{
surface = renderTarget->getSurface();
}
if (!surface)
{
return; // Context must be lost, return silently
// context must be lost
return;
}
D3DSURFACE_DESC desc;
renderTarget->GetDesc(&desc);
surface->GetDesc(&desc);
if (desc.MultiSampleType != D3DMULTISAMPLE_NONE)
{
UNIMPLEMENTED(); // FIXME: Requires resolve using StretchRect into non-multisampled render target
renderTarget->Release();
surface->Release();
return error(GL_OUT_OF_MEMORY);
}
......@@ -1546,14 +1617,14 @@ void Renderer9::readPixels(gl::Framebuffer *framebuffer, GLint x, GLint y, GLsiz
if (FAILED(result))
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
renderTarget->Release();
surface->Release();
return error(GL_OUT_OF_MEMORY);
}
}
result = mDevice->GetRenderTargetData(renderTarget, systemSurface);
renderTarget->Release();
renderTarget = NULL;
result = mDevice->GetRenderTargetData(surface, systemSurface);
surface->Release();
surface = NULL;
if (FAILED(result))
{
......@@ -1824,19 +1895,24 @@ void Renderer9::readPixels(gl::Framebuffer *framebuffer, GLint x, GLint y, GLsiz
bool Renderer9::setRenderTarget(gl::Renderbuffer *renderbuffer)
{
IDirect3DSurface9 *renderTarget = NULL;
IDirect3DSurface9 *renderTargetSurface = NULL;
if (renderbuffer)
{
renderTarget = renderbuffer->getRenderTarget();
if (!renderTarget)
RenderTarget *renderTarget = renderbuffer->getRenderTarget();
if (renderTarget)
{
renderTargetSurface = renderTarget->getSurface();
}
if (!renderTargetSurface)
{
ERR("render target pointer unexpectedly null.");
return false; // Context must be lost
}
mDevice->SetRenderTarget(0, renderTarget);
renderTarget->Release();
mDevice->SetRenderTarget(0, renderTargetSurface);
renderTargetSurface->Release();
}
else
{
......@@ -1848,18 +1924,25 @@ bool Renderer9::setRenderTarget(gl::Renderbuffer *renderbuffer)
bool Renderer9::setDepthStencil(gl::Renderbuffer *renderbuffer)
{
IDirect3DSurface9 *depthStencil = NULL;
IDirect3DSurface9 *depthStencilSurface = NULL;
if (renderbuffer)
{
depthStencil = renderbuffer->getDepthStencil();
if (!depthStencil)
RenderTarget *depthStencil = renderbuffer->getDepthStencil();
if (depthStencil)
{
depthStencilSurface = depthStencil->getSurface();
}
if (!depthStencilSurface)
{
ERR("depth stencil pointer unexpectedly null.");
return false; // Context must be lost
}
mDevice->SetDepthStencilSurface(depthStencil);
depthStencil->Release();
mDevice->SetDepthStencilSurface(depthStencilSurface);
depthStencilSurface->Release();
}
else
{
......
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