为什么vkCreateSwapchainKHR导致访问冲突?

时间:2019-04-28 02:04:42

标签: c++ vulkan

好的,所以我是Vulkan API的新手,如上一个问题所示。我对为什么vkCreateSwapchainKHR导致访问被拒绝感到非常困惑。

我尝试重新键入代码。我尝试了最小可行代码。我还尝试过在不同时间初始化交换链,但是它们似乎都不起作用。

像_sur_capab这样的变量是表面功能,早于此。而且,_logicalDevice只是VkDevice的一个实例。

VkSwapchainCreateInfoKHR cri = {  };
cri.clipped = VK_TRUE;
cri.oldSwapchain = VK_NULL_HANDLE;
cri.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
cri.flags = VkSwapchainCreateFlagBitsKHR::VK_SWAPCHAIN_CREATE_FLAG_BITS_MAX_ENUM_KHR;
cri.imageArrayLayers = 1;
cri.imageColorSpace = VkColorSpaceKHR::VK_COLORSPACE_SRGB_NONLINEAR_KHR;
cri.imageExtent = _sur_capab.maxImageExtent;
cri.imageFormat = VkFormat::VK_FORMAT_ASTC_5x4_UNORM_BLOCK;
cri.imageSharingMode = VkSharingMode::VK_SHARING_MODE_MAX_ENUM;
cri.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
cri.minImageCount = _sur_capab.minImageCount;
cri.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
cri.preTransform = _sur_capab.currentTransform;


vkCreateSwapchainKHR(
    _logicalDevice, 
    &cri,
    nullptr,
    &_swapChain);

1 个答案:

答案 0 :(得分:1)

一个建议:始终在启用验证层的情况下运行应用程序,它们应提示您代码中的潜在问题。

在不了解其余相关代码部分的情况下,我在上面的代码中看到了一些潜在的问题:

第一个事实是您为flagsimageSharingMode设置了无效值。 _MAX_ENUM_值不用于初始化,因此您需要在此处传递适当的值。通常,0flags,例如VK_SHARING_MODE_EXCLUSIVE的{​​{1}}。查看规范,以了解对imageSharingMode结构的成员而言有效的值。

接下来,您需要通过VkSwapchainCreateInfoKHR检查设备上是否确实支持您请求的imageFormat。 vkGetPhysicalDeviceSurfaceFormatsKHR是一种非常特定的格式,我可以想象只有极少数(如果有的话)实现将其支持为表面格式。

您似乎也根本没有设置VK_FORMAT_ASTC_5x4_UNORM_BLOCK,由于初始化(等于presentMode)使其变为0。您的目标实现可能不支持此模式,就像图像格式一样。您需要选择一种随处可用的当前模式,或者正确选择VK_PRESENT_MODE_IMMEDIATE_KHR支持的一种模式。