[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