From: Eric Anholt Date: Wed, 20 Feb 2013 00:46:41 +0000 (-0800) Subject: mesa: Reduce the memory usage for reg alloc with many graph nodes (part 1) X-Git-Tag: android-x86-4.4-r1~968 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=6aa3afbfd6b737350351e9ea22ba9de1accda52d;p=android-x86%2Fexternal-mesa.git mesa: Reduce the memory usage for reg alloc with many graph nodes (part 1) We were allocating an adjacency_list entry for every possible interference that could get created, but that usually doesn't happen. We can save a lot of memory by resizing the array on demand. Reviewed-by: Kenneth Graunke --- diff --git a/src/mesa/program/register_allocate.c b/src/mesa/program/register_allocate.c index 88793dbdc1e..5862c78661a 100644 --- a/src/mesa/program/register_allocate.c +++ b/src/mesa/program/register_allocate.c @@ -120,6 +120,7 @@ struct ra_node { */ GLboolean *adjacency; unsigned int *adjacency_list; + unsigned int adjacency_list_size; unsigned int adjacency_count; /** @} */ @@ -307,6 +308,15 @@ static void ra_add_node_adjacency(struct ra_graph *g, unsigned int n1, unsigned int n2) { g->nodes[n1].adjacency[n2] = GL_TRUE; + + if (g->nodes[n1].adjacency_count >= + g->nodes[n1].adjacency_list_size) { + g->nodes[n1].adjacency_list_size *= 2; + g->nodes[n1].adjacency_list = reralloc(g, g->nodes[n1].adjacency_list, + unsigned int, + g->nodes[n1].adjacency_list_size); + } + g->nodes[n1].adjacency_list[g->nodes[n1].adjacency_count] = n2; g->nodes[n1].adjacency_count++; } @@ -326,7 +336,9 @@ ra_alloc_interference_graph(struct ra_regs *regs, unsigned int count) for (i = 0; i < count; i++) { g->nodes[i].adjacency = rzalloc_array(g, GLboolean, count); - g->nodes[i].adjacency_list = ralloc_array(g, unsigned int, count); + g->nodes[i].adjacency_list_size = 4; + g->nodes[i].adjacency_list = + ralloc_array(g, unsigned int, g->nodes[i].adjacency_list_size); g->nodes[i].adjacency_count = 0; ra_add_node_adjacency(g, i, i); g->nodes[i].reg = NO_REG;