VkSurfaceKHR не обновляется при изменении размера окна xcb - PullRequest
0 голосов
/ 28 октября 2018

Я следовал учебному руководству на https://vulkan -tutorial.com ... Я создал его без использования GLFW etension.Пока что я дошёл до «Перестановки цепочек обмена», и все правильно настроено и отрисовано.

Однако я не могу заставить работать корректно изменение размера!

Я подключилв 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);

не обновляетinfo.swapchainSupport.capabilities с новым размером окна.

Любая помощь или комментарии будут с благодарностью.

Пример снимка экрана:

after resize

1 Ответ

0 голосов
/ 28 октября 2018

Я не уверен, является ли 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 .Интересные части находятся в примере базового класса и заголовке swapchain .

...