Free VkCommandPool if vkResetCommandPool fails
Bug: chromium:1234680 Change-Id: If8f5c2dc0cdf14bf8a0c713d724b883657bd1463 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/61103 Commit-Queue: Austin Eng <enga@chromium.org> Reviewed-by: Kai Ninomiya <kainino@chromium.org> Reviewed-by: Stephen White <senorblanco@chromium.org>
This commit is contained in:
parent
9096fc290f
commit
567e071b5b
|
@ -565,8 +565,22 @@ namespace dawn_native { namespace vulkan {
|
||||||
if (!mUnusedCommands.empty()) {
|
if (!mUnusedCommands.empty()) {
|
||||||
CommandPoolAndBuffer commands = mUnusedCommands.back();
|
CommandPoolAndBuffer commands = mUnusedCommands.back();
|
||||||
mUnusedCommands.pop_back();
|
mUnusedCommands.pop_back();
|
||||||
DAWN_TRY(CheckVkSuccess(fn.ResetCommandPool(mVkDevice, commands.pool, 0),
|
DAWN_TRY_WITH_CLEANUP(CheckVkSuccess(fn.ResetCommandPool(mVkDevice, commands.pool, 0),
|
||||||
"vkResetCommandPool"));
|
"vkResetCommandPool"),
|
||||||
|
{
|
||||||
|
// vkResetCommandPool failed (it may return out-of-memory).
|
||||||
|
// Free the commands in the cleanup step before returning to
|
||||||
|
// reclaim memory.
|
||||||
|
|
||||||
|
// The VkCommandBuffer memory should be wholly owned by the
|
||||||
|
// pool and freed when it is destroyed, but that's not the
|
||||||
|
// case in some drivers and they leak memory. So we call
|
||||||
|
// FreeCommandBuffers before DestroyCommandPool to be safe.
|
||||||
|
// TODO(enga): Only do this on a known list of bad drivers.
|
||||||
|
fn.FreeCommandBuffers(mVkDevice, commands.pool, 1,
|
||||||
|
&commands.commandBuffer);
|
||||||
|
fn.DestroyCommandPool(mVkDevice, commands.pool, nullptr);
|
||||||
|
});
|
||||||
|
|
||||||
mRecordingContext.commandBuffer = commands.commandBuffer;
|
mRecordingContext.commandBuffer = commands.commandBuffer;
|
||||||
mRecordingContext.commandPool = commands.pool;
|
mRecordingContext.commandPool = commands.pool;
|
||||||
|
|
Loading…
Reference in New Issue