diff options
-rw-r--r-- | chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp | 59 | ||||
-rw-r--r-- | chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h | 10 |
2 files changed, 67 insertions, 2 deletions
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp index 7369cf430aa..a891d3d69e8 100644 --- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp +++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp @@ -1610,7 +1610,8 @@ TextureStorage11_External::TextureStorage11_External( Renderer11 *renderer, egl::Stream *stream, const egl::Stream::GLTextureDescription &glDesc) - : TextureStorage11(renderer, D3D11_BIND_SHADER_RESOURCE, 0, glDesc.internalFormat) + : TextureStorage11(renderer, D3D11_BIND_SHADER_RESOURCE, 0, glDesc.internalFormat), + mAssociatedImage(nullptr) { ASSERT(stream->getProducerType() == egl::Stream::ProducerType::D3D11Texture); auto *producer = static_cast<StreamProducerD3DTexture *>(stream->getImplementation()); @@ -1636,6 +1637,14 @@ angle::Result TextureStorage11_External::onDestroy(const gl::Context *context) mRenderer->getStateManager()->invalidateBoundViews(); } + if (mAssociatedImage != nullptr) + { + mAssociatedImage->verifyAssociatedStorageValid(this); + // We must let the Images recover their data before we delete it from the + // TextureStorage. + ANGLE_TRY(mAssociatedImage->recoverFromAssociatedStorage(context)); + } + return angle::Result::Continue; } @@ -1832,7 +1841,8 @@ TextureStorage11_EGLImage::TextureStorage11_EGLImage(Renderer11 *renderer, mImage(eglImage), mCurrentRenderTarget(0), mSwizzleTexture(), - mSwizzleRenderTargets(gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS) + mSwizzleRenderTargets(gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS), + mAssociatedImage(nullptr) { mCurrentRenderTarget = reinterpret_cast<uintptr_t>(renderTarget11); @@ -1844,6 +1854,18 @@ TextureStorage11_EGLImage::TextureStorage11_EGLImage(Renderer11 *renderer, TextureStorage11_EGLImage::~TextureStorage11_EGLImage() {} +angle::Result TextureStorage11_EGLImage::onDestroy(const gl::Context *context) +{ + if (mAssociatedImage != nullptr) + { + mAssociatedImage->verifyAssociatedStorageValid(this); + // We must let the Images recover their data before we delete it from the + // TextureStorage. + ANGLE_TRY(mAssociatedImage->recoverFromAssociatedStorage(context)); + } + return angle::Result::Continue; +} + angle::Result TextureStorage11_EGLImage::getSubresourceIndex(const gl::Context *context, const gl::ImageIndex &index, UINT *outSubresourceIndex) const @@ -2056,6 +2078,39 @@ angle::Result TextureStorage11_EGLImage::getImageRenderTarget(const gl::Context return angle::Result::Continue; } +void TextureStorage11_EGLImage::associateImage(Image11 *image, const gl::ImageIndex &index) +{ + ASSERT(index.getLevelIndex() == 0); + mAssociatedImage = image; +} + +void TextureStorage11_EGLImage::verifyAssociatedImageValid(const gl::ImageIndex &index, + Image11 *expectedImage) +{ + ASSERT(index.getLevelIndex() == 0 && mAssociatedImage == expectedImage); +} + +void TextureStorage11_EGLImage::disassociateImage(const gl::ImageIndex &index, + Image11 *expectedImage) +{ + ASSERT(index.getLevelIndex() == 0); + ASSERT(mAssociatedImage == expectedImage); + mAssociatedImage = nullptr; +} + +angle::Result TextureStorage11_EGLImage::releaseAssociatedImage(const gl::Context *context, + const gl::ImageIndex &index, + Image11 *incomingImage) +{ + ASSERT(index.getLevelIndex() == 0); + if (mAssociatedImage != nullptr && mAssociatedImage != incomingImage) + { + mAssociatedImage->verifyAssociatedStorageValid(this); + ANGLE_TRY(mAssociatedImage->recoverFromAssociatedStorage(context)); + } + return angle::Result::Continue; +} + TextureStorage11_Cube::TextureStorage11_Cube(Renderer11 *renderer, GLenum internalformat, bool renderTarget, diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h index b067444c329..5fee8be7588 100644 --- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h +++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h @@ -473,6 +473,8 @@ class TextureStorage11_EGLImage final : public TextureStorage11ImmutableBase RenderTarget11 *renderTarget11); ~TextureStorage11_EGLImage() override; + angle::Result onDestroy(const gl::Context *context) override; + angle::Result getSubresourceIndex(const gl::Context *context, const gl::ImageIndex &index, UINT *outSubresourceIndex) const override; @@ -498,6 +500,13 @@ class TextureStorage11_EGLImage final : public TextureStorage11ImmutableBase angle::Result useLevelZeroWorkaroundTexture(const gl::Context *context, bool useLevelZeroTexture) override; + void associateImage(Image11 *image, const gl::ImageIndex &index) override; + void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override; + void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override; + angle::Result releaseAssociatedImage(const gl::Context *context, + const gl::ImageIndex &index, + Image11 *incomingImage) override; + protected: angle::Result getSwizzleTexture(const gl::Context *context, const TextureHelper11 **outTexture) override; @@ -525,6 +534,7 @@ class TextureStorage11_EGLImage final : public TextureStorage11ImmutableBase // Swizzle-related variables TextureHelper11 mSwizzleTexture; std::vector<d3d11::RenderTargetView> mSwizzleRenderTargets; + Image11 *mAssociatedImage; }; class TextureStorage11_Cube : public TextureStorage11 |