gallium: add PIPE_FLUSH_DEFERRED
There are 2 uses: - Asynchronous flushing for multithreaded drivers. - Return a fence without flushing (mid-command-buffer fence). The driver can defer flushing until fence_finish is called. This is required to make Bioshock Infinite faster, which creates 1000 fences (flushes) per frame. Reviewed-by: Edward O'Callaghan <funfunctor@folklore1984.net> Reviewed-by: Rob Clark <robdclark@gmail.com>
This commit is contained in:
parent
4cdc482283
commit
d17b35e671
|
@ -463,6 +463,16 @@ Flushing
|
|||
|
||||
``flush``
|
||||
|
||||
PIPE_FLUSH_END_OF_FRAME: Whether the flush marks the end of frame.
|
||||
|
||||
PIPE_FLUSH_DEFERRED: It is not required to flush right away, but it is required
|
||||
to return a valid fence. The behavior of fence_finish or any other call isn't
|
||||
changed. The only side effect can be that fence_finish will wait a little
|
||||
longer. No guidance is given as to how drivers should implement fence_finish
|
||||
with deferred flushes. If some drivers can't do deferred flushes safely, they
|
||||
should just ignore the flag.
|
||||
|
||||
|
||||
|
||||
``flush_resource``
|
||||
|
||||
|
|
|
@ -348,7 +348,8 @@ enum pipe_transfer_usage
|
|||
*/
|
||||
enum pipe_flush_flags
|
||||
{
|
||||
PIPE_FLUSH_END_OF_FRAME = (1 << 0)
|
||||
PIPE_FLUSH_END_OF_FRAME = (1 << 0),
|
||||
PIPE_FLUSH_DEFERRED = (1 << 1),
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -73,7 +73,7 @@ static void st_fence_sync(struct gl_context *ctx, struct gl_sync_object *obj,
|
|||
assert(condition == GL_SYNC_GPU_COMMANDS_COMPLETE && flags == 0);
|
||||
assert(so->fence == NULL);
|
||||
|
||||
pipe->flush(pipe, &so->fence, 0);
|
||||
pipe->flush(pipe, &so->fence, PIPE_FLUSH_DEFERRED);
|
||||
}
|
||||
|
||||
static void st_check_sync(struct gl_context *ctx, struct gl_sync_object *obj)
|
||||
|
|
Loading…
Reference in New Issue