[Mesa-dev] [PATCH 1/2] st/mesa: allow creating buffers of size = 0

Jose Fonseca jfonseca at vmware.com
Mon Nov 14 07:13:33 PST 2011


Is it really necessary to bother pipe drivers with zero size buffers?

It looks like a useless corner case, which will cause all sort of implementations problems (e.g., malloc(0) may return NULL; kernel drivers will likely refuse 0 size buffers), so pipe drivers will need a lot of 

  if (buffer->size == 0) { 
    // don't do something stupid
  } else { 
    // business as usual 
  }

I'd prefer see this be completely handled in the state tracker.

Jose


----- Original Message -----
> Calling glBufferData(size=0) is legal.  Instead of no-oping it, go
> ahead
> and create a gallium buffer of size zero.  This lets us avoid a bunch
> of
> NULL pointer checking elsewhere.  In the case of a zero-sized VBO,
> the
> bounds checking we do later will prevent invalid memory accesses.
> ---
>  src/mesa/state_tracker/st_cb_bufferobjects.c |   22
>  +++++++++-------------
>  1 files changed, 9 insertions(+), 13 deletions(-)
> 
> diff --git a/src/mesa/state_tracker/st_cb_bufferobjects.c
> b/src/mesa/state_tracker/st_cb_bufferobjects.c
> index adac92f..3abf029 100644
> --- a/src/mesa/state_tracker/st_cb_bufferobjects.c
> +++ b/src/mesa/state_tracker/st_cb_bufferobjects.c
> @@ -221,21 +221,17 @@ st_bufferobj_data(struct gl_context *ctx,
>  
>     pipe_resource_reference( &st_obj->buffer, NULL );
>  
> -   if (size != 0) {
> -      st_obj->buffer = pipe_buffer_create(pipe->screen, bind,
> -                                          pipe_usage, size);
> -
> -      if (!st_obj->buffer) {
> -         /* out of memory */
> -         st_obj->Base.Size = 0;
> -         return GL_FALSE;
> -      }
> -
> -      if (data)
> -         pipe_buffer_write(pipe, st_obj->buffer, 0, size, data);
> -      return GL_TRUE;
> +   st_obj->buffer = pipe_buffer_create(pipe->screen, bind,
> pipe_usage, size);
> +
> +   if (!st_obj->buffer) {
> +      /* out of memory */
> +      st_obj->Base.Size = 0;
> +      return GL_FALSE;
>     }
>  
> +   if (data && size > 0)
> +      pipe_buffer_write(pipe, st_obj->buffer, 0, size, data);
> +
>     return GL_TRUE;
>  }
>  
> --
> 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