tu: Implement extendedDynamicState3PolygonMode
authorConnor Abbott <cwabbott0@gmail.com>
Thu, 29 Sep 2022 11:43:46 +0000 (13:43 +0200)
committerMarge Bot <emma+marge@anholt.net>
Thu, 3 Nov 2022 21:59:42 +0000 (21:59 +0000)
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18912>

src/freedreno/vulkan/tu_cmd_buffer.c
src/freedreno/vulkan/tu_cmd_buffer.h
src/freedreno/vulkan/tu_device.c
src/freedreno/vulkan/tu_pipeline.c
src/freedreno/vulkan/tu_pipeline.h

index 1654a61..f83097f 100644 (file)
@@ -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) {
index fdfacd8..242b4da 100644 (file)
@@ -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;
index 8d4702b..29e6486 100644 (file)
@@ -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;
index 59ef12a..d54507c 100644 (file)
@@ -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 &
index 54c93f3..55f0fae 100644 (file)
@@ -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,
 };