首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >vkCreateSwapchainKHR错误

vkCreateSwapchainKHR错误
EN

Stack Overflow用户
提问于 2017-09-13 11:57:19
回答 2查看 2.3K关注 0票数 3

即使验证层和调试回调扩展已经启用并工作(它们响应错误的结构等等),但我仍然从vkCreateSwapchainKHR()获得了一个“vkCreateSwapchainKHR()”结果,并且没有验证层错误来确定错误。交换链创建(使用GTX 970 ):

代码语言:javascript
运行
复制
VkBool32 isSupported = false;
vkGetPhysicalDeviceSurfaceSupportKHR( physicalDevices[0], 0, surface, &isSupported);

if (!isSupported) {
    std::cout << "*ERROR* This device doesn't support surfaces" << std::endl;
}

VkSurfaceCapabilitiesKHR surfCaps;
vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevices[0], surface, &surfCaps);

std::vector<VkSurfaceFormatKHR> deviceFormats;
uint32_t formatCount;
vkGetPhysicalDeviceSurfaceFormatsKHR(physicalDevices[0], surface, &formatCount, nullptr);
deviceFormats.resize(formatCount);
vkGetPhysicalDeviceSurfaceFormatsKHR(physicalDevices[0], surface, &formatCount, deviceFormats.data());


swapChainInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
swapChainInfo.pNext = nullptr;
swapChainInfo.flags = 0;
swapChainInfo.surface = surface;

swapChainInfo.minImageCount = surfCaps.minImageCount; 
swapChainInfo.imageFormat = VK_FORMAT_B8G8R8A8_UNORM;
swapChainInfo.imageColorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR;
swapChainInfo.imageExtent = surfCaps.currentExtent;
swapChainInfo.imageArrayLayers = 1;
swapChainInfo.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
swapChainInfo.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;

swapChainInfo.queueFamilyIndexCount = 0;
swapChainInfo.pQueueFamilyIndices = VK_NULL_HANDLE;
swapChainInfo.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR; 
swapChainInfo.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
swapChainInfo.presentMode = VK_PRESENT_MODE_FIFO_KHR;
swapChainInfo.clipped = VK_TRUE; // TODO : TEST clipping against another window
swapChainInfo.oldSwapchain = VK_NULL_HANDLE;

result = vkCreateSwapchainKHR( device, &swapChainInfo, nullptr, &swapChain );
if (result) {
    std::cout << "*ERROR* Swapchain Creation Failed :" << result << std::endl;
}

使用GLFW创建曲面(不返回任何错误):

代码语言:javascript
运行
复制
if (result = glfwCreateWindowSurface(instance, window, nullptr, &surface)) 
    {
        std::cout << "*ERROR* Surface Creation Failed : " << result << std::endl;
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-13 15:35:45

vkCreateSwapchainKHR的验证失败有很多原因(查看validation.cpp中的PreCallValidateCreateSwapchainKHR )。

这里可能没有足够的代码来说明其失败的原因,例如,失败可能是由于一个无效的表面。但是,要确定问题所在,它应该在调试日志中给出一条失败消息,这将确切地告诉您原因。在尝试创建交换链之前,您应该通过调用CreateDebugReportCallbackEXT来启用它。这还需要您启用VK_EXT_debug_report扩展。详情请参见这里

票数 1
EN

Stack Overflow用户

发布于 2017-09-13 17:19:22

关于您的代码(可能导致问题的原因),只需几点:

  • 您没有检查所有VkResult命令的vkGet*
  • 您没有根据您的swapChainInfo.imageFormat中支持的格式检查deviceFormats
  • 您没有考虑到surfCaps.currentExtent可以是0xFFFFFFFF的情况。
  • swapChainInfo.pQueueFamilyIndices是指针而不是句柄;使用nullptr
  • 您没有检查swapChainInfo.preTransformsurfCaps.supportedTransforms
  • 您没有检查swapChainInfo.compositeAlphasurfCaps.supportedCompositeAlpha
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46196940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档