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