Closed. This question is off-topic。它当前不接受答案。
想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
在8个月前关闭。
好的,所以我对Vulkan API还是很陌生,如我上一个问题所示。我对为什么vkCreateSwapchainKHR导致访问被拒绝感到非常困惑。
我尝试重新键入代码。我尝试了最小可行代码。我还尝试过在不同时间初始化交换链,但是它们似乎都不起作用。
像_sur_capab这样的变量是表面功能的获取时间早于此。并且,_logicalDevice只是VkDevice的一个实例。
想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
在8个月前关闭。
好的,所以我对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);
最佳答案
前面的一个建议:始终在启用验证层的情况下运行应用程序,它们应提示您代码中的潜在问题。
在不了解其余相关代码部分的情况下,我可以在上面的代码中看到一些潜在的问题:
第一个事实是您为flags
和imageSharingMode
设置了无效值。 _MAX_ENUM_
值不用于初始化,因此您需要在此处传递适当的值。通常对于0
是flags
,例如VK_SHARING_MODE_EXCLUSIVE
表示imageSharingMode
。检查规范,以了解哪些值对您的VkSwapchainCreateInfoKHR
结构的成员有效。
接下来,您需要通过vkGetPhysicalDeviceSurfaceFormatsKHR
检查设备上是否确实支持您请求的imageFormat。 VK_FORMAT_ASTC_5x4_UNORM_BLOCK
是一种非常特定的格式,我可以想象只有极少数(如果有的话)实现将其支持为表面格式。
看起来您根本没有设置presentMode
,由于初始化(等于0
)而将其设置为VK_PRESENT_MODE_IMMEDIATE_KHR
。您的目标实现可能不支持此模式,就像图像格式一样。您需要选择一个随处可用的当前模式,或者正确选择vkGetPhysicalDeviceSurfacePresentModesKHR
支持的当前模式。
关于c++ - 为什么vkCreateSwapchainKHR导致访问冲突? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55886435/
10-11 01:09