summaryrefslogtreecommitdiff
path: root/src/vulkan.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/vulkan.h')
-rw-r--r--src/vulkan.h134
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 );