diff options
Diffstat (limited to 'src/vulkan.h')
| -rw-r--r-- | src/vulkan.h | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/src/vulkan.h b/src/vulkan.h new file mode 100644 index 0000000..7a951e2 --- /dev/null +++ b/src/vulkan.h @@ -0,0 +1,134 @@ +#pragma once +#include <vulkan/vulkan.h> +#include <pthread.h> + +#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 ); |
