forked from DerRM/VulkanRaytracingProceduralGeometry
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvulkanhelper.hxx
189 lines (171 loc) · 6.62 KB
/
vulkanhelper.hxx
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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
#ifndef VULKANHELPER_HXX
#define VULKANHELPER_HXX
#define VK_NO_PROTOTYPES
#define VK_ENABLE_BETA_EXTENSIONS
#include <vulkan/vulkan.h>
#define VK_CHECK(func) \
do { \
VkResult res = (func); \
if (res != VK_SUCCESS) { \
printf("function %s failed with %d\n", #func, res); \
} \
} while(0)
#define EXTERN_VK_FUNCTION(name) \
extern PFN_##name name
/*
* Vulkan 1.2 Core functions
*/
EXTERN_VK_FUNCTION(vkGetInstanceProcAddr);
EXTERN_VK_FUNCTION(vkGetPhysicalDeviceMemoryProperties);
EXTERN_VK_FUNCTION(vkGetDeviceProcAddr);
EXTERN_VK_FUNCTION(vkCreateShaderModule);
EXTERN_VK_FUNCTION(vkMapMemory);
EXTERN_VK_FUNCTION(vkUnmapMemory);
EXTERN_VK_FUNCTION(vkCreateImage);
EXTERN_VK_FUNCTION(vkGetImageMemoryRequirements);
EXTERN_VK_FUNCTION(vkAllocateMemory);
EXTERN_VK_FUNCTION(vkBindImageMemory);
EXTERN_VK_FUNCTION(vkCreateImageView);
EXTERN_VK_FUNCTION(vkAllocateCommandBuffers);
EXTERN_VK_FUNCTION(vkBeginCommandBuffer);
EXTERN_VK_FUNCTION(vkUpdateDescriptorSets);
EXTERN_VK_FUNCTION(vkCmdPipelineBarrier);
EXTERN_VK_FUNCTION(vkEndCommandBuffer);
EXTERN_VK_FUNCTION(vkQueueSubmit);
EXTERN_VK_FUNCTION(vkQueueWaitIdle);
EXTERN_VK_FUNCTION(vkFreeCommandBuffers);
EXTERN_VK_FUNCTION(vkCreateBuffer);
EXTERN_VK_FUNCTION(vkGetBufferMemoryRequirements);
EXTERN_VK_FUNCTION(vkBindBufferMemory);
EXTERN_VK_FUNCTION(vkEnumerateInstanceLayerProperties);
EXTERN_VK_FUNCTION(vkEnumerateInstanceExtensionProperties);
EXTERN_VK_FUNCTION(vkCreateInstance);
EXTERN_VK_FUNCTION(vkEnumeratePhysicalDevices);
EXTERN_VK_FUNCTION(vkEnumerateDeviceLayerProperties);
EXTERN_VK_FUNCTION(vkEnumerateDeviceExtensionProperties);
EXTERN_VK_FUNCTION(vkGetPhysicalDeviceQueueFamilyProperties);
EXTERN_VK_FUNCTION(vkGetPhysicalDeviceFeatures);
EXTERN_VK_FUNCTION(vkGetPhysicalDeviceFeatures2);
EXTERN_VK_FUNCTION(vkCreateDevice);
EXTERN_VK_FUNCTION(vkGetDeviceQueue);
EXTERN_VK_FUNCTION(vkCreateCommandPool);
EXTERN_VK_FUNCTION(vkCreateDescriptorPool);
EXTERN_VK_FUNCTION(vkGetPhysicalDeviceProperties);
EXTERN_VK_FUNCTION(vkGetPhysicalDeviceProperties2);
EXTERN_VK_FUNCTION(vkCreateDescriptorSetLayout);
EXTERN_VK_FUNCTION(vkAllocateDescriptorSets);
EXTERN_VK_FUNCTION(vkCreatePipelineLayout);
EXTERN_VK_FUNCTION(vkCreateRenderPass);
EXTERN_VK_FUNCTION(vkCreateFramebuffer);
EXTERN_VK_FUNCTION(vkCmdBindPipeline);
EXTERN_VK_FUNCTION(vkCmdBindDescriptorSets);
EXTERN_VK_FUNCTION(vkCmdCopyImage);
EXTERN_VK_FUNCTION(vkCreateSemaphore);
EXTERN_VK_FUNCTION(vkCreateFence);
EXTERN_VK_FUNCTION(vkWaitForFences);
EXTERN_VK_FUNCTION(vkResetFences);
EXTERN_VK_FUNCTION(vkGetBufferDeviceAddress);
EXTERN_VK_FUNCTION(vkDestroyFence);
/*
* Vulkan WSI functions
*/
#ifdef VK_USE_PLATFORM_WIN32_KHR
EXTERN_VK_FUNCTION(vkCreateWin32SurfaceKHR);
#endif
#ifdef VK_USE_PLATFORM_XCB_KHR
EXTERN_VK_FUNCTION(vkCreateXcbSurfaceKHR);
#endif
/*
* Vulkan Surface extension functions
*/
EXTERN_VK_FUNCTION(vkGetPhysicalDeviceSurfaceSupportKHR);
EXTERN_VK_FUNCTION(vkGetPhysicalDeviceSurfaceFormatsKHR);
EXTERN_VK_FUNCTION(vkGetPhysicalDeviceSurfaceCapabilitiesKHR);
EXTERN_VK_FUNCTION(vkGetPhysicalDeviceSurfacePresentModesKHR);
EXTERN_VK_FUNCTION(vkCreateSwapchainKHR);
EXTERN_VK_FUNCTION(vkGetSwapchainImagesKHR);
EXTERN_VK_FUNCTION(vkAcquireNextImageKHR);
EXTERN_VK_FUNCTION(vkQueuePresentKHR);
/*
* Vulkan NVIDIA Raytracing extension functions
*/
EXTERN_VK_FUNCTION(vkCreateAccelerationStructureNV);
EXTERN_VK_FUNCTION(vkDestroyAccelerationStructureNV);
EXTERN_VK_FUNCTION(vkGetAccelerationStructureMemoryRequirementsNV);
EXTERN_VK_FUNCTION(vkBindAccelerationStructureMemoryNV);
EXTERN_VK_FUNCTION(vkCmdBuildAccelerationStructureNV);
EXTERN_VK_FUNCTION(vkCmdCopyAccelerationStructureNV);
EXTERN_VK_FUNCTION(vkCmdTraceRaysNV);
EXTERN_VK_FUNCTION(vkCreateRayTracingPipelinesNV);
EXTERN_VK_FUNCTION(vkGetRayTracingShaderGroupHandlesNV);
EXTERN_VK_FUNCTION(vkGetAccelerationStructureHandleNV);
EXTERN_VK_FUNCTION(vkCmdWriteAccelerationStructuresPropertiesNV);
EXTERN_VK_FUNCTION(vkCompileDeferredNV);
/*
* Vulkan KHR Acceleration Structure extension functions
*/
EXTERN_VK_FUNCTION(vkBuildAccelerationStructuresKHR);
EXTERN_VK_FUNCTION(vkCmdBuildAccelerationStructuresIndirectKHR);
EXTERN_VK_FUNCTION(vkCmdBuildAccelerationStructuresKHR);
EXTERN_VK_FUNCTION(vkCmdCopyAccelerationStructureKHR);
EXTERN_VK_FUNCTION(vkCmdCopyAccelerationStructureToMemoryKHR);
EXTERN_VK_FUNCTION(vkCmdCopyMemoryToAccelerationStructureKHR);
EXTERN_VK_FUNCTION(vkCmdWriteAccelerationStructuresPropertiesKHR);
EXTERN_VK_FUNCTION(vkCopyAccelerationStructureKHR);
EXTERN_VK_FUNCTION(vkCopyAccelerationStructureToMemoryKHR);
EXTERN_VK_FUNCTION(vkCopyMemoryToAccelerationStructureKHR);
EXTERN_VK_FUNCTION(vkCreateAccelerationStructureKHR);
EXTERN_VK_FUNCTION(vkDestroyAccelerationStructureKHR);
EXTERN_VK_FUNCTION(vkGetAccelerationStructureBuildSizesKHR);
EXTERN_VK_FUNCTION(vkGetAccelerationStructureDeviceAddressKHR);
EXTERN_VK_FUNCTION(vkGetDeviceAccelerationStructureCompatibilityKHR);
EXTERN_VK_FUNCTION(vkWriteAccelerationStructuresPropertiesKHR);
/*
* Vulkan KHR Ray Tracing Pipeline extension functions
*/
EXTERN_VK_FUNCTION(vkCmdSetRayTracingPipelineStackSizeKHR);
EXTERN_VK_FUNCTION(vkCmdTraceRaysIndirectKHR);
EXTERN_VK_FUNCTION(vkCmdTraceRaysKHR);
EXTERN_VK_FUNCTION(vkCreateRayTracingPipelinesKHR);
EXTERN_VK_FUNCTION(vkGetRayTracingCaptureReplayShaderGroupHandlesKHR);
EXTERN_VK_FUNCTION(vkGetRayTracingShaderGroupHandlesKHR);
EXTERN_VK_FUNCTION(vkGetRayTracingShaderGroupStackSizeKHR);
struct VulkanBuffer {
VkBuffer handle;
VkDeviceMemory memory;
VkDeviceSize size;
VkDeviceAddress address;
};
struct VulkanImage {
VkImage handle;
VkDeviceMemory memory;
VkDeviceSize size;
VkFormat format;
uint32_t width;
uint32_t height;
};
class CVulkanHelper
{
public:
CVulkanHelper(VkInstance instance, VkDevice device, VkPhysicalDevice gpu);
static void initVulkan();
static void initVulkanInstanceFunctions(VkInstance instance);
static void initVulkanDeviceFunctions(VkDevice device);
static uint32_t alignTo(uint32_t value, uint32_t alignment);
VulkanBuffer createBuffer(VkBufferUsageFlags usage,
VkDeviceSize size,
VkMemoryPropertyFlags memoryProperties);
uint32_t getMemoryType(VkMemoryRequirements& memoryRequirements,
VkMemoryPropertyFlags memoryProperties);
void copyToBuffer(VulkanBuffer const& buffer, void* data, uint32_t size);
private:
VkInstance m_instance;
VkDevice m_device;
VkPhysicalDevice m_gpu;
VkPhysicalDeviceMemoryProperties m_gpuMemoryProperties;
};
inline uint32_t CVulkanHelper::alignTo(uint32_t value, uint32_t alignment)
{
return ((value + (alignment - 1)) & ~(alignment - 1));
}
#endif // VULKANHELPER_HXX