diff --git a/src/vulkan/runtime/vk_graphics_state.c b/src/vulkan/runtime/vk_graphics_state.c index 977ae8db581..a10365145d2 100644 --- a/src/vulkan/runtime/vk_graphics_state.c +++ b/src/vulkan/runtime/vk_graphics_state.c @@ -57,6 +57,7 @@ get_dynamic_state_groups(BITSET_WORD *dynamic, BITSET_SET(dynamic, MESA_VK_DYNAMIC_VP_VIEWPORTS); BITSET_SET(dynamic, MESA_VK_DYNAMIC_VP_SCISSOR_COUNT); BITSET_SET(dynamic, MESA_VK_DYNAMIC_VP_SCISSORS); + BITSET_SET(dynamic, MESA_VK_DYNAMIC_VP_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE); } if (groups & MESA_VK_GRAPHICS_STATE_DISCARD_RECTANGLES_BIT) @@ -199,6 +200,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( DEPTH_CLIP_NEGATIVE_ONE_TO_ONE_EXT, VP_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE) default: unreachable("Unsupported dynamic graphics state"); } @@ -372,11 +374,13 @@ vk_viewport_state_init(struct vk_viewport_state *vp, vp_info->scissorCount); } - const VkPipelineViewportDepthClipControlCreateInfoEXT *vp_dcc_info = - vk_find_struct_const(vp_info->pNext, - PIPELINE_VIEWPORT_DEPTH_CLIP_CONTROL_CREATE_INFO_EXT); - if (vp_dcc_info != NULL) - vp->depth_clip_negative_one_to_one = vp_dcc_info->negativeOneToOne; + if (!IS_DYNAMIC(VP_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE)) { + const VkPipelineViewportDepthClipControlCreateInfoEXT *vp_dcc_info = + vk_find_struct_const(vp_info->pNext, + PIPELINE_VIEWPORT_DEPTH_CLIP_CONTROL_CREATE_INFO_EXT); + if (vp_dcc_info != NULL) + vp->depth_clip_negative_one_to_one = vp_dcc_info->negativeOneToOne; + } } static void @@ -391,6 +395,8 @@ vk_dynamic_graphics_state_init_vp(struct vk_dynamic_graphics_state *dst, dst->vp.scissor_count = vp->scissor_count; if (IS_NEEDED(VP_SCISSORS)) typed_memcpy(dst->vp.scissors, vp->scissors, vp->scissor_count); + + dst->vp.depth_clip_negative_one_to_one = vp->depth_clip_negative_one_to_one; } static void @@ -1566,6 +1572,9 @@ vk_dynamic_graphics_state_copy(struct vk_dynamic_graphics_state *dst, COPY_ARRAY(VP_SCISSORS, vp.scissors, src->vp.scissor_count); } + COPY_IF_SET(VP_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE, + vp.depth_clip_negative_one_to_one); + if (IS_SET_IN_SRC(DR_RECTANGLES)) { COPY_MEMBER(DR_RECTANGLES, dr.rectangle_count); COPY_ARRAY(DR_RECTANGLES, dr.rectangles, src->dr.rectangle_count); @@ -1809,6 +1818,17 @@ vk_common_CmdSetScissorWithCount(VkCommandBuffer commandBuffer, SET_DYN_ARRAY(dyn, VP_SCISSORS, vp.scissors, 0, scissorCount, pScissors); } +VKAPI_ATTR void VKAPI_CALL +vk_common_CmdSetDepthClipNegativeOneToOneEXT(VkCommandBuffer commandBuffer, + VkBool32 negativeOneToOne) +{ + VK_FROM_HANDLE(vk_command_buffer, cmd, commandBuffer); + struct vk_dynamic_graphics_state *dyn = &cmd->dynamic_graphics_state; + + SET_DYN_BOOL(dyn, VP_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE, + vp.depth_clip_negative_one_to_one, negativeOneToOne); +} + VKAPI_ATTR void VKAPI_CALL vk_common_CmdSetDiscardRectangleEXT(VkCommandBuffer commandBuffer, uint32_t firstDiscardRectangle, diff --git a/src/vulkan/runtime/vk_graphics_state.h b/src/vulkan/runtime/vk_graphics_state.h index 47c54be7482..cb1e9b29a35 100644 --- a/src/vulkan/runtime/vk_graphics_state.h +++ b/src/vulkan/runtime/vk_graphics_state.h @@ -54,6 +54,7 @@ enum mesa_vk_dynamic_graphics_state { MESA_VK_DYNAMIC_VP_VIEWPORTS, MESA_VK_DYNAMIC_VP_SCISSOR_COUNT, MESA_VK_DYNAMIC_VP_SCISSORS, + MESA_VK_DYNAMIC_VP_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE, MESA_VK_DYNAMIC_DR_RECTANGLES, MESA_VK_DYNAMIC_RS_RASTERIZER_DISCARD_ENABLE, MESA_VK_DYNAMIC_RS_CULL_MODE, @@ -149,20 +150,33 @@ struct vk_tessellation_state { }; struct vk_viewport_state { - /** VkPipelineViewportDepthClipControlCreateInfoEXT::negativeOneToOne */ + /** VkPipelineViewportDepthClipControlCreateInfoEXT::negativeOneToOne + */ bool depth_clip_negative_one_to_one; - /** VkPipelineViewportStateCreateInfo::viewportCount */ + /** VkPipelineViewportStateCreateInfo::viewportCount + * + * MESA_VK_DYNAMIC_GRAPHICS_STATE_VP_VIEWPORT_COUNT + */ uint8_t viewport_count; - /** VkPipelineViewportStateCreateInfo::scissorCount */ + /** VkPipelineViewportStateCreateInfo::scissorCount + * + * MESA_VK_DYNAMIC_GRAPHICS_STATE_VP_SCISSOR_COUNT + */ uint8_t scissor_count; - /** VkPipelineViewportStateCreateInfo::pViewports */ - VkRect2D scissors[MESA_VK_MAX_SCISSORS]; - - /** VkPipelineViewportStateCreateInfo::pScissors */ + /** VkPipelineViewportStateCreateInfo::pViewports + * + * MESA_VK_DYNAMIC_GRAPHICS_STATE_VP_VIEWPORTS + */ VkViewport viewports[MESA_VK_MAX_VIEWPORTS]; + + /** VkPipelineViewportStateCreateInfo::pScissors + * + * MESA_VK_DYNAMIC_GRAPHICS_STATE_VP_SCISSORS + */ + VkRect2D scissors[MESA_VK_MAX_SCISSORS]; }; struct vk_discard_rectangles_state { @@ -545,31 +559,7 @@ struct vk_dynamic_graphics_state { } ts; /** Viewport state */ - struct { - /** Viewport count - * - * MESA_VK_DYNAMIC_GRAPHICS_STATE_VP_VIEWPORT_COUNT - */ - uint32_t viewport_count; - - /** Viewports - * - * MESA_VK_DYNAMIC_GRAPHICS_STATE_VP_VIEWPORTS - */ - VkViewport viewports[MESA_VK_MAX_VIEWPORTS]; - - /** Scissor count - * - * MESA_VK_DYNAMIC_GRAPHICS_STATE_VP_SCISSOR_COUNT - */ - uint32_t scissor_count; - - /** Scissor rects - * - * MESA_VK_DYNAMIC_GRAPHICS_STATE_VP_SCISSORS - */ - VkRect2D scissors[MESA_VK_MAX_SCISSORS]; - } vp; + struct vk_viewport_state vp; /** Discard rectangles *