diff options
author | Andres Rodriguez <[email protected]> | 2017-10-18 15:11:27 -0400 |
---|---|---|
committer | Andres Rodriguez <[email protected]> | 2018-01-30 15:13:49 -0500 |
commit | 29b9bd0539ed21805228bdd0933e543eec16c670 (patch) | |
tree | 626520845aa591ab98eb2c353121a00399e32044 /src/mesa/state_tracker | |
parent | 89b52891fd37293e596c75f49fb5202d83155677 (diff) |
mesa/st: add support for semaphore object signal/wait v4
Bits to implement ServerWaitSemaphoreObject/ServerSignalSemaphoreObject
v2:
- corresponding changes for gallium fence->semaphore rename
- flushing moved to mesa/main
v3: s/semaphore/fence for pipe objects
v4: add bitmap flushing
Signed-off-by: Andres Rodriguez <[email protected]>
Reviewed-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src/mesa/state_tracker')
-rw-r--r-- | src/mesa/state_tracker/st_cb_semaphoreobjects.c | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/src/mesa/state_tracker/st_cb_semaphoreobjects.c b/src/mesa/state_tracker/st_cb_semaphoreobjects.c index 0661e65eff8..4a3faf57538 100644 --- a/src/mesa/state_tracker/st_cb_semaphoreobjects.c +++ b/src/mesa/state_tracker/st_cb_semaphoreobjects.c @@ -23,10 +23,14 @@ #include "main/imports.h" #include "main/mtypes.h" +#include "main/context.h" #include "main/externalobjects.h" #include "st_context.h" +#include "st_texture.h" +#include "st_cb_bitmap.h" +#include "st_cb_bufferobjects.h" #include "st_cb_semaphoreobjects.h" #include "state_tracker/drm_driver.h" @@ -69,10 +73,95 @@ st_import_semaphoreobj_fd(struct gl_context *ctx, #endif } +static void +st_server_wait_semaphore(struct gl_context *ctx, + struct gl_semaphore_object *semObj, + GLuint numBufferBarriers, + struct gl_buffer_object **bufObjs, + GLuint numTextureBarriers, + struct gl_texture_object **texObjs, + const GLenum *srcLayouts) +{ + struct st_semaphore_object *st_obj = st_semaphore_object(semObj); + struct st_context *st = st_context(ctx); + struct pipe_context *pipe = st->pipe; + struct st_buffer_object *bufObj; + struct st_texture_object *texObj; + + /* The driver is allowed to flush during fence_server_sync, be prepared */ + st_flush_bitmap_cache(st); + pipe->fence_server_sync(pipe, st_obj->fence); + + /** + * According to the EXT_external_objects spec, the memory operations must + * follow the wait. This is to make sure the flush is executed after the + * other party is done modifying the memory. + * + * Relevant excerpt from section "4.2.3 Waiting for Semaphores": + * + * Following completion of the semaphore wait operation, memory will also be + * made visible in the specified buffer and texture objects. + * + */ + for (unsigned i = 0; i < numBufferBarriers; i++) { + if (!bufObjs[i]) + continue; + + bufObj = st_buffer_object(bufObjs[i]); + pipe->flush_resource(pipe, bufObj->buffer); + } + + for (unsigned i = 0; i < numTextureBarriers; i++) { + if (!texObjs[i]) + continue; + + texObj = st_texture_object(texObjs[i]); + pipe->flush_resource(pipe, texObj->pt); + } +} + +static void +st_server_signal_semaphore(struct gl_context *ctx, + struct gl_semaphore_object *semObj, + GLuint numBufferBarriers, + struct gl_buffer_object **bufObjs, + GLuint numTextureBarriers, + struct gl_texture_object **texObjs, + const GLenum *dstLayouts) +{ + struct st_semaphore_object *st_obj = st_semaphore_object(semObj); + struct st_context *st = st_context(ctx); + struct pipe_context *pipe = st->pipe; + struct st_buffer_object *bufObj; + struct st_texture_object *texObj; + + for (unsigned i = 0; i < numBufferBarriers; i++) { + if (!bufObjs[i]) + continue; + + bufObj = st_buffer_object(bufObjs[i]); + pipe->flush_resource(pipe, bufObj->buffer); + } + + for (unsigned i = 0; i < numTextureBarriers; i++) { + if (!texObjs[i]) + continue; + + texObj = st_texture_object(texObjs[i]); + pipe->flush_resource(pipe, texObj->pt); + } + + /* The driver is allowed to flush during fence_server_signal, be prepared */ + st_flush_bitmap_cache(st); + pipe->fence_server_signal(pipe, st_obj->fence); +} + void st_init_semaphoreobject_functions(struct dd_function_table *functions) { functions->NewSemaphoreObject = st_semaphoreobj_alloc; functions->DeleteSemaphoreObject = st_semaphoreobj_free; functions->ImportSemaphoreFd = st_import_semaphoreobj_fd; + functions->ServerWaitSemaphoreObject = st_server_wait_semaphore; + functions->ServerSignalSemaphoreObject = st_server_signal_semaphore; } |