3#undef COGS_DECLARE_FUNCTION
4#define COGS_DECLARE_FUNCTION(function) COGS_DEFINE_FUNCTION(function)
5#include "FunctionsVK.h"
13#ifndef COGS_USE_VK_SDK
14 gModuleHandle = ::LoadLibraryA(
"vulkan-1.dll");
16 LOAD_FUNCTION(vkCreateInstance);
17 LOAD_FUNCTION(vkEnumerateInstanceExtensionProperties);
18 LOAD_FUNCTION(vkEnumerateInstanceLayerProperties);
19 LOAD_FUNCTION(vkGetInstanceProcAddr);
20 LOAD_FUNCTION(vkGetDeviceProcAddr);
24void loaderInitInstance(VkInstance instance)
26#ifndef COGS_USE_VK_SDK
27 LOAD_INSTANCE_FUNCTION(vkCreateWin32SurfaceKHR);
29 LOAD_INSTANCE_FUNCTION(vkGetPhysicalDeviceQueueFamilyProperties);
30 LOAD_INSTANCE_FUNCTION(vkGetPhysicalDeviceMemoryProperties);
31 LOAD_INSTANCE_FUNCTION(vkGetPhysicalDeviceProperties);
32 LOAD_INSTANCE_FUNCTION(vkGetPhysicalDeviceFeatures);
34 LOAD_INSTANCE_FUNCTION(vkGetPhysicalDeviceSurfaceSupportKHR);
35 LOAD_INSTANCE_FUNCTION(vkGetPhysicalDeviceSurfaceCapabilitiesKHR);
36 LOAD_INSTANCE_FUNCTION(vkGetPhysicalDeviceSurfaceFormatsKHR);
37 LOAD_INSTANCE_FUNCTION(vkGetPhysicalDeviceSurfacePresentModesKHR);
39 LOAD_INSTANCE_FUNCTION(vkEnumeratePhysicalDevices);
41 LOAD_INSTANCE_FUNCTION(vkEnumerateDeviceExtensionProperties);
42 LOAD_INSTANCE_FUNCTION(vkEnumerateDeviceLayerProperties);
44 LOAD_INSTANCE_FUNCTION(vkCreateDevice);
45 LOAD_INSTANCE_FUNCTION(vkDestroyDevice);
47 LOAD_INSTANCE_FUNCTION(vkGetDeviceQueue);
48 LOAD_INSTANCE_FUNCTION(vkQueueSubmit);
49 LOAD_INSTANCE_FUNCTION(vkQueueWaitIdle);
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);
59void loaderInitDevice(VkInstance instance, VkDevice device)
61#ifndef COGS_USE_VK_SDK
62 LOAD_DEVICE_FUNCTION(vkDeviceWaitIdle);
64 LOAD_DEVICE_FUNCTION(vkCreateCommandPool);
65 LOAD_DEVICE_FUNCTION(vkDestroyCommandPool);
66 LOAD_DEVICE_FUNCTION(vkAllocateCommandBuffers);
67 LOAD_DEVICE_FUNCTION(vkFreeCommandBuffers);
69 LOAD_DEVICE_FUNCTION(vkCreateImage);
70 LOAD_DEVICE_FUNCTION(vkDestroyImage);
71 LOAD_DEVICE_FUNCTION(vkCreateImageView);
72 LOAD_DEVICE_FUNCTION(vkDestroyImageView);
74 LOAD_DEVICE_FUNCTION(vkCreateSampler);
75 LOAD_DEVICE_FUNCTION(vkDestroySampler);
77 LOAD_DEVICE_FUNCTION(vkCreateBuffer);
78 LOAD_DEVICE_FUNCTION(vkDestroyBuffer);
79 LOAD_DEVICE_FUNCTION(vkCreateBufferView);
80 LOAD_DEVICE_FUNCTION(vkDestroyBufferView);
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);
88 LOAD_DEVICE_FUNCTION(vkGetImageMemoryRequirements);
89 LOAD_DEVICE_FUNCTION(vkGetBufferMemoryRequirements);
91 LOAD_DEVICE_FUNCTION(vkGetImageSubresourceLayout);
93 LOAD_DEVICE_FUNCTION(vkAllocateMemory);
94 LOAD_DEVICE_FUNCTION(vkFreeMemory);
96 LOAD_DEVICE_FUNCTION(vkBindImageMemory);
97 LOAD_DEVICE_FUNCTION(vkCmdCopyImage);
99 LOAD_DEVICE_FUNCTION(vkCmdPipelineBarrier);
101 LOAD_DEVICE_FUNCTION(vkBeginCommandBuffer);
102 LOAD_DEVICE_FUNCTION(vkEndCommandBuffer);
103 LOAD_DEVICE_FUNCTION(vkResetCommandBuffer);
105 LOAD_DEVICE_FUNCTION(vkCreateRenderPass);
106 LOAD_DEVICE_FUNCTION(vkDestroyRenderPass);
108 LOAD_DEVICE_FUNCTION(vkMapMemory);
109 LOAD_DEVICE_FUNCTION(vkUnmapMemory);
111 LOAD_DEVICE_FUNCTION(vkBindBufferMemory);
113 LOAD_DEVICE_FUNCTION(vkCreateShaderModule);
114 LOAD_DEVICE_FUNCTION(vkDestroyShaderModule);
116 LOAD_DEVICE_FUNCTION(vkCreatePipelineCache);
117 LOAD_DEVICE_FUNCTION(vkDestroyPipelineCache);
118 LOAD_DEVICE_FUNCTION(vkCreateGraphicsPipelines);
120 LOAD_DEVICE_FUNCTION(vkCreateDescriptorPool);
121 LOAD_DEVICE_FUNCTION(vkDestroyDescriptorPool);
122 LOAD_DEVICE_FUNCTION(vkResetDescriptorPool);
124 LOAD_DEVICE_FUNCTION(vkAllocateDescriptorSets);
125 LOAD_DEVICE_FUNCTION(vkFreeDescriptorSets);
127 LOAD_DEVICE_FUNCTION(vkCreateFramebuffer);
128 LOAD_DEVICE_FUNCTION(vkDestroyFramebuffer);
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);
136 LOAD_DEVICE_FUNCTION(vkCreateSemaphore);
137 LOAD_DEVICE_FUNCTION(vkDestroySemaphore);
139 LOAD_DEVICE_FUNCTION(vkCmdBeginRenderPass);
140 LOAD_DEVICE_FUNCTION(vkCmdEndRenderPass);
142 LOAD_DEVICE_FUNCTION(vkCmdBindPipeline);
143 LOAD_DEVICE_FUNCTION(vkCmdBindDescriptorSets);
145 LOAD_DEVICE_FUNCTION(vkCmdSetViewport);
146 LOAD_DEVICE_FUNCTION(vkCmdSetScissor);
148 LOAD_DEVICE_FUNCTION(vkCmdBindVertexBuffers);
149 LOAD_DEVICE_FUNCTION(vkCmdBindIndexBuffer);
151 LOAD_DEVICE_FUNCTION(vkCmdDraw);
152 LOAD_DEVICE_FUNCTION(vkCmdDrawIndexed);
153 LOAD_DEVICE_FUNCTION(vkCmdDrawIndirect);
154 LOAD_DEVICE_FUNCTION(vkCmdDrawIndexedIndirect);
156 LOAD_DEVICE_FUNCTION(vkCmdResolveImage);
160bool Cogs::setImageLayout(VkCommandBuffer commandBuffer, VkImage image, VkImageAspectFlags aspectMask, VkImageLayout oldLayout, VkImageLayout newLayout, VkImageSubresourceRange range)
162 if (newLayout == oldLayout)
return false;
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;
175 if (newLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) {
176 imageMemoryBarrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
179 if (newLayout == VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL) {
180 imageMemoryBarrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
183 if (newLayout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) {
184 imageMemoryBarrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
187 if (newLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) {
188 imageMemoryBarrier.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
191 if (newLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) {
192 imageMemoryBarrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
195 if (newLayout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR) {
196 imageMemoryBarrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
199 VkPipelineStageFlags sourceStages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
200 VkPipelineStageFlags destinationStages = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
202 vkCmdPipelineBarrier(commandBuffer, sourceStages, destinationStages, 0, 0,
nullptr, 0,
nullptr, 1, &imageMemoryBarrier);
207bool Cogs::setImageLayout(VkCommandBuffer commandBuffer, TextureVK & texture, VkImageAspectFlags aspectMask, VkImageLayout newLayout, VkImageSubresourceRange range)
209 if (setImageLayout(commandBuffer, texture.image, aspectMask, texture.layout, newLayout)) {
210 texture.layout = newLayout;