mirror of
https://github.com/godotengine/godot-angle-static.git
synced 2026-01-08 14:09:42 +03:00
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:
committed by
Commit Bot
parent
19b4dfc6cf
commit
ef315fdcdf
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user