#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;
кажется неправильным, приведение адреса переменной к hwnd3. @NicolBolas исправил это, я как-то забыл скопировать это, но это не отсутствует в моем коде
4. @Kazz Вот и все! Я подумал, что есть что-то глупое, чего я не вижу. Я поставил amp; вместо *
Ответ №1:
Спасибо @Kazz в комментариях, который обнаружил, что я неправильно передаю ручку окна.