#ifndef GPU_H #define GPU_H #define VK_USE_PLATFORM_MACOS_MVK #include "vulkan/vulkan_core.h" #include "vk_mem_alloc.h" #define GLFW_INCLUDE_VULKAN #include #ifdef __APPLE__ #define GLFW_EXPOSE_NATIVE_COCOA #endif #include #define GLM_FORCE_RADIANS #define GLM_FORCE_DEPTH_ZERO_TO_ONE #include #include #include #include #include #include typedef struct QueueStruct { VkQueue handle; uint32_t family; uint32_t index; } Queue; VkCommandBuffer command_begin_single(VkDevice device, VkCommandPool transfer_pool); VkResult command_end_single(VkDevice device, VkCommandBuffer command_buffer, VkCommandPool transfer_pool, Queue transfer_queue); void command_copy_buffer(VkCommandBuffer command_buffer, VkBuffer src, VkBuffer dst, VkDeviceSize src_offset, VkDeviceSize dst_offset, VkDeviceSize size); VkResult command_transition_image_layout(VkDevice device, VkCommandPool transfer_pool, Queue transfer_queue, VkImageLayout old_layout, VkImageLayout new_layout, VkImage image, VkAccessFlags src_mask, VkAccessFlags dst_mask, VkPipelineStageFlags source, VkPipelineStageFlags dest, uint32_t source_family, uint32_t dest_family, VkImageAspectFlags aspect_flags); #define VK_RESULT(x) {\ result = x;\ if(result != VK_SUCCESS) {\ return x;\ }\ } extern const uint32_t MAX_FRAMES_IN_FLIGHT; extern const uint32_t WINDOW_MIN_WIDTH; extern const uint32_t WINDOW_MIN_HEIGHT; typedef struct SwapchainDetailsStruct { VkSurfaceCapabilitiesKHR capabilities; VkSurfaceFormatKHR* formats; uint32_t formats_count; VkPresentModeKHR* present_modes; uint32_t present_modes_count; } SwapchainDetails; typedef struct RenderContextStruct { VkInstance instance; VkDebugUtilsMessengerEXT debug_messenger; VkPhysicalDevice physical_device; VkPhysicalDeviceMemoryProperties memories; VkSurfaceKHR surface; Queue graphics_queue; Queue present_queue; Queue transfer_queue; VkDevice device; VmaAllocator allocator; SwapchainDetails swapchain_details; VkSurfaceFormatKHR swapchain_format; VkPresentModeKHR swapchain_present_mode; VkExtent2D swapchain_extent; VkSwapchainKHR swapchain; uint32_t swapchain_image_count; VkImage* swapchain_images; VkImageView* swapchain_image_views; VkFramebuffer* swapchain_framebuffers; VkFormat depth_format; VkImageView depth_image_view; VkImage depth_image; VmaAllocation depth_image_memory; VkCommandPool extra_graphics_pool; VkCommandPool graphics_pool; VkCommandPool transfer_pool; VkRenderPass render_pass; VkCommandBuffer* swapchain_command_buffers; VkSemaphore* image_available_semaphores; VkSemaphore* render_finished_semaphores; VkFence* in_flight_fences; uint32_t current_frame; vec2 window_scale; } RenderContext; GLFWwindow* init_window(); VkResult init_vulkan( GLFWwindow* window, RenderContext* context); VkResult create_transfer_buffer( VmaAllocator allocator, VkDeviceSize size, VkBuffer* buffer, VmaAllocation* memory, void** mapped); void destroy_transfer_buffer( VmaAllocator allocator, VkBuffer buffer, VmaAllocation memory); VkResult create_storage_buffer( VmaAllocator allocator, VkBufferUsageFlags usage, VkDeviceSize size, VkBuffer* buffer, VmaAllocation* memory); VkDeviceAddress buffer_address( VkDevice device, VkBuffer buffer); #endif