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 ...@@ -12,6 +12,15 @@ namespace rx
{ {
unsigned int RenderTarget::mCurrentSerial = 1; unsigned int RenderTarget::mCurrentSerial = 1;
RenderTarget::RenderTarget()
: mSerial(issueSerials(1))
{
}
RenderTarget::~RenderTarget()
{
}
unsigned int RenderTarget::getSerial() const unsigned int RenderTarget::getSerial() const
{ {
return mSerial; return mSerial;
...@@ -23,4 +32,5 @@ unsigned int RenderTarget::issueSerials(unsigned int count) ...@@ -23,4 +32,5 @@ unsigned int RenderTarget::issueSerials(unsigned int count)
mCurrentSerial += count; mCurrentSerial += count;
return firstSerial; return firstSerial;
} }
}
\ No newline at end of file }
...@@ -18,25 +18,16 @@ namespace rx ...@@ -18,25 +18,16 @@ namespace rx
class RenderTarget class RenderTarget
{ {
public: public:
RenderTarget() : mSerial(issueSerials(1)) RenderTarget();
{ virtual ~RenderTarget();
mWidth = 0;
mHeight = 0;
mDepth = 0;
mInternalFormat = GL_NONE;
mActualFormat = GL_NONE;
mSamples = 0;
}
virtual ~RenderTarget() {}; virtual GLsizei getWidth() const = 0;
virtual GLsizei getHeight() const = 0;
GLsizei getWidth() const { return mWidth; } virtual GLsizei getDepth() const = 0;
GLsizei getHeight() const { return mHeight; } virtual GLenum getInternalFormat() const = 0;
GLsizei getDepth() const { return mDepth; } virtual GLenum getActualFormat() const = 0;
GLenum getInternalFormat() const { return mInternalFormat; } virtual GLsizei getSamples() const = 0;
GLenum getActualFormat() const { return mActualFormat; } gl::Extents getExtents() const { return gl::Extents(getWidth(), getHeight(), getDepth()); }
GLsizei getSamples() const { return mSamples; }
gl::Extents getExtents() const { return gl::Extents(mWidth, mHeight, mDepth); }
virtual void invalidate(GLint x, GLint y, GLsizei width, GLsizei height) = 0; virtual void invalidate(GLint x, GLint y, GLsizei width, GLsizei height) = 0;
...@@ -50,14 +41,6 @@ class RenderTarget ...@@ -50,14 +41,6 @@ class RenderTarget
GLenum format; GLenum format;
}; };
protected:
GLsizei mWidth;
GLsizei mHeight;
GLsizei mDepth;
GLenum mInternalFormat;
GLenum mActualFormat;
GLsizei mSamples;
private: private:
DISALLOW_COPY_AND_ASSIGN(RenderTarget); DISALLOW_COPY_AND_ASSIGN(RenderTarget);
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "libGLESv2/renderer/d3d/d3d11/RenderTarget11.h" #include "libGLESv2/renderer/d3d/d3d11/RenderTarget11.h"
#include "libGLESv2/renderer/d3d/d3d11/Renderer11.h" #include "libGLESv2/renderer/d3d/d3d11/Renderer11.h"
#include "libGLESv2/renderer/d3d/d3d11/renderer11_utils.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/renderer/d3d/d3d11/formatutils11.h"
#include "libGLESv2/main.h" #include "libGLESv2/main.h"
...@@ -176,9 +177,26 @@ static unsigned int getDSVSubresourceIndex(ID3D11Resource *resource, ID3D11Depth ...@@ -176,9 +177,26 @@ static unsigned int getDSVSubresourceIndex(ID3D11Resource *resource, ID3D11Depth
return D3D11CalcSubresource(mipSlice, arraySlice, mipLevels); return D3D11CalcSubresource(mipSlice, arraySlice, mipLevels);
} }
RenderTarget11::RenderTarget11(ID3D11RenderTargetView *rtv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv, RenderTarget11 *RenderTarget11::makeRenderTarget11(RenderTarget *target)
GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei samples) {
: mSubresourceIndex(0), 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), mTexture(resource),
mRenderTarget(rtv), mRenderTarget(rtv),
mDepthStencil(NULL), mDepthStencil(NULL),
...@@ -199,13 +217,6 @@ RenderTarget11::RenderTarget11(ID3D11RenderTargetView *rtv, ID3D11Resource *reso ...@@ -199,13 +217,6 @@ RenderTarget11::RenderTarget11(ID3D11RenderTargetView *rtv, ID3D11Resource *reso
mShaderResource->AddRef(); mShaderResource->AddRef();
} }
mWidth = width;
mHeight = height;
mDepth = depth;
mSamples = samples;
mInternalFormat = internalFormat;
mActualFormat = internalFormat;
if (mRenderTarget && mTexture) if (mRenderTarget && mTexture)
{ {
mSubresourceIndex = getRTVSubresourceIndex(mTexture, mRenderTarget); mSubresourceIndex = getRTVSubresourceIndex(mTexture, mRenderTarget);
...@@ -218,9 +229,15 @@ RenderTarget11::RenderTarget11(ID3D11RenderTargetView *rtv, ID3D11Resource *reso ...@@ -218,9 +229,15 @@ RenderTarget11::RenderTarget11(ID3D11RenderTargetView *rtv, ID3D11Resource *reso
} }
} }
RenderTarget11::RenderTarget11(ID3D11DepthStencilView *dsv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv, TextureRenderTarget11::TextureRenderTarget11(ID3D11DepthStencilView *dsv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv,
GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei samples) GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei samples)
: mSubresourceIndex(0), : mWidth(width),
mHeight(height),
mDepth(depth),
mInternalFormat(internalFormat),
mActualFormat(internalFormat),
mSamples(samples),
mSubresourceIndex(0),
mTexture(resource), mTexture(resource),
mRenderTarget(NULL), mRenderTarget(NULL),
mDepthStencil(dsv), mDepthStencil(dsv),
...@@ -241,13 +258,6 @@ RenderTarget11::RenderTarget11(ID3D11DepthStencilView *dsv, ID3D11Resource *reso ...@@ -241,13 +258,6 @@ RenderTarget11::RenderTarget11(ID3D11DepthStencilView *dsv, ID3D11Resource *reso
mShaderResource->AddRef(); mShaderResource->AddRef();
} }
mWidth = width;
mHeight = height;
mDepth = depth;
mSamples = samples;
mInternalFormat = internalFormat;
mActualFormat = internalFormat;
if (mDepthStencil && mTexture) if (mDepthStencil && mTexture)
{ {
mSubresourceIndex = getDSVSubresourceIndex(mTexture, mDepthStencil); mSubresourceIndex = getDSVSubresourceIndex(mTexture, mDepthStencil);
...@@ -260,7 +270,7 @@ RenderTarget11::RenderTarget11(ID3D11DepthStencilView *dsv, ID3D11Resource *reso ...@@ -260,7 +270,7 @@ RenderTarget11::RenderTarget11(ID3D11DepthStencilView *dsv, ID3D11Resource *reso
} }
} }
RenderTarget11::~RenderTarget11() TextureRenderTarget11::~TextureRenderTarget11()
{ {
SafeRelease(mTexture); SafeRelease(mTexture);
SafeRelease(mRenderTarget); SafeRelease(mRenderTarget);
...@@ -268,40 +278,127 @@ RenderTarget11::~RenderTarget11() ...@@ -268,40 +278,127 @@ RenderTarget11::~RenderTarget11()
SafeRelease(mShaderResource); SafeRelease(mShaderResource);
} }
RenderTarget11 *RenderTarget11::makeRenderTarget11(RenderTarget *target) ID3D11Resource *TextureRenderTarget11::getTexture() const
{ {
ASSERT(HAS_DYNAMIC_TYPE(rx::RenderTarget11*, target)); return mTexture;
return static_cast<rx::RenderTarget11*>(target);
} }
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; 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 @@ ...@@ -14,30 +14,62 @@
namespace rx namespace rx
{ {
class SwapChain11;
class RenderTarget11 : public RenderTarget class RenderTarget11 : public RenderTarget
{ {
public: public:
// RenderTarget11 takes ownership of any D3D11 resources it is given and will AddRef them RenderTarget11() { }
RenderTarget11(ID3D11RenderTargetView *rtv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv, virtual ~RenderTarget11() { }
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();
static RenderTarget11 *makeRenderTarget11(RenderTarget *renderTarget); 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; virtual ID3D11Resource *getTexture() const = 0;
ID3D11RenderTargetView *getRenderTargetView() const; virtual ID3D11RenderTargetView *getRenderTargetView() const = 0;
ID3D11DepthStencilView *getDepthStencilView() const; virtual ID3D11DepthStencilView *getDepthStencilView() const = 0;
ID3D11ShaderResourceView *getShaderResourceView() const; virtual ID3D11ShaderResourceView *getShaderResourceView() const = 0;
unsigned int getSubresourceIndex() const; virtual unsigned int getSubresourceIndex() const = 0;
private: private:
DISALLOW_COPY_AND_ASSIGN(RenderTarget11); 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; unsigned int mSubresourceIndex;
ID3D11Resource *mTexture; ID3D11Resource *mTexture;
...@@ -46,6 +78,33 @@ class RenderTarget11 : public RenderTarget ...@@ -46,6 +78,33 @@ class RenderTarget11 : public RenderTarget
ID3D11ShaderResourceView *mShaderResource; 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_ #endif // LIBGLESV2_RENDERER_RENDERTARGET11_H_
...@@ -2191,26 +2191,7 @@ void Renderer11::setOneTimeRenderTarget(ID3D11RenderTargetView *renderTargetView ...@@ -2191,26 +2191,7 @@ void Renderer11::setOneTimeRenderTarget(ID3D11RenderTargetView *renderTargetView
gl::Error Renderer11::createRenderTarget(SwapChain *swapChain, bool depth, RenderTarget **outRT) gl::Error Renderer11::createRenderTarget(SwapChain *swapChain, bool depth, RenderTarget **outRT)
{ {
SwapChain11 *swapChain11 = SwapChain11::makeSwapChain11(swapChain); SwapChain11 *swapChain11 = SwapChain11::makeSwapChain11(swapChain);
*outRT = new SurfaceRenderTarget11(swapChain11, depth);
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);
}
return gl::Error(GL_NO_ERROR); return gl::Error(GL_NO_ERROR);
} }
...@@ -2301,7 +2282,7 @@ gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, G ...@@ -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); 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); SafeRelease(dsv);
} }
...@@ -2328,7 +2309,7 @@ gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, G ...@@ -2328,7 +2309,7 @@ gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, G
mDeviceContext->ClearRenderTargetView(rtv, clearValues); 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); SafeRelease(rtv);
} }
...@@ -2342,7 +2323,7 @@ gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, G ...@@ -2342,7 +2323,7 @@ gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, G
} }
else 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); return gl::Error(GL_NO_ERROR);
......
...@@ -814,7 +814,7 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index, Rend ...@@ -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); 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 // RenderTarget will take ownership of these resources
SafeRelease(rtv); SafeRelease(rtv);
...@@ -838,7 +838,7 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index, Rend ...@@ -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); 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 // RenderTarget will take ownership of these resources
SafeRelease(dsv); SafeRelease(dsv);
...@@ -1217,7 +1217,7 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index, Re ...@@ -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); 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 // RenderTarget will take ownership of these resources
SafeRelease(rtv); SafeRelease(rtv);
...@@ -1243,7 +1243,7 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index, Re ...@@ -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); 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 // RenderTarget will take ownership of these resources
SafeRelease(dsv); SafeRelease(dsv);
...@@ -1626,7 +1626,7 @@ gl::Error TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index, Rend ...@@ -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); 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 // RenderTarget will take ownership of these resources
SafeRelease(rtv); SafeRelease(rtv);
...@@ -1673,7 +1673,7 @@ gl::Error TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index, Rend ...@@ -1673,7 +1673,7 @@ gl::Error TextureStorage11_3D::getRenderTarget(const gl::ImageIndex &index, Rend
} }
ASSERT(SUCCEEDED(result)); 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 // RenderTarget will take ownership of these resources
SafeRelease(rtv); SafeRelease(rtv);
...@@ -2024,7 +2024,7 @@ gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::ImageIndex &index, ...@@ -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); 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 // RenderTarget will take ownership of these resources
SafeRelease(rtv); SafeRelease(rtv);
......
...@@ -10,23 +10,36 @@ ...@@ -10,23 +10,36 @@
#include "libGLESv2/renderer/d3d/d3d9/RenderTarget9.h" #include "libGLESv2/renderer/d3d/d3d9/RenderTarget9.h"
#include "libGLESv2/renderer/d3d/d3d9/Renderer9.h" #include "libGLESv2/renderer/d3d/d3d9/Renderer9.h"
#include "libGLESv2/renderer/d3d/d3d9/renderer9_utils.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/renderer/d3d/d3d9/formatutils9.h"
#include "libGLESv2/main.h" #include "libGLESv2/main.h"
namespace rx 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. // 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, TextureRenderTarget9::TextureRenderTarget9(IDirect3DSurface9 *surface, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth,
GLsizei samples) GLsizei samples)
: mRenderTarget(surface) : mWidth(width),
mHeight(height),
mDepth(depth),
mInternalFormat(internalFormat),
mActualFormat(internalFormat),
mSamples(samples),
mRenderTarget(surface)
{ {
mWidth = width; ASSERT(mDepth == 1);
mHeight = height;
mDepth = depth;
mSamples = samples;
mInternalFormat = internalFormat;
mActualFormat = internalFormat;
if (mRenderTarget) if (mRenderTarget)
{ {
...@@ -38,23 +51,42 @@ RenderTarget9::RenderTarget9(IDirect3DSurface9 *surface, GLenum internalFormat, ...@@ -38,23 +51,42 @@ RenderTarget9::RenderTarget9(IDirect3DSurface9 *surface, GLenum internalFormat,
} }
} }
RenderTarget9::~RenderTarget9() TextureRenderTarget9::~TextureRenderTarget9()
{ {
SafeRelease(mRenderTarget); SafeRelease(mRenderTarget);
} }
RenderTarget9 *RenderTarget9::makeRenderTarget9(RenderTarget *target) GLsizei TextureRenderTarget9::getWidth() const
{ {
ASSERT(HAS_DYNAMIC_TYPE(rx::RenderTarget9*, target)); return mWidth;
return static_cast<rx::RenderTarget9*>(target);
} }
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. // Caller is responsible for releasing the returned surface reference.
// TODO: remove the AddRef to match RenderTarget11 // TODO: remove the AddRef to match RenderTarget11
...@@ -66,4 +98,51 @@ IDirect3DSurface9 *RenderTarget9::getSurface() ...@@ -66,4 +98,51 @@ IDirect3DSurface9 *RenderTarget9::getSurface()
return mRenderTarget; 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 @@ ...@@ -15,26 +15,75 @@
namespace rx namespace rx
{ {
class Renderer9; class Renderer9;
class SwapChain9;
class RenderTarget9 : public RenderTarget class RenderTarget9 : public RenderTarget
{ {
public: public:
RenderTarget9(IDirect3DSurface9 *surface, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, RenderTarget9() { }
GLsizei samples); virtual ~RenderTarget9() { }
virtual ~RenderTarget9();
static RenderTarget9 *makeRenderTarget9(RenderTarget *renderTarget); 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: private:
DISALLOW_COPY_AND_ASSIGN(RenderTarget9); 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; 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_ #endif // LIBGLESV2_RENDERER_RENDERTARGET9_H_
...@@ -2811,17 +2811,7 @@ gl::Error Renderer9::readPixels(gl::Framebuffer *framebuffer, GLint x, GLint y, ...@@ -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) gl::Error Renderer9::createRenderTarget(SwapChain *swapChain, bool depth, RenderTarget **outRT)
{ {
SwapChain9 *swapChain9 = SwapChain9::makeSwapChain9(swapChain); SwapChain9 *swapChain9 = SwapChain9::makeSwapChain9(swapChain);
if (depth) *outRT = new SurfaceRenderTarget9(swapChain9, 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);
}
return gl::Error(GL_NO_ERROR); return gl::Error(GL_NO_ERROR);
} }
...@@ -2872,7 +2862,7 @@ gl::Error Renderer9::createRenderTarget(int width, int height, GLenum format, GL ...@@ -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); return gl::Error(GL_NO_ERROR);
} }
......
...@@ -191,7 +191,7 @@ gl::Error TextureStorage9_2D::getRenderTarget(const gl::ImageIndex &/*index*/, R ...@@ -191,7 +191,7 @@ gl::Error TextureStorage9_2D::getRenderTarget(const gl::ImageIndex &/*index*/, R
return error; return error;
} }
mRenderTarget = new RenderTarget9(surface, mInternalFormat, mTextureWidth, mTextureHeight, 1, 0); mRenderTarget = new TextureRenderTarget9(surface, mInternalFormat, mTextureWidth, mTextureHeight, 1, 0);
} }
ASSERT(outRT); ASSERT(outRT);
...@@ -371,7 +371,7 @@ gl::Error TextureStorage9_Cube::getRenderTarget(const gl::ImageIndex &index, Ren ...@@ -371,7 +371,7 @@ gl::Error TextureStorage9_Cube::getRenderTarget(const gl::ImageIndex &index, Ren
return error; 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]; *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