[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