Commit 24a504ec by John Bauman Committed by Commit Bot

Clear SRV cache on keyed mutex texture unbind from TextureStorage11

If the calling code releases the keyed mutex after the unbind then D3D will unbind the SRV or RTV from the pipeline without notifying the cache. This allows the SRV to be destroyed, which means that a subsequently-created SRV could have the same address. This would cause the new SRV to not be correctly bound to the pipeline if its slot is the same as the unbound SRV. BUG=588000 Change-Id: I0ad1ba3706a6bcc1fee50745e6148c9b23e578f6 Reviewed-on: https://chromium-review.googlesource.com/328400Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Commit-Queue: John Bauman <jbauman@chromium.org>
parent 73a84969
...@@ -780,6 +780,14 @@ void StateManager11::invalidateRenderTarget() ...@@ -780,6 +780,14 @@ void StateManager11::invalidateRenderTarget()
mAppliedDSV = angle::DirtyPointer; mAppliedDSV = angle::DirtyPointer;
} }
void StateManager11::invalidateBoundViews()
{
mCurVertexSRVs.clear();
mCurPixelSRVs.clear();
invalidateRenderTarget();
}
void StateManager11::invalidateEverything() void StateManager11::invalidateEverything()
{ {
mBlendStateIsDirty = true; mBlendStateIsDirty = true;
...@@ -791,10 +799,7 @@ void StateManager11::invalidateEverything() ...@@ -791,10 +799,7 @@ void StateManager11::invalidateEverything()
// We reset the current SRV data because it might not be in sync with D3D's state // We reset the current SRV data because it might not be in sync with D3D's state
// anymore. For example when a currently used SRV is used as an RTV, D3D silently // anymore. For example when a currently used SRV is used as an RTV, D3D silently
// remove it from its state. // remove it from its state.
mCurVertexSRVs.clear(); invalidateBoundViews();
mCurPixelSRVs.clear();
invalidateRenderTarget();
} }
bool StateManager11::setRenderTargets(const RenderTargetArray &renderTargets, bool StateManager11::setRenderTargets(const RenderTargetArray &renderTargets,
......
...@@ -79,6 +79,7 @@ class StateManager11 final : angle::NonCopyable ...@@ -79,6 +79,7 @@ class StateManager11 final : angle::NonCopyable
gl::Error syncFramebuffer(const gl::Framebuffer *framebuffer); gl::Error syncFramebuffer(const gl::Framebuffer *framebuffer);
void invalidateRenderTarget(); void invalidateRenderTarget();
void invalidateBoundViews();
void invalidateEverything(); void invalidateEverything();
bool setRenderTargets(const RenderTargetArray &renderTargets, bool setRenderTargets(const RenderTargetArray &renderTargets,
ID3D11DepthStencilView *depthStencil); ID3D11DepthStencilView *depthStencil);
......
...@@ -777,6 +777,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, SwapChain11 *swap ...@@ -777,6 +777,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, SwapChain11 *swap
mTextureWidth = texDesc.Width; mTextureWidth = texDesc.Width;
mTextureHeight = texDesc.Height; mTextureHeight = texDesc.Height;
mTextureDepth = 1; mTextureDepth = 1;
mHasKeyedMutex = (texDesc.MiscFlags & D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX);
mInternalFormat = swapchain->GetRenderTargetInternalFormat(); mInternalFormat = swapchain->GetRenderTargetInternalFormat();
...@@ -815,6 +816,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, ...@@ -815,6 +816,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer,
renderTarget, renderTarget,
levels)), levels)),
mTexture(nullptr), mTexture(nullptr),
mHasKeyedMutex(false),
mLevelZeroTexture(nullptr), mLevelZeroTexture(nullptr),
mLevelZeroRenderTarget(nullptr), mLevelZeroRenderTarget(nullptr),
mUseLevelZeroTexture(hintLevelZeroOnly && levels > 1), mUseLevelZeroTexture(hintLevelZeroOnly && levels > 1),
...@@ -882,6 +884,13 @@ TextureStorage11_2D::~TextureStorage11_2D() ...@@ -882,6 +884,13 @@ TextureStorage11_2D::~TextureStorage11_2D()
SafeDelete(mRenderTarget[i]); SafeDelete(mRenderTarget[i]);
SafeRelease(mSwizzleRenderTargets[i]); SafeRelease(mSwizzleRenderTargets[i]);
} }
if (mHasKeyedMutex)
{
// If the keyed mutex is released that will unbind it and cause the state cache to become
// desynchronized.
mRenderer->getStateManager()->invalidateBoundViews();
}
} }
gl::Error TextureStorage11_2D::copyToStorage(TextureStorage *destStorage) gl::Error TextureStorage11_2D::copyToStorage(TextureStorage *destStorage)
......
...@@ -181,6 +181,7 @@ class TextureStorage11_2D : public TextureStorage11 ...@@ -181,6 +181,7 @@ class TextureStorage11_2D : public TextureStorage11
ID3D11Texture2D *mTexture; ID3D11Texture2D *mTexture;
RenderTarget11 *mRenderTarget[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS]; RenderTarget11 *mRenderTarget[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
bool mHasKeyedMutex;
// These are members related to the zero max-LOD workaround. // These are members related to the zero max-LOD workaround.
// D3D11 Feature Level 9_3 can't disable mipmaps on a mipmapped texture (i.e. solely sample from level zero). // D3D11 Feature Level 9_3 can't disable mipmaps on a mipmapped texture (i.e. solely sample from level zero).
......
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