Commit 136a2742 by Jamie Madill Committed by Commit Bot

TextureStorage11: Use unique_ptr for RenderTargets.

This ensures they are auto-freed when the Storage is destroyed. Also remove the 'delete this' design pattern. BUG=angleproject:2151 Change-Id: I784b94c7125a1bbc15f5d6ae90e55317e199faa6 Reviewed-on: https://chromium-review.googlesource.com/673137 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarFrank Henigman <fjhenigman@chromium.org>
parent 33510107
......@@ -659,9 +659,9 @@ gl::Error TextureD3D::releaseTexStorage(const gl::Context *context)
{
return gl::NoError();
}
ANGLE_TRY(mTexStorage->onDestroy(context));
mTexStorage = nullptr;
return gl::NoError();
auto err = mTexStorage->onDestroy(context);
SafeDelete(mTexStorage);
return err;
}
gl::Error TextureD3D::onDestroy(const gl::Context *context)
......
......@@ -33,10 +33,10 @@ class TextureStorage : angle::NonCopyable
{
public:
TextureStorage() {}
virtual ~TextureStorage() {}
virtual gl::Error onDestroy(const gl::Context *context)
{
delete this;
return gl::NoError();
}
......@@ -67,9 +67,6 @@ class TextureStorage : angle::NonCopyable
{
return gl::NoError();
}
protected:
virtual ~TextureStorage() {}
};
using TexStoragePointer = angle::UniqueObjectPointer<TextureStorage, gl::Context>;
......
......@@ -781,13 +781,6 @@ gl::Error TextureStorage11_2D::onDestroy(const gl::Context *context)
}
}
SafeDelete(mLevelZeroRenderTarget);
for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
{
SafeDelete(mRenderTarget[i]);
}
if (mHasKeyedMutex)
{
// If the keyed mutex is released that will unbind it and cause the state cache to become
......@@ -795,8 +788,6 @@ gl::Error TextureStorage11_2D::onDestroy(const gl::Context *context)
mRenderer->getStateManager()->invalidateBoundViews(context);
}
delete this;
return gl::NoError();
}
......@@ -893,7 +884,7 @@ gl::Error TextureStorage11_2D::useLevelZeroWorkaroundTexture(bool useLevelZeroTe
{
mLevelZeroRenderTarget->signalDirty();
}
for (auto *renderTarget : mRenderTarget)
for (auto &renderTarget : mRenderTarget)
{
if (renderTarget)
{
......@@ -1049,7 +1040,7 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::Context *context,
ASSERT(outRT);
if (mRenderTarget[level])
{
*outRT = mRenderTarget[level];
*outRT = mRenderTarget[level].get();
return gl::NoError();
}
......@@ -1080,13 +1071,13 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::Context *context,
d3d11::RenderTargetView rtv;
ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mLevelZeroTexture.get(), &rtv));
mLevelZeroRenderTarget = new TextureRenderTarget11(
mLevelZeroRenderTarget.reset(new TextureRenderTarget11(
std::move(rtv), mLevelZeroTexture, d3d11::SharedSRV(), d3d11::SharedSRV(),
mFormatInfo.internalFormat, getFormatSet(), getLevelWidth(level),
getLevelHeight(level), 1, 0);
getLevelHeight(level), 1, 0));
}
*outRT = mLevelZeroRenderTarget;
*outRT = mLevelZeroRenderTarget.get();
return gl::NoError();
}
......@@ -1100,11 +1091,11 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::Context *context,
d3d11::RenderTargetView rtv;
ANGLE_TRY(mRenderer->allocateResource(rtvDesc, texture->get(), &rtv));
mRenderTarget[level] = new TextureRenderTarget11(
mRenderTarget[level].reset(new TextureRenderTarget11(
std::move(rtv), *texture, *srv, *blitSRV, mFormatInfo.internalFormat, getFormatSet(),
getLevelWidth(level), getLevelHeight(level), 1, 0);
getLevelWidth(level), getLevelHeight(level), 1, 0));
*outRT = mRenderTarget[level];
*outRT = mRenderTarget[level].get();
return gl::NoError();
}
......@@ -1119,11 +1110,11 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::Context *context,
d3d11::DepthStencilView dsv;
ANGLE_TRY(mRenderer->allocateResource(dsvDesc, texture->get(), &dsv));
mRenderTarget[level] = new TextureRenderTarget11(
mRenderTarget[level].reset(new TextureRenderTarget11(
std::move(dsv), *texture, *srv, mFormatInfo.internalFormat, getFormatSet(),
getLevelWidth(level), getLevelHeight(level), 1, 0);
getLevelWidth(level), getLevelHeight(level), 1, 0));
*outRT = mRenderTarget[level];
*outRT = mRenderTarget[level].get();
return gl::NoError();
}
......@@ -1286,8 +1277,6 @@ gl::Error TextureStorage11_External::onDestroy(const gl::Context *context)
mRenderer->getStateManager()->invalidateBoundViews(context);
}
delete this;
return gl::NoError();
}
......@@ -1686,21 +1675,6 @@ gl::Error TextureStorage11_Cube::onDestroy(const gl::Context *context)
}
}
for (unsigned int face = 0; face < CUBE_FACE_COUNT; face++)
{
SafeDelete(mLevelZeroRenderTarget[face]);
}
for (unsigned int level = 0; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)
{
for (unsigned int face = 0; face < CUBE_FACE_COUNT; face++)
{
SafeDelete(mRenderTarget[face][level]);
}
}
delete this;
return gl::NoError();
}
......@@ -2023,14 +1997,14 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::Context *context,
d3d11::RenderTargetView rtv;
ANGLE_TRY(mRenderer->allocateResource(rtvDesc, mLevelZeroTexture.get(), &rtv));
mLevelZeroRenderTarget[faceIndex] = new TextureRenderTarget11(
mLevelZeroRenderTarget[faceIndex].reset(new TextureRenderTarget11(
std::move(rtv), mLevelZeroTexture, d3d11::SharedSRV(), d3d11::SharedSRV(),
mFormatInfo.internalFormat, getFormatSet(), getLevelWidth(level),
getLevelHeight(level), 1, 0);
getLevelHeight(level), 1, 0));
}
ASSERT(outRT);
*outRT = mLevelZeroRenderTarget[faceIndex];
*outRT = mLevelZeroRenderTarget[faceIndex].get();
return gl::NoError();
}
......@@ -2061,9 +2035,9 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::Context *context,
ANGLE_TRY(mRenderer->allocateResource(rtvDesc, texture->get(), &rtv));
rtv.setDebugName("TexStorageCube.RenderTargetRTV");
mRenderTarget[faceIndex][level] = new TextureRenderTarget11(
mRenderTarget[faceIndex][level].reset(new TextureRenderTarget11(
std::move(rtv), *texture, srv, blitSRV, mFormatInfo.internalFormat, getFormatSet(),
getLevelWidth(level), getLevelHeight(level), 1, 0);
getLevelWidth(level), getLevelHeight(level), 1, 0));
}
else if (mFormatInfo.dsvFormat != DXGI_FORMAT_UNKNOWN)
{
......@@ -2079,9 +2053,9 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::Context *context,
ANGLE_TRY(mRenderer->allocateResource(dsvDesc, texture->get(), &dsv));
dsv.setDebugName("TexStorageCube.RenderTargetDSV");
mRenderTarget[faceIndex][level] = new TextureRenderTarget11(
mRenderTarget[faceIndex][level].reset(new TextureRenderTarget11(
std::move(dsv), *texture, srv, mFormatInfo.internalFormat, getFormatSet(),
getLevelWidth(level), getLevelHeight(level), 1, 0);
getLevelWidth(level), getLevelHeight(level), 1, 0));
}
else
{
......@@ -2090,7 +2064,7 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::Context *context,
}
ASSERT(outRT);
*outRT = mRenderTarget[faceIndex][level];
*outRT = mRenderTarget[faceIndex][level].get();
return gl::NoError();
}
......@@ -2308,20 +2282,6 @@ gl::Error TextureStorage11_3D::onDestroy(const gl::Context *context)
}
}
for (RenderTargetMap::iterator i = mLevelLayerRenderTargets.begin();
i != mLevelLayerRenderTargets.end(); i++)
{
SafeDelete(i->second);
}
mLevelLayerRenderTargets.clear();
for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
{
SafeDelete(mLevelRenderTargets[i]);
}
delete this;
return gl::NoError();
}
......@@ -2471,14 +2431,14 @@ gl::Error TextureStorage11_3D::getRenderTarget(const gl::Context *context,
ANGLE_TRY(mRenderer->allocateResource(rtvDesc, texture->get(), &rtv));
rtv.setDebugName("TexStorage3D.RTV");
mLevelRenderTargets[mipLevel] = new TextureRenderTarget11(
mLevelRenderTargets[mipLevel].reset(new TextureRenderTarget11(
std::move(rtv), *texture, *srv, *blitSRV, mFormatInfo.internalFormat,
getFormatSet(), getLevelWidth(mipLevel), getLevelHeight(mipLevel),
getLevelDepth(mipLevel), 0);
getLevelDepth(mipLevel), 0));
}
ASSERT(outRT);
*outRT = mLevelRenderTargets[mipLevel];
*outRT = mLevelRenderTargets[mipLevel].get();
return gl::NoError();
}
......@@ -2505,13 +2465,13 @@ gl::Error TextureStorage11_3D::getRenderTarget(const gl::Context *context,
ANGLE_TRY(mRenderer->allocateResource(rtvDesc, texture->get(), &rtv));
rtv.setDebugName("TexStorage3D.LayerRTV");
mLevelLayerRenderTargets[key] = new TextureRenderTarget11(
mLevelLayerRenderTargets[key].reset(new TextureRenderTarget11(
std::move(rtv), *texture, srv, blitSRV, mFormatInfo.internalFormat, getFormatSet(),
getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0);
getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0));
}
ASSERT(outRT);
*outRT = mLevelLayerRenderTargets[key];
*outRT = mLevelLayerRenderTargets[key].get();
return gl::NoError();
}
......@@ -2610,14 +2570,6 @@ gl::Error TextureStorage11_2DArray::onDestroy(const gl::Context *context)
}
mAssociatedImages.clear();
for (auto iter : mRenderTargets)
{
SafeDelete(iter.second);
}
mRenderTargets.clear();
delete this;
return gl::NoError();
}
......@@ -2813,9 +2765,9 @@ gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::Context *context,
ANGLE_TRY(mRenderer->allocateResource(rtvDesc, texture->get(), &rtv));
rtv.setDebugName("TexStorage2DArray.RenderTargetRTV");
mRenderTargets[key] = new TextureRenderTarget11(
mRenderTargets[key].reset(new TextureRenderTarget11(
std::move(rtv), *texture, srv, blitSRV, mFormatInfo.internalFormat, getFormatSet(),
getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0);
getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0));
}
else
{
......@@ -2833,14 +2785,14 @@ gl::Error TextureStorage11_2DArray::getRenderTarget(const gl::Context *context,
ANGLE_TRY(mRenderer->allocateResource(dsvDesc, texture->get(), &dsv));
dsv.setDebugName("TexStorage2DArray.RenderTargetDSV");
mRenderTargets[key] = new TextureRenderTarget11(
mRenderTargets[key].reset(new TextureRenderTarget11(
std::move(dsv), *texture, srv, mFormatInfo.internalFormat, getFormatSet(),
getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0);
getLevelWidth(mipLevel), getLevelHeight(mipLevel), 1, 0));
}
}
ASSERT(outRT);
*outRT = mRenderTargets[key];
*outRT = mRenderTargets[key].get();
return gl::NoError();
}
......@@ -2961,8 +2913,6 @@ TextureStorage11_2DMultisample::TextureStorage11_2DMultisample(Renderer11 *rende
gl::Error TextureStorage11_2DMultisample::onDestroy(const gl::Context *context)
{
mRenderTarget.reset();
delete this;
return gl::NoError();
}
......
......@@ -222,7 +222,7 @@ class TextureStorage11_2D : public TextureStorage11
d3d11::SharedSRV *outSRV) const override;
TextureHelper11 mTexture;
RenderTarget11 *mRenderTarget[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
std::unique_ptr<RenderTarget11> mRenderTarget[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
bool mHasKeyedMutex;
// These are members related to the zero max-LOD workaround.
......@@ -235,7 +235,7 @@ class TextureStorage11_2D : public TextureStorage11
// A more likely example is an app that creates an empty texture, renders to it, and then calls glGenerateMipmap
// TODO: In this rendering scenario, release the mLevelZeroTexture after mTexture has been created to save memory.
TextureHelper11 mLevelZeroTexture;
RenderTarget11 *mLevelZeroRenderTarget;
std::unique_ptr<RenderTarget11> mLevelZeroRenderTarget;
bool mUseLevelZeroTexture;
// Swizzle-related variables
......@@ -396,11 +396,12 @@ class TextureStorage11_Cube : public TextureStorage11
static const size_t CUBE_FACE_COUNT = 6;
TextureHelper11 mTexture;
RenderTarget11 *mRenderTarget[CUBE_FACE_COUNT][gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
std::unique_ptr<RenderTarget11> mRenderTarget[CUBE_FACE_COUNT]
[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
// Level-zero workaround members. See TextureStorage11_2D's workaround members for a description.
TextureHelper11 mLevelZeroTexture;
RenderTarget11 *mLevelZeroRenderTarget[CUBE_FACE_COUNT];
std::unique_ptr<RenderTarget11> mLevelZeroRenderTarget[CUBE_FACE_COUNT];
bool mUseLevelZeroTexture;
TextureHelper11 mSwizzleTexture;
......@@ -445,10 +446,9 @@ class TextureStorage11_3D : public TextureStorage11
d3d11::SharedSRV *outSRV) const override;
typedef std::pair<int, int> LevelLayerKey;
typedef std::map<LevelLayerKey, RenderTarget11*> RenderTargetMap;
RenderTargetMap mLevelLayerRenderTargets;
std::map<LevelLayerKey, std::unique_ptr<RenderTarget11>> mLevelLayerRenderTargets;
RenderTarget11 *mLevelRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
std::unique_ptr<RenderTarget11> mLevelRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
TextureHelper11 mTexture;
TextureHelper11 mSwizzleTexture;
......@@ -520,8 +520,7 @@ class TextureStorage11_2DArray : public TextureStorage11
DXGI_FORMAT resourceFormat,
d3d11::SharedSRV *srv) const;
typedef std::map<LevelLayerRangeKey, RenderTarget11 *> RenderTargetMap;
RenderTargetMap mRenderTargets;
std::map<LevelLayerRangeKey, std::unique_ptr<RenderTarget11>> mRenderTargets;
TextureHelper11 mTexture;
......
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