Render Passes

The Vulkan runtime code in Mesa provides several helpful utilities to make managing render passes easier.

VK_KHR_create_renderpass2

It is strongly recommended that drivers implement VK_KHR_create_renderpass2 directly and not bother implementing the old Vulkan 1.0 entrypoints. If a driver does not implement them, the following will be implemented in common code in terms of their VK_KHR_create_renderpass2 counterparts:

  • vkCreateRenderPass()

  • vkCmdBeginRenderPass()

  • vkCmdNextSubpass()

  • vkCmdEndRenderPass()

Common VkRenderPass implementation

The Vulkan runtime code in Mesa provides a common implementation of VkRenderPass called vk_render_pass which drivers can optionally use. Unlike most Vulkan runtime structs, it’s not really designed to be used as a base for a driver-specific struct. It does, however, contain all the information passed to vkCreateRenderPass2() so it can be used in a driver so long as that driver doesn’t need to do any additional compilation at vkCreateRenderPass2() time. If a driver chooses to use vk_render_pass, the Vulkan runtime provides implementations of vkCreateRenderPass2() and vkDestroyRenderPass().

VK_KHR_dynamic_rendering

For drivers which don’t need to do subpass combining, it is recommended that they skip implementing render passes entirely and implement VK_KHR_dynamic_rendering instead. If they choose to do so, the runtime will provide the following, implemented in terms of vkCmdBeginRendering() and vkCmdEndRendering():

  • vkCmdBeginRenderPass2()

  • vkCmdNextSubpass2()

  • vkCmdEndRenderPass2()

We also provide a no-op implementation of vkGetRenderAreaGranularity() which returns a render area granularity of 1x1.

Drivers which wish to use the common render pass implementation in this way must also support a Mesa-specific pseudo-extension which optionally provides an initial image layout for each attachment at vkCmdBeginRendering() time. This is required for us to combine render pass clears with layout transitions, often from VK_IMAGE_LAYOUT_UNDEFINED. On at least Intel and AMD, combining these transitions with clears is important for performance.

Warning

doxygenstruct: Cannot find file: /home/user/documentation/docs/mesa/repository/docs/doxygen_xml/index.xml

Because render passes and subpass indices are also passed into vkCmdCreateGraphicsPipelines() and vkCmdExecuteCommands() which we can’t implement on the driver’s behalf, we provide a couple of helpers for getting the render pass information in terms of the relevant VK_KHR_dynamic_rendering:

Warning

doxygenfunction: Cannot find file: /home/user/documentation/docs/mesa/repository/docs/doxygen_xml/index.xml

Warning

doxygenfunction: Cannot find file: /home/user/documentation/docs/mesa/repository/docs/doxygen_xml/index.xml

Apart from handling layout transitions, the common render pass implementation mostly ignores input attachments. It is expected that the driver call nir_lower_input_attachments() to turn them into texturing operations. The driver must support texturing from an input attachment at the same time as rendering to it in order to support Vulkan subpass self-dependencies. VK_EXT_attachment_feedback_loop_layout provides information on when these self dependencies are present.

vk_render_pass reference

The following is a reference for the vk_render_pass structure and its substructures.

Warning

doxygenstruct: Cannot find file: /home/user/documentation/docs/mesa/repository/docs/doxygen_xml/index.xml

Warning

doxygenstruct: Cannot find file: /home/user/documentation/docs/mesa/repository/docs/doxygen_xml/index.xml

Warning

doxygenstruct: Cannot find file: /home/user/documentation/docs/mesa/repository/docs/doxygen_xml/index.xml

Warning

doxygenstruct: Cannot find file: /home/user/documentation/docs/mesa/repository/docs/doxygen_xml/index.xml

Warning

doxygenstruct: Cannot find file: /home/user/documentation/docs/mesa/repository/docs/doxygen_xml/index.xml