Skip to content

Commit 68591ef

Browse files
null77Commit Bot
authored andcommitted
Vulkan: Store ImageView access in the graph.
This will ensure we don't destroy the image views when they are still in use by other Contexts. Bug: angleproject:2464 Change-Id: I1d3ba2ad241250e31ea32873446c4cb23971750d Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1843236 Reviewed-by: Tim Van Patten <timvp@google.com> Commit-Queue: Jamie Madill <jmadill@chromium.org>
1 parent f939cb6 commit 68591ef

File tree

13 files changed

+140
-57
lines changed

13 files changed

+140
-57
lines changed

src/libANGLE/renderer/vulkan/CommandGraph.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -717,7 +717,9 @@ ANGLE_INLINE bool CommandGraphResource::hasChildlessWritingNode() const
717717
// CommandGraph inlines.
718718
ANGLE_INLINE void CommandGraph::onResourceUse(const SharedResourceUse &resourceUse)
719719
{
720-
ASSERT(!empty());
720+
// Disabled the assert because of difficulties with ImageView references.
721+
// TODO(jmadill): Clean up with graph redesign. http://anglebug.com/4029
722+
// ASSERT(!empty());
721723
SharedResourceUse newUse;
722724
newUse.set(resourceUse);
723725
mResourceUses.emplace_back(std::move(newUse));

src/libANGLE/renderer/vulkan/ContextVk.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2959,6 +2959,7 @@ angle::Result ContextVk::updateActiveTextures(const gl::Context *context,
29592959
image.changeLayout(aspectFlags, textureLayout, srcLayoutChange);
29602960
}
29612961

2962+
textureVk->onImageViewGraphAccess(&mCommandGraph);
29622963
image.addReadDependency(this, recorder);
29632964

29642965
mActiveTextures[textureUnit].texture = textureVk;

src/libANGLE/renderer/vulkan/FramebufferVk.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -823,6 +823,7 @@ angle::Result FramebufferVk::blit(const gl::Context *context,
823823
{
824824
const vk::ImageView *readImageView = nullptr;
825825
ANGLE_TRY(readRenderTarget->getImageView(contextVk, &readImageView));
826+
readRenderTarget->onImageViewGraphAccess(contextVk);
826827
ANGLE_TRY(utilsVk.colorBlitResolve(contextVk, this, &readRenderTarget->getImage(),
827828
readImageView, params));
828829
}
@@ -1578,10 +1579,12 @@ angle::Result FramebufferVk::readPixelsImpl(ContextVk *contextVk,
15781579

15791580
gl::Extents FramebufferVk::getReadImageExtents() const
15801581
{
1581-
ASSERT(getColorReadRenderTarget()->getExtents().width == mState.getDimensions().width);
1582-
ASSERT(getColorReadRenderTarget()->getExtents().height == mState.getDimensions().height);
1582+
RenderTargetVk *readRenderTarget = mRenderTargetCache.getColorRead(mState);
15831583

1584-
return getColorReadRenderTarget()->getExtents();
1584+
ASSERT(readRenderTarget->getExtents().width == mState.getDimensions().width);
1585+
ASSERT(readRenderTarget->getExtents().height == mState.getDimensions().height);
1586+
1587+
return readRenderTarget->getExtents();
15851588
}
15861589

15871590
gl::Rectangle FramebufferVk::getCompleteRenderArea() const

src/libANGLE/renderer/vulkan/ProgramVk.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1648,16 +1648,23 @@ angle::Result ProgramVk::updateTexturesDescriptorSet(ContextVk *contextVk)
16481648
VkDescriptorImageInfo &imageInfo = descriptorImageInfo[writeCount];
16491649

16501650
// Use bound sampler object if one present, otherwise use texture's sampler
1651-
imageInfo.sampler = (samplerVk != nullptr) ? samplerVk->getSampler().getHandle()
1652-
: textureVk->getSampler().getHandle();
1653-
imageInfo.imageView = textureVk->getReadImageView().getHandle();
1651+
const vk::Sampler &sampler =
1652+
(samplerVk != nullptr) ? samplerVk->getSampler() : textureVk->getSampler();
1653+
1654+
imageInfo.sampler = sampler.getHandle();
16541655
imageInfo.imageLayout = image.getCurrentLayout();
16551656

16561657
if (emulateSeamfulCubeMapSampling)
16571658
{
16581659
// If emulating seamful cubemapping, use the fetch image view. This is basically
16591660
// the same image view as read, except it's a 2DArray view for cube maps.
1660-
imageInfo.imageView = textureVk->getFetchImageView().getHandle();
1661+
imageInfo.imageView =
1662+
textureVk->getFetchImageViewAndRecordUse(contextVk).getHandle();
1663+
}
1664+
else
1665+
{
1666+
imageInfo.imageView =
1667+
textureVk->getReadImageViewAndRecordUse(contextVk).getHandle();
16611668
}
16621669

16631670
VkWriteDescriptorSet &writeInfo = writeDescriptorInfo[writeCount];

src/libANGLE/renderer/vulkan/RenderTargetVk.cpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,12 @@ RenderTargetVk::RenderTargetVk(RenderTargetVk &&other)
2828
mImageViews(other.mImageViews),
2929
mLevelIndex(other.mLevelIndex),
3030
mLayerIndex(other.mLayerIndex)
31-
{}
31+
{
32+
other.mImage = nullptr;
33+
other.mImageViews = nullptr;
34+
other.mLevelIndex = 0;
35+
other.mLayerIndex = 0;
36+
}
3237

3338
void RenderTargetVk::init(vk::ImageHelper *image,
3439
vk::ImageViewHelper *imageViews,
@@ -63,6 +68,8 @@ angle::Result RenderTargetVk::onColorDraw(ContextVk *contextVk,
6368
// Set up dependencies between the RT resource and the Framebuffer.
6469
mImage->addWriteDependency(contextVk, framebufferVk);
6570

71+
onImageViewGraphAccess(contextVk);
72+
6673
return angle::Result::Continue;
6774
}
6875

@@ -82,6 +89,8 @@ angle::Result RenderTargetVk::onDepthStencilDraw(ContextVk *contextVk,
8289
// Set up dependencies between the RT resource and the Framebuffer.
8390
mImage->addWriteDependency(contextVk, framebufferVk);
8491

92+
onImageViewGraphAccess(contextVk);
93+
8594
return angle::Result::Continue;
8695
}
8796

@@ -147,9 +156,8 @@ vk::ImageHelper *RenderTargetVk::getImageForRead(ContextVk *contextVk,
147156
// However, this needs context to be available here, or all call sites changed
148157
// to perform the layout transition and set the dependency.
149158
mImage->addWriteDependency(contextVk, readingResource);
150-
151159
mImage->changeLayout(mImage->getAspectFlags(), layout, commandBuffer);
152-
160+
onImageViewGraphAccess(contextVk);
153161
return mImage;
154162
}
155163

@@ -158,6 +166,7 @@ vk::ImageHelper *RenderTargetVk::getImageForWrite(ContextVk *contextVk,
158166
{
159167
ASSERT(mImage && mImage->valid());
160168
mImage->addWriteDependency(contextVk, writingResource);
169+
onImageViewGraphAccess(contextVk);
161170
return mImage;
162171
}
163172

@@ -173,4 +182,8 @@ angle::Result RenderTargetVk::flushStagedUpdates(ContextVk *contextVk)
173182
mLayerIndex + 1, commandBuffer);
174183
}
175184

185+
void RenderTargetVk::onImageViewGraphAccess(ContextVk *contextVk) const
186+
{
187+
mImageViews->onGraphAccess(contextVk->getCommandGraph());
188+
}
176189
} // namespace rx

src/libANGLE/renderer/vulkan/RenderTargetVk.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget
8282

8383
angle::Result flushStagedUpdates(ContextVk *contextVk);
8484

85+
void onImageViewGraphAccess(ContextVk *contextVk) const;
86+
8587
private:
8688
vk::ImageHelper *mImage;
8789
vk::ImageViewHelper *mImageViews;

src/libANGLE/renderer/vulkan/RenderbufferVk.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -210,10 +210,10 @@ void RenderbufferVk::releaseAndDeleteImage(ContextVk *contextVk)
210210

211211
void RenderbufferVk::releaseImage(ContextVk *contextVk)
212212
{
213+
RendererVk *renderer = contextVk->getRenderer();
214+
213215
if (mImage && mOwnsImage)
214216
{
215-
RendererVk *renderer = contextVk->getRenderer();
216-
217217
mImage->releaseImage(renderer);
218218
mImage->releaseStagingBuffer(renderer);
219219
}
@@ -222,7 +222,7 @@ void RenderbufferVk::releaseImage(ContextVk *contextVk)
222222
mImage = nullptr;
223223
}
224224

225-
mImageViews.release(contextVk);
225+
mImageViews.release(renderer);
226226
}
227227

228228
} // namespace rx

src/libANGLE/renderer/vulkan/RendererVk.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ class RendererVk : angle::NonCopyable
170170
CollectGarbage(&sharedGarbage, garbageIn...);
171171
if (!sharedGarbage.empty())
172172
{
173-
mSharedGarbage.emplace_back(std::move(*use), std::move(sharedGarbage));
173+
collectGarbage(std::move(*use), std::move(sharedGarbage));
174174
}
175175
else
176176
{
@@ -181,6 +181,11 @@ class RendererVk : angle::NonCopyable
181181
use->init();
182182
}
183183

184+
void collectGarbage(vk::SharedResourceUse &&use, std::vector<vk::GarbageObject> &&sharedGarbage)
185+
{
186+
mSharedGarbage.emplace_back(std::move(use), std::move(sharedGarbage));
187+
}
188+
184189
static constexpr size_t kMaxExtensionNames = 200;
185190
using ExtensionNameList = angle::FixedVector<const char *, kMaxExtensionNames>;
186191

src/libANGLE/renderer/vulkan/SurfaceVk.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,11 @@ OffscreenSurfaceVk::OffscreenSurfaceVk(const egl::SurfaceState &surfaceState,
171171
EGLint width,
172172
EGLint height)
173173
: SurfaceVk(surfaceState), mWidth(width), mHeight(height)
174-
{}
174+
{
175+
mColorRenderTarget.init(&mColorAttachment.image, &mColorAttachment.imageViews, 0, 0);
176+
mDepthStencilRenderTarget.init(&mDepthStencilAttachment.image,
177+
&mDepthStencilAttachment.imageViews, 0, 0);
178+
}
175179

176180
OffscreenSurfaceVk::~OffscreenSurfaceVk() {}
177181

@@ -399,7 +403,12 @@ WindowSurfaceVk::WindowSurfaceVk(const egl::SurfaceState &surfaceState,
399403
mCompositeAlpha(VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR),
400404
mCurrentSwapHistoryIndex(0),
401405
mCurrentSwapchainImageIndex(0)
402-
{}
406+
{
407+
// Initialize the color render target with the multisampled targets. If not multisampled, the
408+
// render target will be updated to refer to a swapchain image on every acquire.
409+
mColorRenderTarget.init(&mColorImageMS, &mColorImageMSViews, 0, 0);
410+
mDepthStencilRenderTarget.init(&mDepthStencilImage, &mDepthStencilImageViews, 0, 0);
411+
}
403412

404413
WindowSurfaceVk::~WindowSurfaceVk()
405414
{
@@ -871,14 +880,14 @@ void WindowSurfaceVk::releaseSwapchainImages(ContextVk *contextVk)
871880
{
872881
mDepthStencilImage.releaseImage(renderer);
873882
mDepthStencilImage.releaseStagingBuffer(renderer);
874-
mDepthStencilImageViews.release(contextVk);
883+
mDepthStencilImageViews.release(renderer);
875884
}
876885

877886
if (mColorImageMS.valid())
878887
{
879888
mColorImageMS.releaseImage(renderer);
880889
mColorImageMS.releaseStagingBuffer(renderer);
881-
mColorImageMSViews.release(contextVk);
890+
mColorImageMSViews.release(renderer);
882891
contextVk->addGarbage(&mFramebufferMS);
883892
}
884893

@@ -888,7 +897,7 @@ void WindowSurfaceVk::releaseSwapchainImages(ContextVk *contextVk)
888897
swapchainImage.image.resetImageWeakReference();
889898
swapchainImage.image.destroy(contextVk->getDevice());
890899

891-
swapchainImage.imageViews.release(contextVk);
900+
swapchainImage.imageViews.release(renderer);
892901
contextVk->addGarbage(&swapchainImage.framebuffer);
893902

894903
// present history must have already been taken care of.

src/libANGLE/renderer/vulkan/TextureVk.cpp

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,7 @@ angle::Result TextureVk::copySubImageImpl(const gl::Context *context,
403403

404404
const vk::ImageView *readImageView = nullptr;
405405
ANGLE_TRY(colorReadRT->getImageView(contextVk, &readImageView));
406+
colorReadRT->onImageViewGraphAccess(contextVk);
406407

407408
return copySubImageImplWithDraw(contextVk, offsetImageIndex, modifiedDestOffset, destFormat,
408409
0, clippedSourceArea, isViewportFlipY, false, false, false,
@@ -452,10 +453,10 @@ angle::Result TextureVk::copySubTextureImpl(ContextVk *contextVk,
452453
// If it's possible to perform the copy with a draw call, do that.
453454
if (CanCopyWithDraw(renderer, sourceVkFormat, destVkFormat) && !forceCPUPath)
454455
{
455-
return copySubImageImplWithDraw(contextVk, offsetImageIndex, destOffset, destVkFormat,
456-
sourceLevel, sourceArea, false, unpackFlipY,
457-
unpackPremultiplyAlpha, unpackUnmultiplyAlpha,
458-
&source->getImage(), &source->getFetchImageView());
456+
return copySubImageImplWithDraw(
457+
contextVk, offsetImageIndex, destOffset, destVkFormat, sourceLevel, sourceArea, false,
458+
unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha, &source->getImage(),
459+
&source->getFetchImageViewAndRecordUse(contextVk));
459460
}
460461

461462
if (sourceLevel != 0)
@@ -1362,7 +1363,7 @@ angle::Result TextureVk::syncState(const gl::Context *context,
13621363
uint32_t layerCount =
13631364
mState.getType() == gl::TextureType::_2D ? 1 : mImage->getLayerCount();
13641365

1365-
mImageViews.release(contextVk);
1366+
mImageViews.release(contextVk->getRenderer());
13661367
const gl::ImageDesc &baseLevelDesc = mState.getBaseLevelDesc();
13671368

13681369
ANGLE_TRY(initImageViews(contextVk, mImage->getFormat(),
@@ -1457,30 +1458,33 @@ void TextureVk::releaseOwnershipOfImage(const gl::Context *context)
14571458
releaseAndDeleteImage(contextVk);
14581459
}
14591460

1460-
const vk::ImageView &TextureVk::getReadImageView() const
1461+
const vk::ImageView &TextureVk::getReadImageViewAndRecordUse(ContextVk *contextVk) const
14611462
{
14621463
ASSERT(mImage->valid());
14631464

1464-
if (mState.isStencilMode() && mImageViews.getStencilReadImageView().valid())
1465+
mImageViews.onGraphAccess(contextVk->getCommandGraph());
1466+
1467+
if (mState.isStencilMode() && mImageViews.hasStencilReadImageView())
14651468
{
14661469
return mImageViews.getStencilReadImageView();
14671470
}
14681471

14691472
return mImageViews.getReadImageView();
14701473
}
14711474

1472-
const vk::ImageView &TextureVk::getFetchImageView() const
1475+
const vk::ImageView &TextureVk::getFetchImageViewAndRecordUse(ContextVk *contextVk) const
14731476
{
14741477
ASSERT(mImage->valid());
14751478

1479+
mImageViews.onGraphAccess(contextVk->getCommandGraph());
1480+
14761481
// We don't currently support fetch for depth/stencil cube map textures.
1477-
ASSERT(!mImageViews.getStencilReadImageView().valid() ||
1478-
!mImageViews.getFetchImageView().valid());
1479-
return (mImageViews.getFetchImageView().valid() ? mImageViews.getFetchImageView()
1480-
: mImageViews.getReadImageView());
1482+
ASSERT(!mImageViews.hasStencilReadImageView() || !mImageViews.hasFetchImageView());
1483+
return (mImageViews.hasFetchImageView() ? mImageViews.getFetchImageView()
1484+
: mImageViews.getReadImageView());
14811485
}
14821486

1483-
angle::Result TextureVk::getLevelLayerImageView(vk::Context *context,
1487+
angle::Result TextureVk::getLevelLayerImageView(ContextVk *contextVk,
14841488
size_t level,
14851489
size_t layer,
14861490
const vk::ImageView **imageViewOut)
@@ -1490,7 +1494,7 @@ angle::Result TextureVk::getLevelLayerImageView(vk::Context *context,
14901494
uint32_t nativeLevel = getNativeImageLevel(static_cast<uint32_t>(level));
14911495
uint32_t nativeLayer = getNativeImageLayer(static_cast<uint32_t>(layer));
14921496

1493-
return mImageViews.getLevelLayerDrawImageView(context, *mImage, nativeLevel, nativeLayer,
1497+
return mImageViews.getLevelLayerDrawImageView(contextVk, *mImage, nativeLevel, nativeLayer,
14941498
imageViewOut);
14951499
}
14961500

@@ -1602,19 +1606,21 @@ angle::Result TextureVk::initImageViews(ContextVk *contextVk,
16021606

16031607
void TextureVk::releaseImage(ContextVk *contextVk)
16041608
{
1609+
RendererVk *renderer = contextVk->getRenderer();
1610+
16051611
if (mImage)
16061612
{
16071613
if (mOwnsImage)
16081614
{
1609-
mImage->releaseImage(contextVk->getRenderer());
1615+
mImage->releaseImage(renderer);
16101616
}
16111617
else
16121618
{
16131619
mImage = nullptr;
16141620
}
16151621
}
16161622

1617-
mImageViews.release(contextVk);
1623+
mImageViews.release(renderer);
16181624

16191625
for (RenderTargetVector &renderTargetLevels : mRenderTargets)
16201626
{

0 commit comments

Comments
 (0)