aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles Giessen <charles@lunarg.com>2022-07-29 16:23:12 -0600
committerCharles Giessen <46324611+charles-lunarg@users.noreply.github.com>2022-07-29 17:35:30 -0600
commit8ac3b50e9d2f4aa11339c4b6f68038862b282971 (patch)
tree80f528b907c9698d93cc1539efef23df5f990b73
parente734be0bb5aed1e542fad19ba91e93e1812de0ee (diff)
downloadusermoji-8ac3b50e9d2f4aa11339c4b6f68038862b282971.tar.xz
vulkaninfo: Prevent infinite loops
GetVectorInit could get stuck in an infinite loop if the underlying API call eternally returned VK_INCOMPLETE. This commit makes GetVectorInit stop after 3 tries.
-rw-r--r--vulkaninfo/vulkaninfo.h11
1 files changed, 7 insertions, 4 deletions
diff --git a/vulkaninfo/vulkaninfo.h b/vulkaninfo/vulkaninfo.h
index 64952e99..543257cd 100644
--- a/vulkaninfo/vulkaninfo.h
+++ b/vulkaninfo/vulkaninfo.h
@@ -230,14 +230,17 @@ auto GetVectorInit(const char *func_name, F &&f, T init, Ts &&...ts) -> std::vec
uint32_t count = 0;
std::vector<T> results;
VkResult err;
+ uint32_t iteration_count = 0;
+ uint32_t max_iterations = 3;
do {
err = f(ts..., &count, nullptr);
if (err) THROW_VK_ERR(func_name, err);
results.resize(count, init);
err = f(ts..., &count, results.data());
results.resize(count);
- } while (err == VK_INCOMPLETE);
- if (err) THROW_VK_ERR(func_name, err);
+ iteration_count++;
+ } while (err == VK_INCOMPLETE || iteration_count < max_iterations);
+ if (err && iteration_count <= max_iterations) THROW_VK_ERR(func_name, err);
return results;
}
@@ -1622,8 +1625,8 @@ struct AppGpu {
}
VkImageCreateInfo image_ci_regular = GetImageCreateInfo(0, format, tiling, 0);
- VkImageCreateInfo image_ci_transient = GetImageCreateInfo(
- 0, format, tiling, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT);
+ VkImageCreateInfo image_ci_transient =
+ GetImageCreateInfo(0, format, tiling, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT);
VkImageCreateInfo image_ci_sparse =
GetImageCreateInfo(VK_IMAGE_CREATE_SPARSE_BINDING_BIT, format, tiling, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);