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

Regis Perdreau regis.perdreau at gmail.com
Wed Dec 4 14:17:42 PST 2013


unsubscribe

2013/12/4 Ian Romanick <idr at freedesktop.org>:
> On 11/24/2013 08:00 AM, Brian Paul 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().
>
> Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
>
>> ---
>>  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;
>>
>>
>
> _______________________________________________
> 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