/* Copyright (c) 2019-2024, Sascha Willems * * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 the "License"; * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include "volk.h" #include namespace vkb { namespace initializers { inline VkMemoryAllocateInfo memory_allocate_info() { VkMemoryAllocateInfo memory_allocation{}; memory_allocation.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; return memory_allocation; } inline VkMappedMemoryRange mapped_memory_range() { VkMappedMemoryRange mapped_memory_range{}; mapped_memory_range.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE; return mapped_memory_range; } inline VkCommandBufferAllocateInfo command_buffer_allocate_info( VkCommandPool command_pool, VkCommandBufferLevel level, uint32_t buffer_count) { VkCommandBufferAllocateInfo command_buffer_allocate_info{}; command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; command_buffer_allocate_info.commandPool = command_pool; command_buffer_allocate_info.level = level; command_buffer_allocate_info.commandBufferCount = buffer_count; return command_buffer_allocate_info; } inline VkCommandPoolCreateInfo command_pool_create_info() { VkCommandPoolCreateInfo command_pool_create_info{}; command_pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; return command_pool_create_info; } inline VkCommandBufferBeginInfo command_buffer_begin_info() { VkCommandBufferBeginInfo cmdBufferBeginInfo{}; cmdBufferBeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; return cmdBufferBeginInfo; } inline VkCommandBufferInheritanceInfo command_buffer_inheritance_info() { VkCommandBufferInheritanceInfo command_buffer_inheritance_info{}; command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO; return command_buffer_inheritance_info; } inline VkRenderPassBeginInfo render_pass_begin_info() { VkRenderPassBeginInfo render_pass_begin_info{}; render_pass_begin_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; return render_pass_begin_info; } inline VkRenderPassCreateInfo render_pass_create_info() { VkRenderPassCreateInfo render_pass_create_info{}; render_pass_create_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; return render_pass_create_info; } /** @brief Initialize rendering_attachment_info */ inline VkRenderingAttachmentInfoKHR rendering_attachment_info() { VkRenderingAttachmentInfoKHR attachment_info{}; attachment_info.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR; attachment_info.pNext = VK_NULL_HANDLE; return attachment_info; } /** @brief Initialize VkRenderingInfoKHR, e.g. for use with dynamic rendering extension */ inline VkRenderingInfoKHR rendering_info(VkRect2D render_area = {}, uint32_t color_attachment_count = 0, const VkRenderingAttachmentInfoKHR *pColorAttachments = VK_NULL_HANDLE, VkRenderingFlagsKHR flags = 0) { VkRenderingInfoKHR rendering_info = {}; rendering_info.sType = VK_STRUCTURE_TYPE_RENDERING_INFO_KHR; rendering_info.pNext = VK_NULL_HANDLE; rendering_info.flags = flags; rendering_info.renderArea = render_area; rendering_info.layerCount = 0; rendering_info.viewMask = 0; rendering_info.colorAttachmentCount = color_attachment_count; rendering_info.pColorAttachments = pColorAttachments; rendering_info.pDepthAttachment = VK_NULL_HANDLE; rendering_info.pStencilAttachment = VK_NULL_HANDLE; return rendering_info; } /** @brief Initialize an image memory barrier with no image transfer ownership */ inline VkImageMemoryBarrier image_memory_barrier() { VkImageMemoryBarrier image_memory_barrier{}; image_memory_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; image_memory_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; image_memory_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; return image_memory_barrier; } /** @brief Initialize a buffer memory barrier with no image transfer ownership */ inline VkBufferMemoryBarrier buffer_memory_barrier() { VkBufferMemoryBarrier buffer_memory_barrier{}; buffer_memory_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER; buffer_memory_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; buffer_memory_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; return buffer_memory_barrier; } inline VkMemoryBarrier memory_barrier() { VkMemoryBarrier memory_barrier{}; memory_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER; return memory_barrier; } inline VkImageCreateInfo image_create_info() { VkImageCreateInfo image_create_info{}; image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; return image_create_info; } inline VkSamplerCreateInfo sampler_create_info() { VkSamplerCreateInfo sampler_create_info{}; sampler_create_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; sampler_create_info.maxAnisotropy = 1.0f; return sampler_create_info; } inline VkImageViewCreateInfo image_view_create_info() { VkImageViewCreateInfo image_view_create_info{}; image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; return image_view_create_info; } inline VkFramebufferCreateInfo framebuffer_create_info() { VkFramebufferCreateInfo framebuffer_create_info{}; framebuffer_create_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; return framebuffer_create_info; } inline VkSemaphoreCreateInfo semaphore_create_info() { VkSemaphoreCreateInfo semaphore_create_info{}; semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; return semaphore_create_info; } inline VkFenceCreateInfo fence_create_info(VkFenceCreateFlags flags = 0) { VkFenceCreateInfo fence_create_info{}; fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; fence_create_info.flags = flags; return fence_create_info; } inline VkEventCreateInfo event_create_info() { VkEventCreateInfo event_create_info{}; event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO; return event_create_info; } inline VkSubmitInfo submit_info() { VkSubmitInfo submit_info{}; submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; return submit_info; } inline VkViewport viewport( float width, float height, float min_depth, float max_depth) { VkViewport viewport{}; viewport.width = width; viewport.height = height; viewport.minDepth = min_depth; viewport.maxDepth = max_depth; return viewport; } inline VkRect2D rect2D( int32_t width, int32_t height, int32_t offset_x, int32_t offset_y) { VkRect2D rect2D{}; rect2D.extent.width = width; rect2D.extent.height = height; rect2D.offset.x = offset_x; rect2D.offset.y = offset_y; return rect2D; } inline VkBufferCreateInfo buffer_create_info() { VkBufferCreateInfo buffer_create_info{}; buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; return buffer_create_info; } inline VkBufferCreateInfo buffer_create_info( VkBufferUsageFlags usage, VkDeviceSize size) { VkBufferCreateInfo buffer_create_info{}; buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; buffer_create_info.usage = usage; buffer_create_info.size = size; return buffer_create_info; } inline VkDescriptorPoolCreateInfo descriptor_pool_create_info( uint32_t count, VkDescriptorPoolSize *pool_sizes, uint32_t max_sets) { VkDescriptorPoolCreateInfo descriptor_pool_info{}; descriptor_pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; descriptor_pool_info.poolSizeCount = count; descriptor_pool_info.pPoolSizes = pool_sizes; descriptor_pool_info.maxSets = max_sets; return descriptor_pool_info; } inline VkDescriptorPoolCreateInfo descriptor_pool_create_info( const std::vector &pool_sizes, uint32_t max_sets) { VkDescriptorPoolCreateInfo descriptor_pool_info{}; descriptor_pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; descriptor_pool_info.poolSizeCount = static_cast(pool_sizes.size()); descriptor_pool_info.pPoolSizes = pool_sizes.data(); descriptor_pool_info.maxSets = max_sets; return descriptor_pool_info; } inline VkDescriptorPoolSize descriptor_pool_size( VkDescriptorType type, uint32_t count) { VkDescriptorPoolSize descriptor_pool_size{}; descriptor_pool_size.type = type; descriptor_pool_size.descriptorCount = count; return descriptor_pool_size; } inline VkDescriptorSetLayoutBinding descriptor_set_layout_binding( VkDescriptorType type, VkShaderStageFlags flags, uint32_t binding, uint32_t count = 1) { VkDescriptorSetLayoutBinding set_layout_binding{}; set_layout_binding.descriptorType = type; set_layout_binding.stageFlags = flags; set_layout_binding.binding = binding; set_layout_binding.descriptorCount = count; return set_layout_binding; } inline VkDescriptorSetLayoutCreateInfo descriptor_set_layout_create_info( const VkDescriptorSetLayoutBinding *bindings, uint32_t binding_count) { VkDescriptorSetLayoutCreateInfo descriptor_set_layout_create_info{}; descriptor_set_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; descriptor_set_layout_create_info.pBindings = bindings; descriptor_set_layout_create_info.bindingCount = binding_count; return descriptor_set_layout_create_info; } inline VkDescriptorSetLayoutCreateInfo descriptor_set_layout_create_info( const std::vector &bindings) { VkDescriptorSetLayoutCreateInfo descriptor_set_layout_create_info{}; descriptor_set_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; descriptor_set_layout_create_info.pBindings = bindings.data(); descriptor_set_layout_create_info.bindingCount = static_cast(bindings.size()); return descriptor_set_layout_create_info; } inline VkPipelineLayoutCreateInfo pipeline_layout_create_info( const VkDescriptorSetLayout *set_layouts, uint32_t set_layout_count = 1) { VkPipelineLayoutCreateInfo pipeline_layout_create_info{}; pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; pipeline_layout_create_info.setLayoutCount = set_layout_count; pipeline_layout_create_info.pSetLayouts = set_layouts; return pipeline_layout_create_info; } inline VkPipelineLayoutCreateInfo pipeline_layout_create_info( uint32_t set_layout_count = 1) { VkPipelineLayoutCreateInfo pipeline_layout_create_info{}; pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; pipeline_layout_create_info.setLayoutCount = set_layout_count; return pipeline_layout_create_info; } inline VkDescriptorSetAllocateInfo descriptor_set_allocate_info( VkDescriptorPool descriptor_pool, const VkDescriptorSetLayout *set_layouts, uint32_t descriptor_set_count) { VkDescriptorSetAllocateInfo descriptor_set_allocate_info{}; descriptor_set_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; descriptor_set_allocate_info.descriptorPool = descriptor_pool; descriptor_set_allocate_info.pSetLayouts = set_layouts; descriptor_set_allocate_info.descriptorSetCount = descriptor_set_count; return descriptor_set_allocate_info; } inline VkDescriptorImageInfo descriptor_image_info(VkSampler sampler, VkImageView image_view, VkImageLayout image_layout) { VkDescriptorImageInfo descriptor_image_info{}; descriptor_image_info.sampler = sampler; descriptor_image_info.imageView = image_view; descriptor_image_info.imageLayout = image_layout; return descriptor_image_info; } inline VkWriteDescriptorSet write_descriptor_set( VkDescriptorSet dst_set, VkDescriptorType type, uint32_t binding, VkDescriptorBufferInfo *buffer_info, uint32_t descriptor_count = 1) { VkWriteDescriptorSet write_descriptor_set{}; write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; write_descriptor_set.dstSet = dst_set; write_descriptor_set.descriptorType = type; write_descriptor_set.dstBinding = binding; write_descriptor_set.pBufferInfo = buffer_info; write_descriptor_set.descriptorCount = descriptor_count; return write_descriptor_set; } inline VkWriteDescriptorSet write_descriptor_set( VkDescriptorSet dst_set, VkDescriptorType type, uint32_t binding, VkDescriptorImageInfo *image_info, uint32_t descriptor_count = 1) { VkWriteDescriptorSet write_descriptor_set{}; write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; write_descriptor_set.dstSet = dst_set; write_descriptor_set.descriptorType = type; write_descriptor_set.dstBinding = binding; write_descriptor_set.pImageInfo = image_info; write_descriptor_set.descriptorCount = descriptor_count; return write_descriptor_set; } inline VkVertexInputBindingDescription vertex_input_binding_description( uint32_t binding, uint32_t stride, VkVertexInputRate input_rate) { VkVertexInputBindingDescription vertex_input_binding_description{}; vertex_input_binding_description.binding = binding; vertex_input_binding_description.stride = stride; vertex_input_binding_description.inputRate = input_rate; return vertex_input_binding_description; } inline VkVertexInputBindingDescription2EXT vertex_input_binding_description2ext( uint32_t binding, uint32_t stride, VkVertexInputRate input_rate, uint32_t divisor) { VkVertexInputBindingDescription2EXT vertex_input_binding_description2ext{}; vertex_input_binding_description2ext.sType = VK_STRUCTURE_TYPE_VERTEX_INPUT_BINDING_DESCRIPTION_2_EXT; vertex_input_binding_description2ext.binding = binding; vertex_input_binding_description2ext.stride = stride; vertex_input_binding_description2ext.inputRate = input_rate; vertex_input_binding_description2ext.divisor = divisor; return vertex_input_binding_description2ext; } inline VkVertexInputAttributeDescription vertex_input_attribute_description( uint32_t binding, uint32_t location, VkFormat format, uint32_t offset) { VkVertexInputAttributeDescription vertex_input_attribute_description{}; vertex_input_attribute_description.location = location; vertex_input_attribute_description.binding = binding; vertex_input_attribute_description.format = format; vertex_input_attribute_description.offset = offset; return vertex_input_attribute_description; } inline VkVertexInputAttributeDescription2EXT vertex_input_attribute_description2ext( uint32_t binding, uint32_t location, VkFormat format, uint32_t offset) { VkVertexInputAttributeDescription2EXT vertex_input_attribute_description2ext{}; vertex_input_attribute_description2ext.sType = VK_STRUCTURE_TYPE_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION_2_EXT; vertex_input_attribute_description2ext.location = location; vertex_input_attribute_description2ext.binding = binding; vertex_input_attribute_description2ext.format = format; vertex_input_attribute_description2ext.offset = offset; return vertex_input_attribute_description2ext; } inline VkPipelineVertexInputStateCreateInfo pipeline_vertex_input_state_create_info() { VkPipelineVertexInputStateCreateInfo pipeline_vertex_input_state_create_info{}; pipeline_vertex_input_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; return pipeline_vertex_input_state_create_info; } inline VkPipelineInputAssemblyStateCreateInfo pipeline_input_assembly_state_create_info( VkPrimitiveTopology topology, VkPipelineInputAssemblyStateCreateFlags flags, VkBool32 primitive_restart_enable) { VkPipelineInputAssemblyStateCreateInfo pipeline_input_assembly_state_create_info{}; pipeline_input_assembly_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; pipeline_input_assembly_state_create_info.topology = topology; pipeline_input_assembly_state_create_info.flags = flags; pipeline_input_assembly_state_create_info.primitiveRestartEnable = primitive_restart_enable; return pipeline_input_assembly_state_create_info; } inline VkPipelineRasterizationStateCreateInfo pipeline_rasterization_state_create_info( VkPolygonMode polygon_mode, VkCullModeFlags cull_mode, VkFrontFace front_face, VkPipelineRasterizationStateCreateFlags flags = 0) { VkPipelineRasterizationStateCreateInfo pipeline_rasterization_state_create_info{}; pipeline_rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; pipeline_rasterization_state_create_info.polygonMode = polygon_mode; pipeline_rasterization_state_create_info.cullMode = cull_mode; pipeline_rasterization_state_create_info.frontFace = front_face; pipeline_rasterization_state_create_info.flags = flags; pipeline_rasterization_state_create_info.depthClampEnable = VK_FALSE; pipeline_rasterization_state_create_info.lineWidth = 1.0f; return pipeline_rasterization_state_create_info; } inline VkPipelineColorBlendAttachmentState pipeline_color_blend_attachment_state( VkColorComponentFlags color_write_mask, VkBool32 blend_enable) { VkPipelineColorBlendAttachmentState pipeline_color_blend_attachment_state{}; pipeline_color_blend_attachment_state.colorWriteMask = color_write_mask; pipeline_color_blend_attachment_state.blendEnable = blend_enable; return pipeline_color_blend_attachment_state; } inline VkPipelineColorBlendStateCreateInfo pipeline_color_blend_state_create_info( uint32_t attachment_count, const VkPipelineColorBlendAttachmentState *attachments) { VkPipelineColorBlendStateCreateInfo pipeline_color_blend_state_create_info{}; pipeline_color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; pipeline_color_blend_state_create_info.attachmentCount = attachment_count; pipeline_color_blend_state_create_info.pAttachments = attachments; return pipeline_color_blend_state_create_info; } inline VkPipelineDepthStencilStateCreateInfo pipeline_depth_stencil_state_create_info( VkBool32 depth_test_enable, VkBool32 depth_write_enable, VkCompareOp depth_compare_op) { VkPipelineDepthStencilStateCreateInfo pipeline_depth_stencil_state_create_info{}; pipeline_depth_stencil_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO; pipeline_depth_stencil_state_create_info.depthTestEnable = depth_test_enable; pipeline_depth_stencil_state_create_info.depthWriteEnable = depth_write_enable; pipeline_depth_stencil_state_create_info.depthCompareOp = depth_compare_op; pipeline_depth_stencil_state_create_info.front = pipeline_depth_stencil_state_create_info.back; pipeline_depth_stencil_state_create_info.back.compareOp = VK_COMPARE_OP_ALWAYS; return pipeline_depth_stencil_state_create_info; } inline VkPipelineViewportStateCreateInfo pipeline_viewport_state_create_info( uint32_t viewport_count, uint32_t scissor_count, VkPipelineViewportStateCreateFlags flags = 0) { VkPipelineViewportStateCreateInfo pipeline_viewport_state_create_info{}; pipeline_viewport_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; pipeline_viewport_state_create_info.viewportCount = viewport_count; pipeline_viewport_state_create_info.scissorCount = scissor_count; pipeline_viewport_state_create_info.flags = flags; return pipeline_viewport_state_create_info; } inline VkPipelineMultisampleStateCreateInfo pipeline_multisample_state_create_info( VkSampleCountFlagBits rasterization_samples, VkPipelineMultisampleStateCreateFlags flags = 0) { VkPipelineMultisampleStateCreateInfo pipeline_multisample_state_create_info{}; pipeline_multisample_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; pipeline_multisample_state_create_info.rasterizationSamples = rasterization_samples; pipeline_multisample_state_create_info.flags = flags; return pipeline_multisample_state_create_info; } inline VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info( const VkDynamicState *dynamic_states, uint32_t dynamicStateCount, VkPipelineDynamicStateCreateFlags flags = 0) { VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info{}; pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO; pipeline_dynamic_state_create_info.pDynamicStates = dynamic_states; pipeline_dynamic_state_create_info.dynamicStateCount = dynamicStateCount; pipeline_dynamic_state_create_info.flags = flags; return pipeline_dynamic_state_create_info; } inline VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info( const std::vector &dynamic_states, VkPipelineDynamicStateCreateFlags flags = 0) { VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info{}; pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO; pipeline_dynamic_state_create_info.pDynamicStates = dynamic_states.data(); pipeline_dynamic_state_create_info.dynamicStateCount = static_cast(dynamic_states.size()); pipeline_dynamic_state_create_info.flags = flags; return pipeline_dynamic_state_create_info; } inline VkPipelineTessellationStateCreateInfo pipeline_tessellation_state_create_info(uint32_t patch_control_points) { VkPipelineTessellationStateCreateInfo pipeline_tessellation_state_create_info{}; pipeline_tessellation_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO; pipeline_tessellation_state_create_info.patchControlPoints = patch_control_points; return pipeline_tessellation_state_create_info; } inline VkGraphicsPipelineCreateInfo pipeline_create_info( VkPipelineLayout layout, VkRenderPass render_pass, VkPipelineCreateFlags flags = 0) { VkGraphicsPipelineCreateInfo pipeline_create_info{}; pipeline_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; pipeline_create_info.layout = layout; pipeline_create_info.renderPass = render_pass; pipeline_create_info.flags = flags; pipeline_create_info.basePipelineIndex = -1; pipeline_create_info.basePipelineHandle = VK_NULL_HANDLE; return pipeline_create_info; } inline VkGraphicsPipelineCreateInfo pipeline_create_info() { VkGraphicsPipelineCreateInfo pipeline_create_info{}; pipeline_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; pipeline_create_info.basePipelineIndex = -1; pipeline_create_info.basePipelineHandle = VK_NULL_HANDLE; return pipeline_create_info; } inline VkComputePipelineCreateInfo compute_pipeline_create_info( VkPipelineLayout layout, VkPipelineCreateFlags flags = 0) { VkComputePipelineCreateInfo compute_pipeline_create_info{}; compute_pipeline_create_info.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO; compute_pipeline_create_info.layout = layout; compute_pipeline_create_info.flags = flags; return compute_pipeline_create_info; } inline VkPushConstantRange push_constant_range( VkShaderStageFlags stage_flags, uint32_t size, uint32_t offset) { VkPushConstantRange push_constant_range{}; push_constant_range.stageFlags = stage_flags; push_constant_range.offset = offset; push_constant_range.size = size; return push_constant_range; } inline VkBindSparseInfo bind_sparse_info() { VkBindSparseInfo bind_sparse_info{}; bind_sparse_info.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO; return bind_sparse_info; } /** @brief Initialize a map entry for a shader specialization constant */ inline VkSpecializationMapEntry specialization_map_entry(uint32_t constant_id, uint32_t offset, size_t size) { VkSpecializationMapEntry specialization_map_entry{}; specialization_map_entry.constantID = constant_id; specialization_map_entry.offset = offset; specialization_map_entry.size = size; return specialization_map_entry; } /** @brief Initialize a specialization constant info structure to pass to a shader stage */ inline VkSpecializationInfo specialization_info(uint32_t map_entry_count, const VkSpecializationMapEntry *map_entries, size_t data_size, const void *data) { VkSpecializationInfo specialization_info{}; specialization_info.mapEntryCount = map_entry_count; specialization_info.pMapEntries = map_entries; specialization_info.dataSize = data_size; specialization_info.pData = data; return specialization_info; } inline VkTimelineSemaphoreSubmitInfo timeline_semaphore_submit_info(uint32_t wait_value_count, uint64_t *wait_values, uint32_t signal_value_count, uint64_t *signal_values) { return VkTimelineSemaphoreSubmitInfo{ VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO, NULL, wait_value_count, wait_values, signal_value_count, signal_values}; } } // namespace initializers } // namespace vkb