diff --git a/src/vulkan/runtime/vk_graphics_state.c b/src/vulkan/runtime/vk_graphics_state.c index a10365145d2..4bff7b6cb7c 100644 --- a/src/vulkan/runtime/vk_graphics_state.c +++ b/src/vulkan/runtime/vk_graphics_state.c @@ -65,11 +65,20 @@ get_dynamic_state_groups(BITSET_WORD *dynamic, if (groups & MESA_VK_GRAPHICS_STATE_RASTERIZATION_BIT) { BITSET_SET(dynamic, MESA_VK_DYNAMIC_RS_RASTERIZER_DISCARD_ENABLE); + BITSET_SET(dynamic, MESA_VK_DYNAMIC_RS_DEPTH_CLAMP_ENABLE); + BITSET_SET(dynamic, MESA_VK_DYNAMIC_RS_DEPTH_CLIP_ENABLE); + BITSET_SET(dynamic, MESA_VK_DYNAMIC_RS_POLYGON_MODE); BITSET_SET(dynamic, MESA_VK_DYNAMIC_RS_CULL_MODE); BITSET_SET(dynamic, MESA_VK_DYNAMIC_RS_FRONT_FACE); + BITSET_SET(dynamic, MESA_VK_DYNAMIC_RS_CONSERVATIVE_MODE); + BITSET_SET(dynamic, MESA_VK_DYNAMIC_RS_RASTERIZATION_ORDER_AMD); + BITSET_SET(dynamic, MESA_VK_DYNAMIC_RS_PROVOKING_VERTEX); + BITSET_SET(dynamic, MESA_VK_DYNAMIC_RS_RASTERIZATION_STREAM); BITSET_SET(dynamic, MESA_VK_DYNAMIC_RS_DEPTH_BIAS_ENABLE); BITSET_SET(dynamic, MESA_VK_DYNAMIC_RS_DEPTH_BIAS_FACTORS); BITSET_SET(dynamic, MESA_VK_DYNAMIC_RS_LINE_WIDTH); + BITSET_SET(dynamic, MESA_VK_DYNAMIC_RS_LINE_MODE); + BITSET_SET(dynamic, MESA_VK_DYNAMIC_RS_LINE_STIPPLE_ENABLE); BITSET_SET(dynamic, MESA_VK_DYNAMIC_RS_LINE_STIPPLE); } @@ -200,6 +209,14 @@ 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_CLAMP_ENABLE_EXT, RS_DEPTH_CLAMP_ENABLE) + CASE( POLYGON_MODE_EXT, RS_POLYGON_MODE) + CASE( RASTERIZATION_STREAM_EXT, RS_RASTERIZATION_STREAM) + CASE( CONSERVATIVE_RASTERIZATION_MODE_EXT, RS_CONSERVATIVE_MODE) + CASE( DEPTH_CLIP_ENABLE_EXT, RS_DEPTH_CLIP_ENABLE) + CASE( PROVOKING_VERTEX_MODE_EXT, RS_PROVOKING_VERTEX) + CASE( LINE_RASTERIZATION_MODE_EXT, RS_LINE_MODE) + CASE( LINE_STIPPLE_ENABLE_EXT, RS_LINE_STIPPLE_ENABLE) CASE( DEPTH_CLIP_NEGATIVE_ONE_TO_ONE_EXT, VP_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE) default: unreachable("Unsupported dynamic graphics state"); @@ -483,6 +500,7 @@ vk_rasterization_state_init(struct vk_rasterization_state *rs, const VkPipelineRasterizationDepthClipStateCreateInfoEXT *rdc_info = (const VkPipelineRasterizationDepthClipStateCreateInfoEXT *)ext; rs->depth_clip_enable = rdc_info->depthClipEnable; + rs->depth_clip_present = true; break; } @@ -490,8 +508,9 @@ vk_rasterization_state_init(struct vk_rasterization_state *rs, const VkPipelineRasterizationLineStateCreateInfoEXT *rl_info = (const VkPipelineRasterizationLineStateCreateInfoEXT *)ext; rs->line.mode = rl_info->lineRasterizationMode; - rs->line.stipple.enable = rl_info->stippledLineEnable; - if (rs->line.stipple.enable && !IS_DYNAMIC(RS_LINE_STIPPLE)) { + if (!IS_DYNAMIC(RS_LINE_STIPPLE_ENABLE)) + rs->line.stipple.enable = rl_info->stippledLineEnable; + if ((IS_DYNAMIC(RS_LINE_STIPPLE_ENABLE) || rs->line.stipple.enable) && !IS_DYNAMIC(RS_LINE_STIPPLE)) { rs->line.stipple.factor = rl_info->lineStippleFactor; rs->line.stipple.pattern = rl_info->lineStipplePattern; } @@ -530,16 +549,7 @@ vk_dynamic_graphics_state_init_rs(struct vk_dynamic_graphics_state *dst, const BITSET_WORD *needed, const struct vk_rasterization_state *rs) { - dst->rs.rasterizer_discard_enable = rs->rasterizer_discard_enable; - dst->rs.cull_mode = rs->cull_mode; - dst->rs.front_face = rs->front_face; - dst->rs.depth_bias.enable = rs->depth_bias.enable; - dst->rs.depth_bias.constant = rs->depth_bias.constant; - dst->rs.depth_bias.clamp = rs->depth_bias.clamp; - dst->rs.depth_bias.slope = rs->depth_bias.slope; - dst->rs.line.width = rs->line.width; - dst->rs.line.stipple.factor = rs->line.stipple.factor; - dst->rs.line.stipple.pattern = rs->line.stipple.pattern; + dst->rs = *rs; } static void @@ -1581,13 +1591,22 @@ vk_dynamic_graphics_state_copy(struct vk_dynamic_graphics_state *dst, } COPY_IF_SET(RS_RASTERIZER_DISCARD_ENABLE, rs.rasterizer_discard_enable); + COPY_IF_SET(RS_DEPTH_CLAMP_ENABLE, rs.depth_clamp_enable); + COPY_IF_SET(RS_DEPTH_CLIP_ENABLE, rs.depth_clip_enable); + COPY_IF_SET(RS_POLYGON_MODE, rs.polygon_mode); COPY_IF_SET(RS_CULL_MODE, rs.cull_mode); COPY_IF_SET(RS_FRONT_FACE, rs.front_face); + COPY_IF_SET(RS_CONSERVATIVE_MODE, rs.conservative_mode); + COPY_IF_SET(RS_RASTERIZATION_ORDER_AMD, rs.rasterization_order_amd); + COPY_IF_SET(RS_PROVOKING_VERTEX, rs.provoking_vertex); + COPY_IF_SET(RS_RASTERIZATION_STREAM, rs.rasterization_stream); COPY_IF_SET(RS_DEPTH_BIAS_ENABLE, rs.depth_bias.enable); COPY_IF_SET(RS_DEPTH_BIAS_FACTORS, rs.depth_bias.constant); COPY_IF_SET(RS_DEPTH_BIAS_FACTORS, rs.depth_bias.clamp); COPY_IF_SET(RS_DEPTH_BIAS_FACTORS, rs.depth_bias.slope); COPY_IF_SET(RS_LINE_WIDTH, rs.line.width); + COPY_IF_SET(RS_LINE_MODE, rs.line.mode); + COPY_IF_SET(RS_LINE_STIPPLE_ENABLE, rs.line.stipple.enable); COPY_IF_SET(RS_LINE_STIPPLE, rs.line.stipple.factor); COPY_IF_SET(RS_LINE_STIPPLE, rs.line.stipple.pattern); @@ -1854,6 +1873,38 @@ vk_common_CmdSetRasterizerDiscardEnableEXT(VkCommandBuffer commandBuffer, rs.rasterizer_discard_enable, rasterizerDiscardEnable); } +VKAPI_ATTR void VKAPI_CALL +vk_common_CmdSetDepthClampEnableEXT(VkCommandBuffer commandBuffer, + VkBool32 depthClampEnable) +{ + VK_FROM_HANDLE(vk_command_buffer, cmd, commandBuffer); + struct vk_dynamic_graphics_state *dyn = &cmd->dynamic_graphics_state; + + SET_DYN_BOOL(dyn, RS_DEPTH_CLAMP_ENABLE, + rs.depth_clamp_enable, depthClampEnable); +} + +VKAPI_ATTR void VKAPI_CALL +vk_common_CmdSetDepthClipEnableEXT(VkCommandBuffer commandBuffer, + VkBool32 depthClipEnable) +{ + VK_FROM_HANDLE(vk_command_buffer, cmd, commandBuffer); + struct vk_dynamic_graphics_state *dyn = &cmd->dynamic_graphics_state; + + SET_DYN_BOOL(dyn, RS_DEPTH_CLIP_ENABLE, + rs.depth_clip_enable, depthClipEnable); +} + +VKAPI_ATTR void VKAPI_CALL +vk_common_CmdSetPolygonModeEXT(VkCommandBuffer commandBuffer, + VkPolygonMode polygonMode) +{ + VK_FROM_HANDLE(vk_command_buffer, cmd, commandBuffer); + struct vk_dynamic_graphics_state *dyn = &cmd->dynamic_graphics_state; + + SET_DYN_BOOL(dyn, RS_POLYGON_MODE, rs.polygon_mode, polygonMode); +} + VKAPI_ATTR void VKAPI_CALL vk_common_CmdSetCullMode(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode) @@ -1874,6 +1925,40 @@ vk_common_CmdSetFrontFace(VkCommandBuffer commandBuffer, SET_DYN_VALUE(dyn, RS_FRONT_FACE, rs.front_face, frontFace); } +VKAPI_ATTR void VKAPI_CALL +vk_common_CmdSetConservativeRasterizationModeEXT( + VkCommandBuffer commandBuffer, + VkConservativeRasterizationModeEXT conservativeRasterizationMode) +{ + VK_FROM_HANDLE(vk_command_buffer, cmd, commandBuffer); + struct vk_dynamic_graphics_state *dyn = &cmd->dynamic_graphics_state; + + SET_DYN_VALUE(dyn, RS_CONSERVATIVE_MODE, rs.conservative_mode, + conservativeRasterizationMode); +} + +VKAPI_ATTR void VKAPI_CALL +vk_common_CmdSetProvokingVertexModeEXT(VkCommandBuffer commandBuffer, + VkProvokingVertexModeEXT provokingVertexMode) +{ + VK_FROM_HANDLE(vk_command_buffer, cmd, commandBuffer); + struct vk_dynamic_graphics_state *dyn = &cmd->dynamic_graphics_state; + + SET_DYN_VALUE(dyn, RS_PROVOKING_VERTEX, + rs.provoking_vertex, provokingVertexMode); +} + +VKAPI_ATTR void VKAPI_CALL +vk_common_CmdSetRasterizationStreamEXT(VkCommandBuffer commandBuffer, + uint32_t rasterizationStream) +{ + VK_FROM_HANDLE(vk_command_buffer, cmd, commandBuffer); + struct vk_dynamic_graphics_state *dyn = &cmd->dynamic_graphics_state; + + SET_DYN_VALUE(dyn, RS_PROVOKING_VERTEX, + rs.rasterization_stream, rasterizationStream); +} + VKAPI_ATTR void VKAPI_CALL vk_common_CmdSetDepthBiasEnable(VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable) @@ -1912,6 +1997,27 @@ vk_common_CmdSetLineWidth(VkCommandBuffer commandBuffer, SET_DYN_VALUE(dyn, RS_LINE_WIDTH, rs.line.width, lineWidth); } +VKAPI_ATTR void VKAPI_CALL +vk_common_CmdSetLineRasterizationModeEXT(VkCommandBuffer commandBuffer, + VkLineRasterizationModeEXT lineRasterizationMode) +{ + VK_FROM_HANDLE(vk_command_buffer, cmd, commandBuffer); + struct vk_dynamic_graphics_state *dyn = &cmd->dynamic_graphics_state; + + SET_DYN_VALUE(dyn, RS_LINE_MODE, rs.line.mode, lineRasterizationMode); +} + +VKAPI_ATTR void VKAPI_CALL +vk_common_CmdSetLineStippleEnableEXT(VkCommandBuffer commandBuffer, + VkBool32 stippledLineEnable) +{ + VK_FROM_HANDLE(vk_command_buffer, cmd, commandBuffer); + struct vk_dynamic_graphics_state *dyn = &cmd->dynamic_graphics_state; + + SET_DYN_BOOL(dyn, RS_LINE_STIPPLE_ENABLE, + rs.line.stipple.enable, stippledLineEnable); +} + VKAPI_ATTR void VKAPI_CALL vk_common_CmdSetLineStippleEXT(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor, diff --git a/src/vulkan/runtime/vk_graphics_state.h b/src/vulkan/runtime/vk_graphics_state.h index cb1e9b29a35..1854aea122e 100644 --- a/src/vulkan/runtime/vk_graphics_state.h +++ b/src/vulkan/runtime/vk_graphics_state.h @@ -57,11 +57,20 @@ enum mesa_vk_dynamic_graphics_state { 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_DEPTH_CLAMP_ENABLE, + MESA_VK_DYNAMIC_RS_DEPTH_CLIP_ENABLE, + MESA_VK_DYNAMIC_RS_POLYGON_MODE, MESA_VK_DYNAMIC_RS_CULL_MODE, MESA_VK_DYNAMIC_RS_FRONT_FACE, + MESA_VK_DYNAMIC_RS_CONSERVATIVE_MODE, + MESA_VK_DYNAMIC_RS_RASTERIZATION_ORDER_AMD, + MESA_VK_DYNAMIC_RS_PROVOKING_VERTEX, + MESA_VK_DYNAMIC_RS_RASTERIZATION_STREAM, MESA_VK_DYNAMIC_RS_DEPTH_BIAS_ENABLE, MESA_VK_DYNAMIC_RS_DEPTH_BIAS_FACTORS, MESA_VK_DYNAMIC_RS_LINE_WIDTH, + MESA_VK_DYNAMIC_RS_LINE_MODE, + MESA_VK_DYNAMIC_RS_LINE_STIPPLE_ENABLE, MESA_VK_DYNAMIC_RS_LINE_STIPPLE, MESA_VK_DYNAMIC_FSR, MESA_VK_DYNAMIC_MS_SAMPLE_LOCATIONS, @@ -194,69 +203,124 @@ struct vk_rasterization_state { /** VkPipelineRasterizationStateCreateInfo::rasterizerDiscardEnable * * This will be false if rasterizer discard is dynamic + * + * MESA_VK_DYNAMIC_RS_RASTERIZER_DISCARD_ENABLE */ bool rasterizer_discard_enable; - /** VkPipelineRasterizationStateCreateInfo::depthClampEnable */ + /** VkPipelineRasterizationStateCreateInfo::depthClampEnable + * + * MESA_VK_DYNAMIC_RS_DEPTH_CLAMP_ENABLE + */ bool depth_clamp_enable; - /** VkPipelineRasterizationDepthClipStateCreateInfoEXT::depthClipEnable */ + /** VkPipelineRasterizationDepthClipStateCreateInfoEXT::depthClipEnable + * + * MESA_VK_DYNAMIC_RS_DEPTH_CLIP_ENABLE + */ bool depth_clip_enable; - /** VkPipelineRasterizationStateCreateInfo::polygonMode */ + /** denotes the presence of VkPipelineRasterizationDepthClipStateCreateInfoEXT */ + bool depth_clip_present; + + /** VkPipelineRasterizationStateCreateInfo::polygonMode + * + * MESA_VK_DYNAMIC_RS_POLYGON_MODE_ENABLEDEPTH_CLIP_ENABLE + */ VkPolygonMode polygon_mode; - /** VkPipelineRasterizationStateCreateInfo::cullMode */ + /** VkPipelineRasterizationStateCreateInfo::cullMode + * + * MESA_VK_DYNAMIC_RS_CULL_MODE + */ VkCullModeFlags cull_mode; - /** VkPipelineRasterizationStateCreateInfo::frontFace */ + /** VkPipelineRasterizationStateCreateInfo::frontFace + * + * MESA_VK_DYNAMIC_RS_FRONT_FACE + */ VkFrontFace front_face; - /** VkPipelineRasterizationConservativeStateCreateInfoEXT::conservativeRasterizationMode */ + /** VkPipelineRasterizationConservativeStateCreateInfoEXT::conservativeRasterizationMode + * + * MESA_VK_DYNAMIC_RS_CONSERVATIVE_MODE + */ VkConservativeRasterizationModeEXT conservative_mode; /** VkPipelineRasterizationStateRasterizationOrderAMD::rasterizationOrder */ VkRasterizationOrderAMD rasterization_order_amd; - /** VkPipelineRasterizationProvokingVertexStateCreateInfoEXT::provokingVertexMode */ + /** VkPipelineRasterizationProvokingVertexStateCreateInfoEXT::provokingVertexMode + * + * MESA_VK_DYNAMIC_RS_PROVOKING_VERTEX + */ VkProvokingVertexModeEXT provoking_vertex; - /** VkPipelineRasterizationStateStreamCreateInfoEXT::rasterizationStream */ + /** VkPipelineRasterizationStateStreamCreateInfoEXT::rasterizationStream + * + * MESA_VK_DYNAMIC_RS_RASTERIZATION_STREAM + */ uint32_t rasterization_stream; struct { - /** VkPipelineRasterizationStateCreateInfo::depthBiasEnable */ + /** VkPipelineRasterizationStateCreateInfo::depthBiasEnable + * + * MESA_VK_DYNAMIC_RS_DEPTH_BIAS_ENABLE + */ bool enable; - /** VkPipelineRasterizationStateCreateInfo::depthBiasConstantFactor */ + /** VkPipelineRasterizationStateCreateInfo::depthBiasConstantFactor + * + * MESA_VK_DYNAMIC_RS_DEPTH_BIAS_FACTORS + */ float constant; - /** VkPipelineRasterizationStateCreateInfo::depthBiasClamp */ + /** VkPipelineRasterizationStateCreateInfo::depthBiasClamp + * + * MESA_VK_DYNAMIC_RS_DEPTH_BIAS_FACTORS + */ float clamp; - /** VkPipelineRasterizationStateCreateInfo::depthBiasSlopeFactor */ + /** VkPipelineRasterizationStateCreateInfo::depthBiasSlopeFactor + * + * MESA_VK_DYNAMIC_RS_DEPTH_BIAS_FACTORS + */ float slope; } depth_bias; struct { - /** VkPipelineRasterizationStateCreateInfo::lineWidth */ + /** VkPipelineRasterizationStateCreateInfo::lineWidth + * + * MESA_VK_DYNAMIC_RS_LINE_WIDTH + */ float width; /** VkPipelineRasterizationLineStateCreateInfoEXT::lineRasterizationMode * * Will be set to VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT if * VkPipelineRasterizationLineStateCreateInfoEXT is not provided. + * + * MESA_VK_DYNAMIC_RS_LINE_MODE */ VkLineRasterizationModeEXT mode; struct { - /** VkPipelineRasterizationLineStateCreateInfoEXT::stippledLineEnable */ + /** VkPipelineRasterizationLineStateCreateInfoEXT::stippledLineEnable + * + * MESA_VK_DYNAMIC_RS_LINE_STIPPLE_ENABLE + */ bool enable; - /** VkPipelineRasterizationLineStateCreateInfoEXT::lineStippleFactor */ + /** VkPipelineRasterizationLineStateCreateInfoEXT::lineStippleFactor + * + * MESA_VK_DYNAMIC_RS_LINE_STIPPLE + */ uint32_t factor; - /** VkPipelineRasterizationLineStateCreateInfoEXT::lineStipplePattern */ + /** VkPipelineRasterizationLineStateCreateInfoEXT::lineStipplePattern + * + * MESA_VK_DYNAMIC_RS_LINE_STIPPLE + */ uint16_t pattern; } stipple; } line; @@ -571,69 +635,9 @@ struct vk_dynamic_graphics_state { } dr; /** Rasterization state */ - struct { - /** Rasterizer discard - * - * MESA_VK_DYNAMIC_GRAPHICS_STATE_RS_RASTERIZER_DISCARD_ENABLE - */ - bool rasterizer_discard_enable; - - /** Cull mode - * - * MESA_VK_DYNAMIC_GRAPHICS_STATE_RS_CULL_MODE - */ - VkCullModeFlags cull_mode; - - /** Front face - * - * MESA_VK_DYNAMIC_GRAPHICS_STATE_RS_FRONT_FACE - */ - VkFrontFace front_face; - - struct { - /** Depth bias enable - * - * MESA_VK_DYNAMIC_GRAPHICS_STATE_RS_DEPTH_BIAS_ENABLE - */ - bool enable; - - /** Depth bias constant factor - * - * MESA_VK_DYNAMIC_GRAPHICS_STATE_RS_DEPTH_BIAS_FACTORS - */ - float constant; - - /** Depth bias clamp - * - * MESA_VK_DYNAMIC_GRAPHICS_STATE_RS_DEPTH_BIAS_FACTORS - */ - float clamp; - - /** Depth bias slope - * - * MESA_VK_DYNAMIC_GRAPHICS_STATE_RS_DEPTH_BIAS_FACTORS - */ - float slope; - } depth_bias; - - struct { - /** Line width - * - * MESA_VK_DYNAMIC_GRAPHICS_STATE_RS_LINE_WIDTH - */ - float width; - - /** Line stipple - * - * MESA_VK_DYNAMIC_GRAPHICS_STATE_RS_LINE_STIPPLE - */ - struct { - uint32_t factor; - uint16_t pattern; - } stipple; - } line; - } rs; + struct vk_rasterization_state rs; + /* Fragment shading rate state */ struct vk_fragment_shading_rate_state fsr; /** Multisample state */