From 1b5f373f8e913aa948ef0964d26a0082e6563f0a Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Thu, 2 May 2024 00:09:00 +0200 Subject: Vulkan surface creation & present queue selection --- deimos/core/base.h | 3 +++ deimos/core/os.h | 5 +++++ deimos/core/os_win32.cpp | 18 ++++++++++++++++-- deimos/vulkan/vulkan_instance_functions.inc | 6 +++++- 4 files changed, 29 insertions(+), 3 deletions(-) (limited to 'deimos') diff --git a/deimos/core/base.h b/deimos/core/base.h index 34a341f..0c15ccd 100644 --- a/deimos/core/base.h +++ b/deimos/core/base.h @@ -1,5 +1,8 @@ #pragma once +// @Todo Add some compile-time config stuff +#define DEIMOS_OS_WIN32 1 // NOLINT + #include "deimos/core/std.h" #include "deimos/core/gsl.h" diff --git a/deimos/core/os.h b/deimos/core/os.h index c440555..d310185 100644 --- a/deimos/core/os.h +++ b/deimos/core/os.h @@ -64,6 +64,11 @@ public: virtual void Update(OsWindow*) = 0; virtual bool QuitRequested(const OsWindow*) = 0; + +#if DEIMOS_OS_WIN32 + virtual void* Win32Hwnd(const OsWindow*) = 0; + virtual void* Win32Hinstance(const OsWindow*) = 0; +#endif }; class OsApi diff --git a/deimos/core/os_win32.cpp b/deimos/core/os_win32.cpp index e80a1d5..84fc3a3 100644 --- a/deimos/core/os_win32.cpp +++ b/deimos/core/os_win32.cpp @@ -95,6 +95,7 @@ class Win32WindowApiImpl : public OsWindowApi { static constexpr wchar_t kClassName[] = L"Deimos window class"; + HINSTANCE m_hinstance; Allocator* m_allocator; bool m_class_registered = false; @@ -134,7 +135,7 @@ class Win32WindowApiImpl : public OsWindowApi WNDCLASSW wnd_class{}; wnd_class.lpfnWndProc = WindowProc; - wnd_class.hInstance = ::GetModuleHandleW(nullptr); + wnd_class.hInstance = m_hinstance; wnd_class.lpszClassName = kClassName; ::RegisterClassW(&wnd_class); @@ -144,6 +145,7 @@ class Win32WindowApiImpl : public OsWindowApi public: explicit Win32WindowApiImpl(Allocator* allocator) : + m_hinstance{::GetModuleHandleW(nullptr)}, m_allocator{allocator} {} @@ -163,7 +165,7 @@ public: HWND hwnd = ::CreateWindowExW( 0, kClassName, title_w, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, width, height, - nullptr, nullptr, ::GetModuleHandle(nullptr), window); + nullptr, nullptr, m_hinstance, window); if (hwnd == nullptr) { @@ -192,6 +194,18 @@ public: { return window->quit_requested; } + +#if DEIMOS_OS_WIN32 + void* Win32Hwnd(const OsWindow* window) override + { + return std::bit_cast(window->hwnd); + } + + void* Win32Hinstance(const OsWindow*) override + { + return std::bit_cast(m_hinstance); + } +#endif }; class Win32OsApiImpl : public OsApi diff --git a/deimos/vulkan/vulkan_instance_functions.inc b/deimos/vulkan/vulkan_instance_functions.inc index 48daf68..0a46455 100644 --- a/deimos/vulkan/vulkan_instance_functions.inc +++ b/deimos/vulkan/vulkan_instance_functions.inc @@ -2,8 +2,12 @@ FN(EnumeratePhysicalDevices) FN(GetPhysicalDeviceProperties2) FN(GetPhysicalDeviceQueueFamilyProperties) -FN(GetPhysicalDeviceWin32PresentationSupportKHR) FN(DestroyInstance) + FN(CreateDevice) FN(GetDeviceProcAddr) + +FN(CreateWin32SurfaceKHR) +FN(DestroySurfaceKHR) +FN(GetPhysicalDeviceSurfaceSupportKHR) // NOLINTEND -- cgit