#pragma once #include #include #include "gauges.h" #include "overlay.h" #define MAX_INSTANCES 4 #define MAX_DEVICES 4 #define MAX_QUEUES 16 #define MAX_SWAPS 8 #define MAX_IMAGES 8 #define MAX_WAIT_SEMS 16 #define GET_KEY( x ) ( *(void **)( x ) ) struct INSTANCE_DATA { void *key; VkInstance instance; PFN_vkGetInstanceProcAddr gipa; PFN_vkDestroyInstance destroy_instance; PFN_vkGetPhysicalDeviceMemoryProperties get_memory_properties; PFN_vkGetPhysicalDeviceQueueFamilyProperties get_queue_family_properties; }; struct SWAP_DATA { VkSwapchainKHR sc; VkFormat fmt; VkExtent2D extent; U32 nimages; U8 frames_ready; U8 broken; VkImage imgs[MAX_IMAGES]; VkImageView views[MAX_IMAGES]; VkFramebuffer fbs[MAX_IMAGES]; VkCommandBuffer cbs[MAX_IMAGES]; VkSemaphore sems[MAX_IMAGES]; VkFence fences[MAX_IMAGES]; VkBuffer vbufs[MAX_IMAGES]; VkDeviceMemory vmems[MAX_IMAGES]; void *vmaps[MAX_IMAGES]; VkRenderPass rp; VkShaderModule vs, fs; VkPipelineLayout pl; VkPipeline pipe; VkCommandPool pool; }; struct DEVICE_DATA { void *key; VkDevice dev; VkPhysicalDevice phys; INSTANCE_DATA *inst; PFN_vkGetDeviceProcAddr gdpa; PFN_vkDestroyDevice destroy_device; PFN_vkGetDeviceQueue get_device_queue; PFN_vkGetDeviceQueue2 get_device_queue2; PFN_vkCreateSwapchainKHR create_swapchain; PFN_vkDestroySwapchainKHR destroy_swapchain; PFN_vkGetSwapchainImagesKHR get_swapchain_images; PFN_vkQueuePresentKHR queue_present; PFN_vkQueueSubmit queue_submit; PFN_vkDeviceWaitIdle device_wait_idle; PFN_vkCreateImageView create_image_view; PFN_vkDestroyImageView destroy_image_view; PFN_vkCreateRenderPass create_render_pass; PFN_vkDestroyRenderPass destroy_render_pass; PFN_vkCreateFramebuffer create_framebuffer; PFN_vkDestroyFramebuffer destroy_framebuffer; PFN_vkCreateShaderModule create_shader_module; PFN_vkDestroyShaderModule destroy_shader_module; PFN_vkCreatePipelineLayout create_pipeline_layout; PFN_vkDestroyPipelineLayout destroy_pipeline_layout; PFN_vkCreateGraphicsPipelines create_graphics_pipelines; PFN_vkDestroyPipeline destroy_pipeline; PFN_vkCreateCommandPool create_command_pool; PFN_vkDestroyCommandPool destroy_command_pool; PFN_vkAllocateCommandBuffers allocate_command_buffers; PFN_vkBeginCommandBuffer begin_command_buffer; PFN_vkEndCommandBuffer end_command_buffer; PFN_vkCmdBeginRenderPass cmd_begin_render_pass; PFN_vkCmdEndRenderPass cmd_end_render_pass; PFN_vkCmdBindPipeline cmd_bind_pipeline; PFN_vkCmdBindVertexBuffers cmd_bind_vertex_buffers; PFN_vkCmdPushConstants cmd_push_constants; PFN_vkCmdSetViewport cmd_set_viewport; PFN_vkCmdSetScissor cmd_set_scissor; PFN_vkCmdDraw cmd_draw; PFN_vkCreateSemaphore create_semaphore; PFN_vkDestroySemaphore destroy_semaphore; PFN_vkCreateFence create_fence; PFN_vkDestroyFence destroy_fence; PFN_vkWaitForFences wait_for_fences; PFN_vkResetFences reset_fences; PFN_vkCreateBuffer create_buffer; PFN_vkDestroyBuffer destroy_buffer; PFN_vkGetBufferMemoryRequirements get_buffer_memory_requirements; PFN_vkAllocateMemory allocate_memory; PFN_vkFreeMemory free_memory; PFN_vkBindBufferMemory bind_buffer_memory; PFN_vkMapMemory map_memory; PFN_vkUnmapMemory unmap_memory; U8 warned_family; struct { VkQueue q; U32 family; } queues[MAX_QUEUES]; I32 nqueues; SWAP_DATA *swaps[MAX_SWAPS]; UDP_LISTENER udp; GAUGE_RENDERER gauge; OVERLAY_DATA* overlay; }; extern pthread_mutex_t g_lock; INSTANCE_DATA *vk_instance_register( VkInstance inst, PFN_vkGetInstanceProcAddr gipa ); void vk_instance_forget( VkInstance inst ); INSTANCE_DATA *vk_find_instance( void *key ); void vk_device_register( DEVICE_DATA *d ); void vk_device_unregister( DEVICE_DATA *d ); DEVICE_DATA *vk_find_device( void *key ); void vk_device_add_queue( DEVICE_DATA *d, VkQueue q, U32 family ); SWAP_DATA *vk_find_swap( DEVICE_DATA *d, VkSwapchainKHR sc ); void vk_resolve_device_procs( DEVICE_DATA *d, VkDevice dev, PFN_vkGetDeviceProcAddr gdpa ); SWAP_DATA *vk_swap_create( DEVICE_DATA *d, VkSwapchainKHR sc, const VkSwapchainCreateInfoKHR *ci ); void vk_swap_forget( DEVICE_DATA *d, VkSwapchainKHR sc ); void vk_swap_destroy( DEVICE_DATA *d, SWAP_DATA *s ); STAT vk_swap_setup_frames( DEVICE_DATA *d, SWAP_DATA *s, VkQueue q ); VkResult vk_present( DEVICE_DATA *d, SWAP_DATA *s, VkQueue q, const VkPresentInfoKHR *pi ); void vk_draw( DEVICE_DATA *d, SWAP_DATA *s, U32 idx );