From bf28340899c7dab1fbc94370a007ff875b6a35b8 Mon Sep 17 00:00:00 2001 From: ouczbs Date: Sat, 13 Jan 2024 11:07:01 +0800 Subject: [PATCH] upload 03 --- vulkanLearn/src/main.cpp | 193 +++++++++++++++++++++++++++++---------- 1 file changed, 144 insertions(+), 49 deletions(-) diff --git a/vulkanLearn/src/main.cpp b/vulkanLearn/src/main.cpp index aef317c..abecb6c 100644 --- a/vulkanLearn/src/main.cpp +++ b/vulkanLearn/src/main.cpp @@ -4,11 +4,19 @@ #include "01 Instance and Devices/05 Loading function exported from a Vulkan Loader library.h" #include "01 Instance and Devices/06 Loading global-level functions.h" #include "01 Instance and Devices/07 Checking available Instance extensions.h" -#include "02 Image Presentation/02 Creating a presentation surface.h" -#include "02 Image Presentation/01 Creating a Vulkan Instance with WSI extensions enabled.h" -#include "02 Image Presentation/03 Selecting a queue family that supports presentation to a given surface.h" -#include <01 Instance and Devices/10 Enumerating available physical devices.h> #include <01 Instance and Devices/09 Loading instance-level functions.h> +#include <01 Instance and Devices/10 Enumerating available physical devices.h> +#include <01 Instance and Devices/12 Getting features and properties of a physical device.h> +#include <01 Instance and Devices/14 Selecting index of a queue family with desired capabilities.h> +#include <01 Instance and Devices/16 Loading device-level functions.h> +#include <01 Instance and Devices/17 Getting a device queue.h> +#include <01 Instance and Devices/19 Destroying a logical device.h> +#include <01 Instance and Devices/20 Destroying a Vulkan Instance.h> +#include <01 Instance and Devices/21 Releasing a Vulkan Loader library.h> + +#include "02 Image Presentation/01 Creating a Vulkan Instance with WSI extensions enabled.h" +#include "02 Image Presentation/02 Creating a presentation surface.h" +#include "02 Image Presentation/03 Selecting a queue family that supports presentation to a given surface.h" #include <02 Image Presentation/04 Creating a logical device with WSI extensions enabled.h> #include <02 Image Presentation/05 Selecting a desired presentation mode.h> #include <02 Image Presentation/06 Getting capabilities of a presentation surface.h> @@ -18,90 +26,177 @@ #include <02 Image Presentation/10 Selecting a transformation of swapchain images.h> #include <02 Image Presentation/11 Selecting a format of swapchain images.h> #include <02 Image Presentation/12 Creating a swapchain.h> - +#include <02 Image Presentation/13 Getting handles of swapchain images.h> +#include <02 Image Presentation/14 Creating a swapchain with R8G8B8A8 format and a MAILBOX present mode.h> +#include <02 Image Presentation/15 Acquiring a swapchain image.h> +#include <02 Image Presentation/16 Presenting an image.h> +#include <02 Image Presentation/17 Destroying a swapchain.h> +#include <02 Image Presentation/18 Destroying a presentation surface.h> +#include <03 Command Buffers and Synchronization/07 Creating a semaphore.h> +#include <03 Command Buffers and Synchronization/08 Creating a fence.h> +#include <03 Command Buffers and Synchronization/01 Creating a command pool.h> +#include <03 Command Buffers and Synchronization/02 Allocating command buffers.h> +#include <03 Command Buffers and Synchronization/03 Beginning a command buffer recording operation.h> +#include <03 Command Buffers and Synchronization/04 Ending a command buffer recording operation.h> +#include <03 Command Buffers and Synchronization/05 Resetting a command buffer.h> +#include <03 Command Buffers and Synchronization/06 Resetting a command pool.h> using namespace VulkanCookbook; -WindowParameters createWindow() { - WindowParameters window_parameters{}; - const char* name = "hello window"; - window_parameters.HInstance = WindowClass::GetInstance(); - // create window & get hWnd - auto hWnd = CreateWindow( - WindowClass::GetName(), name, - WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU, - CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, - nullptr, nullptr, WindowClass::GetInstance(), nullptr - ); - window_parameters.HWnd = hWnd; - return window_parameters; -} int main() { - //加载dll + //鍔犺浇dll LIBRARY_TYPE vulkan_library; ConnectWithVulkanLoaderLibrary(vulkan_library); - //加载vulkan接口 + //鍔犺浇vulkan鎺ュ彛 LoadFunctionExportedFromVulkanLoaderLibrary(vulkan_library); - //调用vulkan接口,加载全局函数指针 + //璋冪敤vulkan鎺ュ彛锛屽姞杞藉叏灞鍑芥暟鎸囬拡 LoadGlobalLevelFunctions(); { - //调用全局函数指针,检查实例扩展 + //璋冪敤鍏ㄥ眬鍑芥暟鎸囬拡锛屾鏌ュ疄渚嬫墿灞 std::vector available_extensions; CheckAvailableInstanceExtensions(available_extensions); } + //璋冪敤鍏ㄥ眬鎺ュ彛锛屽垱寤哄疄渚 std::vector desired_extensions; char* application_name = "hello world"; VkInstance instance; - CreateVulkanInstanceWithWsiExtensionsEnabled(desired_extensions, application_name, instance); + CreateVulkanInstanceWithWsiExtensionsEnabled(desired_extensions, application_name, instance); - //调用vulkan接口,加载实例函数指针 + //璋冪敤vulkan鎺ュ彛锛屽姞杞藉疄渚嬪嚱鏁版寚閽 LoadInstanceLevelFunctions(instance, desired_extensions); - //调用实例接口,获取物理设备列表 + //璋冪敤瀹炰緥鎺ュ彛锛岃幏鍙栫墿鐞嗚澶囧垪琛 std::vector available_devices; EnumerateAvailablePhysicalDevices(instance, available_devices); VkPhysicalDevice physical_device = available_devices[0]; - //调用实例接口,创建逻辑设备,并且检查是否支持交换链 - VkDevice logical_device; - std::vector< QueueInfo > queue_infos; - VkPhysicalDeviceFeatures desired_features; - CreateLogicalDeviceWithWsiExtensionsEnabled(physical_device, queue_infos, desired_extensions, &desired_features, logical_device); + //璋冪敤瀹炰緥鎺ュ彛锛屾鏌ョ墿鐞嗚澶囧姛鑳 + VkPhysicalDeviceFeatures device_features; + VkPhysicalDeviceProperties device_properties; + GetFeaturesAndPropertiesOfPhysicalDevice(physical_device, device_features, device_properties); + + //璋冪敤瀹炰緥鎺ュ彛锛岃幏鍙栧懡浠ら槦鍒椾俊鎭 + uint32_t graphics_queue_family_index, compute_queue_family_index; + SelectIndexOfQueueFamilyWithDesiredCapabilities(physical_device, VK_QUEUE_GRAPHICS_BIT, graphics_queue_family_index); + SelectIndexOfQueueFamilyWithDesiredCapabilities(physical_device, VK_QUEUE_COMPUTE_BIT, compute_queue_family_index); + + std::vector requested_queues = { { graphics_queue_family_index, { 1.0f } } }; + if (graphics_queue_family_index != compute_queue_family_index) { + requested_queues.push_back({ compute_queue_family_index, { 1.0f } }); + } + //璋冪敤瀹炰緥鎺ュ彛锛屽垱寤洪昏緫璁惧锛屽苟涓旀鏌ユ槸鍚︽敮鎸佷氦鎹㈤摼 + VkDevice logical_device; + desired_extensions.clear(); + CreateLogicalDeviceWithWsiExtensionsEnabled(physical_device, requested_queues, desired_extensions, &device_features, logical_device); + + //璋冪敤vulkan鎺ュ彛锛屽姞杞借澶囧嚱鏁版寚閽 + LoadDeviceLevelFunctions(logical_device, desired_extensions); + + //鍒涘缓绐楀彛 + Window* pWnd; + WindowParameters window_parameters{}; + pWnd = new Window(600, 800, "hello Window"); + window_parameters.HWnd = pWnd->GetHWnd(); + window_parameters.HInstance = Window::WindowClass::GetInstance(); - WindowParameters&& window_parameters = createWindow(); VkSurfaceKHR presentation_surface; - //调用实例接口,创建图像显示设备,需要传递窗口,并启用对应扩展 + //璋冪敤瀹炰緥鎺ュ彛锛屽垱寤哄浘鍍忔樉绀鸿澶囷紝闇瑕佷紶閫掔獥鍙,骞跺惎鐢ㄥ搴旀墿灞 CreatePresentationSurface(instance, window_parameters, presentation_surface); - //调用实例接口,寻找支持与图像显示设备通信的命令队列 + //璋冪敤瀹炰緥鎺ュ彛锛屽鎵炬敮鎸佷笌鍥惧儚鏄剧ず璁惧閫氫俊鐨勫懡浠ら槦鍒 uint32_t queue_family_index; SelectQueueFamilyThatSupportsPresentationToGivenSurface(physical_device, presentation_surface, queue_family_index); - - //调用实例接口,查询图像显示设备的显示模式 - VkPresentModeKHR desired_present_mode{}, present_mode{}; - SelectDesiredPresentationMode(physical_device, presentation_surface, desired_present_mode, present_mode); - - //调用实例接口,查询图像显示设备的显示能力 + + //璋冪敤瀹炰緥鎺ュ彛锛屾煡璇㈠浘鍍忔樉绀鸿澶囩殑鏄剧ず妯″紡 + VkPresentModeKHR present_mode; + SelectDesiredPresentationMode(physical_device, presentation_surface, VK_PRESENT_MODE_MAILBOX_KHR, present_mode); + + //璋冪敤瀹炰緥鎺ュ彛锛屾煡璇㈠浘鍍忔樉绀鸿澶囩殑鏄剧ず鑳藉姏 VkSurfaceCapabilitiesKHR surface_capabilities; GetCapabilitiesOfPresentationSurface(physical_device, presentation_surface, surface_capabilities); - + //鑾峰彇浜ゆ崲閾惧浘鐗囨暟閲 uint32_t number_of_images; SelectNumberOfSwapchainImages(surface_capabilities, number_of_images); - + //鑾峰彇浜ゆ崲閾惧浘鐗囧昂瀵 VkExtent2D size_of_images; ChooseSizeOfSwapchainImages(surface_capabilities, size_of_images); - VkImageUsageFlags desired_usages{}, image_usage; - SelectDesiredUsageScenariosOfSwapchainImages(surface_capabilities, desired_usages, image_usage); + //閫夋嫨浜ゆ崲閾惧浘鍍忕殑浣跨敤鍦烘櫙锛氭覆鏌撶洰鏍囥佹繁搴︽ā鏉 + VkImageUsageFlags image_usage; + SelectDesiredUsageScenariosOfSwapchainImages(surface_capabilities, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, image_usage); - VkSurfaceTransformFlagBitsKHR desired_transform{}, surface_transform; - SelectTransformationOfSwapchainImages(surface_capabilities, desired_transform, surface_transform); + //閫夋嫨浜ゆ崲閾惧湪灞忓箷涓婄殑绌洪棿鍙樻崲 + VkSurfaceTransformFlagBitsKHR surface_transform; + SelectTransformationOfSwapchainImages(surface_capabilities, VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR, surface_transform); + //閫夋嫨浜ゆ崲閾惧浘鍍忕殑鏍煎紡涓庨鑹茬┖闂 VkFormat image_format; VkColorSpaceKHR image_color_space; - VkSurfaceFormatKHR desired_surface_format{}; - SelectFormatOfSwapchainImages(physical_device, presentation_surface, desired_surface_format, image_format, image_color_space); - + SelectFormatOfSwapchainImages(physical_device, presentation_surface, { VK_FORMAT_B8G8R8A8_UNORM, VK_COLOR_SPACE_SRGB_NONLINEAR_KHR }, + image_format, image_color_space); + + //璋冪敤璁惧鎺ュ彛锛屽垱寤轰氦鎹㈤摼 + VkSwapchainKHR old_swapchain = VK_NULL_HANDLE, swapchain; + CreateSwapchain(logical_device, presentation_surface, number_of_images, { image_format, image_color_space }, size_of_images + , image_usage, surface_transform, present_mode, old_swapchain, swapchain); + + //璋冪敤璁惧鎺ュ彛锛岃幏鍙栦氦鎹㈤摼鍥惧儚鍙ユ焺 + std::vector swapchain_images; + GetHandlesOfSwapchainImages(logical_device, swapchain, swapchain_images); + + //鍒涘缓鎸囧畾鏍煎紡鐨勪氦鎹㈤摼 + old_swapchain = swapchain; + CreateSwapchainWithR8G8B8A8FormatAndMailboxPresentMode(physical_device, presentation_surface, logical_device + , image_usage, size_of_images, image_format, old_swapchain, swapchain, swapchain_images); + + //璋冪敤璁惧鎺ュ彛锛屽垱寤哄洿鏍忥紝鐢ㄤ簬鍚屾鍛戒护 + VkFence fence; + CreateFence(logical_device, false, fence); + + //璋冪敤璁惧鎺ュ彛锛岃幏鍙栧綋鍓嶄氦鎹㈤摼鍥惧儚缂栧彿 + uint32_t image_index; + AcquireSwapchainImage(logical_device, swapchain, nullptr, fence, image_index); + + //璋冪敤璁惧鎺ュ彛锛岃幏鍙栧懡浠ら槦鍒 + VkQueue graphics_queue, compute_queue; + GetDeviceQueue(logical_device, graphics_queue_family_index, 0, graphics_queue); + GetDeviceQueue(logical_device, compute_queue_family_index, 0, compute_queue); + + VkCommandPool command_pool; + CreateCommandPool(logical_device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queue_family_index, command_pool); + + std::vector command_buffers; + AllocateCommandBuffers(logical_device, command_pool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, 10 , command_buffers); + + BeginCommandBufferRecordingOperation(command_buffers[0], VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, nullptr); + + EndCommandBufferRecordingOperation(command_buffers[0]); + + ResetCommandBuffer(command_buffers[0], false); + + ResetCommandPool(logical_device, command_pool, false); + + VkSemaphore semaphore; + VulkanCookbook::CreateSemaphore(logical_device, semaphore); + + //鏄剧ず鍥惧儚 + std::vector rendering_semaphores; + std::vector images_to_present; + PresentImage(graphics_queue, rendering_semaphores, images_to_present); + + + + //璋冪敤璁惧鎺ュ彛锛岄攢姣佷氦鎹㈤摼 + DestroySwapchain(logical_device, swapchain); + //璋冪敤瀹炰緥鎺ュ彛,閿姣佹樉绀烘洸闈紙灞忓箷锛 + DestroyPresentationSurface(instance, presentation_surface); + + //璋冪敤璁惧鎺ュ彛锛岄攢姣侀昏緫璁惧 + DestroyLogicalDevice(logical_device); + //璋冪敤瀹炰緥鎺ュ彛锛岄攢姣乿ulkan瀹炰緥1 + DestroyVulkanInstance(instance); + //璋冪敤绯荤粺鎺ュ彛锛岄攢姣乨ll + ReleaseVulkanLoaderLibrary(vulkan_library); return 1; } \ No newline at end of file