2019-09-12 15:28:40 -04:00
|
|
|
#include "GSH_VulkanQt.h"
|
2019-10-09 08:25:05 -04:00
|
|
|
#include "vulkan/StructDefs.h"
|
2020-01-29 12:55:41 -05:00
|
|
|
#include "vulkan/Loader.h"
|
2019-09-12 15:28:40 -04:00
|
|
|
#include <QWindow>
|
|
|
|
|
2020-01-29 12:55:41 -05:00
|
|
|
#ifdef __APPLE__
|
|
|
|
#include <MoltenVK/vk_mvk_moltenvk.h>
|
|
|
|
#endif
|
|
|
|
|
2020-02-03 13:11:28 -05:00
|
|
|
#ifdef __linux__
|
|
|
|
#include <QX11Info>
|
|
|
|
#endif
|
|
|
|
|
2019-09-12 15:28:40 -04:00
|
|
|
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()
|
|
|
|
{
|
2019-10-09 08:25:05 -04:00
|
|
|
auto instanceCreateInfo = Framework::Vulkan::InstanceCreateInfo();
|
2019-09-26 13:39:27 -04:00
|
|
|
|
2019-10-09 08:25:05 -04:00
|
|
|
std::vector<const char*> extensions;
|
|
|
|
extensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
|
|
|
|
#ifdef _WIN32
|
|
|
|
extensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
|
|
|
|
#endif
|
|
|
|
#ifdef __APPLE__
|
|
|
|
extensions.push_back(VK_MVK_MACOS_SURFACE_EXTENSION_NAME);
|
2019-09-15 12:33:41 -04:00
|
|
|
#endif
|
2020-01-31 13:27:48 -05:00
|
|
|
#ifdef __linux__
|
|
|
|
extensions.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
|
|
|
|
#endif
|
2019-09-15 12:33:41 -04:00
|
|
|
|
2019-10-09 08:25:05 -04:00
|
|
|
std::vector<const char*> layers;
|
2019-12-19 17:46:59 -05:00
|
|
|
#if defined(_DEBUG) && !defined(__APPLE__)
|
2019-10-09 08:25:05 -04:00
|
|
|
layers.push_back("VK_LAYER_LUNARG_standard_validation");
|
|
|
|
#endif
|
2019-09-12 15:28:40 -04:00
|
|
|
|
2019-10-09 08:25:05 -04:00
|
|
|
auto appInfo = Framework::Vulkan::ApplicationInfo();
|
|
|
|
appInfo.pApplicationName = "Play!";
|
2019-12-13 23:21:59 -05:00
|
|
|
appInfo.pEngineName = "Play!";
|
2019-12-20 20:06:49 -05:00
|
|
|
#ifdef __APPLE__
|
|
|
|
//MoltenVK requires version to be 1.0.x
|
2019-12-19 18:59:24 -05:00
|
|
|
appInfo.apiVersion = VK_MAKE_VERSION(1, 0, 0);
|
2019-12-20 20:06:49 -05:00
|
|
|
#else
|
|
|
|
appInfo.apiVersion = VK_MAKE_VERSION(1, 1, 0);
|
|
|
|
#endif
|
2019-09-12 15:28:40 -04:00
|
|
|
|
2019-12-13 23:21:59 -05:00
|
|
|
instanceCreateInfo.pApplicationInfo = &appInfo;
|
|
|
|
instanceCreateInfo.enabledExtensionCount = extensions.size();
|
2019-10-09 08:25:05 -04:00
|
|
|
instanceCreateInfo.ppEnabledExtensionNames = extensions.data();
|
2019-12-13 23:21:59 -05:00
|
|
|
instanceCreateInfo.enabledLayerCount = layers.size();
|
|
|
|
instanceCreateInfo.ppEnabledLayerNames = layers.data();
|
2019-10-09 08:25:05 -04:00
|
|
|
m_instance = Framework::Vulkan::CInstance(instanceCreateInfo);
|
2019-12-13 23:21:59 -05:00
|
|
|
|
2019-10-09 08:25:05 -04: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
|
2019-09-12 15:28:40 -04:00
|
|
|
|
2019-10-09 08:25:05 -04:00
|
|
|
#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
|
|
|
|
2020-01-29 12:55:41 -05:00
|
|
|
DisableSyncQueueSubmits();
|
2019-09-26 13:39:27 -04:00
|
|
|
#endif
|
2020-02-04 09:29:13 -05:00
|
|
|
|
2020-01-31 13:27:48 -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());
|
2020-01-31 13:27:48 -05:00
|
|
|
surfaceCreateInfo.connection = QX11Info::connection();
|
|
|
|
auto result = m_instance.vkCreateXcbSurfaceKHR(m_instance, &surfaceCreateInfo, nullptr, &m_context->surface);
|
|
|
|
CHECKVULKANERROR(result);
|
|
|
|
#endif
|
2019-10-09 08:25:05 -04:00
|
|
|
|
2019-09-12 15:28:40 -04:00
|
|
|
CGSH_Vulkan::InitializeImpl();
|
|
|
|
}
|
|
|
|
|
|
|
|
void CGSH_VulkanQt::ReleaseImpl()
|
|
|
|
{
|
|
|
|
CGSH_Vulkan::ReleaseImpl();
|
2019-10-09 08:25:05 -04:00
|
|
|
m_instance.vkDestroySurfaceKHR(m_instance, m_context->surface, nullptr);
|
2019-09-12 15:28:40 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void CGSH_VulkanQt::PresentBackbuffer()
|
|
|
|
{
|
|
|
|
}
|
2020-01-29 12:55:41 -05:00
|
|
|
|
|
|
|
void CGSH_VulkanQt::DisableSyncQueueSubmits()
|
|
|
|
{
|
|
|
|
#ifdef __APPLE__
|
|
|
|
auto result = VK_SUCCESS;
|
2020-01-31 09:34:48 -05:00
|
|
|
|
2020-01-29 12:55:41 -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
|
|
|
|
2020-01-29 12:55:41 -05:00
|
|
|
config.synchronousQueueSubmits = VK_FALSE;
|
2020-01-31 09:34:48 -05:00
|
|
|
|
2020-01-29 12:55:41 -05:00
|
|
|
result = vkSetMoltenVKConfigurationMVK(m_instance, &config, &configSize);
|
|
|
|
CHECKVULKANERROR(result);
|
|
|
|
#endif
|
|
|
|
}
|