From e63c8b3bf1b18cf10a6142cf46bc61b2c680e869 Mon Sep 17 00:00:00 2001 From: Connor Abbott Date: Fri, 30 Sep 2022 14:33:15 +0200 Subject: [PATCH] tu: Implement extendedDynamicState3ProvokingVertexMode Part-of: --- src/freedreno/vulkan/tu_cmd_buffer.c | 16 +++++++++++++++- src/freedreno/vulkan/tu_cmd_buffer.h | 1 + src/freedreno/vulkan/tu_device.c | 2 +- src/freedreno/vulkan/tu_pipeline.c | 6 +++++- src/freedreno/vulkan/tu_pipeline.h | 1 + 5 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/freedreno/vulkan/tu_cmd_buffer.c b/src/freedreno/vulkan/tu_cmd_buffer.c index a71d34ce714..70e19f34cc9 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.c +++ b/src/freedreno/vulkan/tu_cmd_buffer.c @@ -2632,6 +2632,10 @@ tu_CmdBindPipeline(VkCommandBuffer commandBuffer, cmd->state.tess_upper_left_domain_origin = pipeline->tess.upper_left_domain_origin; + if (!(pipeline->dynamic_state_mask & + BIT(TU_DYNAMIC_STATE_PROVOKING_VTX))) + cmd->state.provoking_vertex_last = pipeline->rast.provoking_vertex_last; + tu6_update_msaa_disable(cmd); if (!(pipeline->dynamic_state_mask & BIT(TU_DYNAMIC_STATE_MSAA_SAMPLES))) @@ -3289,6 +3293,16 @@ tu_CmdSetLineRasterizationModeEXT(VkCommandBuffer commandBuffer, cmd->state.dirty |= TU_CMD_DIRTY_RAST; } +VKAPI_ATTR void VKAPI_CALL +tu_CmdSetProvokingVertexModeEXT(VkCommandBuffer commandBuffer, + VkProvokingVertexModeEXT provokingVertexMode) +{ + TU_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer); + + cmd->state.provoking_vertex_last = + provokingVertexMode == VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT; +} + static void tu_flush_for_access(struct tu_cache_state *cache, enum tu_cmd_access_mask src_mask, @@ -4634,7 +4648,7 @@ tu6_draw_common(struct tu_cmd_buffer *cmd, primitive_restart_enabled = cmd->state.primitive_restart_enable; bool primitive_restart = primitive_restart_enabled && indexed; - bool provoking_vtx_last = pipeline->rast.provoking_vertex_last; + bool provoking_vtx_last = cmd->state.provoking_vertex_last; bool tess_upper_left_domain_origin = cmd->state.tess_upper_left_domain_origin; diff --git a/src/freedreno/vulkan/tu_cmd_buffer.h b/src/freedreno/vulkan/tu_cmd_buffer.h index 048b1ea9212..1faec832b6d 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.h +++ b/src/freedreno/vulkan/tu_cmd_buffer.h @@ -349,6 +349,7 @@ struct tu_cmd_state enum pc_di_primtype primtype; bool primitive_restart_enable; bool tess_upper_left_domain_origin; + bool provoking_vertex_last; /* saved states to re-emit in TU_CMD_DIRTY_DRAW_STATE case */ struct tu_draw_state dynamic_state[TU_DYNAMIC_STATE_COUNT]; diff --git a/src/freedreno/vulkan/tu_device.c b/src/freedreno/vulkan/tu_device.c index 31cdee3fd3f..af7e4c20da3 100644 --- a/src/freedreno/vulkan/tu_device.c +++ b/src/freedreno/vulkan/tu_device.c @@ -776,7 +776,7 @@ tu_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice, features->extendedDynamicState3ExtraPrimitiveOverestimationSize = false; features->extendedDynamicState3LineRasterizationMode = true; features->extendedDynamicState3LineStippleEnable = false; - features->extendedDynamicState3ProvokingVertexMode = false; + features->extendedDynamicState3ProvokingVertexMode = true; features->extendedDynamicState3SampleLocationsEnable = false; features->extendedDynamicState3ColorBlendEnable = false; features->extendedDynamicState3ColorBlendEquation = false; diff --git a/src/freedreno/vulkan/tu_pipeline.c b/src/freedreno/vulkan/tu_pipeline.c index 0e6be0babb3..6c0311b1781 100644 --- a/src/freedreno/vulkan/tu_pipeline.c +++ b/src/freedreno/vulkan/tu_pipeline.c @@ -3784,6 +3784,9 @@ tu_pipeline_builder_parse_dynamic(struct tu_pipeline_builder *builder, pipeline->rast.gras_su_cntl_mask &= ~A6XX_GRAS_SU_CNTL_LINE_MODE__MASK; break; + case VK_DYNAMIC_STATE_PROVOKING_VERTEX_MODE_EXT: + pipeline->dynamic_state_mask |= BIT(TU_DYNAMIC_STATE_PROVOKING_VTX); + break; default: assert(!"unsupported dynamic state"); break; @@ -3855,7 +3858,8 @@ tu_pipeline_builder_parse_libraries(struct tu_pipeline_builder *builder, BIT(TU_DYNAMIC_STATE_POLYGON_MODE) | BIT(TU_DYNAMIC_STATE_TESS_DOMAIN_ORIGIN) | BIT(TU_DYNAMIC_STATE_VIEWPORT_RANGE) | - BIT(TU_DYNAMIC_STATE_LINE_MODE); + BIT(TU_DYNAMIC_STATE_LINE_MODE) | + BIT(TU_DYNAMIC_STATE_PROVOKING_VTX); } if (library->state & diff --git a/src/freedreno/vulkan/tu_pipeline.h b/src/freedreno/vulkan/tu_pipeline.h index a7d8cd8b0e9..699f7c07329 100644 --- a/src/freedreno/vulkan/tu_pipeline.h +++ b/src/freedreno/vulkan/tu_pipeline.h @@ -42,6 +42,7 @@ enum tu_dynamic_state TU_DYNAMIC_STATE_DEPTH_CLIP_RANGE, TU_DYNAMIC_STATE_VIEWPORT_RANGE, TU_DYNAMIC_STATE_LINE_MODE, + TU_DYNAMIC_STATE_PROVOKING_VTX, /* re-use the line width enum as it uses GRAS_SU_CNTL: */ TU_DYNAMIC_STATE_RAST = VK_DYNAMIC_STATE_LINE_WIDTH, };