【问题标题】:VkSurfaceKHR does not to update when resizing xcb window调整 xcb 窗口大小时 VkSurfaceKHR 不更新
【发布时间】:2019-04-01 07:50:00
【问题描述】:

我已按照https://vulkan-tutorial.com 的教程进行操作...我在没有使用 GLFW 扩展的情况下创建了它。到目前为止,我已经完成了“交换链娱乐”,一切都已正确设置和渲染。

但是,我似乎无法正常调整大小!

我已经连接到 XCB_RESIZE_REQUEST 并正在设置我的信息结构,如下所示:

if (resize->width > 0) { info.width = resize->width; }
if (resize->height > 0) { info.height = resize->height; }
info.framebufferResized = true;

导致(在下一次drawFrame() 调用中)recreateSwapchain() 被调用:

if (res == VK_ERROR_OUT_OF_DATE_KHR || res == VK_SUBOPTIMAL_KHR || info.framebufferResized) {
    info.framebufferResized = false;
    recreateSwapchain();
} else  if (res != VK_SUCCESS) {
    throw runtime_error("failed to present swap chain image!");
}

recreateSwapchain() {
    vkDeviceWaitIdle(info.device);

    cleanupSwapchain();

    querySwapchainSupport(info.physicalDevice);
    createSwapchain();
    createImageViews();
    createRenderPass();
    createGraphicsPipeline();
    createFramebuffers();
    createCommandBuffers();
}

我做了一些调试,发现swapchainSupport.capabilities.minImageExtent.width(和高度)并没有从初始值改变!..就是这个调用

querySwapchainSupport(VkPhysicalDevice physicalDevice) {
    VkResult res = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(
        physicalDevice, info.surface, &info.swapchainSupport.capabilities);
    assert(res == VK_SUCCESS);

不使用新的窗口大小更新info.swapchainSupport.capabilities

任何帮助或 cmets 将不胜感激。

示例截图:

【问题讨论】:

  • 我宁愿不使用诸如 GLFW 之类的库。因为我很可能希望在某个时候定位移动设备;
  • 你为什么看minImageExtent而不是currentExtent
  • 当前、最小值和最大值都保持不变:800x600

标签: resize vulkan xcb


【解决方案1】:

我不确定XCB_RESIZE_REQUEST 是否是等待的正确事件。在我的示例中,我使用XCB_CONFIGURE_NOTIFY 来检查窗口大小调整事件,并在该事件之后查询表面功能,因为表面功能按预期扩展时,我会得到新的窗口大小:

case XCB_CONFIGURE_NOTIFY:
{
    const xcb_configure_notify_event_t *cfgEvent = (const xcb_configure_notify_event_t *)event;
    if (((cfgEvent->width != width) || (cfgEvent->height != height)))
    {
            destWidth = cfgEvent->width;
            destHeight = cfgEvent->height;
            if ((destWidth > 0) && (destHeight > 0))
            {
                // Swap chain recreation ins done in this function              
                windowResize();                 
            }
    }
}

您还需要在 XCB 窗口创建时添加随附的标志:

uint32_t value_list[32];
value_list[1] = ... | XCB_EVENT_MASK_STRUCTURE_NOTIFY...

xcb_create_window(connection,
    ...     
    value_list);

已经过测试,可以在许多不同的 Linux 实现和平台上运行。

如果您需要一些帮助来启动和运行 XCB,您可能需要查看我的 Vulkan samples。有趣的部分在example base classswapchain header

【讨论】:

  • 是的,在英特尔的 Vulkan 教程的“API without Secrets”系列中也是如此。看看here.
  • 成功了!很好!这是否与将 XCB_EVENT_MASK_STRUCTURE_NOTIFY 添加到 value_list 中有关?
猜你喜欢
  • 2013-07-13
  • 2016-07-08
  • 1970-01-01
  • 2014-12-28
  • 2013-04-14
  • 2021-01-14
  • 2016-09-14
  • 1970-01-01
  • 2019-05-15
相关资源
最近更新 更多