Qt Vulkan을 자신의 Vulkan Wrapper와 연동하기.
Qt에서는 Vulkan에 대한 지원을 하며 QVulkan~ 형태로 Wrapping 을 해두었습니다.
하지만 Vulkan API를 이용하시는 분들은 이미 자신이 작성한 Wrapper 들을 이용하거나
또는 사내에서 사용하는 Wrapper Library를 이용하는 경우가 많을 것입니다.
이런 경우 다음과 같은 방식으로 Wrapper Library를 이용할 수 있습니다.
혼동을 방지하기 위해 우리가 사용중인 Wrapper Library 를 WVulkan 이라 부르겠습니다.
Qt 는 QWindow 라는 Object가 존재합니다.
QWindow 는 다양한 Surface가 존재하며 여기에 QSurface::VulkanSurface 라는 타입으로
Vulkan을 위한 Surface 를 지원합니다.
따라서 아래와 같은 방식으로 해당 Surface 에 대한 Handler를 얻어온 뒤
WVulkan에서 SwapChain을 생성하여 이용하는 방식으로 사용 가능합니다.
class MyVulkanWindow : public QWindow
{
...
}
int main(void)
{
...
// 위는 Qt Application 의 기본 코드입니다.
WVulkanInstance *wvk_instance = new WVulkanInstance();
VkInstance raw_instance = wvk_instance->getVKInstance(); // VkInstance getter
QVulkanInstance qvk_instance;
qvk_instance.setVkInstance(raw_instance); // 이미 존재하는 VkInstance를 이용하여 QVulkanInstance 생성
qvk_instance.create(); // 초기화
MyVulkanWindow *m_window = new MyVulkanWindow(...args);
m_window->setSurfaceType(QSurface::VulkanSurface);
m_window->setVulkanInstance(&qvk_instance);
m_window->show();
VkSurfaceKHR surface = QVulkanInstance::surfaceForWindow(m_window);
...
return 0;
}
위 언급한 방식을 이용하기 위해서는 QVulkanInstance 의 create method를 호출하기 전에
qvk_instance->setVkInstance(VkInstance inst); 함수를 호출해야하며 순서가 바뀌면 동작하지 않습니다.
또한 WVkInstance 로 생성된 VkInstance는 VK_KHR_*_surface 형태의 surface instance extension
이 입력되어야하며, VK_EXT_debug_report Extension 역시 제공되어야합니다.
Note: It is up to the component creating the external instance to ensure the necessary extensions are enabled on it. These are: VK_KHR_surface, the WSI-specific VK_KHR_*_surface that is appropriate for the platform in question, and VK_EXT_debug_report in case QVulkanInstance's debug output redirection is desired.
공식문서의 내용입니다.
Qt 6.x 공식 문서의 QVulkanInstance를 참고하시면 됩니다.