Cogs.Core
CommonVK.cpp
1#include "CommonVK.h"
2
3#undef COGS_DECLARE_FUNCTION
4#define COGS_DECLARE_FUNCTION(function) COGS_DEFINE_FUNCTION(function)
5#include "FunctionsVK.h"
6
7#include "TexturesVK.h"
8
9HMODULE gModuleHandle;
10
11void loaderInit()
12{
13#ifndef COGS_USE_VK_SDK
14 gModuleHandle = ::LoadLibraryA("vulkan-1.dll");
15
16 LOAD_FUNCTION(vkCreateInstance);
17 LOAD_FUNCTION(vkEnumerateInstanceExtensionProperties);
18 LOAD_FUNCTION(vkEnumerateInstanceLayerProperties);
19 LOAD_FUNCTION(vkGetInstanceProcAddr);
20 LOAD_FUNCTION(vkGetDeviceProcAddr);
21#endif
22}
23
24void loaderInitInstance(VkInstance instance)
25{
26#ifndef COGS_USE_VK_SDK
27 LOAD_INSTANCE_FUNCTION(vkCreateWin32SurfaceKHR);
28
29 LOAD_INSTANCE_FUNCTION(vkGetPhysicalDeviceQueueFamilyProperties);
30 LOAD_INSTANCE_FUNCTION(vkGetPhysicalDeviceMemoryProperties);
31 LOAD_INSTANCE_FUNCTION(vkGetPhysicalDeviceProperties);
32 LOAD_INSTANCE_FUNCTION(vkGetPhysicalDeviceFeatures);
33
34 LOAD_INSTANCE_FUNCTION(vkGetPhysicalDeviceSurfaceSupportKHR);
35 LOAD_INSTANCE_FUNCTION(vkGetPhysicalDeviceSurfaceCapabilitiesKHR);
36 LOAD_INSTANCE_FUNCTION(vkGetPhysicalDeviceSurfaceFormatsKHR);
37 LOAD_INSTANCE_FUNCTION(vkGetPhysicalDeviceSurfacePresentModesKHR);
38
39 LOAD_INSTANCE_FUNCTION(vkEnumeratePhysicalDevices);
40
41 LOAD_INSTANCE_FUNCTION(vkEnumerateDeviceExtensionProperties);
42 LOAD_INSTANCE_FUNCTION(vkEnumerateDeviceLayerProperties);
43
44 LOAD_INSTANCE_FUNCTION(vkCreateDevice);
45 LOAD_INSTANCE_FUNCTION(vkDestroyDevice);
46
47 LOAD_INSTANCE_FUNCTION(vkGetDeviceQueue);
48 LOAD_INSTANCE_FUNCTION(vkQueueSubmit);
49 LOAD_INSTANCE_FUNCTION(vkQueueWaitIdle);
50
51 LOAD_INSTANCE_FUNCTION(vkQueuePresentKHR);
52 LOAD_INSTANCE_FUNCTION(vkCreateSwapchainKHR);
53 LOAD_INSTANCE_FUNCTION(vkDestroySwapchainKHR);
54 LOAD_INSTANCE_FUNCTION(vkGetSwapchainImagesKHR);
55 LOAD_INSTANCE_FUNCTION(vkAcquireNextImageKHR);
56#endif
57}
58
59void loaderInitDevice(VkInstance instance, VkDevice device)
60{
61#ifndef COGS_USE_VK_SDK
62 LOAD_DEVICE_FUNCTION(vkDeviceWaitIdle);
63
64 LOAD_DEVICE_FUNCTION(vkCreateCommandPool);
65 LOAD_DEVICE_FUNCTION(vkDestroyCommandPool);
66 LOAD_DEVICE_FUNCTION(vkAllocateCommandBuffers);
67 LOAD_DEVICE_FUNCTION(vkFreeCommandBuffers);
68
69 LOAD_DEVICE_FUNCTION(vkCreateImage);
70 LOAD_DEVICE_FUNCTION(vkDestroyImage);
71 LOAD_DEVICE_FUNCTION(vkCreateImageView);
72 LOAD_DEVICE_FUNCTION(vkDestroyImageView);
73
74 LOAD_DEVICE_FUNCTION(vkCreateSampler);
75 LOAD_DEVICE_FUNCTION(vkDestroySampler);
76
77 LOAD_DEVICE_FUNCTION(vkCreateBuffer);
78 LOAD_DEVICE_FUNCTION(vkDestroyBuffer);
79 LOAD_DEVICE_FUNCTION(vkCreateBufferView);
80 LOAD_DEVICE_FUNCTION(vkDestroyBufferView);
81
82 LOAD_DEVICE_FUNCTION(vkCreateDescriptorSetLayout);
83 LOAD_DEVICE_FUNCTION(vkDestroyDescriptorSetLayout);
84 LOAD_DEVICE_FUNCTION(vkCreatePipelineLayout);
85 LOAD_DEVICE_FUNCTION(vkDestroyPipelineLayout);
86 LOAD_DEVICE_FUNCTION(vkUpdateDescriptorSets);
87
88 LOAD_DEVICE_FUNCTION(vkGetImageMemoryRequirements);
89 LOAD_DEVICE_FUNCTION(vkGetBufferMemoryRequirements);
90
91 LOAD_DEVICE_FUNCTION(vkGetImageSubresourceLayout);
92
93 LOAD_DEVICE_FUNCTION(vkAllocateMemory);
94 LOAD_DEVICE_FUNCTION(vkFreeMemory);
95
96 LOAD_DEVICE_FUNCTION(vkBindImageMemory);
97 LOAD_DEVICE_FUNCTION(vkCmdCopyImage);
98
99 LOAD_DEVICE_FUNCTION(vkCmdPipelineBarrier);
100
101 LOAD_DEVICE_FUNCTION(vkBeginCommandBuffer);
102 LOAD_DEVICE_FUNCTION(vkEndCommandBuffer);
103 LOAD_DEVICE_FUNCTION(vkResetCommandBuffer);
104
105 LOAD_DEVICE_FUNCTION(vkCreateRenderPass);
106 LOAD_DEVICE_FUNCTION(vkDestroyRenderPass);
107
108 LOAD_DEVICE_FUNCTION(vkMapMemory);
109 LOAD_DEVICE_FUNCTION(vkUnmapMemory);
110
111 LOAD_DEVICE_FUNCTION(vkBindBufferMemory);
112
113 LOAD_DEVICE_FUNCTION(vkCreateShaderModule);
114 LOAD_DEVICE_FUNCTION(vkDestroyShaderModule);
115
116 LOAD_DEVICE_FUNCTION(vkCreatePipelineCache);
117 LOAD_DEVICE_FUNCTION(vkDestroyPipelineCache);
118 LOAD_DEVICE_FUNCTION(vkCreateGraphicsPipelines);
119
120 LOAD_DEVICE_FUNCTION(vkCreateDescriptorPool);
121 LOAD_DEVICE_FUNCTION(vkDestroyDescriptorPool);
122 LOAD_DEVICE_FUNCTION(vkResetDescriptorPool);
123
124 LOAD_DEVICE_FUNCTION(vkAllocateDescriptorSets);
125 LOAD_DEVICE_FUNCTION(vkFreeDescriptorSets);
126
127 LOAD_DEVICE_FUNCTION(vkCreateFramebuffer);
128 LOAD_DEVICE_FUNCTION(vkDestroyFramebuffer);
129
130 LOAD_DEVICE_FUNCTION(vkCreateFence);
131 LOAD_DEVICE_FUNCTION(vkDestroyFence);
132 LOAD_DEVICE_FUNCTION(vkResetFences);
133 LOAD_DEVICE_FUNCTION(vkGetFenceStatus);
134 LOAD_DEVICE_FUNCTION(vkWaitForFences);
135
136 LOAD_DEVICE_FUNCTION(vkCreateSemaphore);
137 LOAD_DEVICE_FUNCTION(vkDestroySemaphore);
138
139 LOAD_DEVICE_FUNCTION(vkCmdBeginRenderPass);
140 LOAD_DEVICE_FUNCTION(vkCmdEndRenderPass);
141
142 LOAD_DEVICE_FUNCTION(vkCmdBindPipeline);
143 LOAD_DEVICE_FUNCTION(vkCmdBindDescriptorSets);
144
145 LOAD_DEVICE_FUNCTION(vkCmdSetViewport);
146 LOAD_DEVICE_FUNCTION(vkCmdSetScissor);
147
148 LOAD_DEVICE_FUNCTION(vkCmdBindVertexBuffers);
149 LOAD_DEVICE_FUNCTION(vkCmdBindIndexBuffer);
150
151 LOAD_DEVICE_FUNCTION(vkCmdDraw);
152 LOAD_DEVICE_FUNCTION(vkCmdDrawIndexed);
153 LOAD_DEVICE_FUNCTION(vkCmdDrawIndirect);
154 LOAD_DEVICE_FUNCTION(vkCmdDrawIndexedIndirect);
155
156 LOAD_DEVICE_FUNCTION(vkCmdResolveImage);
157#endif
158}
159
160bool Cogs::setImageLayout(VkCommandBuffer commandBuffer, VkImage image, VkImageAspectFlags aspectMask, VkImageLayout oldLayout, VkImageLayout newLayout, VkImageSubresourceRange range)
161{
162 if (newLayout == oldLayout) return false;
163
164 VkImageMemoryBarrier imageMemoryBarrier = {};
165 imageMemoryBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
166 imageMemoryBarrier.pNext = nullptr;
167 imageMemoryBarrier.srcAccessMask = 0;
168 imageMemoryBarrier.dstAccessMask = 0;
169 imageMemoryBarrier.oldLayout = oldLayout;
170 imageMemoryBarrier.newLayout = newLayout;
171 imageMemoryBarrier.image = image;
172 imageMemoryBarrier.subresourceRange = range;
173 imageMemoryBarrier.subresourceRange.aspectMask = aspectMask;
174
175 if (newLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) {
176 imageMemoryBarrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
177 }
178
179 if (newLayout == VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL) {
180 imageMemoryBarrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
181 }
182
183 if (newLayout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) {
184 imageMemoryBarrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
185 }
186
187 if (newLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) {
188 imageMemoryBarrier.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
189 }
190
191 if (newLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) {
192 imageMemoryBarrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
193 }
194
195 if (newLayout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR) {
196 imageMemoryBarrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
197 }
198
199 VkPipelineStageFlags sourceStages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
200 VkPipelineStageFlags destinationStages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
201
202 vkCmdPipelineBarrier(commandBuffer, sourceStages, destinationStages, 0, 0, nullptr, 0, nullptr, 1, &imageMemoryBarrier);
203
204 return true;
205}
206
207bool Cogs::setImageLayout(VkCommandBuffer commandBuffer, TextureVK & texture, VkImageAspectFlags aspectMask, VkImageLayout newLayout, VkImageSubresourceRange range)
208{
209 if (setImageLayout(commandBuffer, texture.image, aspectMask, texture.layout, newLayout)) {
210 texture.layout = newLayout;
211 return true;
212 }
213
214 return false;
215}