From 84062873e162bc4a7c799fb67f72dbd055eb15ca Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Wed, 1 May 2024 01:23:05 +0200 Subject: Some work on WSI --- main/main.cpp | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) (limited to 'main/main.cpp') 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 #include #include +#include #include #include @@ -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 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 FindQueueFamily(VulkanApi* vk, VkPhysicalDevice device) +StatusOr 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(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 FindQueueFamily(VulkanApi* vk, VkPhysicalDevice device) return InternalError("Couldn't find a suitable queue"); } -StatusOr CreateDevice(VulkanApi* vk, VkPhysicalDevice gpu, uint32_t queue_family) +StatusOr CreateDevice(VulkanApi* vk, VkPhysicalDevice physical_device, uint32_t queue_family) { const float queue_priority = 1.0F; @@ -135,7 +141,7 @@ StatusOr 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(); temp_api = api_registry->Get(); + os_api = api_registry->Get(); + 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