[Mesa-stable] [Mesa-dev] [PATCH] draw: fix line stippling

Jose Fonseca jfonseca at vmware.com
Tue Mar 15 07:20:30 UTC 2016


On 13/03/16 20:40, sroland at vmware.com wrote:
> From: Roland Scheidegger <sroland at vmware.com>
>
> The logic was comparing actual ints, not true/false values.
> This meant that it was emitting always multiple line segments instead of just
> one even if the stipple test had the same result, which looks inefficient, and
> the segments also overlapped thus breaking line aa as well.
> (In practice, with the no-op default line stipple pattern, for a 10-pixel
> long line from 0-9 it was emitting 10 segments, with the individual segments
> ranging from 0-1, 0-2, 0-3 and so on.)
>
> This fixes https://bugs.freedesktop.org/show_bug.cgi?id=94193
>
> CC: <mesa-stable at lists.freedesktop.org>
> ---
>   src/gallium/auxiliary/draw/draw_pipe_stipple.c | 30 +++++++++++++-------------
>   1 file changed, 15 insertions(+), 15 deletions(-)
>
> diff --git a/src/gallium/auxiliary/draw/draw_pipe_stipple.c b/src/gallium/auxiliary/draw/draw_pipe_stipple.c
> index dcf05aa..04854ad 100644
> --- a/src/gallium/auxiliary/draw/draw_pipe_stipple.c
> +++ b/src/gallium/auxiliary/draw/draw_pipe_stipple.c
> @@ -108,11 +108,11 @@ emit_segment(struct draw_stage *stage, struct prim_header *header,
>   }
>
>
> -static inline unsigned
> +static inline boolean
>   stipple_test(int counter, ushort pattern, int factor)
>   {
>      int b = (counter / factor) & 0xf;
> -   return (1 << b) & pattern;
> +   return !!((1 << b) & pattern);
>   }
>
>
> @@ -126,7 +126,7 @@ stipple_line(struct draw_stage *stage, struct prim_header *header)
>      const float *pos0 = v0->data[pos];
>      const float *pos1 = v1->data[pos];
>      float start = 0;
> -   int state = 0;
> +   boolean state = 0;
>
>      float x0 = pos0[0];
>      float x1 = pos1[0];
> @@ -143,29 +143,29 @@ stipple_line(struct draw_stage *stage, struct prim_header *header)
>         stipple->counter = 0;
>
>
> -   /* XXX ToDo: intead of iterating pixel-by-pixel, use a look-up table.
> +   /* XXX ToDo: instead of iterating pixel-by-pixel, use a look-up table.
>       */
>      for (i = 0; i < length; i++) {
> -      int result = stipple_test( (int) stipple->counter+i,
> -                                 (ushort) stipple->pattern, stipple->factor );
> +      boolean result = stipple_test((int)stipple->counter + i,
> +                                    (ushort)stipple->pattern, stipple->factor);
>         if (result != state) {
>            /* changing from "off" to "on" or vice versa */
> -	 if (state) {
> -	    if (start != i) {
> +         if (state) {
> +            if (start != i) {
>                  /* finishing an "on" segment */
> -	       emit_segment( stage, header, start / length, i / length );
> +               emit_segment(stage, header, start / length, i / length);
>               }
> -	 }
> -	 else {
> +         }
> +         else {
>               /* starting an "on" segment */
> -	    start = (float) i;
> -	 }
> -	 state = result;	
> +            start = (float)i;
> +         }
> +         state = result;
>         }
>      }
>
>      if (state && start < length)
> -      emit_segment( stage, header, start / length, 1.0 );
> +      emit_segment(stage, header, start / length, 1.0);
>
>      stipple->counter += length;
>   }
>

I think we're avoiding "boolean" over the standard C99 "bool".

Otherwise looks good.

Reviewed-by: Jose Fonseca <jfonseca at vmware.com>


More information about the mesa-stable mailing list