summaryrefslogtreecommitdiff
path: root/src/vulkan.h
blob: 7a951e2413936abc07bedefb3e3e4bfef4c82831 (plain)
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 );