diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 3bb876c55ed..33827c73e43 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -122,6 +122,7 @@ const struct radv_dynamic_state default_dynamic_state = { .logic_op = 0u, .color_write_enable = 0u, .patch_control_points = 0, + .polygon_mode = 0, }; static void @@ -255,6 +256,8 @@ radv_bind_dynamic_state(struct radv_cmd_buffer *cmd_buffer, const struct radv_dy RADV_CMP_COPY(patch_control_points, RADV_DYNAMIC_PATCH_CONTROL_POINTS); + RADV_CMP_COPY(polygon_mode, RADV_DYNAMIC_POLYGON_MODE); + #undef RADV_CMP_COPY cmd_buffer->state.dirty |= dest_mask; @@ -1463,7 +1466,8 @@ radv_emit_graphics_pipeline(struct radv_cmd_buffer *cmd_buffer) cmd_buffer->state.emitted_graphics_pipeline->pa_su_sc_mode_cntl != pipeline->pa_su_sc_mode_cntl) cmd_buffer->state.dirty |= RADV_CMD_DIRTY_DYNAMIC_CULL_MODE | RADV_CMD_DIRTY_DYNAMIC_FRONT_FACE | - RADV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS; + RADV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS | + RADV_CMD_DIRTY_DYNAMIC_POLYGON_MODE; if (!cmd_buffer->state.emitted_graphics_pipeline || cmd_buffer->state.emitted_graphics_pipeline->pa_cl_clip_cntl != pipeline->pa_cl_clip_cntl) @@ -1698,6 +1702,7 @@ radv_emit_line_stipple(struct radv_cmd_buffer *cmd_buffer) uint32_t radv_get_pa_su_sc_mode_cntl(const struct radv_cmd_buffer *cmd_buffer) { + enum amd_gfx_level gfx_level = cmd_buffer->device->physical_device->rad_info.gfx_level; unsigned pa_su_sc_mode_cntl = cmd_buffer->state.graphics_pipeline->pa_su_sc_mode_cntl; const struct radv_dynamic_state *d = &cmd_buffer->state.dynamic; @@ -1706,7 +1711,16 @@ radv_get_pa_su_sc_mode_cntl(const struct radv_cmd_buffer *cmd_buffer) S_028814_FACE(d->front_face) | S_028814_POLY_OFFSET_FRONT_ENABLE(d->depth_bias_enable) | S_028814_POLY_OFFSET_BACK_ENABLE(d->depth_bias_enable) | - S_028814_POLY_OFFSET_PARA_ENABLE(d->depth_bias_enable); + S_028814_POLY_OFFSET_PARA_ENABLE(d->depth_bias_enable) | + S_028814_POLY_MODE(d->polygon_mode != V_028814_X_DRAW_TRIANGLES) | + S_028814_POLYMODE_FRONT_PTYPE(d->polygon_mode) | + S_028814_POLYMODE_BACK_PTYPE(d->polygon_mode); + + if (gfx_level >= GFX10) { + pa_su_sc_mode_cntl |= + S_028814_KEEP_TOGETHER_ENABLE(d->polygon_mode != V_028814_X_DRAW_TRIANGLES); + } + return pa_su_sc_mode_cntl; } @@ -3318,7 +3332,7 @@ radv_cmd_buffer_flush_dynamic_state(struct radv_cmd_buffer *cmd_buffer, bool pip radv_emit_line_stipple(cmd_buffer); if (states & (RADV_CMD_DIRTY_DYNAMIC_CULL_MODE | RADV_CMD_DIRTY_DYNAMIC_FRONT_FACE | - RADV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS_ENABLE)) + RADV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS_ENABLE | RADV_CMD_DIRTY_DYNAMIC_POLYGON_MODE)) radv_emit_culling(cmd_buffer); if (states & RADV_CMD_DIRTY_DYNAMIC_PRIMITIVE_TOPOLOGY) @@ -5747,6 +5761,17 @@ radv_CmdSetVertexInputEXT(VkCommandBuffer commandBuffer, uint32_t vertexBindingD RADV_CMD_DIRTY_DYNAMIC_VERTEX_INPUT; } +VKAPI_ATTR void VKAPI_CALL +radv_CmdSetPolygonModeEXT(VkCommandBuffer commandBuffer, VkPolygonMode polygonMode) +{ + RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer); + struct radv_cmd_state *state = &cmd_buffer->state; + + state->dynamic.polygon_mode = si_translate_fill(polygonMode); + + state->dirty |= RADV_CMD_DIRTY_DYNAMIC_POLYGON_MODE; +} + VKAPI_ATTR void VKAPI_CALL radv_CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer *pCmdBuffers) diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index 53943a1f829..84f8d453154 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -879,22 +879,6 @@ radv_pipeline_init_blend_state(struct radv_graphics_pipeline *pipeline, return blend; } -static uint32_t -si_translate_fill(VkPolygonMode func) -{ - switch (func) { - case VK_POLYGON_MODE_FILL: - return V_028814_X_DRAW_TRIANGLES; - case VK_POLYGON_MODE_LINE: - return V_028814_X_DRAW_LINES; - case VK_POLYGON_MODE_POINT: - return V_028814_X_DRAW_POINTS; - default: - assert(0); - return V_028814_X_DRAW_POINTS; - } -} - static unsigned radv_pipeline_color_samples(const struct vk_graphics_pipeline_state *state) { @@ -1903,6 +1887,10 @@ radv_pipeline_init_dynamic_state(struct radv_graphics_pipeline *pipeline, dynamic->patch_control_points = state->ts->patch_control_points; } + if (states & RADV_DYNAMIC_POLYGON_MODE) { + dynamic->polygon_mode = si_translate_fill(state->rs->polygon_mode); + } + pipeline->dynamic_state.mask = states; } @@ -1913,17 +1901,8 @@ radv_pipeline_init_raster_state(struct radv_graphics_pipeline *pipeline, const struct radv_device *device = pipeline->base.device; pipeline->pa_su_sc_mode_cntl = - S_028814_POLY_MODE(state->rs->polygon_mode != VK_POLYGON_MODE_FILL) | - S_028814_POLYMODE_FRONT_PTYPE(si_translate_fill(state->rs->polygon_mode)) | - S_028814_POLYMODE_BACK_PTYPE(si_translate_fill(state->rs->polygon_mode)) | S_028814_PROVOKING_VTX_LAST(state->rs->provoking_vertex == VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT); - if (device->physical_device->rad_info.gfx_level >= GFX10) { - /* It should also be set if PERPENDICULAR_ENDCAP_ENA is set. */ - pipeline->pa_su_sc_mode_cntl |= - S_028814_KEEP_TOGETHER_ENABLE(state->rs->polygon_mode != VK_POLYGON_MODE_FILL); - } - pipeline->pa_cl_clip_cntl = S_028810_DX_CLIP_SPACE_DEF(!pipeline->negative_one_to_one) | S_028810_ZCLIP_NEAR_DISABLE(!state->rs->depth_clip_enable) | diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 870df72736c..2b5df052e87 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -1351,6 +1351,8 @@ struct radv_dynamic_state { uint32_t color_write_enable; uint32_t patch_control_points; + + uint32_t polygon_mode; }; extern const struct radv_dynamic_state default_dynamic_state; @@ -3004,6 +3006,22 @@ radv_get_num_vertices_per_prim(const struct radv_pipeline_key *pipeline_key) } } +static inline uint32_t +si_translate_fill(VkPolygonMode func) +{ + switch (func) { + case VK_POLYGON_MODE_FILL: + return V_028814_X_DRAW_TRIANGLES; + case VK_POLYGON_MODE_LINE: + return V_028814_X_DRAW_LINES; + case VK_POLYGON_MODE_POINT: + return V_028814_X_DRAW_POINTS; + default: + assert(0); + return V_028814_X_DRAW_POINTS; + } +} + static inline uint32_t si_translate_stencil_op(enum VkStencilOp op) {