summaryrefslogtreecommitdiff
path: root/src/window.hpp
blob: 5cb346f322cfc82b4db50429fd83abac3733a312 (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
#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 struct pk_membucket *MemBkt_Vulkan;

extern bool shouldRecreateSwapchain;
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 ImplementedPipelines {
	union {
		VkDescriptorSetLayout arr[2] = { VK_NULL_HANDLE, VK_NULL_HANDLE };
		struct ImplementedPipelineLayoutsByName {
			VkDescriptorSetLayout texture;
			VkDescriptorSetLayout glyph;
		} named;
	} descr_layouts;
	union {
		VkPipelineLayout arr[2] = { VK_NULL_HANDLE, VK_NULL_HANDLE };
		struct ImplementedPipelineLayoutsByName {
			VkPipelineLayout texture;
			VkPipelineLayout glyph;
		} named;
	} pipe_layouts;
	union {
		VkPipeline arr[3] = { VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE };
		struct ImplementedPipelinesByName {
			VkPipeline texture;
			VkPipeline texture_wireframe;
			VkPipeline glyph;
		} named;
	} pipelines;
};
extern ImplementedPipelines pkePipelines;

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

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

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);
void PKVK_EndBuffer(PKVK_TmpBufferDetails &tmpBufferDetails);

#endif /* PKE_WINDOW_HPP */