Получить XVisualInfo для Vulkan - PullRequest
1 голос
/ 08 марта 2020

Для OpenGL с Xlib, чтобы создать окно, мы можем получить соответствующий XVisualInfo из GLX и передать его XCreateWindow. Однако, если я хочу использовать Vulkan с Xlib, как мне получить XVisualInfo? Мне все еще нужно связаться с GLX?

1 Ответ

1 голос
/ 08 марта 2020

Вулкан делает вещи по-другому в этом отношении. Прежде всего, из-за опыта работы с OpenGL и того, как он взаимодействует с оконной системой, был выбран совершенно другой подход.

В OpenGL традиционно вы создаете контекст рендеринга из свойств некоторого рисованного объекта. В Microsoft это более тесно связано с windows, так как выбор визуального формата происходит на основе пиксельного формата рисуемого объекта (он же Window), контекст устройства, который вы используете для создания контекста рендеринга. В GLX нет жестких t ie с рисованными объектами, но вы все равно должны создать контекст, соответствующий визуальной конфигурации и конфигурации кадрового буфера для доступных для рисования элементов.

Vulkan не делает так не работает!

Сначала в Вулкане больше нет контекстов. То, что вы получили, это экземпляров . И для каждого экземпляра вы создаете дескрипторы для физических и логических устройств , для которых в свою очередь вы создаете изображений для рисования. Все это происходит совершенно отдельно от оконной системы. На самом деле, тривиально выполнять рендеринг без головы с Vulkan.

Если для рендеринга без головы с OpenGL потребовалось дополнительное усилие, то с Vulkan все наоборот: для рендеринга требуется дополнительное усилие. window.

Ключом к этому являются так называемые «цепочки обмена». Цепочки обмена - это то, что драйверы текущего дня и архитектуры графических процессоров используют для управления доставкой изображений на дисплей (буфер с именами swap двойной буферизации и вызов SwapBuffers, который вы делаете с OpenGL, принадлежат этому имени) , Чтобы создать цепочку обмена, вы сначала получаете поверхность Vulkan для рисования, которое вы хотите на приемном конце цепочки обмена. Функции для этого являются частью зависимых от оконных расширений Vulkan; они являются расширениями, так что они не загромождают ядро ​​Vulkan связанными с Windows System Integration (WSI) вещами. Для X11 вы либо использовали бы vkCreateXcbSurfaceKHR или vkCreateXlibSurfaceKHR.

С созданной поверхностью вы перебираете ее очереди, чтобы увидеть, какие операции она поддерживает, используя vkGetPhysicalDeviceSurfaceSupportKHR, а затем с какими форматами изображений можно использовать vkGetPhysicalDeviceSurfaceFormatsKHR. Этот самый шаг наиболее близок к запросу Visual s и FBConfig s относительно создания контекста GLX, чтобы ответить на ваш вопрос.

После того, как вы определились с форматом, вы создаете цепочку обмена, для которой вы должны снова проводить домашнее хозяйство, а именно проверять, какие возможности предоставляет поверхность (под возможностями здесь подразумеваются методы, с помощью которых она может передавать данные по цепочке). Для этого используются следующие функции: vkGetPhysicalDeviceSurfaceCapabilitiesKHR и vkGetPhysicalDeviceSurfacePresentModesKHR.

Со всей информацией, которую вы получили до этого момента, вы теперь решаете формат и конфигурацию цепочки обмена и создайте ее, используя vkCreateSwapchainKHR. После этого вы получите изображения цепочки обмена, используя vkGetSwapchainImagesKHR.

Теперь, когда у вас есть образы цепочки обмена, вы можете как обычно создавать их и использовать их. в качестве приложений для визуализации. Поздравляем с бритьем, что Вулкани c як * Фу *.

...