diff options
Diffstat (limited to 'src/gallium')
| -rw-r--r-- | src/gallium/drivers/llvmpipe/lp_rast.c | 17 | ||||
| -rw-r--r-- | src/gallium/drivers/llvmpipe/lp_rast_priv.h | 1 | 
2 files changed, 18 insertions, 0 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_rast.c b/src/gallium/drivers/llvmpipe/lp_rast.c index 07817efd74..82c006d78b 100644 --- a/src/gallium/drivers/llvmpipe/lp_rast.c +++ b/src/gallium/drivers/llvmpipe/lp_rast.c @@ -826,6 +826,9 @@ static PIPE_THREAD_ROUTINE( thread_func, init_data )           debug_printf("thread %d waiting for work\n", task->thread_index);        pipe_semaphore_wait(&task->work_ready); +      if (rast->exit_flag) +         break; +        if (task->thread_index == 0) {           /* thread[0]:            *  - get next scene to rasterize @@ -961,6 +964,20 @@ void lp_rast_destroy( struct lp_rasterizer *rast )  	 align_free(rast->tasks[i].tile.color[cbuf]);     } +   /* Set exit_flag and signal each thread's work_ready semaphore. +    * Each thread will be woken up, notice that the exit_flag is set and +    * break out of its main loop.  The thread will then exit. +    */ +   rast->exit_flag = TRUE; +   for (i = 0; i < rast->num_threads; i++) { +      pipe_semaphore_signal(&rast->tasks[i].work_ready); +   } + +   for (i = 0; i < rast->num_threads; i++) { +      pipe_semaphore_destroy(&rast->tasks[i].work_ready); +      pipe_semaphore_destroy(&rast->tasks[i].work_done); +   } +     /* for synchronizing rasterization threads */     pipe_barrier_destroy( &rast->barrier ); diff --git a/src/gallium/drivers/llvmpipe/lp_rast_priv.h b/src/gallium/drivers/llvmpipe/lp_rast_priv.h index 382e169c1c..abc5a9ad89 100644 --- a/src/gallium/drivers/llvmpipe/lp_rast_priv.h +++ b/src/gallium/drivers/llvmpipe/lp_rast_priv.h @@ -84,6 +84,7 @@ struct lp_rasterizer  {     boolean clipped_tile;     boolean check_for_clipped_tiles; +   boolean exit_flag;     /* Framebuffer stuff      */  | 
