diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 16782fb0787..40fe759db9e 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -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, diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index 7de2b32d5f3..c63351f6061 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -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 | diff --git a/src/intel/vulkan/genX_pipeline.c b/src/intel/vulkan/genX_pipeline.c index 6ef28e0e2f0..d0820fe0b59 100644 --- a/src/intel/vulkan/genX_pipeline.c +++ b/src/intel/vulkan/genX_pipeline.c @@ -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; diff --git a/src/intel/vulkan/gfx8_cmd_buffer.c b/src/intel/vulkan/gfx8_cmd_buffer.c index 96aa600dce0..4f6a6cc1b5a 100644 --- a/src/intel/vulkan/gfx8_cmd_buffer.c +++ b/src/intel/vulkan/gfx8_cmd_buffer.c @@ -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);