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``
|
``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``
|
``flush_resource``
|
||||||
|
|
||||||
|
|
|
@ -348,7 +348,8 @@ enum pipe_transfer_usage
|
||||||
*/
|
*/
|
||||||
enum pipe_flush_flags
|
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(condition == GL_SYNC_GPU_COMMANDS_COMPLETE && flags == 0);
|
||||||
assert(so->fence == NULL);
|
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)
|
static void st_check_sync(struct gl_context *ctx, struct gl_sync_object *obj)
|
||||||
|
|
Loading…
Reference in New Issue