summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/v3d/v3d_program.c
diff options
context:
space:
mode:
authorNeil Roberts <nroberts@igalia.com>2020-06-22 14:26:02 +0200
committerMarge Bot <eric+marge@anholt.net>2020-07-06 21:59:16 +0000
commitee4d51f8b2de004b04d02c7edf66ca0608adf16f (patch)
tree7b3a32fcd42b915bcd32bc94e1f093cd32a552af /src/gallium/drivers/v3d/v3d_program.c
parent207da33a86d1a2b45995a7fd123afb761b1d841f (diff)
v3d: Add a lowering pass for line smoothing
When line smoothing is enabled, the driver now increases the width of the line so that it can add some semi-transparent pixels to either side of the line. A lowering pass is added which modifies the alpha component of every write to fragment output 0 so that if the fragment is outside the width of the line then the alpha is reduced. It additionally discards fragments that are completely invisible. It might seem bad to use discard on a tiled renderer but the assumption is that any bad effects from using discard will also happen anyway because of enabling alpha blending. v2: Disable the line smoothing pass entirely when the framebuffer contains an integer colour output or one with no alpha channel. Calculate the coverage once upfront and store in a global variable instead of calculating each time an output write is modified. Also do the conditional discard once upfront. v3: Don’t check whether the output buffer has an alpha channel. Only look at output 0. Use aa_line_width intrinsic instead of calculating the real line width in the shader. Clamp the coverage as part of the global variable, not per output write. Reviewed-by: Eric Anholt <eric@anholt.net> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5624>
Diffstat (limited to 'src/gallium/drivers/v3d/v3d_program.c')
-rw-r--r--src/gallium/drivers/v3d/v3d_program.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/src/gallium/drivers/v3d/v3d_program.c b/src/gallium/drivers/v3d/v3d_program.c
index 2415b279754..07a596d3eaf 100644
--- a/src/gallium/drivers/v3d/v3d_program.c
+++ b/src/gallium/drivers/v3d/v3d_program.c
@@ -541,6 +541,8 @@ v3d_update_compiled_fs(struct v3d_context *v3d, uint8_t prim_mode)
key->is_points = (prim_mode == PIPE_PRIM_POINTS);
key->is_lines = (prim_mode >= PIPE_PRIM_LINES &&
prim_mode <= PIPE_PRIM_LINE_STRIP);
+ key->line_smoothing = (key->is_lines &&
+ v3d_line_smoothing_enabled(v3d));
key->clamp_color = v3d->rasterizer->base.clamp_fragment_color;
if (v3d->blend->base.logicop_enable) {
key->logicop_func = v3d->blend->base.logicop_func;