2019-09-12 15:28:40 -04:00
|
|
|
#include "GSH_VulkanQt.h"
|
|
|
|
#include <QWindow>
|
|
|
|
#include <QVulkanInstance>
|
|
|
|
|
|
|
|
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-09-26 13:39:27 -04:00
|
|
|
#ifdef USE_MACOS_MOLTENVK
|
|
|
|
|
|
|
|
//Initialize for macOS
|
|
|
|
VkInstanceCreateInfo info = {};
|
|
|
|
const char* extensions[] = { VK_KHR_SURFACE_EXTENSION_NAME, VK_MVK_MACOS_SURFACE_EXTENSION_NAME };
|
|
|
|
info.enabledExtensionCount = 2;
|
|
|
|
info.ppEnabledExtensionNames = extensions;
|
|
|
|
m_instance = Framework::Vulkan::CInstance(info);
|
2019-09-12 15:28:40 -04:00
|
|
|
|
2019-09-26 13:39:27 -04:00
|
|
|
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);
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
//Generic initialization
|
|
|
|
m_qtVulkanInstance = new QVulkanInstance();
|
|
|
|
|
2019-09-15 12:33:41 -04:00
|
|
|
#ifdef _DEBUG
|
|
|
|
m_qtVulkanInstance->setLayers(QByteArrayList()
|
|
|
|
<< "VK_LAYER_LUNARG_standard_validation"
|
|
|
|
<< "VK_LAYER_GOOGLE_threading"
|
|
|
|
<< "VK_LAYER_LUNARG_param_checker"
|
|
|
|
<< "VK_LAYER_LUNARG_object_tracker");
|
|
|
|
#endif
|
|
|
|
|
2019-09-12 15:28:40 -04:00
|
|
|
bool succeeded = m_qtVulkanInstance->create();
|
|
|
|
Q_ASSERT(succeeded);
|
|
|
|
|
|
|
|
m_renderWindow->setVulkanInstance(m_qtVulkanInstance);
|
|
|
|
|
2019-09-12 17:17:10 -04:00
|
|
|
m_instance = Framework::Vulkan::CInstance(m_qtVulkanInstance->vkInstance());
|
2019-09-21 18:41:41 -04:00
|
|
|
m_context->surface = m_qtVulkanInstance->surfaceForWindow(m_renderWindow);
|
2019-09-12 15:28:40 -04:00
|
|
|
|
2019-09-26 13:39:27 -04:00
|
|
|
#endif
|
|
|
|
|
2019-09-12 15:28:40 -04:00
|
|
|
CGSH_Vulkan::InitializeImpl();
|
|
|
|
}
|
|
|
|
|
|
|
|
void CGSH_VulkanQt::ReleaseImpl()
|
|
|
|
{
|
|
|
|
CGSH_Vulkan::ReleaseImpl();
|
2019-09-27 08:33:25 -04:00
|
|
|
#ifdef USE_GENERIC_QTVULKAN
|
2019-09-12 15:28:40 -04:00
|
|
|
delete m_qtVulkanInstance;
|
2019-09-26 13:39:27 -04:00
|
|
|
#endif
|
2019-09-12 15:28:40 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void CGSH_VulkanQt::PresentBackbuffer()
|
|
|
|
{
|
|
|
|
if(m_renderWindow->isExposed())
|
|
|
|
{
|
2019-09-27 08:33:25 -04:00
|
|
|
#ifdef USE_GENERIC_QTVULKAN
|
2019-09-12 15:28:40 -04:00
|
|
|
m_qtVulkanInstance->presentQueued(m_renderWindow);
|
2019-09-26 13:39:27 -04:00
|
|
|
#endif
|
2019-09-12 15:28:40 -04:00
|
|
|
}
|
|
|
|
}
|