X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fmain%2Fsyncobj.c;h=736f043f90c4fd4925de09750f5f43b0d7e03ed2;hb=bbe2d50b589e0d7b7b63d63814a5271b680164ce;hp=4278827b11d8f96b28c27ade13ac619920d11e09;hpb=dd71fd1dd3518c435fc3d143d80b844d77035cbc;p=mesa.git diff --git a/src/mesa/main/syncobj.c b/src/mesa/main/syncobj.c index 4278827b11d..736f043f90c 100644 --- a/src/mesa/main/syncobj.c +++ b/src/mesa/main/syncobj.c @@ -61,7 +61,6 @@ #include "context.h" #include "macros.h" #include "get.h" -#include "dispatch.h" #include "mtypes.h" #include "util/hash_table.h" #include "util/set.h" @@ -69,11 +68,10 @@ #include "syncobj.h" static struct gl_sync_object * -_mesa_new_sync_object(struct gl_context *ctx, GLenum type) +_mesa_new_sync_object(struct gl_context *ctx) { struct gl_sync_object *s = CALLOC_STRUCT(gl_sync_object); (void) ctx; - (void) type; return s; } @@ -90,7 +88,7 @@ _mesa_delete_sync_object(struct gl_context *ctx, struct gl_sync_object *syncObj) static void _mesa_fence_sync(struct gl_context *ctx, struct gl_sync_object *syncObj, - GLenum condition, GLbitfield flags) + GLenum condition, GLbitfield flags) { (void) ctx; (void) condition; @@ -114,7 +112,7 @@ _mesa_check_sync(struct gl_context *ctx, struct gl_sync_object *syncObj) static void _mesa_wait_sync(struct gl_context *ctx, struct gl_sync_object *syncObj, - GLbitfield flags, GLuint64 timeout) + GLbitfield flags, GLuint64 timeout) { (void) ctx; (void) syncObj; @@ -165,7 +163,6 @@ _mesa_free_sync_data(struct gl_context *ctx) * Check if the given sync object is: * - non-null * - not in sync objects hash table - * - type is GL_SYNC_FENCE * - not marked as deleted * * Returns the internal gl_sync_object pointer if the sync object is valid @@ -179,10 +176,9 @@ struct gl_sync_object * _mesa_get_and_ref_sync(struct gl_context *ctx, GLsync sync, bool incRefCount) { struct gl_sync_object *syncObj = (struct gl_sync_object *) sync; - mtx_lock(&ctx->Shared->Mutex); + simple_mtx_lock(&ctx->Shared->Mutex); if (syncObj != NULL && _mesa_set_search(ctx->Shared->SyncObjects, syncObj) != NULL - && (syncObj->Type == GL_SYNC_FENCE) && !syncObj->DeletePending) { if (incRefCount) { syncObj->RefCount++; @@ -190,7 +186,7 @@ _mesa_get_and_ref_sync(struct gl_context *ctx, GLsync sync, bool incRefCount) } else { syncObj = NULL; } - mtx_unlock(&ctx->Shared->Mutex); + simple_mtx_unlock(&ctx->Shared->Mutex); return syncObj; } @@ -201,17 +197,17 @@ _mesa_unref_sync_object(struct gl_context *ctx, struct gl_sync_object *syncObj, { struct set_entry *entry; - mtx_lock(&ctx->Shared->Mutex); + simple_mtx_lock(&ctx->Shared->Mutex); syncObj->RefCount -= amount; if (syncObj->RefCount == 0) { entry = _mesa_set_search(ctx->Shared->SyncObjects, syncObj); assert (entry != NULL); _mesa_set_remove(ctx->Shared->SyncObjects, entry); - mtx_unlock(&ctx->Shared->Mutex); + simple_mtx_unlock(&ctx->Shared->Mutex); ctx->Driver.DeleteSyncObject(ctx, syncObj); } else { - mtx_unlock(&ctx->Shared->Mutex); + simple_mtx_unlock(&ctx->Shared->Mutex); } } @@ -226,10 +222,9 @@ _mesa_IsSync(GLsync sync) } -void GLAPIENTRY -_mesa_DeleteSync(GLsync sync) +static ALWAYS_INLINE void +delete_sync(struct gl_context *ctx, GLsync sync, bool no_error) { - GET_CURRENT_CONTEXT(ctx); struct gl_sync_object *syncObj; /* From the GL_ARB_sync spec: @@ -243,29 +238,45 @@ _mesa_DeleteSync(GLsync sync) } syncObj = _mesa_get_and_ref_sync(ctx, sync, true); - if (!syncObj) { - _mesa_error(ctx, GL_INVALID_VALUE, "glDeleteSync (not a valid sync object)"); + if (!no_error && !syncObj) { + _mesa_error(ctx, GL_INVALID_VALUE, + "glDeleteSync (not a valid sync object)"); return; } /* If there are no client-waits or server-waits pending on this sync, delete * the underlying object. Note that we double-unref the object, as - * _mesa_get_and_ref_sync above took an extra refcount to make sure the pointer - * is valid for us to manipulate. + * _mesa_get_and_ref_sync above took an extra refcount to make sure the + * pointer is valid for us to manipulate. */ syncObj->DeletePending = GL_TRUE; _mesa_unref_sync_object(ctx, syncObj, 2); } +void GLAPIENTRY +_mesa_DeleteSync_no_error(GLsync sync) +{ + GET_CURRENT_CONTEXT(ctx); + delete_sync(ctx, sync, true); +} + + +void GLAPIENTRY +_mesa_DeleteSync(GLsync sync) +{ + GET_CURRENT_CONTEXT(ctx); + delete_sync(ctx, sync, false); +} + + static GLsync fence_sync(struct gl_context *ctx, GLenum condition, GLbitfield flags) { struct gl_sync_object *syncObj; - syncObj = ctx->Driver.NewSyncObject(ctx, GL_SYNC_FENCE); + syncObj = ctx->Driver.NewSyncObject(ctx); if (syncObj != NULL) { - syncObj->Type = GL_SYNC_FENCE; /* The name is not currently used, and it is never visible to * applications. If sync support is extended to provide support for * NV_fence, this field will be used. We'll also need to add an object @@ -280,9 +291,9 @@ fence_sync(struct gl_context *ctx, GLenum condition, GLbitfield flags) ctx->Driver.FenceSync(ctx, syncObj, condition, flags); - mtx_lock(&ctx->Shared->Mutex); + simple_mtx_lock(&ctx->Shared->Mutex); _mesa_set_add(ctx->Shared->SyncObjects, syncObj); - mtx_unlock(&ctx->Shared->Mutex); + simple_mtx_unlock(&ctx->Shared->Mutex); return (GLsync)syncObj; } @@ -291,6 +302,14 @@ fence_sync(struct gl_context *ctx, GLenum condition, GLbitfield flags) } +GLsync GLAPIENTRY +_mesa_FenceSync_no_error(GLenum condition, GLbitfield flags) +{ + GET_CURRENT_CONTEXT(ctx); + return fence_sync(ctx, condition, flags); +} + + GLsync GLAPIENTRY _mesa_FenceSync(GLenum condition, GLbitfield flags) { @@ -299,13 +318,12 @@ _mesa_FenceSync(GLenum condition, GLbitfield flags) if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE) { _mesa_error(ctx, GL_INVALID_ENUM, "glFenceSync(condition=0x%x)", - condition); + condition); return 0; } if (flags != 0) { - _mesa_error(ctx, GL_INVALID_VALUE, "glFenceSync(flags=0x%x)", - condition); + _mesa_error(ctx, GL_INVALID_VALUE, "glFenceSync(flags=0x%x)", condition); return 0; } @@ -335,7 +353,8 @@ client_wait_sync(struct gl_context *ctx, struct gl_sync_object *syncObj, } else { ctx->Driver.ClientWaitSync(ctx, syncObj, flags, timeout); - ret = syncObj->StatusFlag ? GL_CONDITION_SATISFIED : GL_TIMEOUT_EXPIRED; + ret = syncObj->StatusFlag + ? GL_CONDITION_SATISFIED : GL_TIMEOUT_EXPIRED; } } @@ -369,7 +388,8 @@ _mesa_ClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout) syncObj = _mesa_get_and_ref_sync(ctx, sync, true); if (!syncObj) { - _mesa_error(ctx, GL_INVALID_VALUE, "glClientWaitSync (not a valid sync object)"); + _mesa_error(ctx, GL_INVALID_VALUE, + "glClientWaitSync (not a valid sync object)"); return GL_WAIT_FAILED; } @@ -377,6 +397,25 @@ _mesa_ClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout) } +static void +wait_sync(struct gl_context *ctx, struct gl_sync_object *syncObj, + GLbitfield flags, GLuint64 timeout) +{ + ctx->Driver.ServerWaitSync(ctx, syncObj, flags, timeout); + _mesa_unref_sync_object(ctx, syncObj, 1); +} + + +void GLAPIENTRY +_mesa_WaitSync_no_error(GLsync sync, GLbitfield flags, GLuint64 timeout) +{ + GET_CURRENT_CONTEXT(ctx); + + struct gl_sync_object *syncObj = _mesa_get_and_ref_sync(ctx, sync, true); + wait_sync(ctx, syncObj, flags, timeout); +} + + void GLAPIENTRY _mesa_WaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout) { @@ -396,18 +435,18 @@ _mesa_WaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout) syncObj = _mesa_get_and_ref_sync(ctx, sync, true); if (!syncObj) { - _mesa_error(ctx, GL_INVALID_VALUE, "glWaitSync (not a valid sync object)"); + _mesa_error(ctx, GL_INVALID_VALUE, + "glWaitSync (not a valid sync object)"); return; } - ctx->Driver.ServerWaitSync(ctx, syncObj, flags, timeout); - _mesa_unref_sync_object(ctx, syncObj, 1); + wait_sync(ctx, syncObj, flags, timeout); } void GLAPIENTRY _mesa_GetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, - GLint *values) + GLint *values) { GET_CURRENT_CONTEXT(ctx); struct gl_sync_object *syncObj; @@ -416,13 +455,14 @@ _mesa_GetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, syncObj = _mesa_get_and_ref_sync(ctx, sync, true); if (!syncObj) { - _mesa_error(ctx, GL_INVALID_VALUE, "glGetSynciv (not a valid sync object)"); + _mesa_error(ctx, GL_INVALID_VALUE, + "glGetSynciv (not a valid sync object)"); return; } switch (pname) { case GL_OBJECT_TYPE: - v[0] = syncObj->Type; + v[0] = GL_SYNC_FENCE; size = 1; break;