From 4b8f4bae01360a69e05889c66764231b92aa7495 Mon Sep 17 00:00:00 2001 From: Hyunjun Ko Date: Tue, 10 Aug 2021 05:06:36 +0000 Subject: [PATCH] tu: allow dynamic primitive topology with tessellation This allows to set VK_PRIMITIVE_TOPOLOGY_PATCH_LIST dynamically when tessellation used. If other values are set via vkCmdSetPrimitiveTopologyEXT for the case, the validation layer can detect the issue. Fixes dEQP-VK.pipeline.extended_dynamic_state.*.topology_patch* Signed-off-by: Hyunjun Ko Reviewed-by: Danylo Piliaiev Part-of: --- src/freedreno/vulkan/tu_cmd_buffer.c | 14 ++++++++++++-- src/freedreno/vulkan/tu_pipeline.c | 2 -- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/freedreno/vulkan/tu_cmd_buffer.c b/src/freedreno/vulkan/tu_cmd_buffer.c index 017f0720e4a..43e42141c86 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.c +++ b/src/freedreno/vulkan/tu_cmd_buffer.c @@ -3790,8 +3790,18 @@ tu_draw_initiator(struct tu_cmd_buffer *cmd, enum pc_di_src_sel src_sel) const struct tu_pipeline *pipeline = cmd->state.pipeline; enum pc_di_primtype primtype = pipeline->ia.primtype; - if (pipeline->dynamic_state_mask & BIT(TU_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY)) - primtype = cmd->state.primtype; + if (pipeline->dynamic_state_mask & BIT(TU_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY)) { + if (primtype < DI_PT_PATCHES0) { + /* If tesselation used, only VK_PRIMITIVE_TOPOLOGY_PATCH_LIST can be + * set via vkCmdSetPrimitiveTopologyEXT, but primtype is already + * calculated at the pipeline creation based on control points + * for each patch. + * + * Just use the primtype as is for the case. + */ + primtype = cmd->state.primtype; + } + } uint32_t initiator = CP_DRAW_INDX_OFFSET_0_PRIM_TYPE(primtype) | diff --git a/src/freedreno/vulkan/tu_pipeline.c b/src/freedreno/vulkan/tu_pipeline.c index ac315b29437..15a39aa80db 100644 --- a/src/freedreno/vulkan/tu_pipeline.c +++ b/src/freedreno/vulkan/tu_pipeline.c @@ -2633,8 +2633,6 @@ tu_pipeline_builder_parse_tessellation(struct tu_pipeline_builder *builder, const VkPipelineTessellationStateCreateInfo *tess_info = builder->create_info->pTessellationState; - assert(!(pipeline->dynamic_state_mask & BIT(TU_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY))); - assert(pipeline->ia.primtype == DI_PT_PATCHES0); assert(tess_info->patchControlPoints <= 32); pipeline->ia.primtype += tess_info->patchControlPoints;