| 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: |
| |
| - :cpp:func:`vkCreateRenderPass` |
| - :cpp:func:`vkCmdBeginRenderPass` |
| - :cpp:func:`vkCmdNextSubpass` |
| - :cpp:func:`vkCmdEndRenderPass` |
| |
| |
| Common VkRenderPass implementation |
| ---------------------------------- |
| |
| The Vulkan runtime code in Mesa provides a common implementation of |
| :cpp:type:`VkRenderPass` called :cpp:struct:`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 |
| :cpp:func:`vkCreateRenderPass2` so it can be used in a driver so long as |
| that driver doesn't need to do any additional compilation at |
| :cpp:func:`vkCreateRenderPass2` time. If a driver chooses to use |
| :cpp:struct:`vk_render_pass`, the Vulkan runtime provides implementations |
| of :cpp:func:`vkCreateRenderPass2` and :cpp:func:`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 |
| :cpp:func:`vkCmdBeginRendering` and :cpp:func:`vkCmdEndRendering`: |
| |
| - :cpp:func:`vkCmdBeginRenderPass2` |
| - :cpp:func:`vkCmdNextSubpass2` |
| - :cpp:func:`vkCmdEndRenderPass2` |
| |
| We also provide a no-op implementation of |
| :cpp:func:`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 |
| :cpp:func:`vkCmdBeginRendering` time. This is required for us to combine |
| render pass clears with layout transitions, often from |
| :cpp:enum:`VK_IMAGE_LAYOUT_UNDEFINED`. On at least Intel and AMD, |
| combining these transitions with clears is important for performance. |
| |
| .. doxygenstruct:: VkRenderingAttachmentInitialLayoutInfoMESA |
| :members: |
| |
| Because render passes and subpass indices are also passed into |
| :cpp:func:`vkCmdCreateGraphicsPipelines` and |
| :cpp:func:`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: |
| |
| .. doxygenfunction:: vk_get_pipeline_rendering_create_info |
| |
| .. doxygenfunction:: vk_get_command_buffer_inheritance_rendering_info |
| |
| Apart from handling layout transitions, the common render pass |
| implementation mostly ignores input attachments. It is expected that the |
| driver call :cpp:func:`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. To assist drivers, we provide self-dependency |
| information through another Mesa-specific pseudo-extension: |
| |
| .. doxygenstruct:: VkRenderingSelfDependencyInfoMESA |
| :members: |
| |
| vk_render_pass reference |
| ------------------------ |
| |
| The following is a reference for the :cpp:struct:`vk_render_pass` structure |
| and its substructures. |
| |
| .. doxygenstruct:: vk_render_pass |
| :members: |
| |
| .. doxygenstruct:: vk_render_pass_attachment |
| :members: |
| |
| .. doxygenstruct:: vk_subpass |
| :members: |
| |
| .. doxygenstruct:: vk_subpass_attachment |
| :members: |
| |
| .. doxygenstruct:: vk_subpass_dependency |
| :members: |