From 4f0a7dbdeaf4c5cdcc088394cfb81af5bfeb3398 Mon Sep 17 00:00:00 2001 From: Danylo Piliaiev Date: Tue, 10 Aug 2021 03:30:07 +0000 Subject: [PATCH] tu: implement dynamic primitive restart enable Signed-off-by: Danylo Piliaiev Reviewed-by: Hyunjun Ko Part-of: --- src/freedreno/vulkan/tu_cmd_buffer.c | 15 ++++++++++++++- src/freedreno/vulkan/tu_pipeline.c | 3 +++ src/freedreno/vulkan/tu_private.h | 2 ++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/freedreno/vulkan/tu_cmd_buffer.c b/src/freedreno/vulkan/tu_cmd_buffer.c index abdf4880264..ab01f308891 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.c +++ b/src/freedreno/vulkan/tu_cmd_buffer.c @@ -2482,6 +2482,15 @@ tu_CmdSetDepthBiasEnableEXT(VkCommandBuffer commandBuffer, cmd->state.dirty |= TU_CMD_DIRTY_GRAS_SU_CNTL; } +void +tu_CmdSetPrimitiveRestartEnableEXT(VkCommandBuffer commandBuffer, + VkBool32 primitiveRestartEnable) +{ + TU_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer); + + cmd->state.primitive_restart_enable = primitiveRestartEnable; +} + static void tu_flush_for_access(struct tu_cache_state *cache, enum tu_cmd_access_mask src_mask, @@ -3627,9 +3636,13 @@ tu6_draw_common(struct tu_cmd_buffer *cmd, tu_emit_cache_flush_renderpass(cmd, cs); + bool primitive_restart_enabled = pipeline->ia.primitive_restart; + if (pipeline->dynamic_state_mask & BIT(TU_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE)) + primitive_restart_enabled = cmd->state.primitive_restart_enable; + tu_cs_emit_regs(cs, A6XX_PC_PRIMITIVE_CNTL_0( .primitive_restart = - pipeline->ia.primitive_restart && indexed, + primitive_restart_enabled && indexed, .provoking_vtx_last = pipeline->provoking_vertex_last, .tess_upper_left_domain_origin = pipeline->tess.upper_left_domain_origin)); diff --git a/src/freedreno/vulkan/tu_pipeline.c b/src/freedreno/vulkan/tu_pipeline.c index a577484df79..643a71fd79c 100644 --- a/src/freedreno/vulkan/tu_pipeline.c +++ b/src/freedreno/vulkan/tu_pipeline.c @@ -2514,6 +2514,9 @@ tu_pipeline_builder_parse_dynamic(struct tu_pipeline_builder *builder, pipeline->gras_su_cntl_mask &= ~A6XX_GRAS_SU_CNTL_POLY_OFFSET; pipeline->dynamic_state_mask |= BIT(TU_DYNAMIC_STATE_GRAS_SU_CNTL); break; + case VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE_EXT: + pipeline->dynamic_state_mask |= BIT(TU_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE); + break; default: assert(!"unsupported dynamic state"); break; diff --git a/src/freedreno/vulkan/tu_private.h b/src/freedreno/vulkan/tu_private.h index 16fc055b56f..e76bf10736b 100644 --- a/src/freedreno/vulkan/tu_private.h +++ b/src/freedreno/vulkan/tu_private.h @@ -505,6 +505,7 @@ enum tu_dynamic_state TU_DYNAMIC_STATE_COUNT, /* no associated draw state: */ TU_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY = TU_DYNAMIC_STATE_COUNT, + TU_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE, /* re-use the line width enum as it uses GRAS_SU_CNTL: */ TU_DYNAMIC_STATE_GRAS_SU_CNTL = VK_DYNAMIC_STATE_LINE_WIDTH, }; @@ -940,6 +941,7 @@ struct tu_cmd_state uint32_t gras_su_cntl, rb_depth_cntl, rb_stencil_cntl; enum pc_di_primtype primtype; + bool primitive_restart_enable; /* saved states to re-emit in TU_CMD_DIRTY_DRAW_STATE case */ struct tu_draw_state dynamic_state[TU_DYNAMIC_STATE_COUNT];