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