void GLAPIENTRY _mesa_WaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout) { GET_CURRENT_CONTEXT(ctx); struct gl_sync_object *const syncObj = (struct gl_sync_object *) sync; ASSERT_OUTSIDE_BEGIN_END(ctx); if (!_mesa_validate_sync(syncObj)) { _mesa_error(ctx, GL_INVALID_OPERATION, "glWaitSync"); return; } if (flags != 0) { _mesa_error(ctx, GL_INVALID_ENUM, "glWaitSync(flags=0x%x)", flags); return; } /* From the GL_ARB_sync spec: * * If the value of <timeout> is zero, then WaitSync does nothing. */ if (timeout == 0) { return; } ctx->Driver.ServerWaitSync(ctx, syncObj, flags, timeout); }
void GLAPIENTRY _mesa_GetObjectPtrLabel(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label) { GET_CURRENT_CONTEXT(ctx); struct gl_sync_object *const syncObj = (struct gl_sync_object *) ptr; const char *callerstr; char **labelPtr; if (_mesa_is_desktop_gl(ctx)) callerstr = "glGetObjectPtrLabel"; else callerstr = "glGetObjectPtrLabelKHR"; if (bufSize < 0) { _mesa_error(ctx, GL_INVALID_VALUE, "%s(bufSize = %d)", callerstr, bufSize); return; } if (!_mesa_validate_sync(ctx, syncObj)) { _mesa_error(ctx, GL_INVALID_VALUE, "%s (not a valid sync object)", callerstr); return; } labelPtr = &syncObj->Label; copy_label(*labelPtr, label, length, bufSize); }
void GLAPIENTRY _mesa_DeleteSync(GLsync sync) { GET_CURRENT_CONTEXT(ctx); struct gl_sync_object *const syncObj = (struct gl_sync_object *) sync; ASSERT_OUTSIDE_BEGIN_END(ctx); /* From the GL_ARB_sync spec: * * DeleteSync will silently ignore a <sync> value of zero. An * INVALID_VALUE error is generated if <sync> is neither zero nor the * name of a sync object. */ if (sync == 0) { return; } if (!_mesa_validate_sync(syncObj)) { _mesa_error(ctx, GL_INVALID_OPERATION, "glDeleteSync"); return; } /* If there are no client-waits or server-waits pending on this sync, delete * the underlying object. */ syncObj->DeletePending = GL_TRUE; _mesa_unref_sync_object(ctx, syncObj); }
void GLAPIENTRY _mesa_GetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values) { GET_CURRENT_CONTEXT(ctx); struct gl_sync_object *const syncObj = (struct gl_sync_object *) sync; GLsizei size = 0; GLint v[1]; ASSERT_OUTSIDE_BEGIN_END(ctx); if (!_mesa_validate_sync(syncObj)) { _mesa_error(ctx, GL_INVALID_OPERATION, "glGetSynciv"); return; } switch (pname) { case GL_OBJECT_TYPE: v[0] = syncObj->Type; size = 1; break; case GL_SYNC_CONDITION: v[0] = syncObj->SyncCondition; size = 1; break; case GL_SYNC_STATUS: /* Update the state of the sync by dipping into the driver. Note that * this call won't block. It just updates state in the common object * data from the current driver state. */ ctx->Driver.CheckSync(ctx, syncObj); v[0] = (syncObj->StatusFlag) ? GL_SIGNALED : GL_UNSIGNALED; size = 1; break; case GL_SYNC_FLAGS: v[0] = syncObj->Flags; size = 1; break; default: _mesa_error(ctx, GL_INVALID_ENUM, "glGetSynciv(pname=0x%x)\n", pname); return; } if (size > 0) { const GLsizei copy_count = MIN2(size, bufSize); memcpy(values, v, sizeof(GLint) * copy_count); } if (length != NULL) { *length = size; } }
GLboolean GLAPIENTRY _mesa_IsSync(GLsync sync) { GET_CURRENT_CONTEXT(ctx); struct gl_sync_object *const syncObj = (struct gl_sync_object *) sync; ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); return _mesa_validate_sync(syncObj) ? GL_TRUE : GL_FALSE; }
void GLAPIENTRY _mesa_ObjectPtrLabel(const void *ptr, GLsizei length, const GLchar *label) { GET_CURRENT_CONTEXT(ctx); char **labelPtr; struct gl_sync_object *const syncObj = (struct gl_sync_object *) ptr; if (!_mesa_validate_sync(ctx, syncObj)) { _mesa_error(ctx, GL_INVALID_VALUE, "glObjectPtrLabel (not a valid sync object)"); return; } labelPtr = &syncObj->Label; set_label(ctx, labelPtr, label, length, "glObjectPtrLabel"); }
GLenum GLAPIENTRY _mesa_ClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout) { GET_CURRENT_CONTEXT(ctx); struct gl_sync_object *const syncObj = (struct gl_sync_object *) sync; GLenum ret; ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_WAIT_FAILED); if (!_mesa_validate_sync(syncObj)) { _mesa_error(ctx, GL_INVALID_OPERATION, "glClientWaitSync"); return GL_WAIT_FAILED; } if ((flags & ~GL_SYNC_FLUSH_COMMANDS_BIT) != 0) { _mesa_error(ctx, GL_INVALID_ENUM, "glClientWaitSync(flags=0x%x)", flags); return GL_WAIT_FAILED; } _mesa_ref_sync_object(ctx, syncObj); /* From the GL_ARB_sync spec: * * ClientWaitSync returns one of four status values. A return value of * ALREADY_SIGNALED indicates that <sync> was signaled at the time * ClientWaitSync was called. ALREADY_SIGNALED will always be returned * if <sync> was signaled, even if the value of <timeout> is zero. */ ctx->Driver.CheckSync(ctx, syncObj); if (syncObj->StatusFlag) { ret = GL_ALREADY_SIGNALED; } else { if (timeout == 0) { ret = GL_TIMEOUT_EXPIRED; } else { ctx->Driver.ClientWaitSync(ctx, syncObj, flags, timeout); ret = syncObj->StatusFlag ? GL_CONDITION_SATISFIED : GL_TIMEOUT_EXPIRED; } } _mesa_unref_sync_object(ctx, syncObj); return ret; }
void GLAPIENTRY _mesa_GetObjectPtrLabel(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label) { GET_CURRENT_CONTEXT(ctx); char **labelPtr; struct gl_sync_object *const syncObj = (struct gl_sync_object *) ptr; if (bufSize < 0) { _mesa_error(ctx, GL_INVALID_VALUE, "glGetObjectPtrLabel(bufSize = %d)", bufSize); return; } if (!_mesa_validate_sync(ctx, syncObj)) { _mesa_error(ctx, GL_INVALID_VALUE, "glGetObjectPtrLabel (not a valid sync object)"); return; } labelPtr = &syncObj->Label; copy_label(*labelPtr, label, length, bufSize); }
void GLAPIENTRY _mesa_WaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout) { GET_CURRENT_CONTEXT(ctx); struct gl_sync_object *const syncObj = (struct gl_sync_object *) sync; if (!_mesa_validate_sync(ctx, syncObj)) { _mesa_error(ctx, GL_INVALID_VALUE, "glWaitSync (not a valid sync object)"); return; } if (flags != 0) { _mesa_error(ctx, GL_INVALID_VALUE, "glWaitSync(flags=0x%x)", flags); return; } if (timeout != GL_TIMEOUT_IGNORED) { _mesa_error(ctx, GL_INVALID_VALUE, "glWaitSync(timeout=0x%" PRIx64 ")", (uint64_t) timeout); return; } ctx->Driver.ServerWaitSync(ctx, syncObj, flags, timeout); }