Play-/Source/ui_qt/GSH_VulkanQt.cpp

84 lines
2.5 KiB
C++
Raw Normal View History

#include "GSH_VulkanQt.h"
#include "vulkan/StructDefs.h"
#include "vulkan/Loader.h"
#include <QWindow>
#ifdef __APPLE__
#include <MoltenVK/vk_mvk_moltenvk.h>
#endif
2020-02-03 13:11:28 -05:00
#ifdef __linux__
#include <QX11Info>
#endif
CGSH_VulkanQt::CGSH_VulkanQt(QWindow* renderWindow)
: m_renderWindow(renderWindow)
{
}
CGSH_VulkanQt::FactoryFunction CGSH_VulkanQt::GetFactoryFunction(QWindow* renderWindow)
{
return [renderWindow]() { return new CGSH_VulkanQt(renderWindow); };
}
void CGSH_VulkanQt::InitializeImpl()
{
m_instance = CreateInstance();
2019-12-13 23:21:59 -05:00
#ifdef _WIN32
auto surfaceCreateInfo = Framework::Vulkan::Win32SurfaceCreateInfoKHR();
surfaceCreateInfo.hwnd = reinterpret_cast<HWND>(m_renderWindow->winId());
auto result = m_instance.vkCreateWin32SurfaceKHR(m_instance, &surfaceCreateInfo, nullptr, &m_context->surface);
CHECKVULKANERROR(result);
#endif
#ifdef __APPLE__
VkMacOSSurfaceCreateInfoMVK surfaceCreateInfo = {};
surfaceCreateInfo.pView = reinterpret_cast<const void*>(m_renderWindow->winId());
auto result = m_instance.vkCreateMacOSSurfaceMVK(m_instance, &surfaceCreateInfo, nullptr, &m_context->surface);
CHECKVULKANERROR(result);
2020-01-31 09:34:48 -05:00
DisableSyncQueueSubmits();
2019-09-26 13:39:27 -04:00
#endif
2020-02-04 09:29:13 -05:00
#ifdef __linux__
auto surfaceCreateInfo = Framework::Vulkan::XcbSurfaceCreateInfoKHR();
2020-02-03 13:11:28 -05:00
surfaceCreateInfo.window = static_cast<xcb_window_t>(m_renderWindow->winId());
surfaceCreateInfo.connection = QX11Info::connection();
auto result = m_instance.vkCreateXcbSurfaceKHR(m_instance, &surfaceCreateInfo, nullptr, &m_context->surface);
CHECKVULKANERROR(result);
#endif
CGSH_Vulkan::InitializeImpl();
}
void CGSH_VulkanQt::ReleaseImpl()
{
CGSH_Vulkan::ReleaseImpl();
m_instance.vkDestroySurfaceKHR(m_instance, m_context->surface, nullptr);
}
void CGSH_VulkanQt::PresentBackbuffer()
{
}
void CGSH_VulkanQt::DisableSyncQueueSubmits()
{
#ifdef __APPLE__
auto result = VK_SUCCESS;
2020-01-31 09:34:48 -05:00
auto vkGetMoltenVKConfigurationMVK = reinterpret_cast<PFN_vkGetMoltenVKConfigurationMVK>(Framework::Vulkan::CLoader::GetInstance().GetLibraryProcAddr("vkGetMoltenVKConfigurationMVK"));
auto vkSetMoltenVKConfigurationMVK = reinterpret_cast<PFN_vkSetMoltenVKConfigurationMVK>(Framework::Vulkan::CLoader::GetInstance().GetLibraryProcAddr("vkSetMoltenVKConfigurationMVK"));
MVKConfiguration config;
size_t configSize = sizeof(MVKConfiguration);
result = vkGetMoltenVKConfigurationMVK(m_instance, &config, &configSize);
CHECKVULKANERROR(result);
2020-01-31 09:34:48 -05:00
config.synchronousQueueSubmits = VK_FALSE;
2020-01-31 09:34:48 -05:00
result = vkSetMoltenVKConfigurationMVK(m_instance, &config, &configSize);
CHECKVULKANERROR(result);
#endif
}