From 84062873e162bc4a7c799fb67f72dbd055eb15ca Mon Sep 17 00:00:00 2001
From: Steven Le Rouzic <steven.lerouzic@gmail.com>
Date: Wed, 1 May 2024 01:23:05 +0200
Subject: Some work on WSI

---
 main/BUILD    |  3 +++
 main/main.cpp | 36 +++++++++++++++++++++++++++---------
 2 files changed, 30 insertions(+), 9 deletions(-)

(limited to 'main')

diff --git a/main/BUILD b/main/BUILD
index 8e77f54..f9e432c 100644
--- a/main/BUILD
+++ b/main/BUILD
@@ -3,6 +3,9 @@ cc_binary(
     srcs = [
         "main.cpp",
     ],
+    linkopts = [
+        "User32.lib",
+    ],
     deps = [
         "//deimos/vulkan",
         "//deimos/core",
diff --git a/main/main.cpp b/main/main.cpp
index e740c36..938d225 100644
--- a/main/main.cpp
+++ b/main/main.cpp
@@ -1,6 +1,7 @@
 #include <deimos/core/api_registry.h>
 #include <deimos/core/log.h>
 #include <deimos/core/temp_allocator.h>
+#include <deimos/core/os.h>
 #include <deimos/core/status.h>
 #include <deimos/vulkan/vulkan.h>
 
@@ -8,6 +9,7 @@ using namespace deimos;
 
 static LogApi* log_api;
 static TempAllocatorApi* temp_api;
+static OsApi* os_api;
 
 static const VkAllocationCallbacks* kVkAlloc = nullptr;
 
@@ -73,29 +75,33 @@ StatusOr<VkPhysicalDevice> FindPhysicalDevice(VulkanApi* vk, VkInstance instance
     vk->EnumeratePhysicalDevices(instance, &physical_device_count, devices.data());
 
     // @Todo Physical device selection
+    // In fact, FindQueueFamily should be done here.
     return devices[0];
 }
 
-StatusOr<uint32_t> FindQueueFamily(VulkanApi* vk, VkPhysicalDevice device)
+StatusOr<uint32_t> FindQueueFamily(VulkanApi* vk, VkPhysicalDevice physical_device)
 {
     auto temp_alloc = temp_api->Acquire();
 
     uint32_t queue_family_count = 0;
-    vk->GetPhysicalDeviceQueueFamilyProperties(device, &queue_family_count, nullptr);
+    vk->GetPhysicalDeviceQueueFamilyProperties(physical_device, &queue_family_count, nullptr);
     if (queue_family_count == 0)
     {
-        return InternalError("No queue on this physical device??");
+        return InternalError("No queue on this physical device");
     }
 
     log_api->LogInfo("Physical device has $ queue families", queue_family_count);
 
     auto queue_families = temp_alloc.allocator().NewArray<VkQueueFamilyProperties>(queue_family_count);
-    vk->GetPhysicalDeviceQueueFamilyProperties(device, &queue_family_count, queue_families.data());
+    vk->GetPhysicalDeviceQueueFamilyProperties(physical_device, &queue_family_count, queue_families.data());
 
     for (uint32_t index = 0; index < queue_family_count; ++index)
     {
         const auto& prps = queue_families[index];
-        if ((prps.queueFlags & VK_QUEUE_GRAPHICS_BIT) != 0 && (prps.queueFlags & VK_QUEUE_COMPUTE_BIT) != 0)
+
+        bool supports_graphics_compute = (prps.queueFlags & VK_QUEUE_GRAPHICS_BIT) != 0 && (prps.queueFlags & VK_QUEUE_COMPUTE_BIT) != 0;
+        bool supports_presentation = vk->GetPhysicalDeviceWin32PresentationSupportKHR(physical_device, index) == VK_TRUE;
+        if (supports_graphics_compute && supports_presentation)
         {
             return index;
         }
@@ -104,7 +110,7 @@ StatusOr<uint32_t> FindQueueFamily(VulkanApi* vk, VkPhysicalDevice device)
     return InternalError("Couldn't find a suitable queue");
 }
 
-StatusOr<VkDevice> CreateDevice(VulkanApi* vk, VkPhysicalDevice gpu, uint32_t queue_family)
+StatusOr<VkDevice> CreateDevice(VulkanApi* vk, VkPhysicalDevice physical_device, uint32_t queue_family)
 {
     const float queue_priority = 1.0F;
     
@@ -135,7 +141,7 @@ StatusOr<VkDevice> CreateDevice(VulkanApi* vk, VkPhysicalDevice gpu, uint32_t qu
     };
 
     VkDevice device = VK_NULL_HANDLE;
-    VkResult res = vk->CreateDevice(gpu, &create_info, kVkAlloc, &device);
+    VkResult res = vk->CreateDevice(physical_device, &create_info, kVkAlloc, &device);
     if (res != VK_SUCCESS)
     {
         return InternalError("vkCreateDeviceFailed");
@@ -168,7 +174,6 @@ Status InitializeVulkan(ApiRegistry* api_registry)
     }
 
     {
-        
         VkPhysicalDeviceVulkan12Properties prps12{};
         prps12.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES;
         prps12.pNext = nullptr;
@@ -215,14 +220,27 @@ int main(int /* argc */, char* /* argv */[])
     auto* api_registry = InitializeGlobalApiRegistry();
     log_api = api_registry->Get<LogApi>();
     temp_api = api_registry->Get<TempAllocatorApi>();
+    os_api = api_registry->Get<OsApi>();
+    
     log_api->LogInfo("Base APIs registered");
 
+    OsWindowHandle* window{};
+    {
+        auto s = os_api->window->Create("Deimos", 1280, 720);
+        if (!s.ok())
+        {
+            log_api->LogError("Window error: $", s);
+            return 1;
+        }
+        window = s.value();
+    }
+
     const Status s = InitializeVulkan(api_registry);
     if (!s.ok())
     {
         log_api->LogError("Vulkan initializaiton error: $", s);
+        return 1;
     }
-
 
     log_api->LogInfo("OK");
 
-- 
cgit