#pragma once #include "AppBase.h" #include #include struct Texture { VkSampler sampler; VkImage image; VkImageLayout image_layout; VkDeviceMemory device_memory; VkImageView view; uint32_t width, height; uint32_t mip_levels; }; class Application : public AppBase { public: virtual void initVulkan(); void initWindow(); void createSurface(); void mainLoop(); virtual void cleanup(); void createImageViews(); void createFramebuffers(); void createCommandPool(); void createCommandBuffer(); void createLogicalDevice(); void createSwapChain(); void createPipelineLayout(); void createGraphicsPipeline(); void createRenderPass(); void recordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex); void createSyncObjects(); void drawFrame(); virtual void render(VkCommandBuffer commandBuffer); virtual bool isInited() { return inited; } void processWithVulkan(uint8_t* data, int width, int height, int rowStride, size_t dataSize, Texture& out_texture, bool srgb); protected: VkPhysicalDevice physicalDevice = VK_NULL_HANDLE; // 物理设备 VkDevice device; // 逻辑设备 VkQueue graphicsQueue; // 图形队列 VkSurfaceKHR surface; // 窗口表面 VkSwapchainKHR swapChain; // 交换链 std::vector swapChainImages; // 交换链图像 VkFormat swapChainImageFormat; // 交换链图像格式 VkExtent2D swapChainExtent; // 交换链图像分辨率 std::vector swapChainImageViews; // 交换链图像视图 VkRenderPass renderPass; // 渲染流程 VkPipelineLayout pipelineLayout; // 管线布局 VkPipeline graphicsPipeline; // 图形管线 std::vector swapChainFramebuffers; // 帧缓冲区 VkQueue presentQueue; // 呈现队列 VkCommandPool commandPool; std::vector commandBuffers; std::vector imageAvailableSemaphores; // 每个交换链图像一个 std::vector renderFinishedSemaphores; // 每个交换链图像一个 std::vector inFlightFences; // 每个帧在飞行一个 std::vector imagesInFlight; // 跟踪每个图像的使用状态 int currentFrame = 0; int MAX_FRAMES_IN_FLIGHT = 2; bool inited = false; protected: Texture loadTexture(std::string path, Texture& tex, bool srgb); uint32_t findMemoryType(VkPhysicalDevice physicalDevice, uint32_t typeFilter, VkMemoryPropertyFlags properties); void createTexture(VkDevice device, VkPhysicalDevice physicalDevice, int width, int height, Texture& texture, bool srgb); void updateTexture(VkDevice device, VkPhysicalDevice physicalDevice, VkCommandPool commandPool, VkQueue queue, uint8_t* data, int width, int height, int rowStride, size_t dataSize, Texture& texture); VkCommandBuffer beginSingleTimeCommands(VkDevice device, VkCommandPool commandPool); void endSingleTimeCommands(VkDevice device, VkCommandPool commandPool, VkQueue queue, VkCommandBuffer commandBuffer); void transitionImageLayout(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout oldLayout, VkImageLayout newLayout); void destroy_texture(Texture texture); std::mutex mtx; };