1 /* 2 * Copyright © 2021 Intel Corporation 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21 * IN THE SOFTWARE. 22 */ 23 #ifndef VK_RENDER_PASS_H 24 #define VK_RENDER_PASS_H 25 26 #include "vk_object.h" 27 28 #ifdef __cplusplus 29 extern "C" { 30 #endif 31 32 /** 33 * Pseudo-extension struct that may be chained into VkRenderingInfo, 34 * VkCommandBufferInheritanceRenderingInfo, or VkPipelineRenderingCreateInfo 35 * to provide self-dependency information. 36 */ 37 typedef struct VkRenderingSelfDependencyInfoMESA { 38 VkStructureType sType; 39 #define VK_STRUCTURE_TYPE_RENDERING_SELF_DEPENDENCY_INFO_MESA (VkStructureType)1000044900 40 const void* pNext; 41 42 /** Bitset of which color attachments have self-dependencies */ 43 uint32_t colorSelfDependencies; 44 45 /** True if there is a depth self-dependency */ 46 VkBool32 depthSelfDependency; 47 48 /** True if there is a stencil self-dependency */ 49 VkBool32 stencilSelfDependency; 50 } VkRenderingSelfDependencyInfoMESA; 51 52 /** 53 * Pseudo-extension struct that may be chained into VkRenderingAttachmentInfo 54 * to indicate an initial layout for the attachment. This is only allowed if 55 * all of the following conditions are met: 56 * 57 * 1. VkRenderingAttachmentInfo::loadOp == LOAD_OP_CLEAR 58 * 59 * 2. VkRenderingInfo::renderArea is tne entire image view LOD 60 * 61 * 3. For 3D image attachments, VkRenderingInfo::viewMask == 0 AND 62 * VkRenderingInfo::layerCount references the entire bound image view 63 * OR VkRenderingInfo::viewMask is dense (no holes) and references the 64 * entire bound image view. (2D and 2D array images have no such 65 * requirement.) 66 * 67 * If this struct is included in the pNext chain of a 68 * VkRenderingAttachmentInfo, the driver is responsible for transitioning the 69 * bound region of the image from 70 * VkRenderingAttachmentInitialLayoutInfoMESA::initialLayout to 71 * VkRenderingAttachmentInfo::imageLayout prior to rendering. 72 */ 73 typedef struct VkRenderingAttachmentInitialLayoutInfoMESA { 74 VkStructureType sType; 75 #define VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INITIAL_LAYOUT_INFO_MESA (VkStructureType)1000044901 76 const void* pNext; 77 78 /** Initial layout of the attachment */ 79 VkImageLayout initialLayout; 80 } VkRenderingAttachmentInitialLayoutInfoMESA; 81 82 #define VK_IMAGE_LAYOUT_SUBPASS_SELF_DEPENDENCY_MESA (VkImageLayout)1000044902 83 84 struct vk_subpass_attachment { 85 /** VkAttachmentReference2::attachment */ 86 uint32_t attachment; 87 88 /** Aspects referenced by this attachment 89 * 90 * For an input attachment, this is VkAttachmentReference2::aspectMask. 91 * For all others, it's equal to the vk_render_pass_attachment::aspects. 92 */ 93 VkImageAspectFlags aspects; 94 95 /** Usage for this attachment 96 * 97 * This is a single VK_IMAGE_USAGE_* describing the usage of this subpass 98 * attachment. Resolve attachments are VK_IMAGE_USAGE_TRANSFER_DST_BIT. 99 */ 100 VkImageUsageFlagBits usage; 101 102 /** VkAttachmentReference2::layout */ 103 VkImageLayout layout; 104 105 /** VkAttachmentReferenceStencilLayout::stencilLayout 106 * 107 * If VK_KHR_separate_depth_stencil_layouts is not used, this will be 108 * layout if the attachment contains stencil and VK_IMAGE_LAYOUT_UNDEFINED 109 * otherwise. 110 */ 111 VkImageLayout stencil_layout; 112 113 /** A per-view mask for if this is the last use of this attachment 114 * 115 * If the same render pass attachment is used multiple ways within a 116 * subpass, corresponding last_subpass bits will be set in all of them. 117 * For the non-multiview case, only the first bit is used. 118 */ 119 uint32_t last_subpass; 120 121 /** Resolve attachment, if any */ 122 struct vk_subpass_attachment *resolve; 123 }; 124 125 struct vk_subpass { 126 /** Count of all attachments referenced by this subpass */ 127 uint32_t attachment_count; 128 129 /** Array of all attachments referenced by this subpass */ 130 struct vk_subpass_attachment *attachments; 131 132 /** VkSubpassDescription2::inputAttachmentCount */ 133 uint32_t input_count; 134 135 /** VkSubpassDescription2::pInputAttachments */ 136 struct vk_subpass_attachment *input_attachments; 137 138 /** VkSubpassDescription2::colorAttachmentCount */ 139 uint32_t color_count; 140 141 /** VkSubpassDescription2::pColorAttachments */ 142 struct vk_subpass_attachment *color_attachments; 143 144 /** VkSubpassDescription2::colorAttachmentCount or zero */ 145 uint32_t color_resolve_count; 146 147 /** VkSubpassDescription2::pResolveAttachments */ 148 struct vk_subpass_attachment *color_resolve_attachments; 149 150 /** VkSubpassDescription2::pDepthStencilAttachment */ 151 struct vk_subpass_attachment *depth_stencil_attachment; 152 153 /** VkSubpassDescriptionDepthStencilResolve::pDepthStencilResolveAttachment */ 154 struct vk_subpass_attachment *depth_stencil_resolve_attachment; 155 156 /** VkFragmentShadingRateAttachmentInfoKHR::pFragmentShadingRateAttachment */ 157 struct vk_subpass_attachment *fragment_shading_rate_attachment; 158 159 /** VkSubpassDescription2::viewMask or 1 for non-multiview 160 * 161 * For all view masks in the vk_render_pass data structure, we use a mask 162 * of 1 for non-multiview instead of a mask of 0. To determine if the 163 * render pass is multiview or not, see vk_render_pass::is_multiview. 164 */ 165 uint32_t view_mask; 166 167 /** VkSubpassDescriptionDepthStencilResolve::depthResolveMode */ 168 VkResolveModeFlagBits depth_resolve_mode; 169 170 /** VkSubpassDescriptionDepthStencilResolve::stencilResolveMode */ 171 VkResolveModeFlagBits stencil_resolve_mode; 172 173 /** VkFragmentShadingRateAttachmentInfoKHR::shadingRateAttachmentTexelSize */ 174 VkExtent2D fragment_shading_rate_attachment_texel_size; 175 176 /** VkRenderingSelfDependencyInfoMESA for this subpass 177 * 178 * This is in the pNext chain of pipeline_info and inheritance_info. 179 */ 180 VkRenderingSelfDependencyInfoMESA self_dep_info; 181 182 /** VkAttachmentSampleCountInfoAMD for this subpass 183 * 184 * This is in the pNext chain of pipeline_info and inheritance_info. 185 */ 186 VkAttachmentSampleCountInfoAMD sample_count_info_amd; 187 188 /** VkPipelineRenderingCreateInfo for this subpass 189 * 190 * Returned by vk_get_pipeline_rendering_create_info() if 191 * VkGraphicsPipelineCreateInfo::renderPass != VK_NULL_HANDLE. 192 */ 193 VkPipelineRenderingCreateInfo pipeline_info; 194 195 /** VkCommandBufferInheritanceRenderingInfo for this subpass 196 * 197 * Returned by vk_get_command_buffer_inheritance_rendering_info() if 198 * VkCommandBufferInheritanceInfo::renderPass != VK_NULL_HANDLE. 199 */ 200 VkCommandBufferInheritanceRenderingInfo inheritance_info; 201 202 /** VkMultisampledRenderToSingleSampledInfoEXT for this subpass */ 203 VkMultisampledRenderToSingleSampledInfoEXT mrtss; 204 }; 205 206 struct vk_render_pass_attachment { 207 /** VkAttachmentDescription2::format */ 208 VkFormat format; 209 210 /** Aspects contained in format */ 211 VkImageAspectFlags aspects; 212 213 /** VkAttachmentDescription2::samples */ 214 uint32_t samples; 215 216 /** Views in which this attachment is used, 0 for unused 217 * 218 * For non-multiview, this will be 1 if the attachment is used. 219 */ 220 uint32_t view_mask; 221 222 /** VkAttachmentDescription2::loadOp */ 223 VkAttachmentLoadOp load_op; 224 225 /** VkAttachmentDescription2::storeOp */ 226 VkAttachmentStoreOp store_op; 227 228 /** VkAttachmentDescription2::stencilLoadOp */ 229 VkAttachmentLoadOp stencil_load_op; 230 231 /** VkAttachmentDescription2::stencilStoreOp */ 232 VkAttachmentStoreOp stencil_store_op; 233 234 /** VkAttachmentDescription2::initialLayout */ 235 VkImageLayout initial_layout; 236 237 /** VkAttachmentDescription2::finalLayout */ 238 VkImageLayout final_layout; 239 240 /** VkAttachmentDescriptionStencilLayout::stencilInitialLayout 241 * 242 * If VK_KHR_separate_depth_stencil_layouts is not used, this will be 243 * initial_layout if format contains stencil and VK_IMAGE_LAYOUT_UNDEFINED 244 * otherwise. 245 */ 246 VkImageLayout initial_stencil_layout; 247 248 /** VkAttachmentDescriptionStencilLayout::stencilFinalLayout 249 * 250 * If VK_KHR_separate_depth_stencil_layouts is not used, this will be 251 * final_layout if format contains stencil and VK_IMAGE_LAYOUT_UNDEFINED 252 * otherwise. 253 */ 254 VkImageLayout final_stencil_layout; 255 }; 256 257 struct vk_subpass_dependency { 258 /** VkSubpassDependency2::dependencyFlags */ 259 VkDependencyFlags flags; 260 261 /** VkSubpassDependency2::srcSubpass */ 262 uint32_t src_subpass; 263 264 /** VkSubpassDependency2::dstSubpass */ 265 uint32_t dst_subpass; 266 267 /** VkSubpassDependency2::srcStageMask */ 268 VkPipelineStageFlags2 src_stage_mask; 269 270 /** VkSubpassDependency2::dstStageMask */ 271 VkPipelineStageFlags2 dst_stage_mask; 272 273 /** VkSubpassDependency2::srcAccessMask */ 274 VkAccessFlags2 src_access_mask; 275 276 /** VkSubpassDependency2::dstAccessMask */ 277 VkAccessFlags2 dst_access_mask; 278 279 /** VkSubpassDependency2::viewOffset */ 280 int32_t view_offset; 281 }; 282 283 struct vk_render_pass { 284 struct vk_object_base base; 285 286 /** True if this render pass uses multiview 287 * 288 * This is true if all subpasses have viewMask != 0. 289 */ 290 bool is_multiview; 291 292 /** Views used by this render pass or 1 for non-multiview */ 293 uint32_t view_mask; 294 295 /** VkRenderPassCreateInfo2::attachmentCount */ 296 uint32_t attachment_count; 297 298 /** VkRenderPassCreateInfo2::pAttachments */ 299 struct vk_render_pass_attachment *attachments; 300 301 /** VkRenderPassCreateInfo2::subpassCount */ 302 uint32_t subpass_count; 303 304 /** VkRenderPassCreateInfo2::subpasses */ 305 struct vk_subpass *subpasses; 306 307 /** VkRenderPassCreateInfo2::dependencyCount */ 308 uint32_t dependency_count; 309 310 /** VkRenderPassCreateInfo2::pDependencies */ 311 struct vk_subpass_dependency *dependencies; 312 }; 313 314 VK_DEFINE_NONDISP_HANDLE_CASTS(vk_render_pass, base, VkRenderPass, 315 VK_OBJECT_TYPE_RENDER_PASS); 316 317 /** Returns the VkPipelineRenderingCreateInfo for a graphics pipeline 318 * 319 * For render-pass-free drivers, this can be used in the implementation of 320 * vkCreateGraphicsPipelines to get the VkPipelineRenderingCreateInfo. If 321 * VkGraphicsPipelineCreateInfo::renderPass is not VK_NULL_HANDLE, it will 322 * return a representation of the specified subpass as a 323 * VkPipelineRenderingCreateInfo. If VkGraphicsPipelineCreateInfo::renderPass 324 * is VK_NULL_HANDLE and there is a VkPipelineRenderingCreateInfo in the pNext 325 * chain of VkGraphicsPipelineCreateInfo, it will return that. 326 * 327 * @param[in] info One of the pCreateInfos from vkCreateGraphicsPipelines 328 */ 329 const VkPipelineRenderingCreateInfo * 330 vk_get_pipeline_rendering_create_info(const VkGraphicsPipelineCreateInfo *info); 331 332 /** Returns the VkAttachmentSampleCountInfoAMD for a graphics pipeline 333 * 334 * For render-pass-free drivers, this can be used in the implementaiton of 335 * vkCreateGraphicsPipelines to get the VkAttachmentSampleCountInfoAMD. If 336 * VkGraphicsPipelineCreateInfo::renderPass is not VK_NULL_HANDLE, it will 337 * return the sample counts from the specified subpass as a 338 * VkAttachmentSampleCountInfoAMD. If VkGraphicsPipelineCreateInfo::renderPass 339 * is VK_NULL_HANDLE and there is a VkAttachmentSampleCountInfoAMD in the pNext 340 * chain of VkGraphicsPipelineCreateInfo, it will return that. 341 * 342 * @param[in] info One of the pCreateInfos from vkCreateGraphicsPipelines 343 */ 344 const VkAttachmentSampleCountInfoAMD * 345 vk_get_pipeline_sample_count_info_amd(const VkGraphicsPipelineCreateInfo *info); 346 347 /** 348 * Returns the VkCommandBufferInheritanceRenderingInfo for secondary command 349 * buffer execution 350 * 351 * For render-pass-free drivers, this can be used in the implementation of 352 * vkCmdExecuteCommands to get the VkCommandBufferInheritanceRenderingInfo. 353 * If VkCommandBufferInheritanceInfo::renderPass is not VK_NULL_HANDLE, it 354 * will return a representation of the specified subpass as a 355 * VkCommandBufferInheritanceRenderingInfo. If 356 * VkCommandBufferInheritanceInfo::renderPass is not VK_NULL_HANDLE and there 357 * is a VkCommandBufferInheritanceRenderingInfo in the pNext chain of 358 * VkCommandBufferBeginInfo, it will return that. 359 * 360 * @param[in] level The nesting level of this command buffer 361 * @param[in] pBeginInfo The pBeginInfo from vkBeginCommandBuffer 362 */ 363 const VkCommandBufferInheritanceRenderingInfo * 364 vk_get_command_buffer_inheritance_rendering_info( 365 VkCommandBufferLevel level, 366 const VkCommandBufferBeginInfo *pBeginInfo); 367 368 struct vk_gcbiarr_data { 369 VkRenderingInfo rendering; 370 VkRenderingFragmentShadingRateAttachmentInfoKHR fsr_att; 371 VkRenderingAttachmentInfo attachments[]; 372 }; 373 374 #define VK_GCBIARR_DATA_SIZE(max_color_rts) (\ 375 sizeof(struct vk_gcbiarr_data) + \ 376 sizeof(VkRenderingAttachmentInfo) * ((max_color_rts) + 2) \ 377 ) 378 379 /** 380 * Constructs a VkRenderingInfo for the inheritance rendering info 381 * 382 * For render-pass-free drivers, this can be used in the implementaiton of 383 * vkCmdExecuteCommands to get a VkRenderingInfo representing the subpass and 384 * framebuffer provided via the inheritance info for a command buffer created 385 * with VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT. The mental model 386 * here is that VkExecuteCommands() implicitly suspends the render pass and 387 * VkBeginCommandBuffer() resumes it. If a VkRenderingInfo cannot be 388 * constructed due to a missing framebuffer or similar, NULL will be 389 * returned. 390 * 391 * @param[in] level The nesting level of this command buffer 392 * @param[in] pBeginInfo The pBeginInfo from vkBeginCommandBuffer 393 * @param[out] stack_data An opaque blob of data which will be overwritten by 394 * this function, passed in from the caller to avoid 395 * heap allocations. It must be at least 396 * VK_GCBIARR_DATA_SIZE(max_color_rts) bytes. 397 */ 398 const VkRenderingInfo * 399 vk_get_command_buffer_inheritance_as_rendering_resume( 400 VkCommandBufferLevel level, 401 const VkCommandBufferBeginInfo *pBeginInfo, 402 void *stack_data); 403 404 #ifdef __cplusplus 405 } 406 #endif 407 408 #endif /* VK_RENDER_PASS_H */ 409