venus: add support for VK_KHR_dynamic_rendering

Signed-off-by: Ryan Neph <ryanneph@google.com>
Reviewed-by: Yiwei Zhang <zzyiwei@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17668>
This commit is contained in:
Ryan Neph 2022-07-20 15:57:15 -07:00 committed by Marge Bot
parent 6f5289df53
commit 1f28d221d9
3 changed files with 67 additions and 4 deletions

View File

@ -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,

View File

@ -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;

View File

@ -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;