mesa/glthread: Avoid unnecessary batch reallocation
authorBartosz Tomczyk <bartosz.tomczyk86@gmail.com>
Mon, 3 Apr 2017 19:19:40 +0000 (21:19 +0200)
committerTimothy Arceri <tarceri@itsqueeze.com>
Mon, 3 Apr 2017 23:56:52 +0000 (09:56 +1000)
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/mesa/main/glthread.c

index 3f07c420d47580b90ae180d3802187267ddf4d68..c4d3f4a434917e0a57a9f83381778bb3627775e2 100644 (file)
@@ -53,7 +53,8 @@ glthread_allocate_batch(struct gl_context *ctx)
 }
 
 static void
-glthread_unmarshal_batch(struct gl_context *ctx, struct glthread_batch *batch)
+glthread_unmarshal_batch(struct gl_context *ctx, struct glthread_batch *batch,
+                         const bool release_batch)
 {
    size_t pos = 0;
 
@@ -64,7 +65,10 @@ glthread_unmarshal_batch(struct gl_context *ctx, struct glthread_batch *batch)
 
    assert(pos == batch->used);
 
-   free(batch);
+   if (release_batch)
+      free(batch);
+   else
+      batch->used = 0;
 }
 
 static void *
@@ -103,7 +107,7 @@ glthread_worker(void *data)
       glthread->busy = true;
       pthread_mutex_unlock(&glthread->mutex);
 
-      glthread_unmarshal_batch(ctx, batch);
+      glthread_unmarshal_batch(ctx, batch, true);
 
       pthread_mutex_lock(&glthread->mutex);
       glthread->busy = false;
@@ -214,7 +218,7 @@ _mesa_glthread_flush_batch_locked(struct gl_context *ctx)
     * need to restore it when it returns.
     */
    if (false) {
-      glthread_unmarshal_batch(ctx, batch);
+      glthread_unmarshal_batch(ctx, batch, true);
       _glapi_set_dispatch(ctx->CurrentClientDispatch);
       return;
    }
@@ -269,9 +273,8 @@ _mesa_glthread_finish(struct gl_context *ctx)
    if (!(glthread->batch_queue || glthread->busy)) {
       if (glthread->batch && glthread->batch->used) {
          struct _glapi_table *dispatch = _glapi_get_dispatch();
-         glthread_unmarshal_batch(ctx, glthread->batch);
+         glthread_unmarshal_batch(ctx, glthread->batch, false);
          _glapi_set_dispatch(dispatch);
-         glthread_allocate_batch(ctx);
       }
    } else {
       _mesa_glthread_flush_batch_locked(ctx);