Vulkan: Use current commandBuffer pointer

We were using a passed in commandBuffer in
ImageHelper::flushStagedUpdates which became invalid during the process
of handling the flush upon which subsequent uses could cause problems
when threading is enabled (and maybe when it's not as well, just harder
to see.)
Have ImageHelper::flushStagedUpdates use the current
OutsideRenderPassCommandBuffer and the code will use the proper one.

Bug: b/168144059
Change-Id: Ib9849efe9366cf61df5e68fd25d17df165dbd3a0
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2402354
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Courtney Goeltzenleuchter <courtneygo@google.com>
This commit is contained in:
Courtney Goeltzenleuchter
2020-09-10 14:56:35 -06:00
committed by Commit Bot
parent 19b4dfc6cf
commit ef315fdcdf
5 changed files with 12 additions and 15 deletions

View File

@@ -287,9 +287,8 @@ angle::Result RenderTargetVk::flushStagedUpdates(ContextVk *contextVk,
return angle::Result::Continue;
}
vk::CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
return image->flushSingleSubresourceStagedUpdates(
contextVk, mLevelIndexGL, layerIndex, &commandBuffer, deferredClears, deferredClearIndex);
return image->flushSingleSubresourceStagedUpdates(contextVk, mLevelIndexGL, layerIndex,
deferredClears, deferredClearIndex);
}
void RenderTargetVk::retainImageViews(ContextVk *contextVk) const

View File

@@ -1195,6 +1195,7 @@ angle::Result WindowSurfaceVk::present(ContextVk *contextVk,
if (overlayHasWidget)
{
ANGLE_TRY(drawOverlay(contextVk, &image));
commandBuffer = &contextVk->getOutsideRenderPassCommandBuffer();
}
// This does nothing if it's already in the requested layout

View File

@@ -1993,10 +1993,9 @@ angle::Result TextureVk::flushImageStagedUpdates(ContextVk *contextVk)
gl::LevelIndex baseLevelGL = getNativeImageLevel(mImage->getBaseLevel());
vk::LevelIndex baseLevelVK = mImage->toVKLevel(baseLevelGL);
vk::CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
return mImage->flushStagedUpdates(
contextVk, baseLevelVK, vk::LevelIndex(mImage->getLevelCount()), getNativeImageLayer(0),
mImage->getLayerCount(), mRedefinedLevels, &commandBuffer);
mImage->getLayerCount(), mRedefinedLevels);
}
angle::Result TextureVk::initRenderTargets(ContextVk *contextVk,

View File

@@ -4383,7 +4383,6 @@ void ImageHelper::stageSelfForBaseLevel()
angle::Result ImageHelper::flushSingleSubresourceStagedUpdates(ContextVk *contextVk,
gl::LevelIndex levelGL,
uint32_t layer,
CommandBuffer *commandBuffer,
ClearValuesArray *deferredClears,
uint32_t deferredClearIndex)
{
@@ -4430,7 +4429,7 @@ angle::Result ImageHelper::flushSingleSubresourceStagedUpdates(ContextVk *contex
}
LevelIndex levelVK = toVKLevel(levelGL);
return flushStagedUpdates(contextVk, levelVK, levelVK + 1, layer, layer + 1, {}, commandBuffer);
return flushStagedUpdates(contextVk, levelVK, levelVK + 1, layer, layer + 1, {});
}
angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk,
@@ -4438,8 +4437,7 @@ angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk,
LevelIndex levelVKEnd,
uint32_t layerStart,
uint32_t layerEnd,
gl::TexLevelMask skipLevelsMask,
CommandBuffer *commandBuffer)
gl::TexLevelMask skipLevelsMask)
{
if (mSubresourceUpdates.empty())
{
@@ -4481,6 +4479,7 @@ angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk,
// Start in TransferDst.
ANGLE_TRY(contextVk->onImageTransferWrite(aspectFlags, this));
CommandBuffer *commandBuffer = &contextVk->getOutsideRenderPassCommandBuffer();
for (SubresourceUpdate &update : mSubresourceUpdates)
{
@@ -4572,6 +4571,7 @@ angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk,
ASSERT(currentBuffer && currentBuffer->valid());
ANGLE_TRY(contextVk->onBufferTransferRead(currentBuffer));
commandBuffer = &contextVk->getOutsideRenderPassCommandBuffer();
commandBuffer->copyBufferToImage(currentBuffer->getBuffer().getHandle(), mImage,
getCurrentLayout(), 1, &update.buffer.copyRegion);
@@ -4580,6 +4580,7 @@ angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk,
else
{
ANGLE_TRY(contextVk->onImageTransferRead(aspectFlags, update.image.image));
commandBuffer = &contextVk->getOutsideRenderPassCommandBuffer();
commandBuffer->copyImage(update.image.image->getImage(),
update.image.image->getCurrentLayout(), mImage,
@@ -4605,9 +4606,8 @@ angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk,
angle::Result ImageHelper::flushAllStagedUpdates(ContextVk *contextVk)
{
// Clear the image.
CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
return flushStagedUpdates(contextVk, LevelIndex(0), LevelIndex(mLevelCount), 0, mLayerCount, {},
&commandBuffer);
return flushStagedUpdates(contextVk, LevelIndex(0), LevelIndex(mLevelCount), 0, mLayerCount,
{});
}
bool ImageHelper::isUpdateStaged(gl::LevelIndex levelGL, uint32_t layer)

View File

@@ -1418,7 +1418,6 @@ class ImageHelper final : public Resource, public angle::Subject
angle::Result flushSingleSubresourceStagedUpdates(ContextVk *contextVk,
gl::LevelIndex levelGL,
uint32_t layer,
CommandBuffer *commandBuffer,
ClearValuesArray *deferredClears,
uint32_t deferredClearIndex);
@@ -1430,8 +1429,7 @@ class ImageHelper final : public Resource, public angle::Subject
LevelIndex levelEnd,
uint32_t layerStart,
uint32_t layerEnd,
gl::TexLevelMask skipLevelsMask,
CommandBuffer *commandBuffer);
gl::TexLevelMask skipLevelsMask);
// Creates a command buffer and flushes all staged updates. This is used for one-time
// initialization of resources that we don't expect to accumulate further staged updates, such