From 1f28d221d930612981103f577139b0a62bc78210 Mon Sep 17 00:00:00 2001 From: Ryan Neph Date: Wed, 20 Jul 2022 15:57:15 -0700 Subject: [PATCH] venus: add support for VK_KHR_dynamic_rendering Signed-off-by: Ryan Neph Reviewed-by: Yiwei Zhang Part-of: --- src/virtio/vulkan/vn_command_buffer.c | 63 ++++++++++++++++++++++++-- src/virtio/vulkan/vn_physical_device.c | 7 +++ src/virtio/vulkan/vn_physical_device.h | 1 + 3 files changed, 67 insertions(+), 4 deletions(-) diff --git a/src/virtio/vulkan/vn_command_buffer.c b/src/virtio/vulkan/vn_command_buffer.c index a9fa109d9f9..2d89fbadbef 100644 --- a/src/virtio/vulkan/vn_command_buffer.c +++ b/src/virtio/vulkan/vn_command_buffer.c @@ -634,6 +634,7 @@ vn_ResetCommandBuffer(VkCommandBuffer commandBuffer, struct vn_command_buffer_begin_info { VkCommandBufferBeginInfo begin; VkCommandBufferInheritanceInfo inheritance; + VkCommandBufferInheritanceConditionalRenderingInfoEXT conditional_rendering; bool has_inherited_pass; }; @@ -655,6 +656,12 @@ vn_fix_command_buffer_begin_info(struct vn_command_buffer *cmd, const bool has_renderpass = begin_info->pInheritanceInfo->renderPass != VK_NULL_HANDLE; + /* Can early-return if dynamic rendering is used and no structures need to + * be dropped from the pNext chain of VkCommandBufferInheritanceInfo. + */ + if (is_cmd_secondary && has_continue && !has_renderpass) + return begin_info; + local->begin = *begin_info; if (!is_cmd_secondary) { @@ -662,16 +669,52 @@ vn_fix_command_buffer_begin_info(struct vn_command_buffer *cmd, return &local->begin; } + local->inheritance = *begin_info->pInheritanceInfo; + local->begin.pInheritanceInfo = &local->inheritance; + if (!has_continue) { - local->inheritance = *begin_info->pInheritanceInfo; local->inheritance.framebuffer = VK_NULL_HANDLE; local->inheritance.renderPass = VK_NULL_HANDLE; local->inheritance.subpass = 0; - local->begin.pInheritanceInfo = &local->inheritance; } else { - local->has_inherited_pass = has_renderpass; + /* With early-returns above, it must be an inherited pass. */ + local->has_inherited_pass = true; } + /* Per spec, about VkCommandBufferInheritanceRenderingInfo: + * + * If VkCommandBufferInheritanceInfo::renderPass is not VK_NULL_HANDLE, or + * VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT is not specified in + * VkCommandBufferBeginInfo::flags, parameters of this structure are + * ignored. + */ + VkBaseOutStructure *head = NULL; + VkBaseOutStructure *tail = NULL; + vk_foreach_struct_const(src, local->inheritance.pNext) { + void *pnext = NULL; + switch (src->sType) { + case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT: + memcpy( + &local->conditional_rendering, src, + sizeof(VkCommandBufferInheritanceConditionalRenderingInfoEXT)); + pnext = &local->conditional_rendering; + break; + case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO: + default: + break; + } + + if (pnext) { + if (!head) + head = pnext; + else + tail->pNext = pnext; + + tail = pnext; + } + } + local->inheritance.pNext = head; + return &local->begin; } @@ -688,7 +731,6 @@ vn_BeginCommandBuffer(VkCommandBuffer commandBuffer, vn_cs_encoder_reset(&cmd->cs); cmd->draw_cmd_batched = 0; - /* TODO: add support for VK_KHR_dynamic_rendering */ struct vn_command_buffer_begin_info local_begin_info; pBeginInfo = vn_fix_command_buffer_begin_info(cmd, pBeginInfo, &local_begin_info); @@ -915,6 +957,19 @@ vn_CmdDraw(VkCommandBuffer commandBuffer, vn_command_buffer_from_handle(commandBuffer)); } +void +vn_CmdBeginRendering(VkCommandBuffer commandBuffer, + const VkRenderingInfo *pRenderingInfo) +{ + VN_CMD_ENQUEUE(vkCmdBeginRendering, commandBuffer, pRenderingInfo); +} + +void +vn_CmdEndRendering(VkCommandBuffer commandBuffer) +{ + VN_CMD_ENQUEUE(vkCmdEndRendering, commandBuffer); +} + void vn_CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, diff --git a/src/virtio/vulkan/vn_physical_device.c b/src/virtio/vulkan/vn_physical_device.c index 26bf874c1ed..43954f38c1d 100644 --- a/src/virtio/vulkan/vn_physical_device.c +++ b/src/virtio/vulkan/vn_physical_device.c @@ -132,6 +132,8 @@ vn_physical_device_init_features(struct vn_physical_device *physical_dev) VN_ADD_EXT_TO_PNEXT(exts->EXT_inline_uniform_block, feats->inline_uniform_block, INLINE_UNIFORM_BLOCK_FEATURES, features2); + VN_ADD_EXT_TO_PNEXT(exts->KHR_dynamic_rendering, feats->dynamic_rendering, + DYNAMIC_RENDERING_FEATURES, features2); VN_ADD_EXT_TO_PNEXT(exts->KHR_maintenance4, feats->maintenance4, MAINTENANCE_4_FEATURES, features2); VN_ADD_EXT_TO_PNEXT(exts->EXT_shader_demote_to_helper_invocation, @@ -999,6 +1001,7 @@ vn_physical_device_get_passthrough_extensions( .EXT_inline_uniform_block = true, .EXT_shader_demote_to_helper_invocation = true, .KHR_copy_commands2 = true, + .KHR_dynamic_rendering = true, .KHR_maintenance4 = true, /* EXT */ @@ -1620,6 +1623,7 @@ vn_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice, /* Vulkan 1.3 */ VkPhysicalDevice4444FormatsFeaturesEXT *argb_4444_formats; + VkPhysicalDeviceDynamicRenderingFeatures *dynamic_rendering; VkPhysicalDeviceExtendedDynamicStateFeaturesEXT *extended_dynamic_state; VkPhysicalDeviceExtendedDynamicState2FeaturesEXT *extended_dynamic_state2; @@ -1804,6 +1808,9 @@ vn_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice, case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT: *u.argb_4444_formats = feats->argb_4444_formats; break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES: + *u.dynamic_rendering = feats->dynamic_rendering; + break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT: *u.extended_dynamic_state = feats->extended_dynamic_state; break; diff --git a/src/virtio/vulkan/vn_physical_device.h b/src/virtio/vulkan/vn_physical_device.h index ccd12a00fed..db9abc9c988 100644 --- a/src/virtio/vulkan/vn_physical_device.h +++ b/src/virtio/vulkan/vn_physical_device.h @@ -24,6 +24,7 @@ struct vn_physical_device_features { /* Vulkan 1.3 */ VkPhysicalDevice4444FormatsFeaturesEXT argb_4444_formats; + VkPhysicalDeviceDynamicRenderingFeatures dynamic_rendering; VkPhysicalDeviceExtendedDynamicStateFeaturesEXT extended_dynamic_state; VkPhysicalDeviceExtendedDynamicState2FeaturesEXT extended_dynamic_state_2; VkPhysicalDeviceImageRobustnessFeatures image_robustness;