Commit 5f4db6a7 by Mingyu Hu Committed by Commit Bot

Fix performance issue with EXT_multisampled_render_to_texture

Adding a dirty flag to the mMSTexInfo struct so that the multisampled texture does not get unnecessarily resolved on each call. Bug: chromium:1019199 Change-Id: Ia9b24cd0a7f2d82f83f20f7e60f9f2b23383ec6f Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1910531Reviewed-by: 's avatarRafael Cintron <rafael.cintron@microsoft.com> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 11c487a8
...@@ -69,7 +69,7 @@ bool TextureStorage11::ImageKey::operator<(const ImageKey &rhs) const ...@@ -69,7 +69,7 @@ bool TextureStorage11::ImageKey::operator<(const ImageKey &rhs) const
MultisampledRenderToTextureInfo::MultisampledRenderToTextureInfo(const GLsizei samples, MultisampledRenderToTextureInfo::MultisampledRenderToTextureInfo(const GLsizei samples,
const gl::ImageIndex index) const gl::ImageIndex index)
: samples(samples), index(index) : samples(samples), index(index), msTextureNeedsResolve(false)
{} {}
MultisampledRenderToTextureInfo::~MultisampledRenderToTextureInfo() {} MultisampledRenderToTextureInfo::~MultisampledRenderToTextureInfo() {}
...@@ -883,6 +883,7 @@ angle::Result TextureStorage11::resolveTextureHelper(const gl::Context *context, ...@@ -883,6 +883,7 @@ angle::Result TextureStorage11::resolveTextureHelper(const gl::Context *context,
ANGLE_TRY(mMSTexInfo->msTex->getResource(context, &resource)); ANGLE_TRY(mMSTexInfo->msTex->getResource(context, &resource));
deviceContext->ResolveSubresource(texture.get(), subresourceIndexSS, resource->get(), deviceContext->ResolveSubresource(texture.get(), subresourceIndexSS, resource->get(),
subresourceIndexMS, texture.getFormat()); subresourceIndexMS, texture.getFormat());
mMSTexInfo->msTextureNeedsResolve = false;
} }
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -917,7 +918,11 @@ angle::Result TextureStorage11::getMultisampledRenderTarget(const gl::Context *c ...@@ -917,7 +918,11 @@ angle::Result TextureStorage11::getMultisampledRenderTarget(const gl::Context *c
{ {
RenderTargetD3D *rt; RenderTargetD3D *rt;
ANGLE_TRY(mMSTexInfo->msTex->getRenderTarget(context, index, samples, &rt)); ANGLE_TRY(mMSTexInfo->msTex->getRenderTarget(context, index, samples, &rt));
*outRT = rt; // By returning the multisampled render target to the caller, the render target
// is expected to be changed so we need to resolve to a single sampled texture
// next time resolveTexture is called.
mMSTexInfo->msTextureNeedsResolve = true;
*outRT = rt;
return angle::Result::Continue; return angle::Result::Continue;
} }
else else
...@@ -953,7 +958,11 @@ angle::Result TextureStorage11::getMultisampledRenderTarget(const gl::Context *c ...@@ -953,7 +958,11 @@ angle::Result TextureStorage11::getMultisampledRenderTarget(const gl::Context *c
mMSTexInfo->msTex = std::move(texMS); mMSTexInfo->msTex = std::move(texMS);
RenderTargetD3D *rt; RenderTargetD3D *rt;
ANGLE_TRY(mMSTexInfo->msTex->getRenderTarget(context, index, samples, &rt)); ANGLE_TRY(mMSTexInfo->msTex->getRenderTarget(context, index, samples, &rt));
*outRT = rt; // By returning the multisampled render target to the caller, the render target
// is expected to be changed so we need to resolve to a single sampled texture
// next time resolveTexture is called.
mMSTexInfo->msTextureNeedsResolve = true;
*outRT = rt;
return angle::Result::Continue; return angle::Result::Continue;
} }
} }
...@@ -1554,7 +1563,7 @@ angle::Result TextureStorage11_2D::ensureDropStencilTexture(const gl::Context *c ...@@ -1554,7 +1563,7 @@ angle::Result TextureStorage11_2D::ensureDropStencilTexture(const gl::Context *c
angle::Result TextureStorage11_2D::resolveTexture(const gl::Context *context) angle::Result TextureStorage11_2D::resolveTexture(const gl::Context *context)
{ {
if (mMSTexInfo && mMSTexInfo->msTex) if (mMSTexInfo && mMSTexInfo->msTex && mMSTexInfo->msTextureNeedsResolve)
{ {
ANGLE_TRY(resolveTextureHelper(context, mTexture)); ANGLE_TRY(resolveTextureHelper(context, mTexture));
onStateChange(angle::SubjectMessage::ContentsChanged); onStateChange(angle::SubjectMessage::ContentsChanged);
...@@ -2661,7 +2670,7 @@ angle::Result TextureStorage11_Cube::ensureDropStencilTexture(const gl::Context ...@@ -2661,7 +2670,7 @@ angle::Result TextureStorage11_Cube::ensureDropStencilTexture(const gl::Context
angle::Result TextureStorage11_Cube::resolveTexture(const gl::Context *context) angle::Result TextureStorage11_Cube::resolveTexture(const gl::Context *context)
{ {
if (mMSTexInfo && mMSTexInfo->msTex) if (mMSTexInfo && mMSTexInfo->msTex && mMSTexInfo->msTextureNeedsResolve)
{ {
ANGLE_TRY(resolveTextureHelper(context, mTexture)); ANGLE_TRY(resolveTextureHelper(context, mTexture));
onStateChange(angle::SubjectMessage::ContentsChanged); onStateChange(angle::SubjectMessage::ContentsChanged);
......
...@@ -46,6 +46,7 @@ struct MultisampledRenderToTextureInfo ...@@ -46,6 +46,7 @@ struct MultisampledRenderToTextureInfo
GLsizei samples; GLsizei samples;
gl::ImageIndex index; gl::ImageIndex index;
bool msTextureNeedsResolve;
std::unique_ptr<TextureStorage11_2DMultisample> msTex; std::unique_ptr<TextureStorage11_2DMultisample> msTex;
}; };
......
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