import vulkan
, bitops
, render_pass
proc create_color_only_render_pass*( device: VkDevice
, color_format: VkFormat
): Render_Pass =
result = A_Render_Pass()
var
color_attachment = VkAttachmentDescription( format: color_format
, samples: VK_SAMPLE_COUNT_1_BIT
, loadOp: VK_ATTACHMENT_LOAD_OP_CLEAR
, storeOp: VK_ATTACHMENT_STORE_OP_STORE
, stencilLoadOp: VK_ATTACHMENT_LOAD_OP_DONT_CARE
, stencilStoreOp: VK_ATTACHMENT_STORE_OP_DONT_CARE
, initialLayout: VK_IMAGE_LAYOUT_UNDEFINED
, finalLayout: VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
)
color_attachment_reference = VkAttachmentReference( attachment: 0
, layout: VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
)
subpass = VkSubpassDescription( pipelineBindPoint: VK_PIPELINE_BIND_POINT_GRAPHICS
, colorAttachmentCount: 1
, pColorAttachments: addr color_attachment_reference
)
render_pass_info = VkRenderPassCreateInfo( sType: VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO
, attachmentCount: 1
, pAttachments: addr color_attachment
, subpassCount: 1
, pSubpasses: addr subpass
, dependencyCount: 1
)
dependency = VkSubpassDependency( srcSubpass: VK_SUBPASS_EXTERNAL #External means outside of the render pipeline, in srcPass, it means before the render pipeline
, dstSubpass: 0 #must be higher than srcSubpass
, srcStageMask: VkPipelineStageFlags VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
, srcAccessMask: VkAccessFlags 0
, dstStageMask: VkPipelineStageFlags VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
, dstAccessMask: VkAccessFlags bitor( VK_ACCESS_COLOR_ATTACHMENT_READ_BIT.ord
, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT.ord
)
)
render_pass_info.pDependencies = addr dependency
var
res: VkResult = vkCreateRenderPass( device
, addr render_pass_info
, nil
, addr result.vk_handle
)
assert res == VK_SUCCESS
, "create_color_only_render_pass FAILED: " & $res
proc create_basic_shape_render_pass*( device: VkDevice
, color_format: VkFormat
, depth_format: VkFormat
): Render_Pass =
result = A_Render_Pass()
var
attachments: array[2,VkAttachmentDescription]
subpass_dependencies: array[2,VkSubpassDependency]
color_attachment_reference = VkAttachmentReference( attachment: 0
, layout: VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
)
depth_attachment_reference = VkAttachmentReference( attachment: 1
, layout: VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
)
subpass = VkSubpassDescription( pipelineBindPoint: VK_PIPELINE_BIND_POINT_GRAPHICS
, colorAttachmentCount: 1
, pColorAttachments: addr color_attachment_reference
, pDepthStencilAttachment: addr depth_attachment_reference # Reference to the depth attachment in slot 1
, inputAttachmentCount: 0 # Input attachments can be used to sample from contents of a previous subpass
, pInputAttachments: nil # (Input attachments not used by this example)
, preserveAttachmentCount: 0 # Preserved attachments can be used to loop (and preserve) attachments through subpasses
, pPreserveAttachments: nil # (Preserve attachments not used by this example)
, pResolveAttachments: nil # Resolve attachments are resolved at the end of a sub pass and can be used for e.g. multi sampling
)
attachment_description = VkAttachmentDescription( format: color_format
, samples: VK_SAMPLE_COUNT_1_BIT
, loadOp: VK_ATTACHMENT_LOAD_OP_CLEAR
, storeOp: VK_ATTACHMENT_STORE_OP_STORE
, stencilLoadOp: VK_ATTACHMENT_LOAD_OP_DONT_CARE
, stencilStoreOp: VK_ATTACHMENT_STORE_OP_DONT_CARE
, initialLayout: VK_IMAGE_LAYOUT_UNDEFINED
, finalLayout: VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
)
# depth
subpass_dependencies[0] = VkSubpassDependency( srcSubpass: VK_SUBPASS_EXTERNAL #External means outside of the render pipeline, in srcPass, it means before the render pipeline
, dstSubpass: 0 #must be higher than srcSubpass
, srcStageMask: VkPipelineStageFlags bitor( VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT.ord
, VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT.ord
)
, dstStageMask: VkPipelineStageFlags bitor( VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT.ord
, VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT.ord
)
, srcAccessMask: VkAccessFlags VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT
, dstAccessMask: VkAccessFlags bitor( VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT.ord
, VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT.ord
)
)
subpass_dependencies[1] = VkSubpassDependency( srcSubpass: VK_SUBPASS_EXTERNAL
, dstSubpass: 0
, srcStageMask: VkPipelineStageFlags VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
, dstStageMask: VkPipelineStageFlags VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
, srcAccessMask: VkAccessFlags 0
, dstAccessMask: VkAccessFlags bitor( VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT.ord
, VK_ACCESS_COLOR_ATTACHMENT_READ_BIT.ord
)
, dependencyFlags: VkDependencyFlags 0
)
# Color attachment
attachments[0].format = colorFormat # Use the color format selected by the swapchain
attachments[0].samples = VK_SAMPLE_COUNT_1_BIT # We don't use multi sampling in this example
attachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR # Clear this attachment at the start of the render pass
attachments[0].storeOp = VK_ATTACHMENT_STORE_OP_STORE # Keep its contents after the render pass is finished (for displaying it)
attachments[0].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE # We don't use stencil, so don't care for load
attachments[0].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE # Same for store
attachments[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED # Layout at render pass start. Initial doesn't matter, so we use undefined
attachments[0].finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR # Layout to which the attachment is transitioned when the render pass is finished
# As we want to present the color buffer to the swapchain, we transition to PRESENT_KHR
# Depth attachment
attachments[1].format = depthFormat # A proper depth format is selected in the example base
attachments[1].samples = VK_SAMPLE_COUNT_1_BIT
attachments[1].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR # Clear depth at start of first subpass
attachments[1].storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE # We don't need depth after render pass has finished (DONT_CARE may result in better performance)
attachments[1].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE # No stencil
attachments[1].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE # No Stencil
attachments[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED # Layout at render pass start. Initial doesn't matter, so we use undefined
attachments[1].finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL # Transition to depth/stencil attachment
var render_pass_info = VkRenderPassCreateInfo( sType: VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO
, attachmentCount: 2
, subpassCount: 1
, pSubpasses: addr subpass
, dependencyCount: 1
, pAttachments: addr attachments[0]
, pDependencies: addr subpass_dependencies[0]
)
render_pass_info.pDependencies = addr subpass_dependencies[0]
var res: VkResult = vkCreateRenderPass( device
, addr render_pass_info
, nil
, addr result.vk_handle
)
assert res == VK_SUCCESS
, "create_color_only_render_pass FAILED: " & $res