anv: dynamic provoking vertex mode

This affects following packets:

  3DSTATE_CLIP
  3DSTATE_SF
  3DSTATE_STREAMOUT

Signed-off-by: Tapani Pälli <tapani.palli@intel.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18879>
This commit is contained in:
Tapani Pälli 2022-09-04 19:31:09 +03:00 committed by Marge Bot
parent 1a8209218e
commit 0b75376e4d
4 changed files with 43 additions and 50 deletions

View file

@ -3863,6 +3863,23 @@ anv_line_rasterization_mode(VkLineRasterizationModeEXT line_mode,
return line_mode;
}
/* Fill provoking vertex mode to packet. */
#define ANV_SETUP_PROVOKING_VERTEX(cmd, mode) \
switch (dyn->rs.provoking_vertex) { \
case VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT: \
cmd.TriangleStripListProvokingVertexSelect = 0; \
cmd.LineStripListProvokingVertexSelect = 0; \
cmd.TriangleFanProvokingVertexSelect = 1; \
break; \
case VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT: \
cmd.TriangleStripListProvokingVertexSelect = 2; \
cmd.LineStripListProvokingVertexSelect = 1; \
cmd.TriangleFanProvokingVertexSelect = 2; \
break; \
default: \
unreachable("Invalid provoking vertex mode"); \
} \
VkFormatFeatureFlags2
anv_get_image_format_features2(const struct intel_device_info *devinfo,
VkFormat vk_format,

View file

@ -3144,7 +3144,8 @@ cmd_buffer_emit_clip(struct anv_cmd_buffer *cmd_buffer)
!BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_IA_PRIMITIVE_TOPOLOGY) &&
!BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_VP_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE) &&
!BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_VP_VIEWPORT_COUNT) &&
!BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_RS_POLYGON_MODE))
!BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_RS_POLYGON_MODE) &&
!BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_RS_PROVOKING_VERTEX))
return;
/* Take dynamic primitive topology in to account with
@ -3161,6 +3162,9 @@ cmd_buffer_emit_clip(struct anv_cmd_buffer *cmd_buffer)
.APIMode = dyn->vp.depth_clip_negative_one_to_one ? APIMODE_OGL : APIMODE_D3D,
.ViewportXYClipTestEnable = xy_clip_test_enable,
};
ANV_SETUP_PROVOKING_VERTEX(clip, dyn->rs.provoking_vertex);
uint32_t dwords[GENX(3DSTATE_CLIP_length)];
/* TODO(mesh): Multiview. */
@ -3426,6 +3430,20 @@ cmd_buffer_emit_streamout(struct anv_cmd_buffer *cmd_buffer)
.RenderingDisable = dyn->rs.rasterizer_discard_enable,
.RenderStreamSelect = dyn->rs.rasterization_stream,
};
switch (dyn->rs.provoking_vertex) {
case VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT:
so.ReorderMode = LEADING;
break;
case VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT:
so.ReorderMode = TRAILING;
break;
default:
unreachable("Invalid provoking vertex mode");
}
GENX(3DSTATE_STREAMOUT_pack)(NULL, dwords, &so);
anv_batch_emit_merge(&cmd_buffer->batch, dwords, pipeline->gfx8.streamout_state);
}
@ -3625,7 +3643,8 @@ genX(cmd_buffer_flush_gfx_state)(struct anv_cmd_buffer *cmd_buffer)
if ((cmd_buffer->state.gfx.dirty & (ANV_CMD_DIRTY_PIPELINE |
ANV_CMD_DIRTY_XFB_ENABLE)) ||
BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_RS_RASTERIZER_DISCARD_ENABLE) ||
BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_RS_RASTERIZATION_STREAM))
BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_RS_RASTERIZATION_STREAM) ||
BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_RS_PROVOKING_VERTEX))
cmd_buffer_emit_streamout(cmd_buffer);
if ((cmd_buffer->state.gfx.dirty & (ANV_CMD_DIRTY_PIPELINE |

View file

@ -684,23 +684,6 @@ emit_rs_state(struct anv_graphics_pipeline *pipeline,
sf.VertexSubPixelPrecisionSelect = _8Bit;
sf.AALineDistanceMode = true;
switch (rs->provoking_vertex) {
case VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT:
sf.TriangleStripListProvokingVertexSelect = 0;
sf.LineStripListProvokingVertexSelect = 0;
sf.TriangleFanProvokingVertexSelect = 1;
break;
case VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT:
sf.TriangleStripListProvokingVertexSelect = 2;
sf.LineStripListProvokingVertexSelect = 1;
sf.TriangleFanProvokingVertexSelect = 2;
break;
default:
unreachable("Invalid provoking vertex mode");
}
#if GFX_VER >= 12
sf.DerefBlockSize = urb_deref_block_size;
#endif
@ -1034,23 +1017,6 @@ emit_3dstate_clip(struct anv_graphics_pipeline *pipeline,
clip.VertexSubPixelPrecisionSelect = _8Bit;
clip.ClipMode = CLIPMODE_NORMAL;
switch (rs->provoking_vertex) {
case VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT:
clip.TriangleStripListProvokingVertexSelect = 0;
clip.LineStripListProvokingVertexSelect = 0;
clip.TriangleFanProvokingVertexSelect = 1;
break;
case VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT:
clip.TriangleStripListProvokingVertexSelect = 2;
clip.LineStripListProvokingVertexSelect = 1;
clip.TriangleFanProvokingVertexSelect = 2;
break;
default:
unreachable("Invalid provoking vertex mode");
}
clip.MinimumPointWidth = 0.125;
clip.MaximumPointWidth = 255.875;
@ -1249,19 +1215,6 @@ emit_3dstate_streamout(struct anv_graphics_pipeline *pipeline,
so.SOFunctionEnable = true;
so.SOStatisticsEnable = true;
switch (rs->provoking_vertex) {
case VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT:
so.ReorderMode = LEADING;
break;
case VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT:
so.ReorderMode = TRAILING;
break;
default:
unreachable("Invalid provoking vertex mode");
}
so.Buffer0SurfacePitch = xfb_info->buffers[0].stride;
so.Buffer1SurfacePitch = xfb_info->buffers[1].stride;
so.Buffer2SurfacePitch = xfb_info->buffers[2].stride;

View file

@ -273,11 +273,15 @@ genX(cmd_buffer_flush_dynamic_state)(struct anv_cmd_buffer *cmd_buffer)
#endif /* GFX_VER >= 11 */
if ((cmd_buffer->state.gfx.dirty & ANV_CMD_DIRTY_PIPELINE) ||
BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_RS_LINE_WIDTH)) {
BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_RS_LINE_WIDTH) ||
BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_RS_PROVOKING_VERTEX)) {
uint32_t sf_dw[GENX(3DSTATE_SF_length)];
struct GENX(3DSTATE_SF) sf = {
GENX(3DSTATE_SF_header),
};
ANV_SETUP_PROVOKING_VERTEX(sf, dyn->rs.provoking_vertex);
sf.LineWidth = dyn->rs.line.width,
GENX(3DSTATE_SF_pack)(NULL, sf_dw, &sf);