21#define STR(r) case VK_ ##r: return #r
27 STR(ERROR_OUT_OF_HOST_MEMORY);
28 STR(ERROR_OUT_OF_DEVICE_MEMORY);
29 STR(ERROR_INITIALIZATION_FAILED);
30 STR(ERROR_DEVICE_LOST);
31 STR(ERROR_MEMORY_MAP_FAILED);
32 STR(ERROR_LAYER_NOT_PRESENT);
33 STR(ERROR_EXTENSION_NOT_PRESENT);
34 STR(ERROR_FEATURE_NOT_PRESENT);
35 STR(ERROR_INCOMPATIBLE_DRIVER);
36 STR(ERROR_TOO_MANY_OBJECTS);
37 STR(ERROR_FORMAT_NOT_SUPPORTED);
38 STR(ERROR_SURFACE_LOST_KHR);
39 STR(ERROR_NATIVE_WINDOW_IN_USE_KHR);
41 STR(ERROR_OUT_OF_DATE_KHR);
42 STR(ERROR_INCOMPATIBLE_DISPLAY_KHR);
43 STR(ERROR_VALIDATION_FAILED_EXT);
44 STR(ERROR_INVALID_SHADER_NV);
47 return "UNKNOWN_ERROR";
70 std::vector<VkFormat> depthFormats = {
71 VK_FORMAT_D32_SFLOAT_S8_UINT,
73 VK_FORMAT_D24_UNORM_S8_UINT,
74 VK_FORMAT_D16_UNORM_S8_UINT,
78 for (
auto& format : depthFormats)
80 VkFormatProperties formatProps;
81 vkGetPhysicalDeviceFormatProperties(physicalDevice, format, &formatProps);
83 if (formatProps.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)
85 *depthFormat = format;
94 VkBool32
formatIsFilterable(VkPhysicalDevice physicalDevice, VkFormat format, VkImageTiling tiling)
96 VkFormatProperties formatProps;
97 vkGetPhysicalDeviceFormatProperties(physicalDevice, format, &formatProps);
99 if (tiling == VK_IMAGE_TILING_OPTIMAL)
100 return formatProps.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT;
102 if (tiling == VK_IMAGE_TILING_LINEAR)
103 return formatProps.linearTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT;
113 VkCommandBuffer cmdbuffer,
115 VkImageLayout oldImageLayout,
116 VkImageLayout newImageLayout,
117 VkImageSubresourceRange subresourceRange,
118 VkPipelineStageFlags srcStageMask,
119 VkPipelineStageFlags dstStageMask)
123 imageMemoryBarrier.oldLayout = oldImageLayout;
124 imageMemoryBarrier.newLayout = newImageLayout;
125 imageMemoryBarrier.image = image;
126 imageMemoryBarrier.subresourceRange = subresourceRange;
131 switch (oldImageLayout)
133 case VK_IMAGE_LAYOUT_UNDEFINED:
137 imageMemoryBarrier.srcAccessMask = 0;
140 case VK_IMAGE_LAYOUT_PREINITIALIZED:
144 imageMemoryBarrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
147 case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
150 imageMemoryBarrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
153 case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
156 imageMemoryBarrier.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
159 case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
162 imageMemoryBarrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
165 case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
168 imageMemoryBarrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
171 case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
174 imageMemoryBarrier.srcAccessMask = VK_ACCESS_SHADER_READ_BIT;
183 switch (newImageLayout)
185 case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
188 imageMemoryBarrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
191 case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
194 imageMemoryBarrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
197 case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
200 imageMemoryBarrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
203 case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
206 imageMemoryBarrier.dstAccessMask = imageMemoryBarrier.dstAccessMask | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
209 case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
212 if (imageMemoryBarrier.srcAccessMask == 0)
214 imageMemoryBarrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT | VK_ACCESS_TRANSFER_WRITE_BIT;
216 imageMemoryBarrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
224 vkCmdPipelineBarrier(
231 1, &imageMemoryBarrier);
236 VkCommandBuffer cmdbuffer,
238 VkImageAspectFlags aspectMask,
239 VkImageLayout oldImageLayout,
240 VkImageLayout newImageLayout,
241 VkPipelineStageFlags srcStageMask,
242 VkPipelineStageFlags dstStageMask)
244 VkImageSubresourceRange subresourceRange = {};
245 subresourceRange.aspectMask = aspectMask;
246 subresourceRange.baseMipLevel = 0;
247 subresourceRange.levelCount = 1;
248 subresourceRange.layerCount = 1;
249 setImageLayout(cmdbuffer, image, oldImageLayout, newImageLayout, subresourceRange, srcStageMask, dstStageMask);
253 VkCommandBuffer cmdbuffer,
255 VkAccessFlags srcAccessMask,
256 VkAccessFlags dstAccessMask,
257 VkImageLayout oldImageLayout,
258 VkImageLayout newImageLayout,
259 VkPipelineStageFlags srcStageMask,
260 VkPipelineStageFlags dstStageMask,
261 VkImageSubresourceRange subresourceRange)
264 imageMemoryBarrier.srcAccessMask = srcAccessMask;
265 imageMemoryBarrier.dstAccessMask = dstAccessMask;
266 imageMemoryBarrier.oldLayout = oldImageLayout;
267 imageMemoryBarrier.newLayout = newImageLayout;
268 imageMemoryBarrier.image = image;
269 imageMemoryBarrier.subresourceRange = subresourceRange;
271 vkCmdPipelineBarrier(
278 1, &imageMemoryBarrier);
342 VkShaderModule
loadShader(
const char *fileName, VkDevice device)
344 std::ifstream is(fileName, std::ios::binary | std::ios::in | std::ios::ate);
348 size_t size = is.tellg();
349 is.seekg(0, std::ios::beg);
350 char* shaderCode =
new char[size];
351 is.read(shaderCode, size);
356 VkShaderModule shaderModule;
357 VkShaderModuleCreateInfo moduleCreateInfo{};
358 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
359 moduleCreateInfo.codeSize = size;
360 moduleCreateInfo.pCode = (uint32_t*)shaderCode;
362 VK_CHECK_RESULT(vkCreateShaderModule(device, &moduleCreateInfo, NULL, &shaderModule));
370 std::cerr <<
"Error: Could not open shader file \"" << fileName <<
"\"" <<
"\n";
371 return VK_NULL_HANDLE;