vulkan: Add support for VK_EXT_depth_clamp_control

Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31411>
This commit is contained in:
Jules Blok
2024-07-17 22:57:15 +02:00
committed by Marge Bot
parent bd33917509
commit b9af5564bb
2 changed files with 52 additions and 0 deletions

View File

@@ -64,6 +64,7 @@ get_dynamic_state_groups(BITSET_WORD *dynamic,
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);
BITSET_SET(dynamic, MESA_VK_DYNAMIC_VP_DEPTH_CLAMP_RANGE);
}
if (groups & MESA_VK_GRAPHICS_STATE_DISCARD_RECTANGLES_BIT) {
@@ -293,6 +294,7 @@ vk_get_dynamic_graphics_states(BITSET_WORD *dynamic,
CASE( LINE_STIPPLE_ENABLE_EXT, RS_LINE_STIPPLE_ENABLE)
CASE( DEPTH_CLIP_NEGATIVE_ONE_TO_ONE_EXT, VP_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE)
CASE( ATTACHMENT_FEEDBACK_LOOP_ENABLE_EXT, ATTACHMENT_FEEDBACK_LOOP_ENABLE)
CASE( DEPTH_CLAMP_RANGE_EXT, VP_DEPTH_CLAMP_RANGE)
default:
unreachable("Unsupported dynamic graphics state");
}
@@ -497,6 +499,17 @@ vk_viewport_state_init(struct vk_viewport_state *vp,
if (vp_dcc_info != NULL)
vp->depth_clip_negative_one_to_one = vp_dcc_info->negativeOneToOne;
}
if (!IS_DYNAMIC(VP_DEPTH_CLAMP_RANGE)) {
const VkPipelineViewportDepthClampControlCreateInfoEXT *vp_dcc_info =
vk_find_struct_const(vp_info->pNext,
PIPELINE_VIEWPORT_DEPTH_CLAMP_CONTROL_CREATE_INFO_EXT);
if (vp_dcc_info != NULL) {
vp->depth_clamp_mode = vp_dcc_info->depthClampMode;
if (vp->depth_clamp_mode == VK_DEPTH_CLAMP_MODE_USER_DEFINED_RANGE_EXT)
vp->depth_clamp_range = *vp_dcc_info->pDepthClampRange;
}
}
}
static void
@@ -513,6 +526,8 @@ vk_dynamic_graphics_state_init_vp(struct vk_dynamic_graphics_state *dst,
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;
dst->vp.depth_clamp_mode = vp->depth_clamp_mode;
dst->vp.depth_clamp_range = vp->depth_clamp_range;
}
static void
@@ -2086,6 +2101,12 @@ vk_dynamic_graphics_state_copy(struct vk_dynamic_graphics_state *dst,
COPY_IF_SET(VP_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE,
vp.depth_clip_negative_one_to_one);
if (IS_SET_IN_SRC(VP_DEPTH_CLAMP_RANGE)) {
COPY_MEMBER(VP_DEPTH_CLAMP_RANGE, vp.depth_clamp_mode);
COPY_MEMBER(VP_DEPTH_CLAMP_RANGE, vp.depth_clamp_range.minDepthClamp);
COPY_MEMBER(VP_DEPTH_CLAMP_RANGE, vp.depth_clamp_range.maxDepthClamp);
}
COPY_IF_SET(DR_ENABLE, dr.enable);
COPY_IF_SET(DR_MODE, dr.mode);
if (IS_SET_IN_SRC(DR_RECTANGLES)) {
@@ -3155,6 +3176,23 @@ vk_common_CmdSetRenderingInputAttachmentIndicesKHR(
SET_DYN_VALUE(dyn, INPUT_ATTACHMENT_MAP, ial.stencil_att, stencil_att);
}
VKAPI_ATTR void VKAPI_CALL
vk_common_CmdSetDepthClampRangeEXT(VkCommandBuffer commandBuffer,
VkDepthClampModeEXT depthClampMode,
const VkDepthClampRangeEXT* pDepthClampRange)
{
VK_FROM_HANDLE(vk_command_buffer, cmd, commandBuffer);
struct vk_dynamic_graphics_state *dyn = &cmd->dynamic_graphics_state;
SET_DYN_BOOL(dyn, VP_DEPTH_CLAMP_RANGE, vp.depth_clamp_mode, depthClampMode);
if (depthClampMode == VK_DEPTH_CLAMP_MODE_USER_DEFINED_RANGE_EXT) {
SET_DYN_VALUE(dyn, VP_DEPTH_CLAMP_RANGE, vp.depth_clamp_range.minDepthClamp,
pDepthClampRange->minDepthClamp);
SET_DYN_VALUE(dyn, VP_DEPTH_CLAMP_RANGE, vp.depth_clamp_range.maxDepthClamp,
pDepthClampRange->maxDepthClamp);
}
}
/* These are stubs required by VK_EXT_shader_object */
VKAPI_ATTR void VKAPI_CALL
@@ -3249,6 +3287,7 @@ vk_dynamic_graphic_state_to_str(enum mesa_vk_dynamic_graphics_state state)
NAME(VP_SCISSOR_COUNT);
NAME(VP_SCISSORS);
NAME(VP_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE);
NAME(VP_DEPTH_CLAMP_RANGE);
NAME(DR_RECTANGLES);
NAME(DR_MODE);
NAME(DR_ENABLE);

View File

@@ -58,6 +58,7 @@ enum mesa_vk_dynamic_graphics_state {
MESA_VK_DYNAMIC_VP_SCISSOR_COUNT,
MESA_VK_DYNAMIC_VP_SCISSORS,
MESA_VK_DYNAMIC_VP_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE,
MESA_VK_DYNAMIC_VP_DEPTH_CLAMP_RANGE,
MESA_VK_DYNAMIC_DR_RECTANGLES,
MESA_VK_DYNAMIC_DR_MODE,
MESA_VK_DYNAMIC_DR_ENABLE,
@@ -197,6 +198,18 @@ struct vk_viewport_state {
*/
bool depth_clip_negative_one_to_one;
/** VkPipelineViewportDepthClampControlCreateInfoEXT::depthClampMode
*
* MESA_VK_DYNAMIC_GRAPHICS_STATE_VP_DEPTH_CLAMP_RANGE
*/
VkDepthClampModeEXT depth_clamp_mode;
/** VkPipelineViewportDepthClampControlCreateInfoEXT::pDepthClampRange
*
* MESA_VK_DYNAMIC_GRAPHICS_STATE_VP_DEPTH_CLAMP_RANGE
*/
VkDepthClampRangeEXT depth_clamp_range;
/** VkPipelineViewportStateCreateInfo::viewportCount
*
* MESA_VK_DYNAMIC_GRAPHICS_STATE_VP_VIEWPORT_COUNT