KhronosGroup/Vulkan-ValidationLayers

vkAcquireNextImageKHR crashes in validation layers if vkGetSwapchainImagesKHR hasn't been called

zeux opened this issue · 3 comments

zeux commented

If you call vkAcquireNextImageKHR before calling vkGetSwapchainImagesKHR, validation layers crash with this callstack:

VkLayer_core_validation.dll!core_validation::PostCallRecordAcquireNextImageKHR(core_validation::layer_data * dev_data, VkDevice_T * device, VkSwapchainKHR_T * swapchain, unsigned __int64 timeout, VkSemaphore_T * semaphore, VkFence_T * fence, unsigned int * pImageIndex) Line 11754	C++
 	VkLayer_core_validation.dll!core_validation::AcquireNextImageKHR(VkDevice_T * device, VkSwapchainKHR_T * swapchain, unsigned __int64 timeout, VkSemaphore_T * semaphore, VkFence_T * fence, unsigned int * pImageIndex) Line 11775	C++
 	VkLayer_object_tracker.dll!object_tracker::AcquireNextImageKHR(VkDevice_T * device, VkSwapchainKHR_T * swapchain, unsigned __int64 timeout, VkSemaphore_T * semaphore, VkFence_T * fence, unsigned int * pImageIndex) Line 2974	C++
 	VkLayer_parameter_validation.dll!parameter_validation::vkAcquireNextImageKHR(VkDevice_T * device, VkSwapchainKHR_T * swapchain, unsigned __int64 timeout, VkSemaphore_T * semaphore, VkFence_T * fence, unsigned int * pImageIndex) Line 7731	C++
 	VkLayer_threading.dll!threading::AcquireNextImageKHR(VkDevice_T * device, VkSwapchainKHR_T * swapchain, unsigned __int64 timeout, VkSemaphore_T * semaphore, VkFence_T * fence, unsigned int * pImageIndex) Line 3652	C++

Here:

    // Mark the image as acquired.
    auto swapchain_data = GetSwapchainNode(dev_data, swapchain);
    auto image = swapchain_data->images[*pImageIndex];
    auto image_state = GetImageState(dev_data, image);

The issue is that *pImageIndex is 0 (as returned by the driver), but swapchain_data->images is empty.

Triage notes:

two parts to this

  1. deduplicate the vkAcquireNextImageKHR and vkAcquireNextImage2KHR validate and record logic
  2. add defensive checks for invalid swapchain handle (VU codegen'd in Object Tracker) causing null returns from GetSwapchainNode

For #2, see @tobine's comment in #399.

Resolved in PR #402