153 lines
3.4 KiB
C++
153 lines
3.4 KiB
C++
// VulkanTutorial.h: 标准系统包含文件的包含文件
|
|
// 或项目特定的包含文件。
|
|
|
|
#pragma once
|
|
|
|
|
|
#define GLFW_INCLUDE_VULKAN
|
|
#include<GLFW/glfw3.h>
|
|
|
|
#include<vulkan/vulkan.h>
|
|
#include <iostream>
|
|
#include <optional>
|
|
#include <stdexcept>
|
|
#include <functional>
|
|
#include <cstdlib>
|
|
#include <set>
|
|
|
|
#include <cstdint>
|
|
#include <limits>
|
|
#include <algorithm>
|
|
|
|
#include <fstream>
|
|
|
|
|
|
VkResult CreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,const VkAllocationCallbacks* pAllocator,VkDebugUtilsMessengerEXT* pDebugMessenger);
|
|
|
|
void DestroyDebugUtilsMessengerEXT(VkInstance instance,VkDebugUtilsMessengerEXT debugMessenger,const VkAllocationCallbacks* pAllocator);
|
|
|
|
class HelloTriangleApplication
|
|
{
|
|
public:
|
|
|
|
HelloTriangleApplication();
|
|
~HelloTriangleApplication();
|
|
void run(int Width, int Height) {
|
|
GLFWwindow* window = initWindow(Width,Height);
|
|
initVulkan();
|
|
mainLoop(window);
|
|
cleanup(window);
|
|
}
|
|
private:
|
|
|
|
GLFWwindow* window;
|
|
|
|
VkInstance instance;
|
|
|
|
VkDebugUtilsMessengerEXT debugMessenger;
|
|
|
|
VkPhysicalDevice physicalDevice = VK_NULL_HANDLE;
|
|
|
|
VkDevice device;
|
|
|
|
|
|
VkQueue graphicQueue;
|
|
VkQueue presentQueue;
|
|
|
|
VkSurfaceKHR surface;
|
|
|
|
VkSwapchainKHR swapChain;
|
|
std::vector<VkImage> swapChainImages;
|
|
VkFormat swapChainImageFormat;
|
|
VkExtent2D swapChainExtent;
|
|
|
|
std::vector<VkImageView> swapChainImageViews;
|
|
|
|
VkRenderPass renderPass;
|
|
VkPipelineLayout pipelineLayout;
|
|
|
|
VkPipeline graphicsPipeline;
|
|
|
|
struct QueueFamilyIndices
|
|
{
|
|
std::optional<uint32_t> graphicsFamily;
|
|
std::optional<uint32_t> presentFamily;
|
|
|
|
bool isComplete() {
|
|
return graphicsFamily.has_value() && presentFamily.has_value();
|
|
}
|
|
};
|
|
|
|
struct SwapChainSupportDetails
|
|
{
|
|
VkSurfaceCapabilitiesKHR capabilities;
|
|
std::vector<VkSurfaceFormatKHR> formats;
|
|
std::vector<VkPresentModeKHR> presentModes;
|
|
};
|
|
|
|
|
|
GLFWwindow* initWindow(int Width, int Height);
|
|
|
|
void createInstance();
|
|
|
|
void initVulkan();
|
|
|
|
void mainLoop(GLFWwindow* window);
|
|
|
|
void cleanup(GLFWwindow* window);
|
|
|
|
bool checkValidationLayerSupport();
|
|
|
|
std::vector<const char*> getRequiredExtensions();
|
|
|
|
void showAvailableExtension();
|
|
|
|
static VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback(
|
|
VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
|
|
VkDebugUtilsMessageTypeFlagsEXT messageTypes,
|
|
const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
|
|
void* pUserData);
|
|
|
|
void setupDebugMessenger();
|
|
void populateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& createInfo);
|
|
|
|
void createSurface();
|
|
|
|
bool checkDeviceExtensionSupport(VkPhysicalDevice device);
|
|
|
|
void pickPhysicalDevice();
|
|
bool isDeviceSuitable(VkPhysicalDevice device);
|
|
|
|
QueueFamilyIndices findQueueFamilies(VkPhysicalDevice device);
|
|
|
|
void createLogicalDevice();
|
|
|
|
SwapChainSupportDetails querySwapChainSupport(VkPhysicalDevice device);
|
|
|
|
VkSurfaceFormatKHR chooseSwapSurfaceFormat(const std::vector<VkSurfaceFormatKHR>& availableFormats);
|
|
VkPresentModeKHR chooseSwapPresentMode(const std::vector<VkPresentModeKHR>& availablePresentModes);
|
|
VkExtent2D chooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities);
|
|
void createSwapChain();
|
|
|
|
void creatImageView();
|
|
|
|
void createRenderPass();
|
|
void createGraphicPipeline();
|
|
|
|
static std::vector<char> readFile(const std::string& filename);
|
|
|
|
VkShaderModule createShaderModule(const std::vector<char> code);
|
|
|
|
};
|
|
|
|
HelloTriangleApplication::HelloTriangleApplication()
|
|
{
|
|
}
|
|
|
|
HelloTriangleApplication::~HelloTriangleApplication()
|
|
{
|
|
}
|
|
|
|
|
|
|