#pragma once #include #include "buffer_handle.h" #include "glfw/glfw_window.h" #include "precomp.h" #include "texture_handle.h" #include "vertex.h" namespace veng { struct Frame { VkSemaphore image_available_signal = VK_NULL_HANDLE; VkSemaphore render_finished_signal = VK_NULL_HANDLE; VkFence still_rendering_fence = VK_NULL_HANDLE; VkCommandBuffer command_buffer = VK_NULL_HANDLE; VkDescriptorSet uniform_set = VK_NULL_HANDLE; BufferHandle uniform_buffer; void* uniform_buffer_location; }; class Graphics final { public: Graphics(gsl::not_null window); ~Graphics(); bool BeginFrame(); void SetModelMatrix(glm::mat4 model); void SetViewProjection(glm::mat4 view, glm::mat4 projection); void SetTexture(TextureHandle handle); void RenderBuffer(BufferHandle handle, std::uint32_t vertex_count); void RenderIndexedBuffer(BufferHandle vertex_buffer, BufferHandle index_buffer, std::uint32_t count); void EndFrame(); BufferHandle CreateVertexBuffer(gsl::span vertices); BufferHandle CreateIndexBuffer(gsl::span indices); void DestroyBuffer(BufferHandle handle); TextureHandle CreateTexture(gsl::czstring path); TextureHandle CreateTexture(gsl::span image_file_data); void DestroyTexture(TextureHandle handle); private: struct QueueFamilyIndices { std::optional graphics_family = std::nullopt; std::optional presentation_family = std::nullopt; bool IsValid() const { return graphics_family.has_value() && presentation_family.has_value(); } }; struct SwapChainProperties { VkSurfaceCapabilitiesKHR capabilities = {}; std::vector formats; std::vector present_modes; bool IsValid() const { return !formats.empty() && !present_modes.empty(); } }; // 초기화 void InitializeVulkan(); void CreateInstance(); void SetupDebugMessenger(); void PickPhysicalDevice(); void CreateLogicalDeviceAndQueues(); void CreateSurface(); void CreateSwapChain(); void CreateImageViews(); void CreateRenderPass(); void CreateGraphicsPipeline(); void CreateFramebuffers(); void CreateCommandPool(); void CreateCommandBuffer(); void CreateSignals(); void CreateDescriptorSetLayouts(); void CreateDescriptorPools(); void CreateDescriptorSets(); void CreateTextureSampler(); void CreateDepthResources(); void RecreateSwapChain(); void CleanupSwapChain(); // 랜더링 void BeginCommands(); void EndCommands(); std::vector GetRequiredInstanceExtentions(); static gsl::span GetSuggestedInstanceExtentions(); static std::vector GetSupprotedInstanceExtensions(); static bool AreAllExtensionsSupported(gsl::span extensions); static std::vector GetSupprotedValidationLayers(); static bool AreAllLayersSupported(gsl::span extensions); QueueFamilyIndices FindQueueFamilies(VkPhysicalDevice device); SwapChainProperties GetSwapChainProperties(VkPhysicalDevice device); bool IsDeviceSuitable(VkPhysicalDevice device); std::vector GetAvailableDevices(); bool AreAllDeviceExtensionsSupported(VkPhysicalDevice device); std::vector GetDeviceAvailableExtensions( VkPhysicalDevice device); VkSurfaceFormatKHR ChooseSwapSurfaceFormat( gsl::span formats); VkPresentModeKHR ChooseSwapPresentMode( gsl::span present_modes); VkExtent2D ChooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities); std::uint32_t ChooseSwapImageCount( const VkSurfaceCapabilitiesKHR& capabilities); VkShaderModule CreateShaderModule(gsl::span buffer); std::uint32_t FindMemoryType(std::uint32_t type_bits_filter, VkMemoryPropertyFlags required_properties); BufferHandle CreateBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties); VkCommandBuffer BeginTransientCommandBuffer(); void EndTransientCommandBuffer(VkCommandBuffer command_buffer); void CreateUniformBuffers(); TextureHandle CreateImage(glm::ivec2 size, VkFormat image_format, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties); void TransitionImageLayout(VkImage image, VkImageLayout old_layout, VkImageLayout new_layout); void CopyBufferToImage(VkBuffer buffer, VkImage image, glm::ivec2 image_size); VkImageView CreateImageView(VkImage image, VkFormat format, VkImageAspectFlags aspect_flag); VkViewport GetViewport(); VkRect2D GetScissor(); std::array required_device_extentions_ = { VK_KHR_SWAPCHAIN_EXTENSION_NAME}; VkInstance instance_ = VK_NULL_HANDLE; VkDebugUtilsMessengerEXT debug_messenger_; VkPhysicalDevice physical_device_ = VK_NULL_HANDLE; VkDevice logical_device_ = VK_NULL_HANDLE; VkQueue graphics_queue_ = VK_NULL_HANDLE; VkQueue present_queue_ = VK_NULL_HANDLE; VkSurfaceKHR surface_ = VK_NULL_HANDLE; VkSwapchainKHR swap_chain_ = VK_NULL_HANDLE; VkSurfaceFormatKHR surface_format_; VkPresentModeKHR present_mode_; VkExtent2D extent_; std::vector swap_chain_images_; std::vector swap_chain_image_views_; std::vector swap_chain_framebuffers_; VkPipelineLayout pipeline_layout_ = VK_NULL_HANDLE; VkRenderPass render_pass_ = VK_NULL_HANDLE; VkPipeline pipeline_ = VK_NULL_HANDLE; VkDescriptorSetLayout descriptor_set_layout_ = VK_NULL_HANDLE; VkCommandPool command_pool_ = VK_NULL_HANDLE; std::uint32_t current_image_index_ = 0; VkDescriptorSetLayout uniform_set_layout_ = VK_NULL_HANDLE; VkDescriptorPool uniform_pool_ = VK_NULL_HANDLE; VkDescriptorSetLayout texture_set_layout_ = VK_NULL_HANDLE; VkDescriptorPool texture_pool_ = VK_NULL_HANDLE; VkSampler texture_sampler_ = VK_NULL_HANDLE; TextureHandle depth_texture_; std::array frames_; std::int32_t current_frame_ = 0; gsl::not_null window_; bool validation_enabled_ = false; }; VkDebugUtilsMessengerCreateInfoEXT GetCreateMessengerInfo(); bool IsExtensionSupported(gsl::span extensions, gsl::czstring name); } // namespace veng