diff --git a/src/VulkanInitializers.hpp b/src/VulkanInitializers.hpp deleted file mode 100644 index 81a2621b5..000000000 --- a/src/VulkanInitializers.hpp +++ /dev/null @@ -1,679 +0,0 @@ -/* - * Initializers for Vulkan structures and objects used by the examples - * Saves lot of VK_STRUCTURE_TYPE assignments - * Some initializers are parameterized for convenience - * - * Copyright (C) 2016 by Sascha Willems - www.saschawillems.de - * - * This code is licensed under the MIT license (MIT) - * (http://opensource.org/licenses/MIT) - */ - -#pragma once - -#include "vulkan/vulkan.h" -#include - -namespace vks { -namespace initializers { - -inline VkMemoryAllocateInfo -memoryAllocateInfo() -{ - VkMemoryAllocateInfo memAllocInfo{}; - memAllocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; - return memAllocInfo; -} - -inline VkMappedMemoryRange -mappedMemoryRange() -{ - VkMappedMemoryRange mappedMemoryRange{}; - mappedMemoryRange.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE; - return mappedMemoryRange; -} - -inline VkCommandBufferAllocateInfo -commandBufferAllocateInfo(VkCommandPool commandPool, - VkCommandBufferLevel level, - uint32_t bufferCount) -{ - VkCommandBufferAllocateInfo commandBufferAllocateInfo{}; - commandBufferAllocateInfo.sType = - VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; - commandBufferAllocateInfo.commandPool = commandPool; - commandBufferAllocateInfo.level = level; - commandBufferAllocateInfo.commandBufferCount = bufferCount; - return commandBufferAllocateInfo; -} - -inline VkCommandPoolCreateInfo -commandPoolCreateInfo() -{ - VkCommandPoolCreateInfo cmdPoolCreateInfo{}; - cmdPoolCreateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; - return cmdPoolCreateInfo; -} - -inline VkCommandBufferBeginInfo -commandBufferBeginInfo() -{ - VkCommandBufferBeginInfo cmdBufferBeginInfo{}; - cmdBufferBeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; - return cmdBufferBeginInfo; -} - -inline VkCommandBufferInheritanceInfo -commandBufferInheritanceInfo() -{ - VkCommandBufferInheritanceInfo cmdBufferInheritanceInfo{}; - cmdBufferInheritanceInfo.sType = - VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO; - return cmdBufferInheritanceInfo; -} - -inline VkRenderPassBeginInfo -renderPassBeginInfo() -{ - VkRenderPassBeginInfo renderPassBeginInfo{}; - renderPassBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; - return renderPassBeginInfo; -} - -inline VkRenderPassCreateInfo -renderPassCreateInfo() -{ - VkRenderPassCreateInfo renderPassCreateInfo{}; - renderPassCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; - return renderPassCreateInfo; -} - -/** @brief Initialize an image memory barrier with no image transfer ownership - */ -inline VkImageMemoryBarrier -imageMemoryBarrier() -{ - VkImageMemoryBarrier imageMemoryBarrier{}; - imageMemoryBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; - imageMemoryBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - imageMemoryBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - return imageMemoryBarrier; -} - -/** @brief Initialize a buffer memory barrier with no image transfer ownership - */ -inline VkBufferMemoryBarrier -bufferMemoryBarrier() -{ - VkBufferMemoryBarrier bufferMemoryBarrier{}; - bufferMemoryBarrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER; - bufferMemoryBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - bufferMemoryBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - return bufferMemoryBarrier; -} - -inline VkMemoryBarrier -memoryBarrier() -{ - VkMemoryBarrier memoryBarrier{}; - memoryBarrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER; - return memoryBarrier; -} - -inline VkImageCreateInfo -imageCreateInfo() -{ - VkImageCreateInfo imageCreateInfo{}; - imageCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; - return imageCreateInfo; -} - -inline VkSamplerCreateInfo -samplerCreateInfo() -{ - VkSamplerCreateInfo samplerCreateInfo{}; - samplerCreateInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; - samplerCreateInfo.maxAnisotropy = 1.0f; - return samplerCreateInfo; -} - -inline VkImageViewCreateInfo -imageViewCreateInfo() -{ - VkImageViewCreateInfo imageViewCreateInfo{}; - imageViewCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; - return imageViewCreateInfo; -} - -inline VkFramebufferCreateInfo -framebufferCreateInfo() -{ - VkFramebufferCreateInfo framebufferCreateInfo{}; - framebufferCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; - return framebufferCreateInfo; -} - -inline VkSemaphoreCreateInfo -semaphoreCreateInfo() -{ - VkSemaphoreCreateInfo semaphoreCreateInfo{}; - semaphoreCreateInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; - return semaphoreCreateInfo; -} - -inline VkFenceCreateInfo -fenceCreateInfo(VkFenceCreateFlags flags = 0) -{ - VkFenceCreateInfo fenceCreateInfo{}; - fenceCreateInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; - fenceCreateInfo.flags = flags; - return fenceCreateInfo; -} - -inline VkEventCreateInfo -eventCreateInfo() -{ - VkEventCreateInfo eventCreateInfo{}; - eventCreateInfo.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO; - return eventCreateInfo; -} - -inline VkSubmitInfo -submitInfo() -{ - VkSubmitInfo submitInfo{}; - submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; - return submitInfo; -} - -inline VkViewport -viewport(float width, float height, float minDepth, float maxDepth) -{ - VkViewport viewport{}; - viewport.width = width; - viewport.height = height; - viewport.minDepth = minDepth; - viewport.maxDepth = maxDepth; - return viewport; -} - -inline VkRect2D -rect2D(int32_t width, int32_t height, int32_t offsetX, int32_t offsetY) -{ - VkRect2D rect2D{}; - rect2D.extent.width = width; - rect2D.extent.height = height; - rect2D.offset.x = offsetX; - rect2D.offset.y = offsetY; - return rect2D; -} - -inline VkBufferCreateInfo -bufferCreateInfo() -{ - VkBufferCreateInfo bufCreateInfo{}; - bufCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; - return bufCreateInfo; -} - -inline VkBufferCreateInfo -bufferCreateInfo(VkBufferUsageFlags usage, VkDeviceSize size) -{ - VkBufferCreateInfo bufCreateInfo{}; - bufCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; - bufCreateInfo.usage = usage; - bufCreateInfo.size = size; - return bufCreateInfo; -} - -inline VkDescriptorPoolCreateInfo -descriptorPoolCreateInfo(uint32_t poolSizeCount, - VkDescriptorPoolSize* pPoolSizes, - uint32_t maxSets) -{ - VkDescriptorPoolCreateInfo descriptorPoolInfo{}; - descriptorPoolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; - descriptorPoolInfo.poolSizeCount = poolSizeCount; - descriptorPoolInfo.pPoolSizes = pPoolSizes; - descriptorPoolInfo.maxSets = maxSets; - return descriptorPoolInfo; -} - -inline VkDescriptorPoolCreateInfo -descriptorPoolCreateInfo(const std::vector& poolSizes, - uint32_t maxSets) -{ - VkDescriptorPoolCreateInfo descriptorPoolInfo{}; - descriptorPoolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; - descriptorPoolInfo.poolSizeCount = static_cast(poolSizes.size()); - descriptorPoolInfo.pPoolSizes = poolSizes.data(); - descriptorPoolInfo.maxSets = maxSets; - return descriptorPoolInfo; -} - -inline VkDescriptorPoolSize -descriptorPoolSize(VkDescriptorType type, uint32_t descriptorCount) -{ - VkDescriptorPoolSize descriptorPoolSize{}; - descriptorPoolSize.type = type; - descriptorPoolSize.descriptorCount = descriptorCount; - return descriptorPoolSize; -} - -inline VkDescriptorSetLayoutBinding -descriptorSetLayoutBinding(VkDescriptorType type, - VkShaderStageFlags stageFlags, - uint32_t binding, - uint32_t descriptorCount = 1) -{ - VkDescriptorSetLayoutBinding setLayoutBinding{}; - setLayoutBinding.descriptorType = type; - setLayoutBinding.stageFlags = stageFlags; - setLayoutBinding.binding = binding; - setLayoutBinding.descriptorCount = descriptorCount; - return setLayoutBinding; -} - -inline VkDescriptorSetLayoutCreateInfo -descriptorSetLayoutCreateInfo(const VkDescriptorSetLayoutBinding* pBindings, - uint32_t bindingCount) -{ - VkDescriptorSetLayoutCreateInfo descriptorSetLayoutCreateInfo{}; - descriptorSetLayoutCreateInfo.sType = - VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; - descriptorSetLayoutCreateInfo.pBindings = pBindings; - descriptorSetLayoutCreateInfo.bindingCount = bindingCount; - return descriptorSetLayoutCreateInfo; -} - -inline VkDescriptorSetLayoutCreateInfo -descriptorSetLayoutCreateInfo( - const std::vector& bindings) -{ - VkDescriptorSetLayoutCreateInfo descriptorSetLayoutCreateInfo{}; - descriptorSetLayoutCreateInfo.sType = - VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; - descriptorSetLayoutCreateInfo.pBindings = bindings.data(); - descriptorSetLayoutCreateInfo.bindingCount = - static_cast(bindings.size()); - return descriptorSetLayoutCreateInfo; -} - -inline VkPipelineLayoutCreateInfo -pipelineLayoutCreateInfo(const VkDescriptorSetLayout* pSetLayouts, - uint32_t setLayoutCount = 1) -{ - VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo{}; - pipelineLayoutCreateInfo.sType = - VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; - pipelineLayoutCreateInfo.setLayoutCount = setLayoutCount; - pipelineLayoutCreateInfo.pSetLayouts = pSetLayouts; - return pipelineLayoutCreateInfo; -} - -inline VkPipelineLayoutCreateInfo -pipelineLayoutCreateInfo(uint32_t setLayoutCount = 1) -{ - VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo{}; - pipelineLayoutCreateInfo.sType = - VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; - pipelineLayoutCreateInfo.setLayoutCount = setLayoutCount; - return pipelineLayoutCreateInfo; -} - -inline VkDescriptorSetAllocateInfo -descriptorSetAllocateInfo(VkDescriptorPool descriptorPool, - const VkDescriptorSetLayout* pSetLayouts, - uint32_t descriptorSetCount) -{ - VkDescriptorSetAllocateInfo descriptorSetAllocateInfo{}; - descriptorSetAllocateInfo.sType = - VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - descriptorSetAllocateInfo.descriptorPool = descriptorPool; - descriptorSetAllocateInfo.pSetLayouts = pSetLayouts; - descriptorSetAllocateInfo.descriptorSetCount = descriptorSetCount; - return descriptorSetAllocateInfo; -} - -inline VkDescriptorImageInfo -descriptorImageInfo(VkSampler sampler, - VkImageView imageView, - VkImageLayout imageLayout) -{ - VkDescriptorImageInfo descriptorImageInfo{}; - descriptorImageInfo.sampler = sampler; - descriptorImageInfo.imageView = imageView; - descriptorImageInfo.imageLayout = imageLayout; - return descriptorImageInfo; -} - -inline VkWriteDescriptorSet -writeDescriptorSet(VkDescriptorSet dstSet, - VkDescriptorType type, - uint32_t binding, - VkDescriptorBufferInfo* bufferInfo, - uint32_t descriptorCount = 1) -{ - VkWriteDescriptorSet writeDescriptorSet{}; - writeDescriptorSet.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - writeDescriptorSet.dstSet = dstSet; - writeDescriptorSet.descriptorType = type; - writeDescriptorSet.dstBinding = binding; - writeDescriptorSet.pBufferInfo = bufferInfo; - writeDescriptorSet.descriptorCount = descriptorCount; - return writeDescriptorSet; -} - -inline VkWriteDescriptorSet -writeDescriptorSet(VkDescriptorSet dstSet, - VkDescriptorType type, - uint32_t binding, - VkDescriptorImageInfo* imageInfo, - uint32_t descriptorCount = 1) -{ - VkWriteDescriptorSet writeDescriptorSet{}; - writeDescriptorSet.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - writeDescriptorSet.dstSet = dstSet; - writeDescriptorSet.descriptorType = type; - writeDescriptorSet.dstBinding = binding; - writeDescriptorSet.pImageInfo = imageInfo; - writeDescriptorSet.descriptorCount = descriptorCount; - return writeDescriptorSet; -} - -inline VkVertexInputBindingDescription -vertexInputBindingDescription(uint32_t binding, - uint32_t stride, - VkVertexInputRate inputRate) -{ - VkVertexInputBindingDescription vInputBindDescription{}; - vInputBindDescription.binding = binding; - vInputBindDescription.stride = stride; - vInputBindDescription.inputRate = inputRate; - return vInputBindDescription; -} - -inline VkVertexInputAttributeDescription -vertexInputAttributeDescription(uint32_t binding, - uint32_t location, - VkFormat format, - uint32_t offset) -{ - VkVertexInputAttributeDescription vInputAttribDescription{}; - vInputAttribDescription.location = location; - vInputAttribDescription.binding = binding; - vInputAttribDescription.format = format; - vInputAttribDescription.offset = offset; - return vInputAttribDescription; -} - -inline VkPipelineVertexInputStateCreateInfo -pipelineVertexInputStateCreateInfo() -{ - VkPipelineVertexInputStateCreateInfo pipelineVertexInputStateCreateInfo{}; - pipelineVertexInputStateCreateInfo.sType = - VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; - return pipelineVertexInputStateCreateInfo; -} - -inline VkPipelineVertexInputStateCreateInfo -pipelineVertexInputStateCreateInfo( - const std::vector& vertexBindingDescriptions, - const std::vector& - vertexAttributeDescriptions) -{ - VkPipelineVertexInputStateCreateInfo pipelineVertexInputStateCreateInfo{}; - pipelineVertexInputStateCreateInfo.sType = - VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; - pipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = - static_cast(vertexBindingDescriptions.size()); - pipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = - vertexBindingDescriptions.data(); - pipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = - static_cast(vertexAttributeDescriptions.size()); - pipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = - vertexAttributeDescriptions.data(); - return pipelineVertexInputStateCreateInfo; -} - -inline VkPipelineInputAssemblyStateCreateInfo -pipelineInputAssemblyStateCreateInfo( - VkPrimitiveTopology topology, - VkPipelineInputAssemblyStateCreateFlags flags, - VkBool32 primitiveRestartEnable) -{ - VkPipelineInputAssemblyStateCreateInfo - pipelineInputAssemblyStateCreateInfo{}; - pipelineInputAssemblyStateCreateInfo.sType = - VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; - pipelineInputAssemblyStateCreateInfo.topology = topology; - pipelineInputAssemblyStateCreateInfo.flags = flags; - pipelineInputAssemblyStateCreateInfo.primitiveRestartEnable = - primitiveRestartEnable; - return pipelineInputAssemblyStateCreateInfo; -} - -inline VkPipelineRasterizationStateCreateInfo -pipelineRasterizationStateCreateInfo( - VkPolygonMode polygonMode, - VkCullModeFlags cullMode, - VkFrontFace frontFace, - VkPipelineRasterizationStateCreateFlags flags = 0) -{ - VkPipelineRasterizationStateCreateInfo - pipelineRasterizationStateCreateInfo{}; - pipelineRasterizationStateCreateInfo.sType = - VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; - pipelineRasterizationStateCreateInfo.polygonMode = polygonMode; - pipelineRasterizationStateCreateInfo.cullMode = cullMode; - pipelineRasterizationStateCreateInfo.frontFace = frontFace; - pipelineRasterizationStateCreateInfo.flags = flags; - pipelineRasterizationStateCreateInfo.depthClampEnable = VK_FALSE; - pipelineRasterizationStateCreateInfo.lineWidth = 1.0f; - return pipelineRasterizationStateCreateInfo; -} - -inline VkPipelineColorBlendAttachmentState -pipelineColorBlendAttachmentState(VkColorComponentFlags colorWriteMask, - VkBool32 blendEnable) -{ - VkPipelineColorBlendAttachmentState pipelineColorBlendAttachmentState{}; - pipelineColorBlendAttachmentState.colorWriteMask = colorWriteMask; - pipelineColorBlendAttachmentState.blendEnable = blendEnable; - return pipelineColorBlendAttachmentState; -} - -inline VkPipelineColorBlendStateCreateInfo -pipelineColorBlendStateCreateInfo( - uint32_t attachmentCount, - const VkPipelineColorBlendAttachmentState* pAttachments) -{ - VkPipelineColorBlendStateCreateInfo pipelineColorBlendStateCreateInfo{}; - pipelineColorBlendStateCreateInfo.sType = - VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; - pipelineColorBlendStateCreateInfo.attachmentCount = attachmentCount; - pipelineColorBlendStateCreateInfo.pAttachments = pAttachments; - return pipelineColorBlendStateCreateInfo; -} - -inline VkPipelineDepthStencilStateCreateInfo -pipelineDepthStencilStateCreateInfo(VkBool32 depthTestEnable, - VkBool32 depthWriteEnable, - VkCompareOp depthCompareOp) -{ - VkPipelineDepthStencilStateCreateInfo pipelineDepthStencilStateCreateInfo{}; - pipelineDepthStencilStateCreateInfo.sType = - VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO; - pipelineDepthStencilStateCreateInfo.depthTestEnable = depthTestEnable; - pipelineDepthStencilStateCreateInfo.depthWriteEnable = depthWriteEnable; - pipelineDepthStencilStateCreateInfo.depthCompareOp = depthCompareOp; - pipelineDepthStencilStateCreateInfo.back.compareOp = VK_COMPARE_OP_ALWAYS; - return pipelineDepthStencilStateCreateInfo; -} - -inline VkPipelineViewportStateCreateInfo -pipelineViewportStateCreateInfo(uint32_t viewportCount, - uint32_t scissorCount, - VkPipelineViewportStateCreateFlags flags = 0) -{ - VkPipelineViewportStateCreateInfo pipelineViewportStateCreateInfo{}; - pipelineViewportStateCreateInfo.sType = - VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; - pipelineViewportStateCreateInfo.viewportCount = viewportCount; - pipelineViewportStateCreateInfo.scissorCount = scissorCount; - pipelineViewportStateCreateInfo.flags = flags; - return pipelineViewportStateCreateInfo; -} - -inline VkPipelineMultisampleStateCreateInfo -pipelineMultisampleStateCreateInfo( - VkSampleCountFlagBits rasterizationSamples, - VkPipelineMultisampleStateCreateFlags flags = 0) -{ - VkPipelineMultisampleStateCreateInfo pipelineMultisampleStateCreateInfo{}; - pipelineMultisampleStateCreateInfo.sType = - VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; - pipelineMultisampleStateCreateInfo.rasterizationSamples = - rasterizationSamples; - pipelineMultisampleStateCreateInfo.flags = flags; - return pipelineMultisampleStateCreateInfo; -} - -inline VkPipelineDynamicStateCreateInfo -pipelineDynamicStateCreateInfo(const VkDynamicState* pDynamicStates, - uint32_t dynamicStateCount, - VkPipelineDynamicStateCreateFlags flags = 0) -{ - VkPipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo{}; - pipelineDynamicStateCreateInfo.sType = - VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO; - pipelineDynamicStateCreateInfo.pDynamicStates = pDynamicStates; - pipelineDynamicStateCreateInfo.dynamicStateCount = dynamicStateCount; - pipelineDynamicStateCreateInfo.flags = flags; - return pipelineDynamicStateCreateInfo; -} - -inline VkPipelineDynamicStateCreateInfo -pipelineDynamicStateCreateInfo( - const std::vector& pDynamicStates, - VkPipelineDynamicStateCreateFlags flags = 0) -{ - VkPipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo{}; - pipelineDynamicStateCreateInfo.sType = - VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO; - pipelineDynamicStateCreateInfo.pDynamicStates = pDynamicStates.data(); - pipelineDynamicStateCreateInfo.dynamicStateCount = - static_cast(pDynamicStates.size()); - pipelineDynamicStateCreateInfo.flags = flags; - return pipelineDynamicStateCreateInfo; -} - -inline VkPipelineTessellationStateCreateInfo -pipelineTessellationStateCreateInfo(uint32_t patchControlPoints) -{ - VkPipelineTessellationStateCreateInfo pipelineTessellationStateCreateInfo{}; - pipelineTessellationStateCreateInfo.sType = - VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO; - pipelineTessellationStateCreateInfo.patchControlPoints = patchControlPoints; - return pipelineTessellationStateCreateInfo; -} - -inline VkGraphicsPipelineCreateInfo -pipelineCreateInfo(VkPipelineLayout layout, - VkRenderPass renderPass, - VkPipelineCreateFlags flags = 0) -{ - VkGraphicsPipelineCreateInfo pipelineCreateInfo{}; - pipelineCreateInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; - pipelineCreateInfo.layout = layout; - pipelineCreateInfo.renderPass = renderPass; - pipelineCreateInfo.flags = flags; - pipelineCreateInfo.basePipelineIndex = -1; - pipelineCreateInfo.basePipelineHandle = VK_NULL_HANDLE; - return pipelineCreateInfo; -} - -inline VkGraphicsPipelineCreateInfo -pipelineCreateInfo() -{ - VkGraphicsPipelineCreateInfo pipelineCreateInfo{}; - pipelineCreateInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; - pipelineCreateInfo.basePipelineIndex = -1; - pipelineCreateInfo.basePipelineHandle = VK_NULL_HANDLE; - return pipelineCreateInfo; -} - -inline VkComputePipelineCreateInfo -computePipelineCreateInfo(VkPipelineLayout layout, - VkPipelineCreateFlags flags = 0) -{ - VkComputePipelineCreateInfo computePipelineCreateInfo{}; - computePipelineCreateInfo.sType = - VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO; - computePipelineCreateInfo.layout = layout; - computePipelineCreateInfo.flags = flags; - return computePipelineCreateInfo; -} - -inline VkPushConstantRange -pushConstantRange(VkShaderStageFlags stageFlags, uint32_t size, uint32_t offset) -{ - VkPushConstantRange pushConstantRange{}; - pushConstantRange.stageFlags = stageFlags; - pushConstantRange.offset = offset; - pushConstantRange.size = size; - return pushConstantRange; -} - -inline VkBindSparseInfo -bindSparseInfo() -{ - VkBindSparseInfo bindSparseInfo{}; - bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO; - return bindSparseInfo; -} - -/** @brief Initialize a map entry for a shader specialization constant */ -inline VkSpecializationMapEntry -specializationMapEntry(uint32_t constantID, uint32_t offset, size_t size) -{ - VkSpecializationMapEntry specializationMapEntry{}; - specializationMapEntry.constantID = constantID; - specializationMapEntry.offset = offset; - specializationMapEntry.size = size; - return specializationMapEntry; -} - -/** @brief Initialize a specialization constant info structure to pass to a - * shader stage */ -inline VkSpecializationInfo -specializationInfo(uint32_t mapEntryCount, - const VkSpecializationMapEntry* mapEntries, - size_t dataSize, - const void* data) -{ - VkSpecializationInfo specializationInfo{}; - specializationInfo.mapEntryCount = mapEntryCount; - specializationInfo.pMapEntries = mapEntries; - specializationInfo.dataSize = dataSize; - specializationInfo.pData = data; - return specializationInfo; -} - -/** @brief Initialize a specialization constant info structure to pass to a - * shader stage */ -inline VkSpecializationInfo -specializationInfo(const std::vector& mapEntries, - size_t dataSize, - const void* data) -{ - VkSpecializationInfo specializationInfo{}; - specializationInfo.mapEntryCount = static_cast(mapEntries.size()); - specializationInfo.pMapEntries = mapEntries.data(); - specializationInfo.dataSize = dataSize; - specializationInfo.pData = data; - return specializationInfo; -} - -} // namespace initializers -} // namespace vks diff --git a/src/VulkanTools.cpp b/src/VulkanTools.cpp deleted file mode 100644 index c252e4f93..000000000 --- a/src/VulkanTools.cpp +++ /dev/null @@ -1,371 +0,0 @@ -/* - * Assorted commonly used Vulkan helper functions - * - * Copyright (C) 2016 by Sascha Willems - www.saschawillems.de - * - * This code is licensed under the MIT license (MIT) - * (http://opensource.org/licenses/MIT) - */ - -#include "VulkanTools.h" - -const std::string -getAssetPath() -{ -#if defined(VK_EXAMPLE_DATA_DIR) - return VK_EXAMPLE_DATA_DIR; -#else - return "./"; -#endif -} - -namespace vks { -namespace tools { -bool errorModeSilent = false; - -std::string -errorString(VkResult errorCode) -{ - switch (errorCode) { -#define STR(r) \ - case VK_##r: \ - return #r - STR(NOT_READY); - STR(TIMEOUT); - STR(EVENT_SET); - STR(EVENT_RESET); - STR(INCOMPLETE); - STR(ERROR_OUT_OF_HOST_MEMORY); - STR(ERROR_OUT_OF_DEVICE_MEMORY); - STR(ERROR_INITIALIZATION_FAILED); - STR(ERROR_DEVICE_LOST); - STR(ERROR_MEMORY_MAP_FAILED); - STR(ERROR_LAYER_NOT_PRESENT); - STR(ERROR_EXTENSION_NOT_PRESENT); - STR(ERROR_FEATURE_NOT_PRESENT); - STR(ERROR_INCOMPATIBLE_DRIVER); - STR(ERROR_TOO_MANY_OBJECTS); - STR(ERROR_FORMAT_NOT_SUPPORTED); - STR(ERROR_SURFACE_LOST_KHR); - STR(ERROR_NATIVE_WINDOW_IN_USE_KHR); - STR(SUBOPTIMAL_KHR); - STR(ERROR_OUT_OF_DATE_KHR); - STR(ERROR_INCOMPATIBLE_DISPLAY_KHR); - STR(ERROR_VALIDATION_FAILED_EXT); - STR(ERROR_INVALID_SHADER_NV); -#undef STR - default: - return "UNKNOWN_ERROR"; - } -} - -std::string -physicalDeviceTypeString(VkPhysicalDeviceType type) -{ - switch (type) { -#define STR(r) \ - case VK_PHYSICAL_DEVICE_TYPE_##r: \ - return #r - STR(OTHER); - STR(INTEGRATED_GPU); - STR(DISCRETE_GPU); - STR(VIRTUAL_GPU); -#undef STR - default: - return "UNKNOWN_DEVICE_TYPE"; - } -} - -VkBool32 -getSupportedDepthFormat(VkPhysicalDevice physicalDevice, VkFormat* depthFormat) -{ - // Since all depth formats may be optional, we need to find a suitable depth - // format to use Start with the highest precision packed format - std::vector depthFormats = { VK_FORMAT_D32_SFLOAT_S8_UINT, - VK_FORMAT_D32_SFLOAT, - VK_FORMAT_D24_UNORM_S8_UINT, - VK_FORMAT_D16_UNORM_S8_UINT, - VK_FORMAT_D16_UNORM }; - - for (auto& format : depthFormats) { - VkFormatProperties formatProps; - vkGetPhysicalDeviceFormatProperties( - physicalDevice, format, &formatProps); - // Format must support depth stencil attachment for optimal tiling - if (formatProps.optimalTilingFeatures & - VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) { - *depthFormat = format; - return true; - } - } - - return false; -} - -// Returns if a given format support LINEAR filtering -VkBool32 -formatIsFilterable(VkPhysicalDevice physicalDevice, - VkFormat format, - VkImageTiling tiling) -{ - VkFormatProperties formatProps; - vkGetPhysicalDeviceFormatProperties(physicalDevice, format, &formatProps); - - if (tiling == VK_IMAGE_TILING_OPTIMAL) - return formatProps.optimalTilingFeatures & - VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT; - - if (tiling == VK_IMAGE_TILING_LINEAR) - return formatProps.linearTilingFeatures & - VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT; - - return false; -} - -// Create an image memory barrier for changing the layout of -// an image and put it into an active command buffer -// See chapter 11.4 "Image Layout" for details - -void -setImageLayout(VkCommandBuffer cmdbuffer, - VkImage image, - VkImageLayout oldImageLayout, - VkImageLayout newImageLayout, - VkImageSubresourceRange subresourceRange, - VkPipelineStageFlags srcStageMask, - VkPipelineStageFlags dstStageMask) -{ - // Create an image barrier object - VkImageMemoryBarrier imageMemoryBarrier = - vks::initializers::imageMemoryBarrier(); - imageMemoryBarrier.oldLayout = oldImageLayout; - imageMemoryBarrier.newLayout = newImageLayout; - imageMemoryBarrier.image = image; - imageMemoryBarrier.subresourceRange = subresourceRange; - - // Source layouts (old) - // Source access mask controls actions that have to be finished on the old - // layout before it will be transitioned to the new layout - switch (oldImageLayout) { - case VK_IMAGE_LAYOUT_UNDEFINED: - // Image layout is undefined (or does not matter) - // Only valid as initial layout - // No flags required, listed only for completeness - imageMemoryBarrier.srcAccessMask = 0; - break; - - case VK_IMAGE_LAYOUT_PREINITIALIZED: - // Image is preinitialized - // Only valid as initial layout for linear images, preserves memory - // contents Make sure host writes have been finished - imageMemoryBarrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT; - break; - - case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: - // Image is a color attachment - // Make sure any writes to the color buffer have been finished - imageMemoryBarrier.srcAccessMask = - VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - break; - - case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL: - // Image is a depth/stencil attachment - // Make sure any writes to the depth/stencil buffer have been - // finished - imageMemoryBarrier.srcAccessMask = - VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; - break; - - case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: - // Image is a transfer source - // Make sure any reads from the image have been finished - imageMemoryBarrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; - break; - - case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: - // Image is a transfer destination - // Make sure any writes to the image have been finished - imageMemoryBarrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - break; - - case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: - // Image is read by a shader - // Make sure any shader reads from the image have been finished - imageMemoryBarrier.srcAccessMask = VK_ACCESS_SHADER_READ_BIT; - break; - default: - // Other source layouts aren't handled (yet) - break; - } - - // Target layouts (new) - // Destination access mask controls the dependency for the new image layout - switch (newImageLayout) { - case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: - // Image will be used as a transfer destination - // Make sure any writes to the image have been finished - imageMemoryBarrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - break; - - case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: - // Image will be used as a transfer source - // Make sure any reads from the image have been finished - imageMemoryBarrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; - break; - - case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: - // Image will be used as a color attachment - // Make sure any writes to the color buffer have been finished - imageMemoryBarrier.dstAccessMask = - VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - break; - - case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL: - // Image layout will be used as a depth/stencil attachment - // Make sure any writes to depth/stencil buffer have been finished - imageMemoryBarrier.dstAccessMask = - imageMemoryBarrier.dstAccessMask | - VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; - break; - - case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: - // Image will be read in a shader (sampler, input attachment) - // Make sure any writes to the image have been finished - if (imageMemoryBarrier.srcAccessMask == 0) { - imageMemoryBarrier.srcAccessMask = - VK_ACCESS_HOST_WRITE_BIT | VK_ACCESS_TRANSFER_WRITE_BIT; - } - imageMemoryBarrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; - break; - default: - // Other source layouts aren't handled (yet) - break; - } - - // Put barrier inside setup command buffer - vkCmdPipelineBarrier(cmdbuffer, - srcStageMask, - dstStageMask, - 0, - 0, - nullptr, - 0, - nullptr, - 1, - &imageMemoryBarrier); -} - -// Fixed sub resource on first mip level and layer -void -setImageLayout(VkCommandBuffer cmdbuffer, - VkImage image, - VkImageAspectFlags aspectMask, - VkImageLayout oldImageLayout, - VkImageLayout newImageLayout, - VkPipelineStageFlags srcStageMask, - VkPipelineStageFlags dstStageMask) -{ - VkImageSubresourceRange subresourceRange = {}; - subresourceRange.aspectMask = aspectMask; - subresourceRange.baseMipLevel = 0; - subresourceRange.levelCount = 1; - subresourceRange.layerCount = 1; - setImageLayout(cmdbuffer, - image, - oldImageLayout, - newImageLayout, - subresourceRange, - srcStageMask, - dstStageMask); -} - -void -insertImageMemoryBarrier(VkCommandBuffer cmdbuffer, - VkImage image, - VkAccessFlags srcAccessMask, - VkAccessFlags dstAccessMask, - VkImageLayout oldImageLayout, - VkImageLayout newImageLayout, - VkPipelineStageFlags srcStageMask, - VkPipelineStageFlags dstStageMask, - VkImageSubresourceRange subresourceRange) -{ - VkImageMemoryBarrier imageMemoryBarrier = - vks::initializers::imageMemoryBarrier(); - imageMemoryBarrier.srcAccessMask = srcAccessMask; - imageMemoryBarrier.dstAccessMask = dstAccessMask; - imageMemoryBarrier.oldLayout = oldImageLayout; - imageMemoryBarrier.newLayout = newImageLayout; - imageMemoryBarrier.image = image; - imageMemoryBarrier.subresourceRange = subresourceRange; - - vkCmdPipelineBarrier(cmdbuffer, - srcStageMask, - dstStageMask, - 0, - 0, - nullptr, - 0, - nullptr, - 1, - &imageMemoryBarrier); -} - -void -exitFatal(std::string message, int32_t exitCode) -{ -#if defined(_WIN32) - if (!errorModeSilent) { - MessageBox(NULL, message.c_str(), NULL, MB_OK | MB_ICONERROR); - } -#endif - std::cerr << message << "\n"; -} - -void -exitFatal(std::string message, VkResult resultCode) -{ - exitFatal(message, (int32_t)resultCode); -} - -VkShaderModule -loadShader(const char* fileName, VkDevice device) -{ - std::ifstream is(fileName, std::ios::binary | std::ios::in | std::ios::ate); - - if (is.is_open()) { - size_t size = is.tellg(); - is.seekg(0, std::ios::beg); - char* shaderCode = new char[size]; - is.read(shaderCode, size); - is.close(); - - assert(size > 0); - - VkShaderModule shaderModule; - VkShaderModuleCreateInfo moduleCreateInfo{}; - moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; - moduleCreateInfo.codeSize = size; - moduleCreateInfo.pCode = (uint32_t*)shaderCode; - - VK_CHECK_RESULT( - vkCreateShaderModule(device, &moduleCreateInfo, NULL, &shaderModule)); - - delete[] shaderCode; - - return shaderModule; - } else { - std::cerr << "Error: Could not open shader file \"" << fileName << "\"" - << std::endl; - return VK_NULL_HANDLE; - } -} - -bool -fileExists(const std::string& filename) -{ - std::ifstream f(filename.c_str()); - return !f.fail(); -} -} // namespace tools -} // namespace vks diff --git a/src/VulkanTools.h b/src/VulkanTools.h deleted file mode 100644 index bec00baa7..000000000 --- a/src/VulkanTools.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Assorted Vulkan helper functions - * - * Copyright (C) 2016 by Sascha Willems - www.saschawillems.de - * - * This code is licensed under the MIT license (MIT) - * (http://opensource.org/licenses/MIT) - */ - -#pragma once - -#include "VulkanInitializers.hpp" -#include "vulkan/vulkan.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#if defined(_WIN32) -#include -#include -#include -#endif - -// Custom define for better code readability -#define VK_FLAGS_NONE 0 -// Default fence timeout in nanoseconds -#define DEFAULT_FENCE_TIMEOUT 100000000000 - -// Macro to check and display Vulkan return results -#define VK_CHECK_RESULT(f) \ - { \ - VkResult res = (f); \ - if (res != VK_SUCCESS) { \ - std::cout << "Fatal : VkResult is \"" \ - << vks::tools::errorString(res) << "\" in " << __FILE__ \ - << " at line " << __LINE__ << std::endl; \ - assert(res == VK_SUCCESS); \ - } \ - } - -const std::string -getAssetPath(); - -namespace vks { -namespace tools { -/** @brief Disable message boxes on fatal errors */ -extern bool errorModeSilent; - -/** @brief Returns an error code as a string */ -std::string -errorString(VkResult errorCode); - -/** @brief Returns the device type as a string */ -std::string -physicalDeviceTypeString(VkPhysicalDeviceType type); - -// Selected a suitable supported depth format starting with 32 bit down to 16 -// bit Returns false if none of the depth formats in the list is supported by -// the device -VkBool32 -getSupportedDepthFormat(VkPhysicalDevice physicalDevice, VkFormat* depthFormat); - -// Returns if a given format support LINEAR filtering -VkBool32 -formatIsFilterable(VkPhysicalDevice physicalDevice, - VkFormat format, - VkImageTiling tiling); - -// Put an image memory barrier for setting an image layout on the sub resource -// into the given command buffer -void -setImageLayout( - VkCommandBuffer cmdbuffer, - VkImage image, - VkImageLayout oldImageLayout, - VkImageLayout newImageLayout, - VkImageSubresourceRange subresourceRange, - VkPipelineStageFlags srcStageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, - VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT); -// Uses a fixed sub resource layout with first mip level and layer -void -setImageLayout( - VkCommandBuffer cmdbuffer, - VkImage image, - VkImageAspectFlags aspectMask, - VkImageLayout oldImageLayout, - VkImageLayout newImageLayout, - VkPipelineStageFlags srcStageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, - VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT); - -/** @brief Inser an image memory barrier into the command buffer */ -void -insertImageMemoryBarrier(VkCommandBuffer cmdbuffer, - VkImage image, - VkAccessFlags srcAccessMask, - VkAccessFlags dstAccessMask, - VkImageLayout oldImageLayout, - VkImageLayout newImageLayout, - VkPipelineStageFlags srcStageMask, - VkPipelineStageFlags dstStageMask, - VkImageSubresourceRange subresourceRange); - -// Display error message and exit on fatal error -void -exitFatal(std::string message, int32_t exitCode); -void -exitFatal(std::string message, VkResult resultCode); - -// Load a SPIR-V shader (binary) -VkShaderModule -loadShader(const char* fileName, VkDevice device); - -/** @brief Checks if a file exists */ -bool -fileExists(const std::string& filename); -} // namespace tools -} // namespace vks