mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 09:38:07 +02:00
llvmpipe: move some fence functions into lp_screen.c
This commit is contained in:
parent
1e926fe42a
commit
5a45e53df4
4 changed files with 79 additions and 57 deletions
|
|
@ -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 );
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue