From: Dave Airlie Date: Tue, 10 Mar 2020 03:51:24 +0000 (+1000) Subject: draw: disable point/line smoothing for multisample (v2) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=24cf7a2b36fa784cce9eee4ae8957d3d9dac98c3;p=mesa.git draw: disable point/line smoothing for multisample (v2) When MSAA is enabled smoothing is ignored v2: As pointed out by Roland I got this completely wrong, fix this to work the other way Reviewed-by: Roland Scheidegger Part-of: --- diff --git a/src/gallium/auxiliary/draw/draw_pipe_aaline.c b/src/gallium/auxiliary/draw/draw_pipe_aaline.c index 872b29e9c8d..cd4be6d967f 100644 --- a/src/gallium/auxiliary/draw/draw_pipe_aaline.c +++ b/src/gallium/auxiliary/draw/draw_pipe_aaline.c @@ -502,7 +502,7 @@ aaline_first_line(struct draw_stage *stage, struct prim_header *header) const struct pipe_rasterizer_state *rast = draw->rasterizer; void *r; - assert(draw->rasterizer->line_smooth); + assert(draw->rasterizer->line_smooth && !draw->rasterizer->multisample); if (draw->rasterizer->line_width <= 1.0) aaline->half_line_width = 1.0; @@ -718,11 +718,11 @@ draw_aaline_prepare_outputs(struct draw_context *draw, /* update vertex attrib info */ aaline->pos_slot = draw_current_shader_position_output(draw); - if (!rast->line_smooth) + if (!rast->line_smooth || rast->multisample) return; /* allocate the extra post-transformed vertex attribute */ - if (aaline->fs->aaline_fs) + if (aaline->fs && aaline->fs->aaline_fs) aaline->coord_slot = draw_alloc_extra_vertex_attrib(draw, TGSI_SEMANTIC_GENERIC, aaline->fs->generic_attrib); diff --git a/src/gallium/auxiliary/draw/draw_pipe_aapoint.c b/src/gallium/auxiliary/draw/draw_pipe_aapoint.c index 797e0d2d9c2..2ee2bc17faa 100644 --- a/src/gallium/auxiliary/draw/draw_pipe_aapoint.c +++ b/src/gallium/auxiliary/draw/draw_pipe_aapoint.c @@ -580,7 +580,7 @@ aapoint_first_point(struct draw_stage *stage, struct prim_header *header) const struct pipe_rasterizer_state *rast = draw->rasterizer; void *r; - assert(draw->rasterizer->point_smooth); + assert(draw->rasterizer->point_smooth && !draw->rasterizer->multisample); if (draw->rasterizer->point_size <= 2.0) aapoint->radius = 1.0; @@ -666,10 +666,10 @@ draw_aapoint_prepare_outputs(struct draw_context *draw, /* update vertex attrib info */ aapoint->pos_slot = draw_current_shader_position_output(draw); - if (!rast->point_smooth) + if (!rast->point_smooth || rast->multisample) return; - if (aapoint->fs->aapoint_fs) { + if (aapoint->fs && aapoint->fs->aapoint_fs) { /* allocate the extra post-transformed vertex attribute */ aapoint->tex_slot = draw_alloc_extra_vertex_attrib(draw, TGSI_SEMANTIC_GENERIC, diff --git a/src/gallium/auxiliary/draw/draw_pipe_validate.c b/src/gallium/auxiliary/draw/draw_pipe_validate.c index 940ca5644de..3c5afaf29a8 100644 --- a/src/gallium/auxiliary/draw/draw_pipe_validate.c +++ b/src/gallium/auxiliary/draw/draw_pipe_validate.c @@ -77,7 +77,7 @@ draw_need_pipeline(const struct draw_context *draw, return TRUE; /* AA lines */ - if (rasterizer->line_smooth && draw->pipeline.aaline) + if ((!rasterizer->multisample && rasterizer->line_smooth) && draw->pipeline.aaline) return TRUE; if (draw_current_shader_num_written_culldistances(draw)) @@ -94,7 +94,7 @@ draw_need_pipeline(const struct draw_context *draw, return TRUE; /* AA points */ - if (rasterizer->point_smooth && draw->pipeline.aapoint) + if ((!rasterizer->multisample && rasterizer->point_smooth) && draw->pipeline.aapoint) return TRUE; /* point sprites */ @@ -162,12 +162,12 @@ static struct draw_stage *validate_pipeline( struct draw_stage *stage ) /* drawing wide, non-AA lines? */ wide_lines = rast->line_width != 1.0f && roundf(rast->line_width) > draw->pipeline.wide_line_threshold && - !rast->line_smooth; + (!rast->line_smooth || rast->multisample); /* drawing large/sprite points (but not AA points)? */ if (rast->sprite_coord_enable && draw->pipeline.point_sprite) wide_points = TRUE; - else if (rast->point_smooth && draw->pipeline.aapoint) + else if ((!rast->multisample && rast->point_smooth) && draw->pipeline.aapoint) wide_points = FALSE; else if (rast->point_size > draw->pipeline.wide_point_threshold) wide_points = TRUE; @@ -183,13 +183,13 @@ static struct draw_stage *validate_pipeline( struct draw_stage *stage ) * shorter pipelines for lines & points. */ - if (rast->line_smooth && draw->pipeline.aaline) { + if ((!rast->multisample && rast->line_smooth) && draw->pipeline.aaline) { draw->pipeline.aaline->next = next; next = draw->pipeline.aaline; precalc_flat = TRUE; } - if (rast->point_smooth && draw->pipeline.aapoint) { + if ((!rast->multisample && rast->point_smooth) && draw->pipeline.aapoint) { draw->pipeline.aapoint->next = next; next = draw->pipeline.aapoint; }