]> git.tdb.fi Git - libs/gui.git/commitdiff
Add VulkanContext implementation for Windows
authorMikko Rasa <tdb@tdb.fi>
Sat, 4 May 2024 16:42:14 +0000 (19:42 +0300)
committerMikko Rasa <tdb@tdb.fi>
Sat, 4 May 2024 16:42:14 +0000 (19:42 +0300)
Build
source/graphics/vkwin32/vulkancontext.cpp [new file with mode: 0644]
source/graphics/vkwin32/vulkancontext_platform.h [new file with mode: 0644]

diff --git a/Build b/Build
index 848b24041cfc3a456e5bffd7c4175a7f58d2c7cc..05bd094ca2b6ac6451234f52bb47be11210c6cda 100644 (file)
--- a/Build
+++ b/Build
@@ -150,6 +150,10 @@ package "mspgui"
                        {
                                overlay "wgl";
                        };
+                       if_feature "vulkan"
+                       {
+                               overlay "vkwin32";
+                       };
                };
                if_arch "darwin"
                {
diff --git a/source/graphics/vkwin32/vulkancontext.cpp b/source/graphics/vkwin32/vulkancontext.cpp
new file mode 100644 (file)
index 0000000..60361bc
--- /dev/null
@@ -0,0 +1,37 @@
+#include "vulkancontext.h"
+#include <msp/core/application.h>
+#include "vulkancontext_private.h"
+#include "display_private.h"
+#include "window_private.h"
+
+namespace Msp {
+namespace Graphics {
+
+void VulkanContext::add_platform_extensions(std::vector<const char *> &extensions) const
+{
+       extensions.push_back("VK_KHR_win32_surface");
+}
+
+void VulkanContext::init_platform_functions()
+{
+       VulkanFunctions &f = priv->functions;
+
+       f.vkCreateWin32Surface = get_function<PFN_vkCreateWin32SurfaceKHR>("vkCreateWin32SurfaceKHR");
+}
+
+void VulkanContext::init_surface()
+{
+       const VulkanFunctions &f = priv->functions;
+
+       VkWin32SurfaceCreateInfoKHR surface_create_info = { };
+       surface_create_info.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;
+       surface_create_info.hinstance = static_cast<HINSTANCE>(Application::get_data());
+       surface_create_info.hwnd = window.get_private().window;
+
+       VkResult result = f.vkCreateWin32Surface(priv->instance, &surface_create_info, nullptr, &priv->surface);
+       if(result!=VK_SUCCESS)
+               throw vulkan_error(result, "vkCreateWin32Surface");
+}
+
+} // namespace Graphics
+} // namespace Msp
diff --git a/source/graphics/vkwin32/vulkancontext_platform.h b/source/graphics/vkwin32/vulkancontext_platform.h
new file mode 100644 (file)
index 0000000..b3a82c0
--- /dev/null
@@ -0,0 +1,20 @@
+#ifndef MSP_GRAPHICS_VULKANCONTEXT_PLATFORM_H_
+#define MSP_GRAPHICS_VULKANCONTEXT_PLATFORM_H_
+
+#define VK_USE_PLATFORM_WIN32_KHR
+#define WIN32_LEAN_AND_MEAN
+#define NOMINMAX
+#include <vulkan/vulkan.h>
+
+namespace Msp {
+namespace Graphics {
+
+struct VulkanPlatformFunctions
+{
+       PFN_vkCreateWin32SurfaceKHR vkCreateWin32Surface = nullptr;
+};
+
+} // namespace Graphics
+} // namespace Msp
+
+#endif