[Mesa-dev] [RFC PATCH 1/3] gallium: decrease the size of pipe_vertex_buffer - 24 -> 16 bytes

Brian Paul brianp at vmware.com
Wed Apr 12 03:59:35 UTC 2017


On 04/11/2017 02:15 PM, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> New interface:
>
> union pipe_buffer_binding {
>     struct pipe_resource *buffer;  /**< the actual buffer */
>     const void *user_buffer;  /**< pointer to a user buffer */
> };
>
> struct pipe_vertex_buffer
> {
>     uint16_t stride;    /**< stride to same attrib in next vertex, in bytes */
>     bool is_user_buffer;
>     unsigned buffer_offset;  /**< offset to start of data in buffer, in bytes */
>     union pipe_buffer_binding u;
> };
> ---
>   src/gallium/include/pipe/p_state.h | 11 ++++++++---
>   1 file changed, 8 insertions(+), 3 deletions(-)
>
> diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h
> index ce9ca34..9576f18 100644
> --- a/src/gallium/include/pipe/p_state.h
> +++ b/src/gallium/include/pipe/p_state.h
> @@ -534,6 +534,11 @@ struct pipe_transfer
>   };
>
>
> +union pipe_buffer_binding {
> +   struct pipe_resource *buffer;  /**< the actual buffer */
> +   const void *user_buffer;  /**< pointer to a user buffer */
> +};
> +
>
>   /**
>    * A vertex buffer.  Typically, all the vertex data/attributes for
> @@ -542,10 +547,10 @@ struct pipe_transfer
>    */
>   struct pipe_vertex_buffer
>   {
> -   unsigned stride;    /**< stride to same attrib in next vertex, in bytes */
> +   uint16_t stride;    /**< stride to same attrib in next vertex, in bytes */
> +   bool is_user_buffer;
>      unsigned buffer_offset;  /**< offset to start of data in buffer, in bytes */
> -   struct pipe_resource *buffer;  /**< the actual buffer */
> -   const void *user_buffer;  /**< pointer to a user buffer if buffer == NULL */
> +   union pipe_buffer_binding u;
>   };

Why have the separate pipe_buffer_binding union at all?  Do you 
anticipate it being needed elsewhere in Gallium?

How about something like this:

struct pipe_vertex_buffer
{
    uint16_t stride;
    bool is_user_buffer;
    ...
    union {
       struct pipe_resource *resource;
       const void *user;
    } buffer;
};

Similarly in patch 3:

struct pipe_draw_info
{
    ...
    union {
       struct pipe_resource *resource;
       const void *user;
    } index;
};

If you really want the separate union type, can I suggest calling it 
"pipe_buffer_union" instead?  I don't know what "binding" has to do with it.

-Brian



More information about the mesa-dev mailing list