调整 xcb 大小时 VkSurfaceKHR 不更新 window
VkSurfaceKHR does not to update when resizing xcb window
我已按照 https://vulkan-tutorial.com 中的教程进行操作...我在未使用 GLFW etension 的情况下创建了它。到目前为止,我已经完成 "Swap chain Recreation",并且所有设置和渲染都正确。
但是,我似乎无法正常调整大小!
我已经连接到 XCB_RESIZE_REQUEST
并且正在设置我的信息结构 w/h,如下所示:
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);
不使用新的 window 尺寸更新 info.swapchainSupport.capabilities
。
如有任何帮助或意见,我们将不胜感激。
示例截图:
我不确定 XCB_RESIZE_REQUEST
是否是值得等待的正确事件。在我的示例中,我使用 XCB_CONFIGURE_NOTIFY
检查 window 调整大小事件,并且在该事件之后查询表面功能会给我新的 window 大小,因为表面功能按预期扩展:
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 window 创建时添加随附标志:
uint32_t value_list[32];
value_list[1] = ... | XCB_EVENT_MASK_STRUCTURE_NOTIFY...
xcb_create_window(connection,
...
value_list);
这已经过测试,可以在许多不同的 Linux 实现和平台上工作。
如果您需要一些帮助来启动 XCB 并且 运行 您可能想看看我的 Vulkan samples. The interesting parts are in the example base class and the swapchain header。
我已按照 https://vulkan-tutorial.com 中的教程进行操作...我在未使用 GLFW etension 的情况下创建了它。到目前为止,我已经完成 "Swap chain Recreation",并且所有设置和渲染都正确。
但是,我似乎无法正常调整大小!
我已经连接到 XCB_RESIZE_REQUEST
并且正在设置我的信息结构 w/h,如下所示:
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);
不使用新的 window 尺寸更新 info.swapchainSupport.capabilities
。
如有任何帮助或意见,我们将不胜感激。
示例截图:
我不确定 XCB_RESIZE_REQUEST
是否是值得等待的正确事件。在我的示例中,我使用 XCB_CONFIGURE_NOTIFY
检查 window 调整大小事件,并且在该事件之后查询表面功能会给我新的 window 大小,因为表面功能按预期扩展:
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 window 创建时添加随附标志:
uint32_t value_list[32];
value_list[1] = ... | XCB_EVENT_MASK_STRUCTURE_NOTIFY...
xcb_create_window(connection,
...
value_list);
这已经过测试,可以在许多不同的 Linux 实现和平台上工作。
如果您需要一些帮助来启动 XCB 并且 运行 您可能想看看我的 Vulkan samples. The interesting parts are in the example base class and the swapchain header。