X-Git-Url: https://git.libre-soc.org/?p=mesa.git;a=blobdiff_plain;f=src%2Fmesa%2Fmain%2Fsyncobj.c;h=23b49c981ae079023d4d98b4dc8c2f70b30e0353;hp=915b7009f78ac6d1f270541ca303485c5d7a6167;hb=HEAD;hpb=c6f81a1df833c2adf1cec735a197fe54d21d435a diff --git a/src/mesa/main/syncobj.c b/src/mesa/main/syncobj.c index 915b7009f78..23b49c981ae 100644 --- a/src/mesa/main/syncobj.c +++ b/src/mesa/main/syncobj.c @@ -57,14 +57,14 @@ #include #include "glheader.h" -#include "imports.h" + #include "context.h" #include "macros.h" #include "get.h" -#include "dispatch.h" #include "mtypes.h" #include "util/hash_table.h" #include "util/set.h" +#include "util/u_memory.h" #include "syncobj.h" @@ -89,7 +89,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; @@ -113,7 +113,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; @@ -177,7 +177,7 @@ 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->DeletePending) { @@ -187,7 +187,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; } @@ -198,17 +198,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); } } @@ -223,10 +223,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: @@ -240,21 +239,38 @@ _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) { @@ -276,9 +292,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; } @@ -303,13 +319,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; } @@ -339,7 +354,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; } } @@ -373,7 +389,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; } @@ -390,6 +407,16 @@ wait_sync(struct gl_context *ctx, struct gl_sync_object *syncObj, } +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) { @@ -409,7 +436,8 @@ _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; } @@ -419,7 +447,7 @@ _mesa_WaitSync(GLsync sync, GLbitfield flags, GLuint64 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; @@ -428,7 +456,8 @@ _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; }