Commit 1bd642c5 by Geoff Lang

Split the RenderTarget classes based on if they are backing a SwapChain.

bug=angle:824 Change-Id: I89e475d4065102dbaa7fa1f1bfd02c7207def75c Reviewed-on: https://chromium-review.googlesource.com/227600Reviewed-by: 's avatarShannon Woods <shannonwoods@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent df8fafef
......@@ -12,6 +12,15 @@ namespace rx
{
unsigned int RenderTarget::mCurrentSerial = 1;
RenderTarget::RenderTarget()
: mSerial(issueSerials(1))
{
}
RenderTarget::~RenderTarget()
{
}
unsigned int RenderTarget::getSerial() const
{
return mSerial;
......@@ -23,4 +32,5 @@ unsigned int RenderTarget::issueSerials(unsigned int count)
mCurrentSerial += count;
return firstSerial;
}
}
\ No newline at end of file
}
......@@ -18,25 +18,16 @@ namespace rx
class RenderTarget
{
public:
RenderTarget() : mSerial(issueSerials(1))
{
mWidth = 0;
mHeight = 0;
mDepth = 0;
mInternalFormat = GL_NONE;
mActualFormat = GL_NONE;
mSamples = 0;
}
RenderTarget();
virtual ~RenderTarget();
virtual ~RenderTarget() {};
GLsizei getWidth() const { return mWidth; }
GLsizei getHeight() const { return mHeight; }
GLsizei getDepth() const { return mDepth; }
GLenum getInternalFormat() const { return mInternalFormat; }
GLenum getActualFormat() const { return mActualFormat; }
GLsizei getSamples() const { return mSamples; }
gl::Extents getExtents() const { return gl::Extents(mWidth, mHeight, mDepth); }
virtual GLsizei getWidth() const = 0;
virtual GLsizei getHeight() const = 0;
virtual GLsizei getDepth() const = 0;
virtual GLenum getInternalFormat() const = 0;
virtual GLenum getActualFormat() const = 0;
virtual GLsizei getSamples() const = 0;
gl::Extents getExtents() const { return gl::Extents(getWidth(), getHeight(), getDepth()); }
virtual void invalidate(GLint x, GLint y, GLsizei width, GLsizei height) = 0;
......@@ -50,14 +41,6 @@ class RenderTarget
GLenum format;
};
protected:
GLsizei mWidth;
GLsizei mHeight;
GLsizei mDepth;
GLenum mInternalFormat;
GLenum mActualFormat;
GLsizei mSamples;
private:
DISALLOW_COPY_AND_ASSIGN(RenderTarget);
......
......@@ -10,6 +10,7 @@
#include "libGLESv2/renderer/d3d/d3d11/RenderTarget11.h"
#include "libGLESv2/renderer/d3d/d3d11/Renderer11.h"
#include "libGLESv2/renderer/d3d/d3d11/renderer11_utils.h"
#include "libGLESv2/renderer/d3d/d3d11/SwapChain11.h"
#include "libGLESv2/renderer/d3d/d3d11/formatutils11.h"
#include "libGLESv2/main.h"
......@@ -176,9 +177,26 @@ static unsigned int getDSVSubresourceIndex(ID3D11Resource *resource, ID3D11Depth
return D3D11CalcSubresource(mipSlice, arraySlice, mipLevels);
}
RenderTarget11::RenderTarget11(ID3D11RenderTargetView *rtv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv,
GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei samples)
: mSubresourceIndex(0),
RenderTarget11 *RenderTarget11::makeRenderTarget11(RenderTarget *target)
{
ASSERT(HAS_DYNAMIC_TYPE(rx::RenderTarget11*, target));
return static_cast<rx::RenderTarget11*>(target);
}
void RenderTarget11::invalidate(GLint x, GLint y, GLsizei width, GLsizei height)
{
// Currently a no-op
}
TextureRenderTarget11::TextureRenderTarget11(ID3D11RenderTargetView *rtv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv,
GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei samples)
: mWidth(width),
mHeight(height),
mDepth(depth),
mInternalFormat(internalFormat),
mActualFormat(internalFormat),
mSamples(samples),
mSubresourceIndex(0),
mTexture(resource),
mRenderTarget(rtv),
mDepthStencil(NULL),
......@@ -199,13 +217,6 @@ RenderTarget11::RenderTarget11(ID3D11RenderTargetView *rtv, ID3D11Resource *reso
mShaderResource->AddRef();
}
mWidth = width;
mHeight = height;
mDepth = depth;
mSamples = samples;
mInternalFormat = internalFormat;
mActualFormat = internalFormat;
if (mRenderTarget && mTexture)
{
mSubresourceIndex = getRTVSubresourceIndex(mTexture, mRenderTarget);
......@@ -218,9 +229,15 @@ RenderTarget11::RenderTarget11(ID3D11RenderTargetView *rtv, ID3D11Resource *reso
}
}
RenderTarget11::RenderTarget11(ID3D11DepthStencilView *dsv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv,
GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei samples)
: mSubresourceIndex(0),
TextureRenderTarget11::TextureRenderTarget11(ID3D11DepthStencilView *dsv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv,
GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei samples)
: mWidth(width),
mHeight(height),
mDepth(depth),
mInternalFormat(internalFormat),
mActualFormat(internalFormat),
mSamples(samples),
mSubresourceIndex(0),
mTexture(resource),
mRenderTarget(NULL),
mDepthStencil(dsv),
......@@ -241,13 +258,6 @@ RenderTarget11::RenderTarget11(ID3D11DepthStencilView *dsv, ID3D11Resource *reso
mShaderResource->AddRef();
}
mWidth = width;
mHeight = height;
mDepth = depth;
mSamples = samples;
mInternalFormat = internalFormat;
mActualFormat = internalFormat;
if (mDepthStencil && mTexture)
{
mSubresourceIndex = getDSVSubresourceIndex(mTexture, mDepthStencil);
......@@ -260,7 +270,7 @@ RenderTarget11::RenderTarget11(ID3D11DepthStencilView *dsv, ID3D11Resource *reso
}
}
RenderTarget11::~RenderTarget11()
TextureRenderTarget11::~TextureRenderTarget11()
{
SafeRelease(mTexture);
SafeRelease(mRenderTarget);
......@@ -268,40 +278,127 @@ RenderTarget11::~RenderTarget11()
SafeRelease(mShaderResource);
}
RenderTarget11 *RenderTarget11::makeRenderTarget11(RenderTarget *target)
ID3D11Resource *TextureRenderTarget11::getTexture() const
{
ASSERT(HAS_DYNAMIC_TYPE(rx::RenderTarget11*, target));
return static_cast<rx::RenderTarget11*>(target);
return mTexture;
}
void RenderTarget11::invalidate(GLint x, GLint y, GLsizei width, GLsizei height)
ID3D11RenderTargetView *TextureRenderTarget11::getRenderTargetView() const
{
// Currently a no-op
return mRenderTarget;
}
ID3D11Resource *RenderTarget11::getTexture() const
ID3D11DepthStencilView *TextureRenderTarget11::getDepthStencilView() const
{
return mTexture;
return mDepthStencil;
}
ID3D11RenderTargetView *RenderTarget11::getRenderTargetView() const
ID3D11ShaderResourceView *TextureRenderTarget11::getShaderResourceView() const
{
return mRenderTarget;
return mShaderResource;
}
ID3D11DepthStencilView *RenderTarget11::getDepthStencilView() const
GLsizei TextureRenderTarget11::getWidth() const
{
return mDepthStencil;
return mWidth;
}
ID3D11ShaderResourceView *RenderTarget11::getShaderResourceView() const
GLsizei TextureRenderTarget11::getHeight() const
{
return mShaderResource;
return mHeight;
}
unsigned int RenderTarget11::getSubresourceIndex() const
GLsizei TextureRenderTarget11::getDepth() const
{
return mDepth;
}
GLenum TextureRenderTarget11::getInternalFormat() const
{
return mInternalFormat;
}
GLenum TextureRenderTarget11::getActualFormat() const
{
return mActualFormat;
}
GLsizei TextureRenderTarget11::getSamples() const
{
return mSamples;
}
unsigned int TextureRenderTarget11::getSubresourceIndex() const
{
return mSubresourceIndex;
}
SurfaceRenderTarget11::SurfaceRenderTarget11(SwapChain11 *swapChain, bool depth)
: mSwapChain(swapChain),
mDepth(depth)
{
ASSERT(mSwapChain);
}
SurfaceRenderTarget11::~SurfaceRenderTarget11()
{
}
GLsizei SurfaceRenderTarget11::getWidth() const
{
return mSwapChain->getWidth();
}
GLsizei SurfaceRenderTarget11::getHeight() const
{
return mSwapChain->getHeight();
}
GLsizei SurfaceRenderTarget11::getDepth() const
{
return 1;
}
GLenum SurfaceRenderTarget11::getInternalFormat() const
{
return (mDepth ? mSwapChain->GetDepthBufferInternalFormat() : mSwapChain->GetBackBufferInternalFormat());
}
GLenum SurfaceRenderTarget11::getActualFormat() const
{
return d3d11::GetDXGIFormatInfo(d3d11::GetTextureFormatInfo(getInternalFormat()).texFormat).internalFormat;
}
GLsizei SurfaceRenderTarget11::getSamples() const
{
// Our EGL surfaces do not support multisampling.
return 0;
}
ID3D11Resource *SurfaceRenderTarget11::getTexture() const
{
return (mDepth ? mSwapChain->getDepthStencilTexture() : mSwapChain->getOffscreenTexture());
}
ID3D11RenderTargetView *SurfaceRenderTarget11::getRenderTargetView() const
{
return (mDepth ? NULL : mSwapChain->getRenderTarget());
}
ID3D11DepthStencilView *SurfaceRenderTarget11::getDepthStencilView() const
{
return (mDepth ? mSwapChain->getDepthStencil() : NULL);
}
ID3D11ShaderResourceView *SurfaceRenderTarget11::getShaderResourceView() const
{
return (mDepth ? mSwapChain->getDepthStencilShaderResource() : mSwapChain->getRenderTargetShaderResource());
}
unsigned int SurfaceRenderTarget11::getSubresourceIndex() const
{
return 0;
}
}
......@@ -14,30 +14,62 @@
namespace rx
{
class SwapChain11;
class RenderTarget11 : public RenderTarget
{
public:
// RenderTarget11 takes ownership of any D3D11 resources it is given and will AddRef them
RenderTarget11(ID3D11RenderTargetView *rtv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv,
GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei samples);
RenderTarget11(ID3D11DepthStencilView *dsv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv,
GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei samples);
virtual ~RenderTarget11();
RenderTarget11() { }
virtual ~RenderTarget11() { }
static RenderTarget11 *makeRenderTarget11(RenderTarget *renderTarget);
virtual void invalidate(GLint x, GLint y, GLsizei width, GLsizei height);
void invalidate(GLint x, GLint y, GLsizei width, GLsizei height) override;
ID3D11Resource *getTexture() const;
ID3D11RenderTargetView *getRenderTargetView() const;
ID3D11DepthStencilView *getDepthStencilView() const;
ID3D11ShaderResourceView *getShaderResourceView() const;
virtual ID3D11Resource *getTexture() const = 0;
virtual ID3D11RenderTargetView *getRenderTargetView() const = 0;
virtual ID3D11DepthStencilView *getDepthStencilView() const = 0;
virtual ID3D11ShaderResourceView *getShaderResourceView() const = 0;
unsigned int getSubresourceIndex() const;
virtual unsigned int getSubresourceIndex() const = 0;
private:
DISALLOW_COPY_AND_ASSIGN(RenderTarget11);
};
class TextureRenderTarget11 : public RenderTarget11
{
public:
// TextureRenderTarget11 takes ownership of any D3D11 resources it is given and will AddRef them
TextureRenderTarget11(ID3D11RenderTargetView *rtv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv,
GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei samples);
TextureRenderTarget11(ID3D11DepthStencilView *dsv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv,
GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei samples);
virtual ~TextureRenderTarget11();
GLsizei getWidth() const override;
GLsizei getHeight() const override;
GLsizei getDepth() const override;
GLenum getInternalFormat() const override;
GLenum getActualFormat() const override;
GLsizei getSamples() const override;
ID3D11Resource *getTexture() const override;
ID3D11RenderTargetView *getRenderTargetView() const override;
ID3D11DepthStencilView *getDepthStencilView() const override;
ID3D11ShaderResourceView *getShaderResourceView() const override;
unsigned int getSubresourceIndex() const override;
private:
DISALLOW_COPY_AND_ASSIGN(TextureRenderTarget11);
GLsizei mWidth;
GLsizei mHeight;
GLsizei mDepth;
GLenum mInternalFormat;
GLenum mActualFormat;
GLsizei mSamples;
unsigned int mSubresourceIndex;
ID3D11Resource *mTexture;
......@@ -46,6 +78,33 @@ class RenderTarget11 : public RenderTarget
ID3D11ShaderResourceView *mShaderResource;
};
class SurfaceRenderTarget11 : public RenderTarget11
{
public:
SurfaceRenderTarget11(SwapChain11 *swapChain, bool depth);
virtual ~SurfaceRenderTarget11();
GLsizei getWidth() const override;
GLsizei getHeight() const override;
GLsizei getDepth() const override;
GLenum getInternalFormat() const override;
GLenum getActualFormat() const override;
GLsizei getSamples() const override;
ID3D11Resource *getTexture() const override;
ID3D11RenderTargetView *getRenderTargetView() const override;
ID3D11DepthStencilView *getDepthStencilView() const override;
ID3D11ShaderResourceView *getShaderResourceView() const override;
unsigned int getSubresourceIndex() const override;
private:
DISALLOW_COPY_AND_ASSIGN(SurfaceRenderTarget11);
SwapChain11 *mSwapChain;
bool mDepth;
};
}
#endif // LIBGLESV2_RENDERER_RENDERTARGET11_H_
......@@ -2191,26 +2191,7 @@ void Renderer11::setOneTimeRenderTarget(ID3D11RenderTargetView *renderTargetView
gl::Error Renderer11::createRenderTarget(SwapChain *swapChain, bool depth, RenderTarget **outRT)
{
SwapChain11 *swapChain11 = SwapChain11::makeSwapChain11(swapChain);
if (depth)
{
// Note: depth stencil may be NULL for 0 sized surfaces
*outRT = new RenderTarget11(swapChain11->getDepthStencil(),
swapChain11->getDepthStencilTexture(),
swapChain11->getDepthStencilShaderResource(),
swapChain11->GetDepthBufferInternalFormat(),
swapChain11->getWidth(), swapChain11->getHeight(), 1, 0);
}
else
{
// Note: render target may be NULL for 0 sized surfaces
*outRT = new RenderTarget11(swapChain11->getRenderTarget(),
swapChain11->getOffscreenTexture(),
swapChain11->getRenderTargetShaderResource(),
swapChain11->GetBackBufferInternalFormat(),
swapChain11->getWidth(), swapChain11->getHeight(), 1, 0);
}
*outRT = new SurfaceRenderTarget11(swapChain11, depth);
return gl::Error(GL_NO_ERROR);
}
......@@ -2301,7 +2282,7 @@ gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, G
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create render target depth stencil view, result: 0x%X.", result);
}
*outRT = new RenderTarget11(dsv, texture, srv, format, width, height, 1, supportedSamples);
*outRT = new TextureRenderTarget11(dsv, texture, srv, format, width, height, 1, supportedSamples);
SafeRelease(dsv);
}
......@@ -2328,7 +2309,7 @@ gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, G
mDeviceContext->ClearRenderTargetView(rtv, clearValues);
}
*outRT = new RenderTarget11(rtv, texture, srv, format, width, height, 1, supportedSamples);
*outRT = new TextureRenderTarget11(rtv, texture, srv, format, width, height, 1, supportedSamples);
SafeRelease(rtv);
}
......@@ -2342,7 +2323,7 @@ gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, G
}
else
{
*outRT = new RenderTarget11(reinterpret_cast<ID3D11RenderTargetView*>(NULL), NULL, NULL, format, width, height, 1, supportedSamples);
*outRT = new TextureRenderTarget11(reinterpret_cast<ID3D11RenderTargetView*>(NULL), NULL, NULL, format, width, height, 1, supportedSamples);
}
return gl::Error(GL_NO_ERROR);
......
......@@ -814,7 +814,7 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index, Rend
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal render target view for texture storage, result: 0x%X.", result);
}
mRenderTarget[level] = new RenderTarget11(rtv, texture, srv, mInternalFormat, getLevelWidth(level), getLevelHeight(level), 1, 0);
mRenderTarget[level] = new TextureRenderTarget11(rtv, texture, srv, mInternalFormat, getLevelWidth(level), getLevelHeight(level), 1, 0);
// RenderTarget will take ownership of these resources
SafeRelease(rtv);
......@@ -838,7 +838,7 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index, Rend
return gl::Error(GL_OUT_OF_MEMORY,"Failed to create internal depth stencil view for texture storage, result: 0x%X.", result);
}
mRenderTarget[level] = new RenderTarget11(dsv, texture, srv, mInternalFormat, getLevelWidth(level), getLevelHeight(level), 1, 0);
mRenderTarget[level] = new TextureRenderTarget11(dsv, texture, srv, mInternalFormat, getLevelWidth(level), getLevelHeight(level), 1, 0);
// RenderTarget will take ownership of these resources
SafeRelease(dsv);
......@@ -1217,7 +1217,7 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index, Re
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal render target view for texture storage, result: 0x%X.", result);
}
mRenderTarget[faceIndex][level] = new RenderTarget11(rtv, texture, srv, mInternalFormat, getLevelWidth(level), getLevelHeight(level), 1, 0);
mRenderTarget[faceIndex][level] = new TextureRenderTarget11(rtv, texture, srv, mInternalFormat, getLevelWidth(level), getLevelHeight(level), 1, 0);
// RenderTarget will take ownership of these resources
SafeRelease(rtv);
......@@ -1243,7 +1243,7 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index, Re
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal depth stencil view for texture storage, result: 0x%X.", result);
}
mRenderTarget[faceIndex][level] = new RenderTarget11(dsv, texture, srv, mInternalFormat, getLevelWidth(level), getLevelHeight(level), 1, 0);
mRenderTarget[faceIndex][level] = new TextureRenderTarget11(dsv, texture, srv, mInternalFormat, getLevelWidth(level), getLevelHeight(level), 1, 0);
// RenderTarget will take ownership of these resources
SafeRelease(dsv);
......@@ -1626,7 +1626,7 @@ gl::Error TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index, Rend
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal render target view for texture storage, result: 0x%X.", result);
}
mLevelRenderTargets[mipLevel] = new RenderTarget11(rtv, texture, srv, mInternalFormat, getLevelWidth(mipLevel), getLevelHeight(mipLevel), getLevelDepth(mipLevel), 0);
mLevelRenderTargets[mipLevel] = new TextureRenderTarget11(rtv, texture, srv, mInternalFormat, getLevelWidth(mipLevel), getLevelHeight(mipLevel), getLevelDepth(mipLevel), 0);
// RenderTarget will take ownership of these resources
SafeRelease(rtv);
......@@ -1673,7 +1673,7 @@ gl::Error TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index, Rend
}
ASSERT(SUCCEEDED(result));
mLevelLayerRenderTargets[key] = new RenderTarget11(rtv, texture, srv, mInternalFormat, getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0);
mLevelLayerRenderTargets[key] = new TextureRenderTarget11(rtv, texture, srv, mInternalFormat, getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0);
// RenderTarget will take ownership of these resources
SafeRelease(rtv);
......@@ -2024,7 +2024,7 @@ gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &index,
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal render target view for texture storage, result: 0x%X.", result);
}
mRenderTargets[key] = new RenderTarget11(rtv, texture, srv, mInternalFormat, getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0);
mRenderTargets[key] = new TextureRenderTarget11(rtv, texture, srv, mInternalFormat, getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0);
// RenderTarget will take ownership of these resources
SafeRelease(rtv);
......
......@@ -10,23 +10,36 @@
#include "libGLESv2/renderer/d3d/d3d9/RenderTarget9.h"
#include "libGLESv2/renderer/d3d/d3d9/Renderer9.h"
#include "libGLESv2/renderer/d3d/d3d9/renderer9_utils.h"
#include "libGLESv2/renderer/d3d/d3d9/SwapChain9.h"
#include "libGLESv2/renderer/d3d/d3d9/formatutils9.h"
#include "libGLESv2/main.h"
namespace rx
{
RenderTarget9 *RenderTarget9::makeRenderTarget9(RenderTarget *target)
{
ASSERT(HAS_DYNAMIC_TYPE(rx::RenderTarget9*, target));
return static_cast<rx::RenderTarget9*>(target);
}
void RenderTarget9::invalidate(GLint x, GLint y, GLsizei width, GLsizei height)
{
// Currently a no-op
}
// TODO: AddRef the incoming surface to take ownership instead of expecting that its ref is being given.
RenderTarget9::RenderTarget9(IDirect3DSurface9 *surface, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth,
GLsizei samples)
: mRenderTarget(surface)
TextureRenderTarget9::TextureRenderTarget9(IDirect3DSurface9 *surface, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth,
GLsizei samples)
: mWidth(width),
mHeight(height),
mDepth(depth),
mInternalFormat(internalFormat),
mActualFormat(internalFormat),
mSamples(samples),
mRenderTarget(surface)
{
mWidth = width;
mHeight = height;
mDepth = depth;
mSamples = samples;
mInternalFormat = internalFormat;
mActualFormat = internalFormat;
ASSERT(mDepth == 1);
if (mRenderTarget)
{
......@@ -38,23 +51,42 @@ RenderTarget9::RenderTarget9(IDirect3DSurface9 *surface, GLenum internalFormat,
}
}
RenderTarget9::~RenderTarget9()
TextureRenderTarget9::~TextureRenderTarget9()
{
SafeRelease(mRenderTarget);
}
RenderTarget9 *RenderTarget9::makeRenderTarget9(RenderTarget *target)
GLsizei TextureRenderTarget9::getWidth() const
{
ASSERT(HAS_DYNAMIC_TYPE(rx::RenderTarget9*, target));
return static_cast<rx::RenderTarget9*>(target);
return mWidth;
}
void RenderTarget9::invalidate(GLint x, GLint y, GLsizei width, GLsizei height)
GLsizei TextureRenderTarget9::getHeight() const
{
// Currently a no-op
return mHeight;
}
IDirect3DSurface9 *RenderTarget9::getSurface()
GLsizei TextureRenderTarget9::getDepth() const
{
return mDepth;
}
GLenum TextureRenderTarget9::getInternalFormat() const
{
return mInternalFormat;
}
GLenum TextureRenderTarget9::getActualFormat() const
{
return mActualFormat;
}
GLsizei TextureRenderTarget9::getSamples() const
{
return mSamples;
}
IDirect3DSurface9 *TextureRenderTarget9::getSurface()
{
// Caller is responsible for releasing the returned surface reference.
// TODO: remove the AddRef to match RenderTarget11
......@@ -66,4 +98,51 @@ IDirect3DSurface9 *RenderTarget9::getSurface()
return mRenderTarget;
}
SurfaceRenderTarget9::SurfaceRenderTarget9(SwapChain9 *swapChain, bool depth)
: mSwapChain(swapChain),
mDepth(depth)
{
}
SurfaceRenderTarget9::~SurfaceRenderTarget9()
{
}
GLsizei SurfaceRenderTarget9::getWidth() const
{
return mSwapChain->getWidth();
}
GLsizei SurfaceRenderTarget9::getHeight() const
{
return mSwapChain->getHeight();
}
GLsizei SurfaceRenderTarget9::getDepth() const
{
return 1;
}
GLenum SurfaceRenderTarget9::getInternalFormat() const
{
return (mDepth ? mSwapChain->GetDepthBufferInternalFormat() : mSwapChain->GetBackBufferInternalFormat());
}
GLenum SurfaceRenderTarget9::getActualFormat() const
{
return d3d9::GetD3DFormatInfo(d3d9::GetTextureFormatInfo(getInternalFormat()).texFormat).internalFormat;
}
GLsizei SurfaceRenderTarget9::getSamples() const
{
// Our EGL surfaces do not support multisampling.
return 0;
}
IDirect3DSurface9 *SurfaceRenderTarget9::getSurface()
{
return (mDepth ? mSwapChain->getDepthStencil() : mSwapChain->getRenderTarget());
}
}
......@@ -15,26 +15,75 @@
namespace rx
{
class Renderer9;
class SwapChain9;
class RenderTarget9 : public RenderTarget
{
public:
RenderTarget9(IDirect3DSurface9 *surface, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth,
GLsizei samples);
virtual ~RenderTarget9();
RenderTarget9() { }
virtual ~RenderTarget9() { }
static RenderTarget9 *makeRenderTarget9(RenderTarget *renderTarget);
virtual void invalidate(GLint x, GLint y, GLsizei width, GLsizei height);
void invalidate(GLint x, GLint y, GLsizei width, GLsizei height) override;
IDirect3DSurface9 *getSurface();
virtual IDirect3DSurface9 *getSurface() = 0;
private:
DISALLOW_COPY_AND_ASSIGN(RenderTarget9);
};
class TextureRenderTarget9 : public RenderTarget9
{
public:
TextureRenderTarget9(IDirect3DSurface9 *surface, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth,
GLsizei samples);
virtual ~TextureRenderTarget9();
GLsizei getWidth() const override;
GLsizei getHeight() const override;
GLsizei getDepth() const override;
GLenum getInternalFormat() const override;
GLenum getActualFormat() const override;
GLsizei getSamples() const override;
IDirect3DSurface9 *getSurface() override;
private:
DISALLOW_COPY_AND_ASSIGN(TextureRenderTarget9);
GLsizei mWidth;
GLsizei mHeight;
GLsizei mDepth;
GLenum mInternalFormat;
GLenum mActualFormat;
GLsizei mSamples;
IDirect3DSurface9 *mRenderTarget;
};
class SurfaceRenderTarget9 : public RenderTarget9
{
public:
SurfaceRenderTarget9(SwapChain9 *swapChain, bool depth);
virtual ~SurfaceRenderTarget9();
GLsizei getWidth() const override;
GLsizei getHeight() const override;
GLsizei getDepth() const override;
GLenum getInternalFormat() const override;
GLenum getActualFormat() const override;
GLsizei getSamples() const override;
IDirect3DSurface9 *getSurface() override;
private:
DISALLOW_COPY_AND_ASSIGN(SurfaceRenderTarget9);
SwapChain9 *mSwapChain;
bool mDepth;
};
}
#endif // LIBGLESV2_RENDERER_RENDERTARGET9_H_
......@@ -2811,17 +2811,7 @@ gl::Error Renderer9::readPixels(gl::Framebuffer *framebuffer, GLint x, GLint y,
gl::Error Renderer9::createRenderTarget(SwapChain *swapChain, bool depth, RenderTarget **outRT)
{
SwapChain9 *swapChain9 = SwapChain9::makeSwapChain9(swapChain);
if (depth)
{
*outRT = new RenderTarget9(swapChain9->getDepthStencil(), swapChain9->GetDepthBufferInternalFormat(),
swapChain9->getWidth(), swapChain9->getHeight(), 1, 0);
}
else
{
*outRT = new RenderTarget9(swapChain9->getRenderTarget(), swapChain9->GetBackBufferInternalFormat(),
swapChain9->getWidth(), swapChain9->getHeight(), 1, 0);
}
*outRT = new SurfaceRenderTarget9(swapChain9, depth);
return gl::Error(GL_NO_ERROR);
}
......@@ -2872,7 +2862,7 @@ gl::Error Renderer9::createRenderTarget(int width, int height, GLenum format, GL
}
}
*outRT = new RenderTarget9(renderTarget, format, width, height, 1, supportedSamples);
*outRT = new TextureRenderTarget9(renderTarget, format, width, height, 1, supportedSamples);
return gl::Error(GL_NO_ERROR);
}
......
......@@ -191,7 +191,7 @@ gl::Error TextureStorage9_2D::getRenderTarget(const gl::ImageIndex &/*index*/, R
return error;
}
mRenderTarget = new RenderTarget9(surface, mInternalFormat, mTextureWidth, mTextureHeight, 1, 0);
mRenderTarget = new TextureRenderTarget9(surface, mInternalFormat, mTextureWidth, mTextureHeight, 1, 0);
}
ASSERT(outRT);
......@@ -371,7 +371,7 @@ gl::Error TextureStorage9_Cube::getRenderTarget(const gl::ImageIndex &index, Ren
return error;
}
mRenderTarget[index.layerIndex] = new RenderTarget9(surface, mInternalFormat, mTextureWidth, mTextureHeight, 1, 0);
mRenderTarget[index.layerIndex] = new TextureRenderTarget9(surface, mInternalFormat, mTextureWidth, mTextureHeight, 1, 0);
}
*outRT = mRenderTarget[index.layerIndex];
......
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