tu: Implement extendedDynamicState3TessellationDomainOrigin
authorConnor Abbott <cwabbott0@gmail.com>
Thu, 29 Sep 2022 12:04:54 +0000 (14:04 +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 f83097f..acf2165 100644 (file)
@@ -2610,6 +2610,11 @@ tu_CmdBindPipeline(VkCommandBuffer commandBuffer,
          BIT(TU_DYNAMIC_STATE_POLYGON_MODE)))
        cmd->state.polygon_mode = pipeline->rast.polygon_mode;
 
+   if (!(pipeline->dynamic_state_mask &
+         BIT(TU_DYNAMIC_STATE_TESS_DOMAIN_ORIGIN)))
+       cmd->state.tess_upper_left_domain_origin =
+          pipeline->tess.upper_left_domain_origin;
+
    tu6_update_msaa(cmd, pipeline->output.samples);
 
    if ((pipeline->dynamic_state_mask & BIT(VK_DYNAMIC_STATE_VIEWPORT)) &&
@@ -3102,6 +3107,15 @@ tu_CmdSetPolygonModeEXT(VkCommandBuffer commandBuffer,
    cmd->state.dirty |= TU_CMD_DIRTY_RAST;
 }
 
+VKAPI_ATTR void VKAPI_CALL
+tu_CmdSetTessellationDomainOriginEXT(VkCommandBuffer commandBuffer,
+                                     VkTessellationDomainOrigin domainOrigin)
+{
+   TU_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer);
+   cmd->state.tess_upper_left_domain_origin =
+      domainOrigin == VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT;
+}
+
 static void
 tu_flush_for_access(struct tu_cache_state *cache,
                     enum tu_cmd_access_mask src_mask,
@@ -4437,7 +4451,7 @@ tu6_draw_common(struct tu_cmd_buffer *cmd,
    bool primitive_restart = primitive_restart_enabled && indexed;
    bool provoking_vtx_last = pipeline->rast.provoking_vertex_last;
    bool tess_upper_left_domain_origin =
-      pipeline->tess.upper_left_domain_origin;
+      cmd->state.tess_upper_left_domain_origin;
 
    struct tu_primitive_params* prim_params = &cmd->state.last_prim_params;
 
index 242b4da..9ce766c 100644 (file)
@@ -347,6 +347,7 @@ struct tu_cmd_state
    bool rop_reads_dst;
    enum pc_di_primtype primtype;
    bool primitive_restart_enable;
+   bool tess_upper_left_domain_origin;
 
    /* saved states to re-emit in TU_CMD_DIRTY_DRAW_STATE case */
    struct tu_draw_state dynamic_state[TU_DYNAMIC_STATE_COUNT];
index 29e6486..ab95f3a 100644 (file)
@@ -762,7 +762,7 @@ tu_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,
          VkPhysicalDeviceExtendedDynamicState3FeaturesEXT *features =
             (VkPhysicalDeviceExtendedDynamicState3FeaturesEXT *)ext;
          features->extendedDynamicState3PolygonMode = true;
-         features->extendedDynamicState3TessellationDomainOrigin = false;
+         features->extendedDynamicState3TessellationDomainOrigin = true;
          features->extendedDynamicState3DepthClampEnable = false;
          features->extendedDynamicState3DepthClipEnable = false;
          features->extendedDynamicState3LogicOpEnable = false;
index d54507c..88c8927 100644 (file)
@@ -3712,6 +3712,10 @@ tu_pipeline_builder_parse_dynamic(struct tu_pipeline_builder *builder,
             BIT(TU_DYNAMIC_STATE_RAST) |
             BIT(TU_DYNAMIC_STATE_POLYGON_MODE);
          break;
+      case VK_DYNAMIC_STATE_TESSELLATION_DOMAIN_ORIGIN_EXT:
+         pipeline->dynamic_state_mask |=
+            BIT(TU_DYNAMIC_STATE_TESS_DOMAIN_ORIGIN);
+         break;
       default:
          assert(!"unsupported dynamic state");
          break;
@@ -3769,7 +3773,8 @@ tu_pipeline_builder_parse_libraries(struct tu_pipeline_builder *builder,
             BIT(VK_DYNAMIC_STATE_DEPTH_BIAS) |
             BIT(TU_DYNAMIC_STATE_RASTERIZER_DISCARD) |
             BIT(TU_DYNAMIC_STATE_PATCH_CONTROL_POINTS) |
-            BIT(TU_DYNAMIC_STATE_POLYGON_MODE);
+            BIT(TU_DYNAMIC_STATE_POLYGON_MODE) |
+            BIT(TU_DYNAMIC_STATE_TESS_DOMAIN_ORIGIN);
       }
 
       if (library->state &
index 55f0fae..f6aea49 100644 (file)
@@ -35,6 +35,7 @@ enum tu_dynamic_state
    TU_DYNAMIC_STATE_LOGIC_OP,
    TU_DYNAMIC_STATE_COLOR_WRITE_ENABLE,
    TU_DYNAMIC_STATE_POLYGON_MODE,
+   TU_DYNAMIC_STATE_TESS_DOMAIN_ORIGIN,
    /* re-use the line width enum as it uses GRAS_SU_CNTL: */
    TU_DYNAMIC_STATE_RAST = VK_DYNAMIC_STATE_LINE_WIDTH,
 };