Commit 5a45e53d authored by Keith Whitwell's avatar Keith Whitwell

llvmpipe: move some fence functions into lp_screen.c

parent 1e926fe4
......@@ -75,58 +75,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);
}
......@@ -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 */
......@@ -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);
......
......@@ -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 );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment