vulkan: Add a dynamic state for vp.depth_clip_negative_one_to_one

This is the last bit of viewport state that's not dynamic.  Making it
dynamic will help ANV out a bit.

Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18878>
This commit is contained in:
Jason Ekstrand 2022-07-21 14:01:02 -05:00 committed by Marge Bot
parent 10bc2cd3ae
commit effd9962d9
2 changed files with 47 additions and 37 deletions

View file

@ -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,

View file

@ -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
*