mirror of https://github.com/AxioDL/boo.git
Huge Vulkan refactor
This commit is contained in:
parent
eaff1ba744
commit
721d10919b
|
@ -13,6 +13,9 @@
|
||||||
#include <queue>
|
#include <queue>
|
||||||
#include "boo/graphicsdev/VulkanDispatchTable.hpp"
|
#include "boo/graphicsdev/VulkanDispatchTable.hpp"
|
||||||
|
|
||||||
|
/* Forward-declare handle type for Vulkan Memory Allocator */
|
||||||
|
struct VmaAllocator_T;
|
||||||
|
|
||||||
namespace boo
|
namespace boo
|
||||||
{
|
{
|
||||||
struct BaseGraphicsData;
|
struct BaseGraphicsData;
|
||||||
|
@ -34,18 +37,20 @@ struct VulkanContext
|
||||||
VkPhysicalDeviceFeatures m_features;
|
VkPhysicalDeviceFeatures m_features;
|
||||||
VkPhysicalDeviceProperties m_gpuProps;
|
VkPhysicalDeviceProperties m_gpuProps;
|
||||||
VkPhysicalDeviceMemoryProperties m_memoryProperties;
|
VkPhysicalDeviceMemoryProperties m_memoryProperties;
|
||||||
VkDevice m_dev;
|
VkDevice m_dev = VK_NULL_HANDLE;
|
||||||
|
VmaAllocator_T* m_allocator = VK_NULL_HANDLE;
|
||||||
uint32_t m_queueCount;
|
uint32_t m_queueCount;
|
||||||
uint32_t m_graphicsQueueFamilyIndex = UINT32_MAX;
|
uint32_t m_graphicsQueueFamilyIndex = UINT32_MAX;
|
||||||
std::vector<VkQueueFamilyProperties> m_queueProps;
|
std::vector<VkQueueFamilyProperties> m_queueProps;
|
||||||
VkQueue m_queue = VK_NULL_HANDLE;
|
VkQueue m_queue = VK_NULL_HANDLE;
|
||||||
std::mutex m_queueLock;
|
std::mutex m_queueLock;
|
||||||
VkDescriptorSetLayout m_descSetLayout;
|
VkDescriptorSetLayout m_descSetLayout = VK_NULL_HANDLE;
|
||||||
VkPipelineLayout m_pipelinelayout;
|
VkPipelineLayout m_pipelinelayout = VK_NULL_HANDLE;
|
||||||
VkRenderPass m_pass;
|
VkDescriptorPool m_descPool = VK_NULL_HANDLE;
|
||||||
VkRenderPass m_passColorOnly;
|
VkRenderPass m_pass = VK_NULL_HANDLE;
|
||||||
VkCommandPool m_loadPool;
|
VkRenderPass m_passColorOnly = VK_NULL_HANDLE;
|
||||||
VkCommandBuffer m_loadCmdBuf;
|
VkCommandPool m_loadPool = VK_NULL_HANDLE;
|
||||||
|
VkCommandBuffer m_loadCmdBuf = VK_NULL_HANDLE;
|
||||||
VkFormat m_displayFormat;
|
VkFormat m_displayFormat;
|
||||||
VkFormat m_internalFormat;
|
VkFormat m_internalFormat;
|
||||||
|
|
||||||
|
@ -99,9 +104,10 @@ struct VulkanContext
|
||||||
|
|
||||||
std::unordered_map<uint32_t, VkSampler> m_samplers;
|
std::unordered_map<uint32_t, VkSampler> m_samplers;
|
||||||
|
|
||||||
bool initVulkan(std::string_view appName);
|
bool initVulkan(std::string_view appName, PFN_vkGetInstanceProcAddr getVkProc);
|
||||||
bool enumerateDevices();
|
bool enumerateDevices();
|
||||||
void initDevice();
|
void initDevice();
|
||||||
|
void destroyDevice();
|
||||||
void initSwapChain(Window& windowCtx, VkSurfaceKHR surface, VkFormat format, VkColorSpaceKHR colorspace);
|
void initSwapChain(Window& windowCtx, VkSurfaceKHR surface, VkFormat format, VkColorSpaceKHR colorspace);
|
||||||
|
|
||||||
struct SwapChainResize
|
struct SwapChainResize
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -370,13 +370,11 @@ public:
|
||||||
if (m_getVkProc)
|
if (m_getVkProc)
|
||||||
{
|
{
|
||||||
/* Check device support for vulkan */
|
/* Check device support for vulkan */
|
||||||
vk::init_dispatch_table_top(PFN_vkGetInstanceProcAddr(m_getVkProc));
|
|
||||||
if (g_VulkanContext.m_instance == VK_NULL_HANDLE)
|
if (g_VulkanContext.m_instance == VK_NULL_HANDLE)
|
||||||
{
|
{
|
||||||
auto appName = getUniqueName();
|
auto appName = getUniqueName();
|
||||||
if (g_VulkanContext.initVulkan(WCSTMBS(appName.data()).c_str()))
|
if (g_VulkanContext.initVulkan(WCSTMBS(appName.data()).c_str(), m_getVkProc))
|
||||||
{
|
{
|
||||||
vk::init_dispatch_table_middle(g_VulkanContext.m_instance, false);
|
|
||||||
if (g_VulkanContext.enumerateDevices())
|
if (g_VulkanContext.enumerateDevices())
|
||||||
{
|
{
|
||||||
/* Obtain DXGI Factory */
|
/* Obtain DXGI Factory */
|
||||||
|
|
|
@ -591,8 +591,6 @@ public:
|
||||||
}
|
}
|
||||||
free(supportsPresent);
|
free(supportsPresent);
|
||||||
|
|
||||||
vk::init_dispatch_table_bottom(m_ctx->m_instance, m_ctx->m_dev);
|
|
||||||
|
|
||||||
if (!vk::GetPhysicalDeviceWin32PresentationSupportKHR(m_ctx->m_gpus[0], m_ctx->m_graphicsQueueFamilyIndex))
|
if (!vk::GetPhysicalDeviceWin32PresentationSupportKHR(m_ctx->m_gpus[0], m_ctx->m_graphicsQueueFamilyIndex))
|
||||||
{
|
{
|
||||||
Log.report(logvisor::Fatal, "Win32 doesn't support vulkan present");
|
Log.report(logvisor::Fatal, "Win32 doesn't support vulkan present");
|
||||||
|
|
|
@ -538,7 +538,13 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
m_callback.appQuitting(this);
|
m_callback.appQuitting(this);
|
||||||
clientThread.join();
|
if (clientThread.joinable())
|
||||||
|
clientThread.join();
|
||||||
|
|
||||||
|
#if BOO_HAS_VULKAN
|
||||||
|
g_VulkanContext.destroyDevice();
|
||||||
|
#endif
|
||||||
|
|
||||||
return clientReturn;
|
return clientReturn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -726,11 +726,9 @@ public:
|
||||||
Log.report(logvisor::Fatal, "unable to resolve glXWaitVideoSyncSGI");
|
Log.report(logvisor::Fatal, "unable to resolve glXWaitVideoSyncSGI");
|
||||||
}
|
}
|
||||||
|
|
||||||
vk::init_dispatch_table_top(PFN_vkGetInstanceProcAddr(getVkProc));
|
|
||||||
if (m_ctx->m_instance == VK_NULL_HANDLE)
|
if (m_ctx->m_instance == VK_NULL_HANDLE)
|
||||||
m_ctx->initVulkan(APP->getUniqueName());
|
m_ctx->initVulkan(APP->getUniqueName(), PFN_vkGetInstanceProcAddr(getVkProc));
|
||||||
|
|
||||||
vk::init_dispatch_table_middle(m_ctx->m_instance, false);
|
|
||||||
if (!m_ctx->enumerateDevices())
|
if (!m_ctx->enumerateDevices())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -781,8 +779,6 @@ public:
|
||||||
}
|
}
|
||||||
free(supportsPresent);
|
free(supportsPresent);
|
||||||
|
|
||||||
vk::init_dispatch_table_bottom(m_ctx->m_instance, m_ctx->m_dev);
|
|
||||||
|
|
||||||
if (!vk::GetPhysicalDeviceXcbPresentationSupportKHR(m_ctx->m_gpus[0], m_ctx->m_graphicsQueueFamilyIndex, m_xcbConn, m_visualid))
|
if (!vk::GetPhysicalDeviceXcbPresentationSupportKHR(m_ctx->m_gpus[0], m_ctx->m_graphicsQueueFamilyIndex, m_xcbConn, m_visualid))
|
||||||
{
|
{
|
||||||
Log.report(logvisor::Fatal, "XCB visual doesn't support vulkan present");
|
Log.report(logvisor::Fatal, "XCB visual doesn't support vulkan present");
|
||||||
|
|
Loading…
Reference in New Issue