调整XCB窗口大小时VkSurfaceKHR不更新

时间:2018-10-28 01:12:25

标签: resize vulkan xcb

我已经按照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

任何帮助或评论将不胜感激。

示例屏幕截图:

after resize

1 个答案:

答案 0 :(得分:5)

我不确定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中。