Mesa (main): venus: add support for VK_KHR_dynamic_rendering
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Sat Jul 23 01:22:41 UTC 2022
Module: Mesa
Branch: main
Commit: 1f28d221d930612981103f577139b0a62bc78210
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=1f28d221d930612981103f577139b0a62bc78210
Author: Ryan Neph <ryanneph at google.com>
Date: Wed Jul 20 15:57:15 2022 -0700
venus: add support for VK_KHR_dynamic_rendering
Signed-off-by: Ryan Neph <ryanneph at google.com>
Reviewed-by: Yiwei Zhang <zzyiwei at chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17668>
---
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;
More information about the mesa-commit
mailing list