summaryrefslogtreecommitdiff
path: root/src/window.hpp
blob: 38449988da96593351967727f0e20b8f7f6a5b50 (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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#ifndef PKE_WINDOW_HPP
#define PKE_WINDOW_HPP

#include "asset-manager.hpp"
#include "window-types.hpp"
#include "pk.h"
#include "vendor-glm-include.hpp"

#include <GLFW/glfw3.h>
#include <vulkan/vulkan.h>

// TODO replace me with something more elegant
extern uint32_t swapchainLength;
extern uint32_t prevSwapchainLength;

extern struct pk_membucket *MemBkt_Vulkan;

extern bool shouldRecreateSwapchain;
extern pk_ev_mgr_id_T pke_ev_mgr_id_window;
extern pk_ev_id_T pke_ev_id_framebuffer_length_changed;

extern GLFWwindow *window;
extern GLFWmonitor *monitor;
extern GLFWvidmode vidMode;
extern VkInstance vkInstance;
extern VkPhysicalDevice vkPhysicalDevice;
extern VkPhysicalDeviceProperties vkPhysicalDeviceProperties;
extern VkSurfaceKHR vkSurfaceKHR;
extern VkFormat depthFormat;
extern VkDevice vkDevice;
extern VkAllocationCallbacks *vkAllocator;
extern unsigned int graphicsFamilyIndex;
extern unsigned int presentFamilyIndex;
extern unsigned int transferFamilyIndex;
extern VkRenderPass presentRenderPass;
extern VkRenderPass renderRenderPass;
extern VkSampler global_sampler;
extern VkSampleCountFlagBits global_sample_count;

struct UniformBufferObject {
	glm::mat4 model;
	glm::mat4 view;
	glm::mat4 proj;
};
extern UniformBufferObject UBO;
extern VkBuffer *UniformBuffers;

extern VkExtent2D Extent;

struct DebugHitbox {
	VkImage vkImage = VK_NULL_HANDLE;
	VkImageView vkImageView = VK_NULL_HANDLE;
	VkDeviceMemory textureMemory = VK_NULL_HANDLE;
	VkDeviceMemory vertBufferMemory = VK_NULL_HANDLE;
	VkBuffer vertexBuffer;
	VkBuffer normalsBuffer;
	VkBuffer uvBuffer;
	VkBuffer indexBuffer;
	VkBuffer instanceBuffer = VK_NULL_HANDLE;
	uint32_t indexCount = 0;
	uint32_t instanceCount = 1;
	uint32_t instanceStartingIndex = 0;
	VkDescriptorPool vkDescriptorPool;
	VkDescriptorSet *vkDescriptorSets = nullptr;
};
extern DebugHitbox pkeDebugHitbox;
struct ImplementedPKVK {
	struct ImplementedDescrSetLayouts {
		struct ImplementedDescrSetLayoutsByName {
			// 0 bindings
			VkDescriptorSetLayout base;
			// 1 binding, texture sampler
			VkDescriptorSetLayout txtr;
			// 2 bindings, ubo + texture sampler
			VkDescriptorSetLayout ubo_txtr;
		} named;
	} descr_layouts;
	struct ImplementedPipelineLayouts {
		struct ImplementedPipelineLayoutsByName {
			VkPipelineLayout base;
			VkPipelineLayout txtr;
			VkPipelineLayout ubo_txtr;
		} named;
	} pipe_layouts;
	struct ImplementedPipelines {
		struct ImplementedPipelinesByName {
			VkPipeline entity_standard;
			VkPipeline entity_wireframe;
			VkPipeline font_glyph;
			VkPipeline ui_base;
			VkPipeline ui_txtr;
		} named;
	} pipelines;
};
extern ImplementedPKVK pkePipelines;

void CreateWindow(PKEWindowProperties wp);
void DestroyWindow();
VkShaderModule UploadShader(AssetHandle handle);
void window_tick_late(double delta);
void Render();

unsigned int FindMemoryTypeIndex(uint32_t typeFilter, VkMemoryPropertyFlags memPropertyFlags);
void CalculateCombinedMemReqs(uint64_t memReqsCount, VkMemoryRequirements *memReqs, VkMemoryRequirements &combinedMemReqs);

enum PKVK_TmpBufferFlags : uint8_t {
	PKVK_TmpBufferFlags_NONE       = 0,
	PKVK_TmpBufferFlags_MAP_MEMORY = 1,
	PKVK_TmpBufferFlags_ALL        = 0xFF,
};
struct PKVK_TmpBufferDetails {
	VkQueue queue = VK_NULL_HANDLE;
	VkCommandBuffer cmdBuffer = VK_NULL_HANDLE;
	VkBuffer buffer = VK_NULL_HANDLE;
	VkDeviceMemory deviceMemory = VK_NULL_HANDLE;
	void *deviceData = nullptr;
};
void PKVK_BeginBuffer(unsigned int family_index, VkDeviceSize requestedMemorySize, PKVK_TmpBufferDetails &tmpBufferDetails, PKVK_TmpBufferFlags flags = PKVK_TmpBufferFlags_ALL);
void PKVK_EndBuffer(PKVK_TmpBufferDetails &tmpBufferDetails, PKVK_TmpBufferFlags flags = PKVK_TmpBufferFlags_ALL);

#define PKVK_BUFFER_CREATE_DATA_ARR_MAX_LENGTH 8

struct pkvk_buffer_create_data {
	uint32_t buffer_byte_length[PKVK_BUFFER_CREATE_DATA_ARR_MAX_LENGTH];
	void *src_data[PKVK_BUFFER_CREATE_DATA_ARR_MAX_LENGTH];
	uint8_t n_buffers;
	uint8_t index_index;
	uint8_t index_instance;
};
struct pkvk_buffer_create_data_out {
	VkBuffer buffers[PKVK_BUFFER_CREATE_DATA_ARR_MAX_LENGTH];
	VkDeviceMemory device_memory_vertex;
	VkDeviceMemory device_memory_instance;
	VkMemoryRequirements memory_requirements_vertex;
	VkMemoryRequirements memory_requirements_instance;
};
// creates vertex and instance buffers + memory + bind
// DOES upload vertex data
// DOES NOT upload instance data
void pkvk_buffer_create(pkvk_buffer_create_data *data, pkvk_buffer_create_data_out *out);

#define PKVK_TEXTURE_UPLOAD_ARR_MAX_LENGTH 8

struct pkvk_texture_upload_data {
	const Asset *texture_assets[PKVK_TEXTURE_UPLOAD_ARR_MAX_LENGTH];
	uint8_t      n_textures;
};
struct pkvk_texture_upload_data_out {
	VkImage        images[PKVK_TEXTURE_UPLOAD_ARR_MAX_LENGTH];
	VkImageView    image_views[PKVK_TEXTURE_UPLOAD_ARR_MAX_LENGTH];
	VkDeviceMemory device_memory;
};
void pkvk_texture_upload(pkvk_texture_upload_data *data, pkvk_texture_upload_data_out *out);
void pkvk_texture_upload_array(pkvk_texture_upload_data *data, pkvk_texture_upload_data_out *out);

void pkvk_queue_vk_image_view_destroy(VkImageView image_view);
void pkvk_queue_vk_image_destroy(VkImage image);
void pkvk_queue_vk_buffer_destroy(VkBuffer buffer);
void pkvk_queue_vk_memory_free(VkDeviceMemory memory);
void pkvk_queue_vk_descriptor_pool_destroy(VkDescriptorPool descriptor_pool);

#endif /* PKE_WINDOW_HPP */