107 lines
4.7 KiB
C++
107 lines
4.7 KiB
C++
|
|
#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;
|
|||
|
|
}
|