llvmpipe: fix wierd performance regression in isosurf
authorKeith Whitwell <keithw@vmware.com>
Sun, 12 Sep 2010 13:29:00 +0000 (14:29 +0100)
committerKeith Whitwell <keithw@vmware.com>
Sun, 12 Sep 2010 13:58:43 +0000 (14:58 +0100)
I really don't understand the mechanism behind this, but it
seems like the way data blocks for a scene are malloced, and in
particular whether we treat them as stack or a queue, and whether
we retain the most recently allocated or least recently allocated
has a real affect (~5%) on isosurf framerates...

This is probably specific to my distro or even just my machine,
but none the less, it's nicer not to see the framerates go in the
wrong direction.

src/gallium/drivers/llvmpipe/lp_scene.c

index f6c6941507177ddd567137fcf6f919f67a3cfa90..c0732e4ab7819859a6a964d72195322421d58770 100644 (file)
@@ -58,7 +58,9 @@ lp_scene_create( struct pipe_context *pipe )
       return NULL;
 
    scene->pipe = pipe;
-   scene->data.head = &scene->data.first;
+
+   scene->data.head =
+      CALLOC_STRUCT(data_block);
 
    pipe_mutex_init(scene->mutex);
 
@@ -73,7 +75,8 @@ void
 lp_scene_destroy(struct lp_scene *scene)
 {
    pipe_mutex_destroy(scene->mutex);
-   assert(scene->data.head == &scene->data.first);
+   assert(scene->data.head->next == NULL);
+   FREE(scene->data.head);
    FREE(scene);
 }
 
@@ -240,14 +243,13 @@ lp_scene_end_rasterization(struct lp_scene *scene )
       struct data_block_list *list = &scene->data;
       struct data_block *block, *tmp;
 
-      for (block = list->head; block; block = tmp) {
+      for (block = list->head->next; block; block = tmp) {
          tmp = block->next;
-         if (block != &list->first)
-            FREE(block);
+        FREE(block);
       }
 
-      list->head = &list->first;
       list->head->next = NULL;
+      list->head->used = 0;
    }
 
    lp_fence_reference(&scene->fence, NULL);