[Mesa-dev] [PATCH] mesa: reduce memory used for short display lists

Brian Paul brian.e.paul at gmail.com
Wed Dec 4 09:00:54 PST 2013


On Sun, Nov 24, 2013 at 9:00 AM, Brian Paul <brian.e.paul at gmail.com> wrote:

> From: Brian Paul <brianp at vmware.com>
>
> Display lists allocate memory in chunks of 256 tokens (1KB) at a time.
> If an app creates many short display lists or uses glXUseXFont() this
> can waste quite a bit of memory.
>
> This patch uses realloc() to trim short lists and reduce the memory
> used.
>
> Also, null/zero-out some list construction fields in _mesa_EndList().
> ---
>  src/mesa/main/dlist.c |   35 +++++++++++++++++++++++++++++++++++
>  1 file changed, 35 insertions(+)
>
> diff --git a/src/mesa/main/dlist.c b/src/mesa/main/dlist.c
> index d1e2035..cb40ff4 100644
> --- a/src/mesa/main/dlist.c
> +++ b/src/mesa/main/dlist.c
> @@ -1067,6 +1067,37 @@ alloc_instruction(struct gl_context *ctx, OpCode
> opcode, GLuint nparams)
>  }
>
>
> +/**
> + * Called by EndList to try to reduce memory used for the list.
> + */
> +static void
> +trim_list(struct gl_context *ctx)
> +{
> +   /* If the list we're ending only has one allocated block of
> nodes/tokens
> +    * and its size isn't a full block size, realloc the block to use less
> +    * memory.  This is important for apps that create many small display
> +    * lists and apps that use glXUseXFont (many lists each containing one
> +    * glBitmap call).
> +    * Note: we currently only trim display lists that allocated one block
> +    * of tokens.  That hits the short list case which is what we're mainly
> +    * concerned with.  Trimming longer lists would involve traversing the
> +    * linked list of blocks.
> +    */
> +   struct gl_dlist_state *list = &ctx->ListState;
> +
> +   if ((list->CurrentList->Head == list->CurrentBlock) &&
> +       (list->CurrentPos < BLOCK_SIZE)) {
> +      /* There's only one block and it's not full, so realloc */
> +      GLuint newSize = list->CurrentPos * sizeof(Node);
> +      list->CurrentList->Head =
> +      list->CurrentBlock = realloc(list->CurrentBlock, newSize);
> +      if (!list->CurrentBlock) {
> +         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glEndList");
> +      }
> +   }
> +}
> +
> +
>
>  /*
>   * Display List compilation functions
> @@ -8242,6 +8273,8 @@ _mesa_EndList(void)
>
>     (void) alloc_instruction(ctx, OPCODE_END_OF_LIST, 0);
>
> +   trim_list(ctx);
> +
>     /* Destroy old list, if any */
>     destroy_list(ctx, ctx->ListState.CurrentList->Name);
>
> @@ -8255,6 +8288,8 @@ _mesa_EndList(void)
>        mesa_print_display_list(ctx->ListState.CurrentList->Name);
>
>     ctx->ListState.CurrentList = NULL;
> +   ctx->ListState.CurrentBlock = NULL;
> +   ctx->ListState.CurrentPos = 0;
>     ctx->ExecuteFlag = GL_TRUE;
>     ctx->CompileFlag = GL_FALSE;
>
> --
> 1.7.9.5
>
>
Ping.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20131204/b10620f8/attachment.html>


More information about the mesa-dev mailing list