Вулкан: vkGetPhysicalDeviceSurfaceCapabilitiesKHR возвращает VK_ERROR_SURFACE_LOST_KHR в C

#c #instance #vulkan #surface

Вопрос:

У меня есть эта функция:

 static cyBool swapchainSuitable(VkPhysicalDevice device, VkSurfaceKHR surface){

    //Capabilities
    VkSurfaceCapabilitiesKHR capabilities;
    VkResult result =  vkGetPhysicalDeviceSurfaceCapabilitiesKHR(device, surface, amp;capabilities);
    if (result != VK_SUCCESS){
        CY_LOG_FATAL("Unable to get the physical device surface capabilities");
        return FALSE;
    }

    //more stuff...
}
 

В результате всегда VK_ERROR_SURFACE_LOST_KHR получается , что спецификация Vulkan определяет его как

Поверхность больше недоступна.

Что это значит? Отладчик проверки Vulkan ничего не улавливает, и поверхность была создана успешно. Я не уничтожил ни поверхность, ни экземпляр, и устройство является допустимым указателем.

Вот как создается поверхность (я использую не GLFW, а Win32 API)

 VkWin32SurfaceCreateInfoKHR createInfo;
createInfo.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;
createInfo.pNext = NULL;
createInfo.flags = 0;
createInfo.hinstance = GetModuleHandleA(NULL);
createInfo.hwnd = (HWND) amp;pWindowHandle;

VkResult result = vkCreateWin32SurfaceKHR(pInstance->handle, amp;createInfo, NULL, amp;pSurface->handle);
if(result != VK_SUCCESS){
    CY_LOG_FATAL("Unable to create Windows Surface");
    return FALSE;
}
 

Опять же: дескриптор экземпляра действителен, HWND также действителен, и поверхность успешно создана, так как проверка отладки ничего не показывает.

расширения экземпляра, которые я хотел:

  • VK_KHR_SURFACE_EXTENSION_NAME
  • «VK_KHR_win32_surface»
  • VK_EXT_DEBUG_UTILS_EXTENSION_NAME
  • VK_EXT_DEBUG_REPORT_EXTENSION_NAME

Расширения устройств, которые я хотел:

  • VK_KHR_SWAPCHAIN_EXTENSION_NAME

Я чувствую, что упускаю что-то действительно глупое, но не могу понять, в чем дело.

Комментарии:

1. Может быть, я совершенно не прав, но я думаю, что расширения: VK_EXT_DEBUG_UTILS_EXTENSION_NAME и VK_EXT_DEBUG_REPORT_EXTENSION_NAME не могут использоваться вместе, imo вы можете использовать только один из них в зависимости от того, какой у вас SDK.

2. createInfo.hwnd = (HWND) amp;pWindowHandle; кажется неправильным, приведение адреса переменной к hwnd

3. @NicolBolas исправил это, я как-то забыл скопировать это, но это не отсутствует в моем коде

4. @Kazz Вот и все! Я подумал, что есть что-то глупое, чего я не вижу. Я поставил amp; вместо *

Ответ №1:

Спасибо @Kazz в комментариях, который обнаружил, что я неправильно передаю ручку окна.