vulkan: Add more dynamic rasterizer state

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:19:30 -05:00
committed by Marge Bot
parent effd9962d9
commit 9d0ed9cbcc
2 changed files with 200 additions and 90 deletions

View File

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

View File

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