C++ vkCreateSwapchainKHR():未为此物理设备检索表面功能

C++ vkCreateSwapchainKHR():未为此物理设备检索表面功能,c++,windows,glfw,vulkan,C++,Windows,Glfw,Vulkan,我试图在创建曲面后创建一个交换链。当前正在使用GLFW创建我的窗口,如下所示: glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); GLFWWindow = glfwCreateWindow(Extent.Width, Extent.Height, _Name.c_str(), NULL, NULL); VkApplicationInfo AppInfo = { VK_STRUCTURE_TYPE_APPLICATION_INFO };

我试图在创建曲面后创建一个交换链。当前正在使用GLFW创建我的窗口,如下所示:

glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
GLFWWindow = glfwCreateWindow(Extent.Width, Extent.Height, _Name.c_str(), NULL, NULL);
    VkApplicationInfo AppInfo = { VK_STRUCTURE_TYPE_APPLICATION_INFO };
    AppInfo.apiVersion = VK_API_VERSION_1_1;    //Should check if version is available vi vkEnumerateInstanceVersion().
    AppInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0);
    AppInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0);
    AppInfo.pApplicationName = _AppName;
    AppInfo.pEngineName = "Game Studio";

#ifdef GS_DEBUG
    const char* InstanceLayers[] = { "VK_LAYER_LUNARG_standard_validation" };
#else
    const char* InstanceLayers[] = nullptr;
#endif // GS_DEBUG

    const char* Extensions[] = { VK_KHR_SURFACE_EXTENSION_NAME, VK_KHR_WIN32_SURFACE_EXTENSION_NAME };

    VkInstanceCreateInfo InstanceCreateInfo = { VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO };
    InstanceCreateInfo.pApplicationInfo = &AppInfo;
    InstanceCreateInfo.enabledLayerCount = 1;
    InstanceCreateInfo.ppEnabledLayerNames = InstanceLayers;
    InstanceCreateInfo.enabledExtensionCount = 2;
    InstanceCreateInfo.ppEnabledExtensionNames = Extensions;

    GS_VK_CHECK(vkCreateInstance(&InstanceCreateInfo, ALLOCATOR, &Instance), "Failed to create Instance!")
    VkPhysicalDeviceFeatures deviceFeatures = {};   //COME BACK TO

    const char* DeviceExtensions[] = { VK_KHR_SWAPCHAIN_EXTENSION_NAME };

    PhysicalDevice = CreatePhysicalDevice(_Instance);

    QueueInfo GraphicsQueueInfo;
    QueueInfo ComputeQueueInfo;
    QueueInfo TransferQueueInfo;

    GraphicsQueueInfo.QueueFlag = VK_QUEUE_GRAPHICS_BIT;
    GraphicsQueueInfo.QueuePriority = 1.0f;
    ComputeQueueInfo.QueueFlag = VK_QUEUE_COMPUTE_BIT;
    ComputeQueueInfo.QueuePriority = 1.0f;
    TransferQueueInfo.QueueFlag = VK_QUEUE_TRANSFER_BIT;
    TransferQueueInfo.QueuePriority = 1.0f;

    QueueInfo QueueInfos[] = { GraphicsQueueInfo, ComputeQueueInfo, TransferQueueInfo };

    FVector<VkDeviceQueueCreateInfo> QueueCreateInfos = CreateQueueInfos(QueueInfos, 3, PhysicalDevice);

    VkDeviceCreateInfo DeviceCreateInfo = { VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO };
    DeviceCreateInfo.queueCreateInfoCount = QueueCreateInfos.length();
    DeviceCreateInfo.pQueueCreateInfos = QueueCreateInfos.data();
    DeviceCreateInfo.enabledExtensionCount = 1;
    DeviceCreateInfo.pEnabledFeatures = &deviceFeatures;
    DeviceCreateInfo.ppEnabledExtensionNames = DeviceExtensions;

    auto ff = vkCreateDevice(PhysicalDevice, &DeviceCreateInfo, ALLOCATOR, &Device);

    Vk_Queue* Queues[] = { &GraphicsQueue, &ComputeQueue, &TransferQueue };

    SetVk_Queues(Queues, QueueCreateInfos);

    vkGetPhysicalDeviceMemoryProperties(PhysicalDevice, &MemoryProperties);
我创建的
VkInstance
如下:

glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
GLFWWindow = glfwCreateWindow(Extent.Width, Extent.Height, _Name.c_str(), NULL, NULL);
    VkApplicationInfo AppInfo = { VK_STRUCTURE_TYPE_APPLICATION_INFO };
    AppInfo.apiVersion = VK_API_VERSION_1_1;    //Should check if version is available vi vkEnumerateInstanceVersion().
    AppInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0);
    AppInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0);
    AppInfo.pApplicationName = _AppName;
    AppInfo.pEngineName = "Game Studio";

#ifdef GS_DEBUG
    const char* InstanceLayers[] = { "VK_LAYER_LUNARG_standard_validation" };
#else
    const char* InstanceLayers[] = nullptr;
#endif // GS_DEBUG

    const char* Extensions[] = { VK_KHR_SURFACE_EXTENSION_NAME, VK_KHR_WIN32_SURFACE_EXTENSION_NAME };

    VkInstanceCreateInfo InstanceCreateInfo = { VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO };
    InstanceCreateInfo.pApplicationInfo = &AppInfo;
    InstanceCreateInfo.enabledLayerCount = 1;
    InstanceCreateInfo.ppEnabledLayerNames = InstanceLayers;
    InstanceCreateInfo.enabledExtensionCount = 2;
    InstanceCreateInfo.ppEnabledExtensionNames = Extensions;

    GS_VK_CHECK(vkCreateInstance(&InstanceCreateInfo, ALLOCATOR, &Instance), "Failed to create Instance!")
    VkPhysicalDeviceFeatures deviceFeatures = {};   //COME BACK TO

    const char* DeviceExtensions[] = { VK_KHR_SWAPCHAIN_EXTENSION_NAME };

    PhysicalDevice = CreatePhysicalDevice(_Instance);

    QueueInfo GraphicsQueueInfo;
    QueueInfo ComputeQueueInfo;
    QueueInfo TransferQueueInfo;

    GraphicsQueueInfo.QueueFlag = VK_QUEUE_GRAPHICS_BIT;
    GraphicsQueueInfo.QueuePriority = 1.0f;
    ComputeQueueInfo.QueueFlag = VK_QUEUE_COMPUTE_BIT;
    ComputeQueueInfo.QueuePriority = 1.0f;
    TransferQueueInfo.QueueFlag = VK_QUEUE_TRANSFER_BIT;
    TransferQueueInfo.QueuePriority = 1.0f;

    QueueInfo QueueInfos[] = { GraphicsQueueInfo, ComputeQueueInfo, TransferQueueInfo };

    FVector<VkDeviceQueueCreateInfo> QueueCreateInfos = CreateQueueInfos(QueueInfos, 3, PhysicalDevice);

    VkDeviceCreateInfo DeviceCreateInfo = { VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO };
    DeviceCreateInfo.queueCreateInfoCount = QueueCreateInfos.length();
    DeviceCreateInfo.pQueueCreateInfos = QueueCreateInfos.data();
    DeviceCreateInfo.enabledExtensionCount = 1;
    DeviceCreateInfo.pEnabledFeatures = &deviceFeatures;
    DeviceCreateInfo.ppEnabledExtensionNames = DeviceExtensions;

    auto ff = vkCreateDevice(PhysicalDevice, &DeviceCreateInfo, ALLOCATOR, &Device);

    Vk_Queue* Queues[] = { &GraphicsQueue, &ComputeQueue, &TransferQueue };

    SetVk_Queues(Queues, QueueCreateInfos);

    vkGetPhysicalDeviceMemoryProperties(PhysicalDevice, &MemoryProperties);
我的
VkDevice
如下:

glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
GLFWWindow = glfwCreateWindow(Extent.Width, Extent.Height, _Name.c_str(), NULL, NULL);
    VkApplicationInfo AppInfo = { VK_STRUCTURE_TYPE_APPLICATION_INFO };
    AppInfo.apiVersion = VK_API_VERSION_1_1;    //Should check if version is available vi vkEnumerateInstanceVersion().
    AppInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0);
    AppInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0);
    AppInfo.pApplicationName = _AppName;
    AppInfo.pEngineName = "Game Studio";

#ifdef GS_DEBUG
    const char* InstanceLayers[] = { "VK_LAYER_LUNARG_standard_validation" };
#else
    const char* InstanceLayers[] = nullptr;
#endif // GS_DEBUG

    const char* Extensions[] = { VK_KHR_SURFACE_EXTENSION_NAME, VK_KHR_WIN32_SURFACE_EXTENSION_NAME };

    VkInstanceCreateInfo InstanceCreateInfo = { VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO };
    InstanceCreateInfo.pApplicationInfo = &AppInfo;
    InstanceCreateInfo.enabledLayerCount = 1;
    InstanceCreateInfo.ppEnabledLayerNames = InstanceLayers;
    InstanceCreateInfo.enabledExtensionCount = 2;
    InstanceCreateInfo.ppEnabledExtensionNames = Extensions;

    GS_VK_CHECK(vkCreateInstance(&InstanceCreateInfo, ALLOCATOR, &Instance), "Failed to create Instance!")
    VkPhysicalDeviceFeatures deviceFeatures = {};   //COME BACK TO

    const char* DeviceExtensions[] = { VK_KHR_SWAPCHAIN_EXTENSION_NAME };

    PhysicalDevice = CreatePhysicalDevice(_Instance);

    QueueInfo GraphicsQueueInfo;
    QueueInfo ComputeQueueInfo;
    QueueInfo TransferQueueInfo;

    GraphicsQueueInfo.QueueFlag = VK_QUEUE_GRAPHICS_BIT;
    GraphicsQueueInfo.QueuePriority = 1.0f;
    ComputeQueueInfo.QueueFlag = VK_QUEUE_COMPUTE_BIT;
    ComputeQueueInfo.QueuePriority = 1.0f;
    TransferQueueInfo.QueueFlag = VK_QUEUE_TRANSFER_BIT;
    TransferQueueInfo.QueuePriority = 1.0f;

    QueueInfo QueueInfos[] = { GraphicsQueueInfo, ComputeQueueInfo, TransferQueueInfo };

    FVector<VkDeviceQueueCreateInfo> QueueCreateInfos = CreateQueueInfos(QueueInfos, 3, PhysicalDevice);

    VkDeviceCreateInfo DeviceCreateInfo = { VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO };
    DeviceCreateInfo.queueCreateInfoCount = QueueCreateInfos.length();
    DeviceCreateInfo.pQueueCreateInfos = QueueCreateInfos.data();
    DeviceCreateInfo.enabledExtensionCount = 1;
    DeviceCreateInfo.pEnabledFeatures = &deviceFeatures;
    DeviceCreateInfo.ppEnabledExtensionNames = DeviceExtensions;

    auto ff = vkCreateDevice(PhysicalDevice, &DeviceCreateInfo, ALLOCATOR, &Device);

    Vk_Queue* Queues[] = { &GraphicsQueue, &ComputeQueue, &TransferQueue };

    SetVk_Queues(Queues, QueueCreateInfos);

    vkGetPhysicalDeviceMemoryProperties(PhysicalDevice, &MemoryProperties);
之后,根据验证层的要求,我查询支持和功能:

VkSurfaceCapabilitiesKHR Capabilities;
auto CapResult = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(_PD, Surface, &Capabilities);

VkBool32 Supports = 0;
auto SupResult = vkGetPhysicalDeviceSurfaceSupportKHR(_PD, _Device.GetGraphicsQueue().GetQueueIndex(), Surface, &Supports);
vkGetPhysicalDeviceSurfaceSupportKHR()
返回
VK_SUCCESS
并且支持曲面,但
vkGetPhysicalDeviceSurfaceCapabilitiesKHR()
返回
VK_ERROR_surface_LOST_KHR
。我试着切换这两个函数的顺序,结果还是一样

最后,当我尝试创建交换链时:

VkSwapchainCreateInfoKHR-SwapchainCreateInfo={VK_-STRUCTURE_-TYPE_-SWAPCHAIN_-CREATE_-INFO_-KHR};
SwapchainCreateInfo.surface=\u surface;
SwapchainCreateInfo.minImageCount=3;
SwapchainCreateInfo.imageFormat=_SurfaceFormat;
SwapchainCreateInfo.imageColorSpace=\u SurfaceColorSpace;
SwapchainCreateInfo.imageExtent=\u SurfaceExtent;
SwapchainCreateInfo.imageArrayLayers=1;
SwapchainCreateInfo.imageUsage=VK\u图像\u用法\u颜色\u附件\u位;
SwapchainCreateInfo.imageSharingMode=VK_共享模式_独占模式;
SwapchainCreateInfo.queueFamilyIndexCount=1;//可选的
SwapchainCreateInfo.pquefamilyindices=nullptr;
SwapchainCreateInfo.preTransform=VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
SwapchainCreateInfo.compositeAlpha=VK_COMPOSITE_ALPHA_不透明_BIT_KHR;
SwapchainCreateInfo.presentMode=\u presentMode;
SwapchainCreateInfo.clipped=VK_TRUE;
SwapchainCreateInfo.oldSwapchain=\u oldSwapchain;
它失败,结果为
VK\u结果
VK\u错误\u初始化失败
,验证层抛出以下警告:

UNASSIGNED-CoreValidation-DrawState-SwapchainCreateBeforeQuery(ERROR / SPEC): msgNum: 0 - vkCreateSwapchainKHR(): surface capabilities not retrieved for this physical device
    Objects: 1
        [0] 0x1fddb809470, type: 2, name: NULL
尽管我相信我已经检查了功能

我的实例已启用此扩展,这是GLFW正常运行所需的所有扩展:

const char* Extensions[] = { VK_KHR_SURFACE_EXTENSION_NAME, VK_KHR_WIN32_SURFACE_EXTENSION_NAME };

我的想法是Vulkan有问题,因为我看不出哪里会出问题。我正在考虑创建一个问题,但我想先和你们确认一下。

您显示了窗口创建和曲面创建,但不包括实例创建代码。创建实例时,是否确保请求了由
glfwGetRequiredInstanceExtensions
返回的扩展?请求的确切扩展集是什么

如果您没有请求任何扩展,特别是如果您缺少
VK_KHR_surface
VK_KHR_win32_surface
,则预计部分或所有surface操作可能会失败

另外,如何填充
\u SurfaceFormat

最后,这看起来是错误的:

SwapchainCreateInfo.queueFamilyIndexCount = 1; // Optional
SwapchainCreateInfo.pQueueFamilyIndices = nullptr;

如果
pquefamilyindices
为空,则
queueFamilyIndexCount
应为零

结果表明,我没有正确设置HWND和HInstance变量,但曲面创建没有对此抱怨,验证层也没有。由于某种原因,其中一个查询功能没有失败,而另一个失败。

答案应该主要由答案组成,而不是更多的问题。如果没有足够的信息来回答这个问题,那么在评论部分请求更多的信息<代码>常量字符*扩展[]={VK_KHR_SURFACE_EXTENSION_NAME,VK_KHR_WIN32_SURFACE_EXTENSION_NAME}这些都是GLFW需要的扩展,我测试了它。然后,我还测试了
\u SurfaceFormat
是如何填充的,现在已经正确完成了。最后我把家里的东西修好了。即使在所有这些之后,应用程序也会以同样的方式失败。您的问题没有包含足够的信息来确定答案。您需要包含创建实例、设备和交换链的全部代码,否则试图找出错误只是猜测。嗨@Jherico,我刚刚添加了您请求的信息,如果需要其他信息,请询问。谢谢你的提示。注意:由于您对我的另一个问题的回答,我修复了队列,因此队列创建现在似乎工作正常。
\u Device.GetGraphicsQueue().GetQueueIndex()
返回的值是多少?您没有使用调试报告功能。如果将
VK_EXT_DEBUG_REPORT_EXTENSION_NAME
添加到实例扩展中,并使用
vkCreateDebugReportCallbackEXT
分配消息处理程序,它是否在调用
vkGetPhysicalDeviceSurfaceCapabilitiesKHR
之前或期间生成任何输出?此外,您似乎没有调用
glfwGetRequiredInstanceExtensions
。在我的系统上,它实际上只返回您请求的两个扩展,但它可能会在您的系统上返回不同的内容。