From 0e09559bd643d76206d82a97c0cc6d311b8cace1 Mon Sep 17 00:00:00 2001 From: Connor Abbott Date: Thu, 29 Sep 2022 14:04:54 +0200 Subject: [PATCH] tu: Implement extendedDynamicState3TessellationDomainOrigin 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 | 7 ++++++- 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 f83097fcd7f..acf216514a4 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.c +++ b/src/freedreno/vulkan/tu_cmd_buffer.c @@ -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; diff --git a/src/freedreno/vulkan/tu_cmd_buffer.h b/src/freedreno/vulkan/tu_cmd_buffer.h index 242b4dac74e..9ce766c47a6 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.h +++ b/src/freedreno/vulkan/tu_cmd_buffer.h @@ -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]; diff --git a/src/freedreno/vulkan/tu_device.c b/src/freedreno/vulkan/tu_device.c index 29e64861731..ab95f3a4ab3 100644 --- a/src/freedreno/vulkan/tu_device.c +++ b/src/freedreno/vulkan/tu_device.c @@ -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; diff --git a/src/freedreno/vulkan/tu_pipeline.c b/src/freedreno/vulkan/tu_pipeline.c index d54507c23ff..88c892768fa 100644 --- a/src/freedreno/vulkan/tu_pipeline.c +++ b/src/freedreno/vulkan/tu_pipeline.c @@ -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 & diff --git a/src/freedreno/vulkan/tu_pipeline.h b/src/freedreno/vulkan/tu_pipeline.h index 55f0faefef4..f6aea494db2 100644 --- a/src/freedreno/vulkan/tu_pipeline.h +++ b/src/freedreno/vulkan/tu_pipeline.h @@ -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, };