-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathcommon.hpp
135 lines (114 loc) · 4.61 KB
/
common.hpp
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
/*
* Some defines, functions, structs, and a helper class that are used commonly throughout the project
* */
#ifndef COMMON_H
#define COMMON_H
#include <QDebug>
#include <QFile>
#include <QMessageBox>
#include <cstring>
#include "BUILD_OPTIONS.h"
#include "platform.hpp"
// Readability defines
#define VERTEX_BUFFER_BIND_ID 0
#define INSTANCE_BUFFER_BIND_ID 1
// Debug functions
#define HANDLE_VK_RESULT(result) \
VulkanHandleResult((result), # result, __LINE__, __FILE__);
void VulkanHandleResult(VkResult result, const char *argument, size_t line, const char *file);
#define VERIFY_FUNCTION_POINTER(function_ptr) \
if (function_ptr == nullptr) \
{ \
QString msg = "Line " + QString::number(__LINE__) + " (" + __FILE__ + ") Invalid function pointer (" + QString(# function_ptr) + ")"; \
qFatal(msg.toStdString().c_str()); \
}
VKAPI_ATTR VkBool32 VKAPI_CALL VulkanDebugReportCallback(
VkDebugReportFlagsEXT flags,
VkDebugReportObjectTypeEXT objectType,
uint64_t object,
size_t location,
int32_t messageCode,
const char *pLayerPrefix,
const char *pMessage,
void *pUserData);
// Helper class
class VulkanHelper
{
public:
VulkanHelper(VkPhysicalDevice physicalDevice,
VkDevice device,
VkPhysicalDeviceMemoryProperties physicalDeviceMemoryProperties);
void createBuffer(VkBufferUsageFlags usageFlags,
VkMemoryPropertyFlags memoryPropertyFlags,
VkDeviceSize size,
void *data,
VkBuffer *buffer,
VkDeviceMemory *memory);
void createBuffer(VkBufferUsageFlags usageFlags,
VkMemoryPropertyFlags memoryPropertyFlags,
VkDeviceSize size,
void *data,
VkBuffer *buffer,
VkDeviceMemory *memory,
VkDescriptorBufferInfo *descriptor)
{
createBuffer(usageFlags, memoryPropertyFlags, size, data, buffer, memory);
descriptor->offset = 0;
descriptor->buffer = *buffer;
descriptor->range = size;
}
void createBuffer(VkBufferUsageFlags usageFlags,
VkDeviceSize size,
void *data,
VkBuffer *buffer,
VkDeviceMemory *memory,
VkDescriptorBufferInfo *descriptor)
{
createBuffer(usageFlags, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, size, data, buffer, memory);
descriptor->offset = 0;
descriptor->buffer = *buffer;
descriptor->range = size;
}
uint32_t memoryTypeIndex(uint32_t typeBits, VkFlags properties);
VkShaderModule createVulkanShaderModule(QString path);
void destroyVulkanShaderModule(VkShaderModule& shader_module);
private:
VkPhysicalDevice physicalDevice;
VkDevice device;
VkPhysicalDeviceMemoryProperties physicalDeviceMemoryProperties;
};
// Convenience structs
struct StandaloneImage
{
VkImage image;
VkDeviceMemory mem;
VkImageView view;
};
struct VertexCollection
{
VkBuffer buffer;
VkDeviceMemory memory;
VkPipelineVertexInputStateCreateInfo inputState;
std::vector<VkVertexInputBindingDescription> bindingDescriptions;
std::vector<VkVertexInputAttributeDescription> attributeDescriptions;
};
struct IndexCollection
{
VkBuffer buffer;
VkDeviceMemory memory;
int count;
};
struct UniformData
{
VkBuffer buffer;
VkDeviceMemory memory;
VkDescriptorBufferInfo descriptor;
void *mapped = nullptr;
};
struct ViewMatrixCollection
{
float projectionMatrix[16];
float modelMatrix[16];
float viewMatrix[16];
};
#endif // COMMON_H