[Mesa-dev] [PATCH 05/18] i965: Reuse our VBO for streaming fast-clear vertices

Martin Peres martin.peres at linux.intel.com
Mon Jul 6 07:31:52 PDT 2015


On 06/07/15 13:33, Chris Wilson wrote:
> Rather than allocating a fresh page every time we clear a buffer, keep
> that page around between invocations by tracking the last used offset
> and only allocating a fresh page when we wrap.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

Reviewed-by: Martin Peres <martin.peres at linux.intel.com>

> ---
>   src/mesa/drivers/dri/i965/brw_meta_fast_clear.c | 17 ++++++++++++++---
>   1 file changed, 14 insertions(+), 3 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_meta_fast_clear.c b/src/mesa/drivers/dri/i965/brw_meta_fast_clear.c
> index a571a74..ffd1e3b 100644
> --- a/src/mesa/drivers/dri/i965/brw_meta_fast_clear.c
> +++ b/src/mesa/drivers/dri/i965/brw_meta_fast_clear.c
> @@ -55,6 +55,7 @@
>   struct brw_fast_clear_state {
>      GLuint vao;
>      GLuint vbo;
> +   GLuint vbo_offset;
>      GLuint shader_prog;
>      GLint color_location;
>   };
> @@ -83,6 +84,8 @@ brw_fast_clear_init(struct brw_context *brw)
>      _mesa_VertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);
>      _mesa_EnableVertexAttribArray(0);
>   
> +   clear->vbo_offset = 4096; /* Force an allocation on first use */
> +
>      return true;
>   }
>   
> @@ -166,7 +169,8 @@ struct rect {
>   static void
>   brw_draw_rectlist(struct gl_context *ctx, struct rect *rect, int num_instances)
>   {
> -   int start = 0, count = 3;
> +   struct brw_fast_clear_state *clear = brw_context(ctx)->fast_clear_state;
> +   int start, count = 3, offset;
>      struct _mesa_prim prim;
>      float verts[6];
>   
> @@ -178,8 +182,15 @@ brw_draw_rectlist(struct gl_context *ctx, struct rect *rect, int num_instances)
>      verts[5] = rect->y0;
>   
>      /* upload new vertex data */
> -   _mesa_BufferData(GL_ARRAY_BUFFER_ARB, sizeof(verts), verts,
> -                    GL_DYNAMIC_DRAW_ARB);
> +   offset = clear->vbo_offset;
> +   clear->vbo_offset += sizeof(verts);
> +   if (clear->vbo_offset > 4096) {
> +      _mesa_BufferData(GL_ARRAY_BUFFER_ARB, 4096, NULL, GL_STREAM_DRAW_ARB);
> +      offset = 0;
> +      clear->vbo_offset = sizeof(verts);
> +   }
> +   _mesa_BufferSubData(GL_ARRAY_BUFFER_ARB, offset, sizeof(verts), verts);
> +   start = offset / (2*sizeof(float));
>   
>      if (ctx->NewState)
>         _mesa_update_state(ctx);



More information about the mesa-dev mailing list