zvulkan/vulkanLearn/src/main.cpp

107 lines
4.7 KiB
C++
Raw Normal View History

2023-09-17 21:01:13 +08:00
#include "external/vulkan.h"
#include "com/Window.h"
#include "01 Instance and Devices/03 Connecting with a Vulkan Loader library.h"
#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 <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>
#include <02 Image Presentation/07 Selecting a number of swapchain images.h>
#include <02 Image Presentation/08 Choosing a size of swapchain images.h>
#include <02 Image Presentation/09 Selecting desired usage scenarios of swapchain images.h>
#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>
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() {
//<2F><><EFBFBD><EFBFBD>dll
LIBRARY_TYPE vulkan_library;
ConnectWithVulkanLoaderLibrary(vulkan_library);
//<2F><><EFBFBD><EFBFBD>vulkan<61>ӿ<EFBFBD>
LoadFunctionExportedFromVulkanLoaderLibrary(vulkan_library);
//<2F><><EFBFBD><EFBFBD>vulkan<61>ӿڣ<D3BF><DAA3><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD>ֺ<EFBFBD><D6BA><EFBFBD>ָ<EFBFBD><D6B8>
LoadGlobalLevelFunctions();
{
//<2F><><EFBFBD><EFBFBD>ȫ<EFBFBD>ֺ<EFBFBD><D6BA><EFBFBD>ָ<EFBFBD><EFBFBD><EBA3AC><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD>չ
std::vector<VkExtensionProperties> available_extensions;
CheckAvailableInstanceExtensions(available_extensions);
}
std::vector<char const*> desired_extensions;
char* application_name = "hello world";
VkInstance instance;
CreateVulkanInstanceWithWsiExtensionsEnabled(desired_extensions, application_name, instance);
//<2F><><EFBFBD><EFBFBD>vulkan<61>ӿڣ<D3BF><DAA3><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
LoadInstanceLevelFunctions(instance, desired_extensions);
//<2F><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>ӿڣ<D3BF><DAA3><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
std::vector<VkPhysicalDevice> available_devices;
EnumerateAvailablePhysicalDevices(instance, available_devices);
VkPhysicalDevice physical_device = available_devices[0];
//<2F><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>ӿڣ<D3BF><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD><DFBC><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD>Ҽ<EFBFBD><D2BC><EFBFBD><EFBFBD>Ƿ<EFBFBD>֧<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
VkDevice logical_device;
std::vector< QueueInfo > queue_infos;
VkPhysicalDeviceFeatures desired_features;
CreateLogicalDeviceWithWsiExtensionsEnabled(physical_device, queue_infos, desired_extensions, &desired_features, logical_device);
WindowParameters&& window_parameters = createWindow();
VkSurfaceKHR presentation_surface;
//<2F><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>ӿڣ<D3BF><DAA3><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>Ӧ<EFBFBD><D3A6>չ
CreatePresentationSurface(instance, window_parameters, presentation_surface);
//<2F><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>ӿڣ<D3BF>Ѱ<EFBFBD><D1B0>֧<EFBFBD><D6A7><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>ʾ<EFBFBD>豸ͨ<E8B1B8>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint32_t queue_family_index;
SelectQueueFamilyThatSupportsPresentationToGivenSurface(physical_device, presentation_surface, queue_family_index);
//<2F><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>ӿڣ<D3BF><DAA3><EFBFBD>ѯͼ<D1AF><CDBC><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>ʾģʽ
VkPresentModeKHR desired_present_mode{}, present_mode{};
SelectDesiredPresentationMode(physical_device, presentation_surface, desired_present_mode, present_mode);
//<2F><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>ӿڣ<D3BF><DAA3><EFBFBD>ѯͼ<D1AF><CDBC><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
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);
VkSurfaceTransformFlagBitsKHR desired_transform{}, surface_transform;
SelectTransformationOfSwapchainImages(surface_capabilities, desired_transform, 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);
return 1;
}