From 1fee04d8ffd899c20886c282d389a662337d0c67 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Thu, 21 Jul 2022 14:29:16 -0500 Subject: [PATCH] vulkan: Add dynamic state for tessellation domain origin Reviewed-By: Mike Blumenkrantz Part-of: --- src/vulkan/runtime/vk_graphics_state.c | 39 +++++++++++++++++++++++++--------- src/vulkan/runtime/vk_graphics_state.h | 17 ++++++++++----- 2 files changed, 41 insertions(+), 15 deletions(-) diff --git a/src/vulkan/runtime/vk_graphics_state.c b/src/vulkan/runtime/vk_graphics_state.c index 4bff7b6..fc316de 100644 --- a/src/vulkan/runtime/vk_graphics_state.c +++ b/src/vulkan/runtime/vk_graphics_state.c @@ -49,8 +49,10 @@ get_dynamic_state_groups(BITSET_WORD *dynamic, BITSET_SET(dynamic, MESA_VK_DYNAMIC_IA_PRIMITIVE_RESTART_ENABLE); } - if (groups & MESA_VK_GRAPHICS_STATE_TESSELLATION_BIT) + if (groups & MESA_VK_GRAPHICS_STATE_TESSELLATION_BIT) { BITSET_SET(dynamic, MESA_VK_DYNAMIC_TS_PATCH_CONTROL_POINTS); + BITSET_SET(dynamic, MESA_VK_DYNAMIC_TS_DOMAIN_ORIGIN); + } if (groups & MESA_VK_GRAPHICS_STATE_VIEWPORT_BIT) { BITSET_SET(dynamic, MESA_VK_DYNAMIC_VP_VIEWPORT_COUNT); @@ -116,6 +118,10 @@ fully_dynamic_state_groups(const BITSET_WORD *dynamic) if (BITSET_TEST(dynamic, MESA_VK_DYNAMIC_VI)) groups |= MESA_VK_GRAPHICS_STATE_VERTEX_INPUT_BIT; + if (BITSET_TEST(dynamic, MESA_VK_DYNAMIC_TS_PATCH_CONTROL_POINTS) && + BITSET_TEST(dynamic, MESA_VK_DYNAMIC_TS_DOMAIN_ORIGIN)) + groups |= MESA_VK_GRAPHICS_STATE_TESSELLATION_BIT; + if (BITSET_TEST(dynamic, MESA_VK_DYNAMIC_FSR)) groups |= MESA_VK_GRAPHICS_STATE_FRAGMENT_SHADING_RATE_BIT; @@ -209,6 +215,7 @@ vk_get_dynamic_graphics_states(BITSET_WORD *dynamic, CASE( PATCH_CONTROL_POINTS_EXT, TS_PATCH_CONTROL_POINTS) CASE( LOGIC_OP_EXT, CB_LOGIC_OP) CASE( COLOR_WRITE_ENABLE_EXT, CB_COLOR_WRITE_ENABLES) + CASE( TESSELLATION_DOMAIN_ORIGIN_EXT, TS_DOMAIN_ORIGIN) CASE( DEPTH_CLAMP_ENABLE_EXT, RS_DEPTH_CLAMP_ENABLE) CASE( POLYGON_MODE_EXT, RS_POLYGON_MODE) CASE( RASTERIZATION_STREAM_EXT, RS_RASTERIZATION_STREAM) @@ -343,14 +350,15 @@ vk_tessellation_state_init(struct vk_tessellation_state *ts, ts->patch_control_points = ts_info->patchControlPoints; } - const VkPipelineTessellationDomainOriginStateCreateInfo *ts_do_info = - vk_find_struct_const(ts_info->pNext, - PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO); - if (ts_do_info != NULL) { - assert(ts_do_info->domainOrigin <= UINT8_MAX); - ts->domain_origin = ts_do_info->domainOrigin; - } else { - ts->domain_origin = VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT; + ts->domain_origin = VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT; + if (!IS_DYNAMIC(TS_DOMAIN_ORIGIN)) { + const VkPipelineTessellationDomainOriginStateCreateInfo *ts_do_info = + vk_find_struct_const(ts_info->pNext, + PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO); + if (ts_do_info != NULL) { + assert(ts_do_info->domainOrigin <= UINT8_MAX); + ts->domain_origin = ts_do_info->domainOrigin; + } } } @@ -359,7 +367,7 @@ vk_dynamic_graphics_state_init_ts(struct vk_dynamic_graphics_state *dst, const BITSET_WORD *needed, const struct vk_tessellation_state *ts) { - dst->ts.patch_control_points = ts->patch_control_points; + dst->ts = *ts; } static void @@ -1569,6 +1577,7 @@ vk_dynamic_graphics_state_copy(struct vk_dynamic_graphics_state *dst, COPY_IF_SET(IA_PRIMITIVE_TOPOLOGY, ia.primitive_topology); COPY_IF_SET(IA_PRIMITIVE_RESTART_ENABLE, ia.primitive_restart_enable); COPY_IF_SET(TS_PATCH_CONTROL_POINTS, ts.patch_control_points); + COPY_IF_SET(TS_DOMAIN_ORIGIN, ts.domain_origin); COPY_IF_SET(VP_VIEWPORT_COUNT, vp.viewport_count); if (IS_SET_IN_SRC(VP_VIEWPORTS)) { @@ -1788,6 +1797,16 @@ vk_common_CmdSetPatchControlPointsEXT(VkCommandBuffer commandBuffer, } VKAPI_ATTR void VKAPI_CALL +vk_common_CmdSetTessellationDomainOriginEXT(VkCommandBuffer commandBuffer, + VkTessellationDomainOrigin domainOrigin) +{ + VK_FROM_HANDLE(vk_command_buffer, cmd, commandBuffer); + struct vk_dynamic_graphics_state *dyn = &cmd->dynamic_graphics_state; + + SET_DYN_VALUE(dyn, TS_DOMAIN_ORIGIN, ts.domain_origin, domainOrigin); +} + +VKAPI_ATTR void VKAPI_CALL vk_common_CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, diff --git a/src/vulkan/runtime/vk_graphics_state.h b/src/vulkan/runtime/vk_graphics_state.h index 1854aea..9481eab 100644 --- a/src/vulkan/runtime/vk_graphics_state.h +++ b/src/vulkan/runtime/vk_graphics_state.h @@ -50,6 +50,7 @@ enum mesa_vk_dynamic_graphics_state { MESA_VK_DYNAMIC_IA_PRIMITIVE_TOPOLOGY, MESA_VK_DYNAMIC_IA_PRIMITIVE_RESTART_ENABLE, MESA_VK_DYNAMIC_TS_PATCH_CONTROL_POINTS, + MESA_VK_DYNAMIC_TS_DOMAIN_ORIGIN, MESA_VK_DYNAMIC_VP_VIEWPORT_COUNT, MESA_VK_DYNAMIC_VP_VIEWPORTS, MESA_VK_DYNAMIC_VP_SCISSOR_COUNT, @@ -151,10 +152,16 @@ struct vk_input_assembly_state { }; struct vk_tessellation_state { - /** VkPipelineTessellationStateCreateInfo::patchControlPoints */ + /** VkPipelineTessellationStateCreateInfo::patchControlPoints + * + * MESA_VK_DYNAMIC_TS_PATCH_CONTROL_POINTS + */ uint8_t patch_control_points; - /** VkPipelineTessellationDomainOriginStateCreateInfo::domainOrigin */ + /** VkPipelineTessellationDomainOriginStateCreateInfo::domainOrigin + * + * MESA_VK_DYNAMIC_TS_DOMAIN_ORIGIN + */ uint8_t domain_origin; }; @@ -616,11 +623,11 @@ struct vk_dynamic_graphics_state { */ uint16_t vi_binding_strides[MESA_VK_MAX_VERTEX_BINDINGS]; + /** Input assembly state */ struct vk_input_assembly_state ia; - struct { - uint32_t patch_control_points; - } ts; + /** Tessellation state */ + struct vk_tessellation_state ts; /** Viewport state */ struct vk_viewport_state vp; -- 2.7.4