summaryrefslogtreecommitdiff
path: root/include/render/renderer.h
blob: bae799d584adec91944e1219d22ecc91478a2db4 (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 _RENDER_H_
#define _RENDER_H_

#include <vulkan/vulkan.h>
#include <sys/types.h>
#include "render/window.h"
#include "render/buffer.h"
#include "render/shader.h"
#include "render/mesh.h"

#define MAX_FRAMES 2

struct image {
	VkImage image;
	VkDeviceMemory memory;
	VkImageView view;
};

struct renderer {
	struct window *win;
	VkInstance instance;
	VkSurfaceKHR surface;

	struct {
		uint32_t cap, len;
		struct phy_gpu {
			VkPhysicalDevice gpu;
			size_t graphics_queue;
			size_t present_queue;
			struct surface_caps {
				VkSurfaceCapabilitiesKHR caps;
				struct {
					uint32_t len;
					VkSurfaceFormatKHR *data;
				} formats;
				struct {
					uint32_t len;
					VkPresentModeKHR *data;
				} present_modes;
			} surface_caps;
		} *gpus;
		struct phy_gpu *chosen;
	} phy_gpus;

	struct {
		VkDevice device;
		VkQueue gfx_queue;
		VkQueue present_queue;
	} gpu;

	struct {
		VkSwapchainKHR swapchain;
		VkFormat format;
		VkExtent2D extent;
		struct {
			uint32_t len;
			struct {
				VkImage image;
				VkImageView view;
				VkFramebuffer framebuffer;
			} *data;
		} images;
	} swapchain;

	VkRenderPass render_pass;

	struct {
		VkCommandPool pool;
		VkCommandBuffer buffers[MAX_FRAMES];
	} command;

	struct {
		VkPipelineLayout layout;
		VkPipeline gfx;
	} pipeline;

	struct {
		VkSemaphore image_available[MAX_FRAMES];
		VkSemaphore render_finished[MAX_FRAMES];
		VkFence in_flight[MAX_FRAMES];
	} locks;

	struct {
		VkDescriptorSetLayout layout;
		VkDescriptorPool pool;
		VkDescriptorSet sets[MAX_FRAMES];
	} descriptor;

	struct image depth;
	struct {
		struct buffer buffer;
		void *data;
	} uniform[MAX_FRAMES];

	VkSampler sampler;
	VkSampleCountFlagBits msaa_samples;

	uint32_t mip_levels;
	uint32_t current_frame;
};

struct renderer *renderer_init(struct window *win);
void renderer_destroy(struct renderer *ren);
void renderer_draw(struct renderer *ren, size_t mesh_count, struct mesh meshes[mesh_count]);
void renderer_resize(struct renderer *ren);

#endif