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, ...@@ -287,9 +287,8 @@ angle::Result RenderTargetVk::flushStagedUpdates(ContextVk *contextVk,
return angle::Result::Continue; return angle::Result::Continue;
} }
vk::CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer(); return image->flushSingleSubresourceStagedUpdates(contextVk, mLevelIndexGL, layerIndex,
return image->flushSingleSubresourceStagedUpdates( deferredClears, deferredClearIndex);
contextVk, mLevelIndexGL, layerIndex, &commandBuffer, deferredClears, deferredClearIndex);
} }
void RenderTargetVk::retainImageViews(ContextVk *contextVk) const void RenderTargetVk::retainImageViews(ContextVk *contextVk) const
......
...@@ -1195,6 +1195,7 @@ angle::Result WindowSurfaceVk::present(ContextVk *contextVk, ...@@ -1195,6 +1195,7 @@ angle::Result WindowSurfaceVk::present(ContextVk *contextVk,
if (overlayHasWidget) if (overlayHasWidget)
{ {
ANGLE_TRY(drawOverlay(contextVk, &image)); ANGLE_TRY(drawOverlay(contextVk, &image));
commandBuffer = &contextVk->getOutsideRenderPassCommandBuffer();
} }
// This does nothing if it's already in the requested layout // This does nothing if it's already in the requested layout
......
...@@ -1993,10 +1993,9 @@ angle::Result TextureVk::flushImageStagedUpdates(ContextVk *contextVk) ...@@ -1993,10 +1993,9 @@ angle::Result TextureVk::flushImageStagedUpdates(ContextVk *contextVk)
gl::LevelIndex baseLevelGL = getNativeImageLevel(mImage->getBaseLevel()); gl::LevelIndex baseLevelGL = getNativeImageLevel(mImage->getBaseLevel());
vk::LevelIndex baseLevelVK = mImage->toVKLevel(baseLevelGL); vk::LevelIndex baseLevelVK = mImage->toVKLevel(baseLevelGL);
vk::CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer();
return mImage->flushStagedUpdates( return mImage->flushStagedUpdates(
contextVk, baseLevelVK, vk::LevelIndex(mImage->getLevelCount()), getNativeImageLayer(0), contextVk, baseLevelVK, vk::LevelIndex(mImage->getLevelCount()), getNativeImageLayer(0),
mImage->getLayerCount(), mRedefinedLevels, &commandBuffer); mImage->getLayerCount(), mRedefinedLevels);
} }
angle::Result TextureVk::initRenderTargets(ContextVk *contextVk, angle::Result TextureVk::initRenderTargets(ContextVk *contextVk,
......
...@@ -4383,7 +4383,6 @@ void ImageHelper::stageSelfForBaseLevel() ...@@ -4383,7 +4383,6 @@ void ImageHelper::stageSelfForBaseLevel()
angle::Result ImageHelper::flushSingleSubresourceStagedUpdates(ContextVk *contextVk, angle::Result ImageHelper::flushSingleSubresourceStagedUpdates(ContextVk *contextVk,
gl::LevelIndex levelGL, gl::LevelIndex levelGL,
uint32_t layer, uint32_t layer,
CommandBuffer *commandBuffer,
ClearValuesArray *deferredClears, ClearValuesArray *deferredClears,
uint32_t deferredClearIndex) uint32_t deferredClearIndex)
{ {
...@@ -4430,7 +4429,7 @@ angle::Result ImageHelper::flushSingleSubresourceStagedUpdates(ContextVk *contex ...@@ -4430,7 +4429,7 @@ angle::Result ImageHelper::flushSingleSubresourceStagedUpdates(ContextVk *contex
} }
LevelIndex levelVK = toVKLevel(levelGL); 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, angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk,
...@@ -4438,8 +4437,7 @@ angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk, ...@@ -4438,8 +4437,7 @@ angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk,
LevelIndex levelVKEnd, LevelIndex levelVKEnd,
uint32_t layerStart, uint32_t layerStart,
uint32_t layerEnd, uint32_t layerEnd,
gl::TexLevelMask skipLevelsMask, gl::TexLevelMask skipLevelsMask)
CommandBuffer *commandBuffer)
{ {
if (mSubresourceUpdates.empty()) if (mSubresourceUpdates.empty())
{ {
...@@ -4481,6 +4479,7 @@ angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk, ...@@ -4481,6 +4479,7 @@ angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk,
// Start in TransferDst. // Start in TransferDst.
ANGLE_TRY(contextVk->onImageTransferWrite(aspectFlags, this)); ANGLE_TRY(contextVk->onImageTransferWrite(aspectFlags, this));
CommandBuffer *commandBuffer = &contextVk->getOutsideRenderPassCommandBuffer();
for (SubresourceUpdate &update : mSubresourceUpdates) for (SubresourceUpdate &update : mSubresourceUpdates)
{ {
...@@ -4572,6 +4571,7 @@ angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk, ...@@ -4572,6 +4571,7 @@ angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk,
ASSERT(currentBuffer && currentBuffer->valid()); ASSERT(currentBuffer && currentBuffer->valid());
ANGLE_TRY(contextVk->onBufferTransferRead(currentBuffer)); ANGLE_TRY(contextVk->onBufferTransferRead(currentBuffer));
commandBuffer = &contextVk->getOutsideRenderPassCommandBuffer();
commandBuffer->copyBufferToImage(currentBuffer->getBuffer().getHandle(), mImage, commandBuffer->copyBufferToImage(currentBuffer->getBuffer().getHandle(), mImage,
getCurrentLayout(), 1, &update.buffer.copyRegion); getCurrentLayout(), 1, &update.buffer.copyRegion);
...@@ -4580,6 +4580,7 @@ angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk, ...@@ -4580,6 +4580,7 @@ angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk,
else else
{ {
ANGLE_TRY(contextVk->onImageTransferRead(aspectFlags, update.image.image)); ANGLE_TRY(contextVk->onImageTransferRead(aspectFlags, update.image.image));
commandBuffer = &contextVk->getOutsideRenderPassCommandBuffer();
commandBuffer->copyImage(update.image.image->getImage(), commandBuffer->copyImage(update.image.image->getImage(),
update.image.image->getCurrentLayout(), mImage, update.image.image->getCurrentLayout(), mImage,
...@@ -4605,9 +4606,8 @@ angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk, ...@@ -4605,9 +4606,8 @@ angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk,
angle::Result ImageHelper::flushAllStagedUpdates(ContextVk *contextVk) angle::Result ImageHelper::flushAllStagedUpdates(ContextVk *contextVk)
{ {
// Clear the image. // Clear the image.
CommandBuffer &commandBuffer = contextVk->getOutsideRenderPassCommandBuffer(); return flushStagedUpdates(contextVk, LevelIndex(0), LevelIndex(mLevelCount), 0, mLayerCount,
return flushStagedUpdates(contextVk, LevelIndex(0), LevelIndex(mLevelCount), 0, mLayerCount, {}, {});
&commandBuffer);
} }
bool ImageHelper::isUpdateStaged(gl::LevelIndex levelGL, uint32_t layer) bool ImageHelper::isUpdateStaged(gl::LevelIndex levelGL, uint32_t layer)
......
...@@ -1418,7 +1418,6 @@ class ImageHelper final : public Resource, public angle::Subject ...@@ -1418,7 +1418,6 @@ class ImageHelper final : public Resource, public angle::Subject
angle::Result flushSingleSubresourceStagedUpdates(ContextVk *contextVk, angle::Result flushSingleSubresourceStagedUpdates(ContextVk *contextVk,
gl::LevelIndex levelGL, gl::LevelIndex levelGL,
uint32_t layer, uint32_t layer,
CommandBuffer *commandBuffer,
ClearValuesArray *deferredClears, ClearValuesArray *deferredClears,
uint32_t deferredClearIndex); uint32_t deferredClearIndex);
...@@ -1430,8 +1429,7 @@ class ImageHelper final : public Resource, public angle::Subject ...@@ -1430,8 +1429,7 @@ class ImageHelper final : public Resource, public angle::Subject
LevelIndex levelEnd, LevelIndex levelEnd,
uint32_t layerStart, uint32_t layerStart,
uint32_t layerEnd, uint32_t layerEnd,
gl::TexLevelMask skipLevelsMask, gl::TexLevelMask skipLevelsMask);
CommandBuffer *commandBuffer);
// Creates a command buffer and flushes all staged updates. This is used for one-time // 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 // 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