-
Notifications
You must be signed in to change notification settings - Fork 59
Description
Generally, asserts are used in code for things that should never happen and can't reasonably be recovered from, where allowing the program to continue running would be invalid. Logging and calling abort() is generally recognized as a perfectly-reasonable resolution to triggering one.
But it seems like in Anvil, the use of anvil_assert() is used for both cases where reasonable recovery is not possible, but also just for general errors that need to be reported.
This is true even in the same function within a few lines of each other. Using Queue::present() as an example:
Line #227:
/* Sanity checks */
anvil_assert(in_n_wait_semaphores < sizeof(wait_semaphores_vk) / sizeof(wait_semaphores_vk[0]) );
This is an assert that cannot fail. If it does, code later on will cause a buffer overflow.
But then later on in the same function:
Line #284:
result = swapchain_entrypoints.vkQueuePresentKHR(m_queue,
&image_presentation_info);
anvil_assert_vk_call_succeeded(result);
if (is_vk_call_successful(result) )
{
anvil_assert(is_vk_call_successful(presentation_results[0]));
/* Return the most important error code reported */
switch (presentation_results[0])
{
...
It's perfectly-reasonable for that assert to fail, and for the program to handle the error and continue running. That's what's expected to happen in the case of an out-of-date swapchain.
And, in fact, the code below it even continues and handles the error as-if the assert wasn't there, so why even bother asserting?
Anvil has this problem literally everywhere, and fixing it would require a thorough review of all the places where asserts happen, properly separating the can never fail from the can fail and we'll handle it.