diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 9f6348c2939..7e1632c9484 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -125,6 +125,7 @@ const struct radv_dynamic_state default_dynamic_state = { .polygon_mode = 0, .tess_domain_origin = VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT, .logic_op_enable = 0u, + .stippled_line_enable = 0u, }; static void @@ -264,6 +265,8 @@ radv_bind_dynamic_state(struct radv_cmd_buffer *cmd_buffer, const struct radv_dy RADV_CMP_COPY(logic_op_enable, RADV_DYNAMIC_LOGIC_OP_ENABLE); + RADV_CMP_COPY(stippled_line_enable, RADV_DYNAMIC_LINE_STIPPLE_ENABLE); + #undef RADV_CMP_COPY cmd_buffer->state.dirty |= dest_mask; @@ -1492,6 +1495,10 @@ radv_emit_graphics_pipeline(struct radv_cmd_buffer *cmd_buffer) cmd_buffer->state.emitted_graphics_pipeline->vgt_tf_param != pipeline->vgt_tf_param) cmd_buffer->state.dirty |= RADV_CMD_DIRTY_DYNAMIC_TESS_DOMAIN_ORIGIN; + if (!cmd_buffer->state.emitted_graphics_pipeline || + cmd_buffer->state.emitted_graphics_pipeline->ms.pa_sc_mode_cntl_0 != pipeline->ms.pa_sc_mode_cntl_0) + cmd_buffer->state.dirty |= RADV_CMD_DIRTY_DYNAMIC_LINE_STIPPLE_ENABLE; + radeon_emit_array(cmd_buffer->cs, pipeline->base.cs.buf, pipeline->base.cs.cdw); if (pipeline->has_ngg_culling && @@ -3339,6 +3346,18 @@ radv_emit_tess_domain_origin(struct radv_cmd_buffer *cmd_buffer) radeon_set_context_reg(cmd_buffer->cs, R_028B6C_VGT_TF_PARAM, vgt_tf_param); } +static void +radv_emit_line_stipple_enable(struct radv_cmd_buffer *cmd_buffer) +{ + struct radv_graphics_pipeline *pipeline = cmd_buffer->state.graphics_pipeline; + struct radv_dynamic_state *d = &cmd_buffer->state.dynamic; + unsigned pa_sc_mode_cntl_0 = pipeline->ms.pa_sc_mode_cntl_0; + + pa_sc_mode_cntl_0 |= S_028A48_LINE_STIPPLE_ENABLE(d->stippled_line_enable); + + radeon_set_context_reg(cmd_buffer->cs, R_028A48_PA_SC_MODE_CNTL_0, pa_sc_mode_cntl_0); +} + static void radv_cmd_buffer_flush_dynamic_state(struct radv_cmd_buffer *cmd_buffer, bool pipeline_is_dirty) { @@ -3418,6 +3437,9 @@ radv_cmd_buffer_flush_dynamic_state(struct radv_cmd_buffer *cmd_buffer, bool pip if (states & RADV_CMD_DIRTY_DYNAMIC_TESS_DOMAIN_ORIGIN) radv_emit_tess_domain_origin(cmd_buffer); + if (states & RADV_CMD_DIRTY_DYNAMIC_LINE_STIPPLE_ENABLE) + radv_emit_line_stipple_enable(cmd_buffer); + cmd_buffer->state.dirty &= ~states; } @@ -5845,6 +5867,17 @@ radv_CmdSetLogicOpEnableEXT(VkCommandBuffer commandBuffer, VkBool32 logicOpEnabl state->dirty |= RADV_CMD_DIRTY_DYNAMIC_LOGIC_OP_ENABLE; } +VKAPI_ATTR void VKAPI_CALL +radv_CmdSetLineStippleEnableEXT(VkCommandBuffer commandBuffer, VkBool32 stippledLineEnable) +{ + RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer); + struct radv_cmd_state *state = &cmd_buffer->state; + + state->dynamic.stippled_line_enable = stippledLineEnable; + + state->dirty |= RADV_CMD_DIRTY_DYNAMIC_LINE_STIPPLE_ENABLE; +} + 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 a0a8fbbde24..4403fa4ff42 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -1151,8 +1151,7 @@ radv_pipeline_init_multisample_state(struct radv_graphics_pipeline *pipeline, S_028A4C_TILE_WALK_ORDER_ENABLE(1) | S_028A4C_MULTI_SHADER_ENGINE_PRIM_DISCARD_ENABLE(1) | S_028A4C_FORCE_EOV_CNTDWN_ENABLE(1) | S_028A4C_FORCE_EOV_REZ_ENABLE(1); ms->pa_sc_mode_cntl_0 = S_028A48_ALTERNATE_RBS_PER_TILE(pdevice->rad_info.gfx_level >= GFX9) | - S_028A48_VPORT_SCISSOR_ENABLE(1) | - S_028A48_LINE_STIPPLE_ENABLE(state->rs->line.stipple.enable); + S_028A48_VPORT_SCISSOR_ENABLE(1); if (state->rs->line.mode == VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT && radv_rast_prim_is_line(rast_prim)) { @@ -1421,7 +1420,8 @@ radv_pipeline_needed_dynamic_state(const struct radv_graphics_pipeline *pipeline if (!state->ms || !state->ms->sample_locations_enable) states &= ~RADV_DYNAMIC_SAMPLE_LOCATIONS; - if (!state->rs->line.stipple.enable) + if (!(pipeline->dynamic_states & RADV_DYNAMIC_LINE_STIPPLE_ENABLE) && + !state->rs->line.stipple.enable) states &= ~RADV_DYNAMIC_LINE_STIPPLE; if (!radv_is_vrs_enabled(pipeline, state)) @@ -1900,6 +1900,10 @@ radv_pipeline_init_dynamic_state(struct radv_graphics_pipeline *pipeline, dynamic->logic_op_enable = state->cb->logic_op_enable; } + if (states & RADV_DYNAMIC_LINE_STIPPLE_ENABLE) { + dynamic->stippled_line_enable = state->rs->line.stipple.enable; + } + pipeline->dynamic_state.mask = states; } @@ -4849,9 +4853,7 @@ radv_pipeline_emit_multisample_state(struct radeon_cmdbuf *ctx_cs, radeon_set_context_reg(ctx_cs, R_028804_DB_EQAA, ms->db_eqaa); radeon_set_context_reg(ctx_cs, R_028BE0_PA_SC_AA_CONFIG, ms->pa_sc_aa_config); - radeon_set_context_reg_seq(ctx_cs, R_028A48_PA_SC_MODE_CNTL_0, 2); - radeon_emit(ctx_cs, ms->pa_sc_mode_cntl_0); - radeon_emit(ctx_cs, ms->pa_sc_mode_cntl_1); + radeon_set_context_reg(ctx_cs, R_028A4C_PA_SC_MODE_CNTL_1, ms->pa_sc_mode_cntl_1); /* The exclusion bits can be set to improve rasterization efficiency * if no sample lies on the pixel boundary (-8 sample offset). It's diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index be042b8b1ae..51f7d6f3fae 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -1357,6 +1357,8 @@ struct radv_dynamic_state { VkTessellationDomainOrigin tess_domain_origin; bool logic_op_enable; + + bool stippled_line_enable; }; extern const struct radv_dynamic_state default_dynamic_state;