Commit ef315fdc by Courtney Goeltzenleuchter Committed by Commit Bot

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/+/2402354Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Courtney Goeltzenleuchter <courtneygo@google.com>
parent 19b4dfc6
......@@ -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
......
......@@ -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
......
......@@ -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,
......
......@@ -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)
......
......@@ -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
......
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