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

Roland Scheidegger sroland at vmware.com
Tue Mar 15 15:07:41 UTC 2016


Am 15.03.2016 um 08:20 schrieb Jose Fonseca:
> 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>

Ok I'll change that. The reason I used boolean was that draw code near
exclusively is using boolean, not bool (with a ratio of about 100:1) but
it probably makes sense to use bool when things are changed.

Roland



More information about the mesa-dev mailing list