From 55bbf56a179cbf520f0336811c1c719b99fb4b59 Mon Sep 17 00:00:00 2001 From: Connor Abbott Date: Thu, 29 Sep 2022 13:43:46 +0200 Subject: [PATCH] tu: Implement extendedDynamicState3PolygonMode Part-of: --- src/freedreno/vulkan/tu_cmd_buffer.c | 15 ++++++++++++++- src/freedreno/vulkan/tu_cmd_buffer.h | 1 + src/freedreno/vulkan/tu_device.c | 2 +- src/freedreno/vulkan/tu_pipeline.c | 8 +++++++- src/freedreno/vulkan/tu_pipeline.h | 1 + 5 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/freedreno/vulkan/tu_cmd_buffer.c b/src/freedreno/vulkan/tu_cmd_buffer.c index 1654a61..f83097f 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.c +++ b/src/freedreno/vulkan/tu_cmd_buffer.c @@ -2606,6 +2606,10 @@ tu_CmdBindPipeline(VkCommandBuffer commandBuffer, BIT(TU_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY))) cmd->state.primtype = pipeline->ia.primtype; + if (!(pipeline->dynamic_state_mask & + BIT(TU_DYNAMIC_STATE_POLYGON_MODE))) + cmd->state.polygon_mode = pipeline->rast.polygon_mode; + tu6_update_msaa(cmd, pipeline->output.samples); if ((pipeline->dynamic_state_mask & BIT(VK_DYNAMIC_STATE_VIEWPORT)) && @@ -3089,6 +3093,15 @@ tu_CmdSetColorWriteEnableEXT(VkCommandBuffer commandBuffer, uint32_t attachmentC cmd->state.dirty |= TU_CMD_DIRTY_BLEND; } +VKAPI_ATTR void VKAPI_CALL +tu_CmdSetPolygonModeEXT(VkCommandBuffer commandBuffer, + VkPolygonMode polygonMode) +{ + TU_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer); + cmd->state.polygon_mode = tu6_polygon_mode(polygonMode); + 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, @@ -4475,7 +4488,7 @@ tu6_draw_common(struct tu_cmd_buffer *cmd, struct tu_cs cs = tu_cmd_dynamic_state(cmd, TU_DYNAMIC_STATE_RAST, tu6_rast_size(cmd->device)); tu6_emit_rast(&cs, cmd->state.gras_su_cntl, - pipeline->rast.gras_cl_cntl, pipeline->rast.polygon_mode); + pipeline->rast.gras_cl_cntl, cmd->state.polygon_mode); } if (dirty & TU_CMD_DIRTY_RB_DEPTH_CNTL) { diff --git a/src/freedreno/vulkan/tu_cmd_buffer.h b/src/freedreno/vulkan/tu_cmd_buffer.h index fdfacd8..242b4da 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.h +++ b/src/freedreno/vulkan/tu_cmd_buffer.h @@ -337,6 +337,7 @@ struct tu_cmd_state uint32_t gras_su_cntl, rb_depth_cntl, rb_stencil_cntl; uint32_t pc_raster_cntl, vpc_unknown_9107; + enum a6xx_polygon_mode polygon_mode; uint32_t rb_mrt_control[MAX_RTS], rb_mrt_blend_control[MAX_RTS]; uint32_t rb_mrt_control_rop; uint32_t rb_blend_cntl, sp_blend_cntl; diff --git a/src/freedreno/vulkan/tu_device.c b/src/freedreno/vulkan/tu_device.c index 8d4702b..29e6486 100644 --- a/src/freedreno/vulkan/tu_device.c +++ b/src/freedreno/vulkan/tu_device.c @@ -761,7 +761,7 @@ tu_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice, case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT: { VkPhysicalDeviceExtendedDynamicState3FeaturesEXT *features = (VkPhysicalDeviceExtendedDynamicState3FeaturesEXT *)ext; - features->extendedDynamicState3PolygonMode = false; + features->extendedDynamicState3PolygonMode = true; features->extendedDynamicState3TessellationDomainOrigin = false; features->extendedDynamicState3DepthClampEnable = false; features->extendedDynamicState3DepthClipEnable = false; diff --git a/src/freedreno/vulkan/tu_pipeline.c b/src/freedreno/vulkan/tu_pipeline.c index 59ef12a..d54507c 100644 --- a/src/freedreno/vulkan/tu_pipeline.c +++ b/src/freedreno/vulkan/tu_pipeline.c @@ -3707,6 +3707,11 @@ tu_pipeline_builder_parse_dynamic(struct tu_pipeline_builder *builder, pipeline->dynamic_state_mask |= BIT(TU_DYNAMIC_STATE_PATCH_CONTROL_POINTS); break; + case VK_DYNAMIC_STATE_POLYGON_MODE_EXT: + pipeline->dynamic_state_mask |= + BIT(TU_DYNAMIC_STATE_RAST) | + BIT(TU_DYNAMIC_STATE_POLYGON_MODE); + break; default: assert(!"unsupported dynamic state"); break; @@ -3763,7 +3768,8 @@ tu_pipeline_builder_parse_libraries(struct tu_pipeline_builder *builder, BIT(TU_DYNAMIC_STATE_RAST) | BIT(VK_DYNAMIC_STATE_DEPTH_BIAS) | BIT(TU_DYNAMIC_STATE_RASTERIZER_DISCARD) | - BIT(TU_DYNAMIC_STATE_PATCH_CONTROL_POINTS); + BIT(TU_DYNAMIC_STATE_PATCH_CONTROL_POINTS) | + BIT(TU_DYNAMIC_STATE_POLYGON_MODE); } if (library->state & diff --git a/src/freedreno/vulkan/tu_pipeline.h b/src/freedreno/vulkan/tu_pipeline.h index 54c93f3..55f0fae 100644 --- a/src/freedreno/vulkan/tu_pipeline.h +++ b/src/freedreno/vulkan/tu_pipeline.h @@ -34,6 +34,7 @@ enum tu_dynamic_state TU_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE, TU_DYNAMIC_STATE_LOGIC_OP, TU_DYNAMIC_STATE_COLOR_WRITE_ENABLE, + TU_DYNAMIC_STATE_POLYGON_MODE, /* re-use the line width enum as it uses GRAS_SU_CNTL: */ TU_DYNAMIC_STATE_RAST = VK_DYNAMIC_STATE_LINE_WIDTH, }; -- 2.7.4