diff options
Diffstat (limited to 'src/gallium')
| -rw-r--r-- | src/gallium/drivers/llvmpipe/lp_fence.c | 73 | ||||
| -rw-r--r-- | src/gallium/drivers/llvmpipe/lp_fence.h | 12 | ||||
| -rw-r--r-- | src/gallium/drivers/llvmpipe/lp_screen.c | 49 | ||||
| -rw-r--r-- | src/gallium/drivers/llvmpipe/lp_setup.c | 2 | 
4 files changed, 79 insertions, 57 deletions
| diff --git a/src/gallium/drivers/llvmpipe/lp_fence.c b/src/gallium/drivers/llvmpipe/lp_fence.c index 1f96dcd81a..3a55e76bc3 100644 --- a/src/gallium/drivers/llvmpipe/lp_fence.c +++ b/src/gallium/drivers/llvmpipe/lp_fence.c @@ -76,58 +76,6 @@ lp_fence_destroy(struct lp_fence *fence)  /** - * For reference counting. - * This is a Gallium API function. - */ -static void -llvmpipe_fence_reference(struct pipe_screen *screen, -                         struct pipe_fence_handle **ptr, -                         struct pipe_fence_handle *fence) -{ -   struct lp_fence **old = (struct lp_fence **) ptr; -   struct lp_fence *f = (struct lp_fence *) fence; - -   lp_fence_reference(old, f); -} - - -/** - * Has the fence been executed/finished? - * This is a Gallium API function. - */ -static int -llvmpipe_fence_signalled(struct pipe_screen *screen, -                         struct pipe_fence_handle *fence, -                         unsigned flag) -{ -   struct lp_fence *f = (struct lp_fence *) fence; - -   return f->count == f->rank; -} - - -/** - * Wait for the fence to finish. - * This is a Gallium API function. - */ -static int -llvmpipe_fence_finish(struct pipe_screen *screen, -                      struct pipe_fence_handle *fence_handle, -                      unsigned flag) -{ -   struct lp_fence *fence = (struct lp_fence *) fence_handle; - -   pipe_mutex_lock(fence->mutex); -   while (fence->count < fence->rank) { -      pipe_condvar_wait(fence->signalled, fence->mutex); -   } -   pipe_mutex_unlock(fence->mutex); - -   return 0; -} - - -/**   * Called by the rendering threads to increment the fence counter.   * When the counter == the rank, the fence is finished.   */ @@ -153,11 +101,24 @@ lp_fence_signal(struct lp_fence *fence)     pipe_mutex_unlock(fence->mutex);  } +boolean +lp_fence_signalled(struct lp_fence *f) +{ +   return f->count == f->rank; +}  void -llvmpipe_init_screen_fence_funcs(struct pipe_screen *screen) +lp_fence_wait(struct lp_fence *f)  { -   screen->fence_reference = llvmpipe_fence_reference; -   screen->fence_signalled = llvmpipe_fence_signalled; -   screen->fence_finish = llvmpipe_fence_finish; +   if (LP_DEBUG & DEBUG_FENCE) +      debug_printf("%s %d\n", __FUNCTION__, f->id); + +   pipe_mutex_lock(f->mutex); +   assert(f->issued); +   while (f->count < f->rank) { +      pipe_condvar_wait(f->signalled, f->mutex); +   } +   pipe_mutex_unlock(f->mutex);  } + + diff --git a/src/gallium/drivers/llvmpipe/lp_fence.h b/src/gallium/drivers/llvmpipe/lp_fence.h index b80af5c654..3c59118780 100644 --- a/src/gallium/drivers/llvmpipe/lp_fence.h +++ b/src/gallium/drivers/llvmpipe/lp_fence.h @@ -46,6 +46,7 @@ struct lp_fence     pipe_mutex mutex;     pipe_condvar signalled; +   boolean issued;     unsigned rank;     unsigned count;  }; @@ -58,6 +59,11 @@ lp_fence_create(unsigned rank);  void  lp_fence_signal(struct lp_fence *fence); +boolean +lp_fence_signalled(struct lp_fence *fence); + +void +lp_fence_wait(struct lp_fence *fence);  void  llvmpipe_init_screen_fence_funcs(struct pipe_screen *screen); @@ -79,5 +85,11 @@ lp_fence_reference(struct lp_fence **ptr,     *ptr = f;  } +static INLINE boolean +lp_fence_issued(const struct lp_fence *fence) +{ +   return fence->issued; +} +  #endif /* LP_FENCE_H */ diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c index 14a156378a..9b7e0d51cd 100644 --- a/src/gallium/drivers/llvmpipe/lp_screen.c +++ b/src/gallium/drivers/llvmpipe/lp_screen.c @@ -317,6 +317,51 @@ llvmpipe_destroy_screen( struct pipe_screen *_screen ) + +/** + * Fence reference counting. + */ +static void +llvmpipe_fence_reference(struct pipe_screen *screen, +                         struct pipe_fence_handle **ptr, +                         struct pipe_fence_handle *fence) +{ +   struct lp_fence **old = (struct lp_fence **) ptr; +   struct lp_fence *f = (struct lp_fence *) fence; + +   lp_fence_reference(old, f); +} + + +/** + * Has the fence been executed/finished? + */ +static int +llvmpipe_fence_signalled(struct pipe_screen *screen, +                         struct pipe_fence_handle *fence, +                         unsigned flag) +{ +   struct lp_fence *f = (struct lp_fence *) fence; +   return lp_fence_signalled(f); +} + + +/** + * Wait for the fence to finish. + */ +static int +llvmpipe_fence_finish(struct pipe_screen *screen, +                      struct pipe_fence_handle *fence_handle, +                      unsigned flag) +{ +   struct lp_fence *f = (struct lp_fence *) fence_handle; + +   lp_fence_wait(f); +   return 0; +} + + +  /**   * Create a new pipe_screen object   * Note: we're not presently subclassing pipe_screen (no llvmpipe_screen). @@ -354,9 +399,11 @@ llvmpipe_create_screen(struct sw_winsys *winsys)     screen->base.context_create = llvmpipe_create_context;     screen->base.flush_frontbuffer = llvmpipe_flush_frontbuffer; +   screen->base.fence_reference = llvmpipe_fence_reference; +   screen->base.fence_signalled = llvmpipe_fence_signalled; +   screen->base.fence_finish = llvmpipe_fence_finish;     llvmpipe_init_screen_resource_funcs(&screen->base); -   llvmpipe_init_screen_fence_funcs(&screen->base);     lp_jit_screen_init(screen); diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c b/src/gallium/drivers/llvmpipe/lp_setup.c index 6eede83bfb..5389de8b63 100644 --- a/src/gallium/drivers/llvmpipe/lp_setup.c +++ b/src/gallium/drivers/llvmpipe/lp_setup.c @@ -288,6 +288,8 @@ lp_setup_flush( struct lp_setup_context *setup,           *fence = lp_setup_fence( setup );        } +      if (setup->scene->fence) +         setup->scene->fence->issued = TRUE;     }     set_scene_state( setup, SETUP_FLUSHED ); | 
