[Mesa-dev] [PATCH 2/2] util/draw: replace assertions with conditionals in util_draw_max_index()

Brian Paul brianp at vmware.com
Mon Nov 14 08:38:50 PST 2011


New patch posted.  Let me know if that's what you have in mind.

-Brian

On 11/14/2011 04:00 AM, Jose Fonseca wrote:
> Looks good, but some warnings on util_draw_max_index would be useful, as this is not something apps normally do, so are much more often a symptom of a state tracker bug than apps bugs.
>
> Jose
>
> ----- Original Message -----
>> Don't assert/die if a VBO is too small.  Return zero instead.
>>
>> Note that util_draw_max_index() now returns max_index+1 instead of
>> max_index.  This lets us return zero to indicate that one of the VBOs
>> is too small to draw anything.
>>
>> Fixes a failure with the new piglit vbo-too-small test.
>> ---
>>   src/gallium/auxiliary/draw/draw_pt.c         |   19 ++++++++++++----
>>   src/gallium/auxiliary/util/u_draw.c          |   30
>>   +++++++++++++++++++------
>>   src/mesa/state_tracker/st_cb_bufferobjects.c |    1 +
>>   3 files changed, 38 insertions(+), 12 deletions(-)
>>
>> diff --git a/src/gallium/auxiliary/draw/draw_pt.c
>> b/src/gallium/auxiliary/draw/draw_pt.c
>> index e0eda67..737dd79 100644
>> --- a/src/gallium/auxiliary/draw/draw_pt.c
>> +++ b/src/gallium/auxiliary/draw/draw_pt.c
>> @@ -422,6 +422,7 @@ draw_vbo(struct draw_context *draw,
>>   {
>>      unsigned reduced_prim = u_reduced_prim(info->mode);
>>      unsigned instance;
>> +   unsigned index_limit;
>>
>>      assert(info->instance_count>  0);
>>      if (info->indexed)
>> @@ -470,11 +471,19 @@ draw_vbo(struct draw_context *draw,
>>      if (0)
>>         draw_print_arrays(draw, info->mode, info->start,
>>         MIN2(info->count, 20));
>>
>> -   draw->pt.max_index = util_draw_max_index(draw->pt.vertex_buffer,
>> -
>>                                             draw->pt.nr_vertex_buffers,
>> -                                            draw->pt.vertex_element,
>> -
>>                                             draw->pt.nr_vertex_elements,
>> -                                            info);
>> +   index_limit = util_draw_max_index(draw->pt.vertex_buffer,
>> +                                     draw->pt.nr_vertex_buffers,
>> +                                     draw->pt.vertex_element,
>> +                                     draw->pt.nr_vertex_elements,
>> +                                     info);
>> +
>> +   if (index_limit == 0) {
>> +      /* one of the buffers is too small to do any valid drawing */
>> +      return;
>> +   }
>> +
>> +   draw->pt.max_index = index_limit - 1;
>> +
>>
>>      /*
>>       * TODO: We could use draw->pt.max_index to further narrow
>> diff --git a/src/gallium/auxiliary/util/u_draw.c
>> b/src/gallium/auxiliary/util/u_draw.c
>> index 20837be..2da1adb 100644
>> --- a/src/gallium/auxiliary/util/u_draw.c
>> +++ b/src/gallium/auxiliary/util/u_draw.c
>> @@ -33,9 +33,13 @@
>>
>>
>>   /**
>> - * Returns the largest legal index value for the current set of
>> bound vertex
>> - * buffers.  Regardless of any other consideration, all vertex
>> lookups need to
>> - * be clamped to 0..max_index to prevent an out-of-bound access.
>> + * Returns the largest legal index value plus one for the current
>> set
>> + * of bound vertex buffers.  Regardless of any other consideration,
>> + * all vertex lookups need to be clamped to 0..max_index-1 to
>> prevent
>> + * an out-of-bound access.
>> + *
>> + * Note that if zero is returned it means that one or more buffers
>> is
>> + * too small to contain any valid vertex data.
>>    */
>>   unsigned
>>   util_draw_max_index(
>> @@ -68,13 +72,25 @@ util_draw_max_index(
>>         assert(format_desc->block.bits % 8 == 0);
>>         format_size = format_desc->block.bits/8;
>>
>> -      assert(buffer_size - buffer->buffer_offset<= buffer_size);
>> +      if (buffer->buffer_offset>= buffer_size) {
>> +         /* buffer is too small */
>> +         return 0;
>> +      }
>> +
>>         buffer_size -= buffer->buffer_offset;
>>
>> -      assert(buffer_size - element->src_offset<= buffer_size);
>> +      if (element->src_offset>= buffer_size) {
>> +         /* buffer is too small */
>> +         return 0;
>> +      }
>> +
>>         buffer_size -= element->src_offset;
>>
>> -      assert(buffer_size - format_size<= buffer_size);
>> +      if (format_size>  buffer_size) {
>> +         /* buffer is too small */
>> +         return 0;
>> +      }
>> +
>>         buffer_size -= format_size;
>>
>>         if (buffer->stride != 0) {
>> @@ -95,5 +111,5 @@ util_draw_max_index(
>>         }
>>      }
>>
>> -   return max_index;
>> +   return max_index + 1;
>>   }
>> diff --git a/src/mesa/state_tracker/st_cb_bufferobjects.c
>> b/src/mesa/state_tracker/st_cb_bufferobjects.c
>> index 3abf029..286fa02 100644
>> --- a/src/mesa/state_tracker/st_cb_bufferobjects.c
>> +++ b/src/mesa/state_tracker/st_cb_bufferobjects.c
>> @@ -221,6 +221,7 @@ st_bufferobj_data(struct gl_context *ctx,
>>
>>      pipe_resource_reference(&st_obj->buffer, NULL );
>>
>> +   /* note that size=0 is OK and we should get a non-null value */
>>      st_obj->buffer = pipe_buffer_create(pipe->screen, bind,
>>      pipe_usage, size);
>>
>>      if (!st_obj->buffer) {
>> --
>> 1.7.3.4
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>>
>



More information about the mesa-dev mailing list