diff --git a/src/vulkan/runtime/vk_graphics_state.c b/src/vulkan/runtime/vk_graphics_state.c index cb848c736bf..eb16d4d95b1 100644 --- a/src/vulkan/runtime/vk_graphics_state.c +++ b/src/vulkan/runtime/vk_graphics_state.c @@ -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); diff --git a/src/vulkan/runtime/vk_graphics_state.h b/src/vulkan/runtime/vk_graphics_state.h index 008ef4e1461..3309cdfba02 100644 --- a/src/vulkan/runtime/vk_graphics_state.h +++ b/src/vulkan/runtime/vk_graphics_state.h @@ -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