好的,所以我是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);
答案 0 :(得分:1)
一个建议:始终在启用验证层的情况下运行应用程序,它们应提示您代码中的潜在问题。
在不了解其余相关代码部分的情况下,我在上面的代码中看到了一些潜在的问题:
第一个事实是您为flags
和imageSharingMode
设置了无效值。 _MAX_ENUM_
值不用于初始化,因此您需要在此处传递适当的值。通常,0
是flags
,例如VK_SHARING_MODE_EXCLUSIVE
的{{1}}。查看规范,以了解对imageSharingMode
结构的成员而言有效的值。
接下来,您需要通过VkSwapchainCreateInfoKHR
检查设备上是否确实支持您请求的imageFormat。 vkGetPhysicalDeviceSurfaceFormatsKHR
是一种非常特定的格式,我可以想象只有极少数(如果有的话)实现将其支持为表面格式。
您似乎也根本没有设置VK_FORMAT_ASTC_5x4_UNORM_BLOCK
,由于初始化(等于presentMode
)使其变为0
。您的目标实现可能不支持此模式,就像图像格式一样。您需要选择一种随处可用的当前模式,或者正确选择VK_PRESENT_MODE_IMMEDIATE_KHR
支持的一种模式。