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:
Marek Olšák 2016-07-15 15:44:29 +02:00
parent 4cdc482283
commit d17b35e671
3 changed files with 13 additions and 2 deletions

View File

@ -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``

View File

@ -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),
};
/**

View File

@ -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)