1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
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 );
|