From 1af2471bd75b166d21baafa047d8ad63cdc49a23 Mon Sep 17 00:00:00 2001 From: Connor Abbott Date: Fri, 30 Sep 2022 14:18:05 +0200 Subject: [PATCH] tu: Implement extendedDynamicState3LineRasterizationMode Part-of: --- src/freedreno/vulkan/tu_cmd_buffer.c | 23 ++++++++++++++++++++++- src/freedreno/vulkan/tu_device.c | 2 +- src/freedreno/vulkan/tu_pipeline.c | 10 +++++++++- src/freedreno/vulkan/tu_pipeline.h | 1 + 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/freedreno/vulkan/tu_cmd_buffer.c b/src/freedreno/vulkan/tu_cmd_buffer.c index 4312b4df4bd..a71d34ce714 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.c +++ b/src/freedreno/vulkan/tu_cmd_buffer.c @@ -2615,7 +2615,10 @@ tu_CmdBindPipeline(VkCommandBuffer commandBuffer, } } - cmd->state.line_mode = pipeline->rast.line_mode; + if (!(pipeline->dynamic_state_mask & + BIT(TU_DYNAMIC_STATE_LINE_MODE))) + cmd->state.line_mode = pipeline->rast.line_mode; + if (!(pipeline->dynamic_state_mask & BIT(TU_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY))) cmd->state.primtype = pipeline->ia.primtype; @@ -3268,6 +3271,24 @@ tu_CmdSetRasterizationStreamEXT(VkCommandBuffer commandBuffer, cmd->state.dirty |= TU_CMD_DIRTY_PC_RASTER_CNTL; } +VKAPI_ATTR void VKAPI_CALL +tu_CmdSetLineRasterizationModeEXT(VkCommandBuffer commandBuffer, + VkLineRasterizationModeEXT lineRasterizationMode) +{ + TU_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer); + + cmd->state.line_mode = lineRasterizationMode == + VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT ? BRESENHAM : RECTANGULAR; + + tu6_update_msaa_disable(cmd); + + cmd->state.gras_su_cntl = + (cmd->state.gras_su_cntl & ~A6XX_GRAS_SU_CNTL_LINE_MODE__MASK) | + A6XX_GRAS_SU_CNTL_LINE_MODE(cmd->state.line_mode); + + cmd->state.dirty |= TU_CMD_DIRTY_RAST; +} + static void tu_flush_for_access(struct tu_cache_state *cache, enum tu_cmd_access_mask src_mask, diff --git a/src/freedreno/vulkan/tu_device.c b/src/freedreno/vulkan/tu_device.c index d946b4c3fbb..31cdee3fd3f 100644 --- a/src/freedreno/vulkan/tu_device.c +++ b/src/freedreno/vulkan/tu_device.c @@ -774,7 +774,7 @@ tu_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice, features->extendedDynamicState3RasterizationStream = true; features->extendedDynamicState3ConservativeRasterizationMode = false; features->extendedDynamicState3ExtraPrimitiveOverestimationSize = false; - features->extendedDynamicState3LineRasterizationMode = false; + features->extendedDynamicState3LineRasterizationMode = true; features->extendedDynamicState3LineStippleEnable = false; features->extendedDynamicState3ProvokingVertexMode = false; features->extendedDynamicState3SampleLocationsEnable = false; diff --git a/src/freedreno/vulkan/tu_pipeline.c b/src/freedreno/vulkan/tu_pipeline.c index bc1ed9a33f5..0e6be0babb3 100644 --- a/src/freedreno/vulkan/tu_pipeline.c +++ b/src/freedreno/vulkan/tu_pipeline.c @@ -3777,6 +3777,13 @@ tu_pipeline_builder_parse_dynamic(struct tu_pipeline_builder *builder, pipeline->rast.pc_raster_cntl_mask &= ~A6XX_PC_RASTER_CNTL_STREAM__MASK; break; + case VK_DYNAMIC_STATE_LINE_RASTERIZATION_MODE_EXT: + pipeline->dynamic_state_mask |= + BIT(TU_DYNAMIC_STATE_RAST) | + BIT(TU_DYNAMIC_STATE_LINE_MODE); + pipeline->rast.gras_su_cntl_mask &= + ~A6XX_GRAS_SU_CNTL_LINE_MODE__MASK; + break; default: assert(!"unsupported dynamic state"); break; @@ -3847,7 +3854,8 @@ tu_pipeline_builder_parse_libraries(struct tu_pipeline_builder *builder, BIT(TU_DYNAMIC_STATE_PATCH_CONTROL_POINTS) | BIT(TU_DYNAMIC_STATE_POLYGON_MODE) | BIT(TU_DYNAMIC_STATE_TESS_DOMAIN_ORIGIN) | - BIT(TU_DYNAMIC_STATE_VIEWPORT_RANGE); + BIT(TU_DYNAMIC_STATE_VIEWPORT_RANGE) | + BIT(TU_DYNAMIC_STATE_LINE_MODE); } if (library->state & diff --git a/src/freedreno/vulkan/tu_pipeline.h b/src/freedreno/vulkan/tu_pipeline.h index b1cd4231553..a7d8cd8b0e9 100644 --- a/src/freedreno/vulkan/tu_pipeline.h +++ b/src/freedreno/vulkan/tu_pipeline.h @@ -41,6 +41,7 @@ enum tu_dynamic_state TU_DYNAMIC_STATE_ALPHA_TO_COVERAGE, TU_DYNAMIC_STATE_DEPTH_CLIP_RANGE, TU_DYNAMIC_STATE_VIEWPORT_RANGE, + TU_DYNAMIC_STATE_LINE_MODE, /* re-use the line width enum as it uses GRAS_SU_CNTL: */ TU_DYNAMIC_STATE_RAST = VK_DYNAMIC_STATE_LINE_WIDTH, };