1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright © 2009 Intel Corporation 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the next 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * paragraph) shall be included in all copies or substantial portions of the 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software. 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DEALINGS IN THE SOFTWARE. 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file syncobj.c 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Sync object management. 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unlike textures and other objects that are shared between contexts, sync 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * objects are not bound to the context. As a result, the reference counting 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and delete behavior of sync objects is slightly different. References to 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * sync objects are added: 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - By \c glFencSynce. This sets the initial reference count to 1. 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - At the start of \c glClientWaitSync. The reference is held for the 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * duration of the wait call. 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * References are removed: 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - By \c glDeleteSync. 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - At the end of \c glClientWaitSync. 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Additionally, drivers may call \c _mesa_ref_sync_object and 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \c _mesa_unref_sync_object as needed to implement \c ServerWaitSync. 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * As with shader objects, sync object names become invalid as soon as 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \c glDeleteSync is called. For this reason \c glDeleteSync sets the 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \c DeletePending flag. All functions validate object handles by testing 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * this flag. 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Only \c GL_ARB_sync objects are shared between contexts. If support is ever 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * added for either \c GL_NV_fence or \c GL_APPLE_fence different semantics 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * will need to be implemented. 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \author Ian Romanick <ian.d.romanick@intel.com> 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glheader.h" 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "imports.h" 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "context.h" 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "macros.h" 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mfeatures.h" 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "get.h" 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "dispatch.h" 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mtypes.h" 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_ARB_sync 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "syncobj.h" 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct gl_sync_object * 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_new_sync_object(struct gl_context *ctx, GLenum type) 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_sync_object *s = MALLOC_STRUCT(gl_sync_object); 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) ctx; 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) type; 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return s; 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_delete_sync_object(struct gl_context *ctx, struct gl_sync_object *syncObj) 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) ctx; 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(syncObj); 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_fence_sync(struct gl_context *ctx, struct gl_sync_object *syncObj, 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum condition, GLbitfield flags) 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) ctx; 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) condition; 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) flags; 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org syncObj->StatusFlag = 1; 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_check_sync(struct gl_context *ctx, struct gl_sync_object *syncObj) 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) ctx; 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) syncObj; 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* No-op for software rendering. Hardware drivers will need to determine 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * whether the state of the sync object has changed. 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_wait_sync(struct gl_context *ctx, struct gl_sync_object *syncObj, 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbitfield flags, GLuint64 timeout) 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) ctx; 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) syncObj; 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) flags; 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) timeout; 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* No-op for software rendering. Hardware drivers will need to wait until 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the state of the sync object changes or the timeout expires. 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_init_sync_object_functions(struct dd_function_table *driver) 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org driver->NewSyncObject = _mesa_new_sync_object; 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org driver->FenceSync = _mesa_fence_sync; 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org driver->DeleteSyncObject = _mesa_delete_sync_object; 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org driver->CheckSync = _mesa_check_sync; 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Use the same no-op wait function for both. 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org driver->ClientWaitSync = _mesa_wait_sync; 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org driver->ServerWaitSync = _mesa_wait_sync; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_init_sync_dispatch(struct _glapi_table *disp) 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_IsSync(disp, _mesa_IsSync); 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_DeleteSync(disp, _mesa_DeleteSync); 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_FenceSync(disp, _mesa_FenceSync); 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_ClientWaitSync(disp, _mesa_ClientWaitSync); 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_WaitSync(disp, _mesa_WaitSync); 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_GetInteger64v(disp, _mesa_GetInteger64v); 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_GetSynciv(disp, _mesa_GetSynciv); 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Allocate/init the context state related to sync objects. 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_init_sync(struct gl_context *ctx) 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) ctx; 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Free the context state related to sync objects. 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_free_sync_data(struct gl_context *ctx) 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) ctx; 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_validate_sync(struct gl_sync_object *syncObj) 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (syncObj != NULL) 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && (syncObj->Type == GL_SYNC_FENCE) 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && !syncObj->DeletePending; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_ref_sync_object(struct gl_context *ctx, struct gl_sync_object *syncObj) 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _glthread_LOCK_MUTEX(ctx->Shared->Mutex); 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org syncObj->RefCount++; 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex); 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_unref_sync_object(struct gl_context *ctx, struct gl_sync_object *syncObj) 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _glthread_LOCK_MUTEX(ctx->Shared->Mutex); 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org syncObj->RefCount--; 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (syncObj->RefCount == 0) { 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org remove_from_list(& syncObj->link); 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex); 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.DeleteSyncObject(ctx, syncObj); 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex); 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean GLAPIENTRY 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_IsSync(GLsync sync) 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_sync_object *const syncObj = (struct gl_sync_object *) sync; 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _mesa_validate_sync(syncObj) ? GL_TRUE : GL_FALSE; 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_DeleteSync(GLsync sync) 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_sync_object *const syncObj = (struct gl_sync_object *) sync; 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* From the GL_ARB_sync spec: 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DeleteSync will silently ignore a <sync> value of zero. An 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * INVALID_VALUE error is generated if <sync> is neither zero nor the 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * name of a sync object. 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sync == 0) { 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_mesa_validate_sync(syncObj)) { 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "glDeleteSync"); 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If there are no client-waits or server-waits pending on this sync, delete 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the underlying object. 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org syncObj->DeletePending = GL_TRUE; 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unref_sync_object(ctx, syncObj); 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLsync GLAPIENTRY 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_FenceSync(GLenum condition, GLbitfield flags) 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_sync_object *syncObj; 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, 0); 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE) { 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glFenceSync(condition=0x%x)", 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org condition); 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (flags != 0) { 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glFenceSync(flags=0x%x)", 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org condition); 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org syncObj = ctx->Driver.NewSyncObject(ctx, GL_SYNC_FENCE); 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (syncObj != NULL) { 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org syncObj->Type = GL_SYNC_FENCE; 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The name is not currently used, and it is never visible to 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * applications. If sync support is extended to provide support for 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * NV_fence, this field will be used. We'll also need to add an object 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ID hashtable. 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org syncObj->Name = 1; 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org syncObj->RefCount = 1; 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org syncObj->DeletePending = GL_FALSE; 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org syncObj->SyncCondition = condition; 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org syncObj->Flags = flags; 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org syncObj->StatusFlag = 0; 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.FenceSync(ctx, syncObj, condition, flags); 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _glthread_LOCK_MUTEX(ctx->Shared->Mutex); 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insert_at_tail(& ctx->Shared->SyncObjects, & syncObj->link); 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex); 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (GLsync) syncObj; 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLenum GLAPIENTRY 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_ClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout) 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_sync_object *const syncObj = (struct gl_sync_object *) sync; 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum ret; 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_WAIT_FAILED); 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_mesa_validate_sync(syncObj)) { 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "glClientWaitSync"); 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_WAIT_FAILED; 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((flags & ~GL_SYNC_FLUSH_COMMANDS_BIT) != 0) { 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glClientWaitSync(flags=0x%x)", flags); 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_WAIT_FAILED; 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_ref_sync_object(ctx, syncObj); 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* From the GL_ARB_sync spec: 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ClientWaitSync returns one of four status values. A return value of 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ALREADY_SIGNALED indicates that <sync> was signaled at the time 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ClientWaitSync was called. ALREADY_SIGNALED will always be returned 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * if <sync> was signaled, even if the value of <timeout> is zero. 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.CheckSync(ctx, syncObj); 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (syncObj->StatusFlag) { 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = GL_ALREADY_SIGNALED; 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (timeout == 0) { 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = GL_TIMEOUT_EXPIRED; 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.ClientWaitSync(ctx, syncObj, flags, timeout); 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = syncObj->StatusFlag ? GL_CONDITION_SATISFIED : GL_TIMEOUT_EXPIRED; 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unref_sync_object(ctx, syncObj); 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ret; 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_WaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout) 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_sync_object *const syncObj = (struct gl_sync_object *) sync; 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_mesa_validate_sync(syncObj)) { 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "glWaitSync"); 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (flags != 0) { 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glWaitSync(flags=0x%x)", flags); 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* From the GL_ARB_sync spec: 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If the value of <timeout> is zero, then WaitSync does nothing. 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (timeout == 0) { 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.ServerWaitSync(ctx, syncObj, flags, timeout); 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *values) 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_sync_object *const syncObj = (struct gl_sync_object *) sync; 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei size = 0; 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint v[1]; 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_mesa_validate_sync(syncObj)) { 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "glGetSynciv"); 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (pname) { 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OBJECT_TYPE: 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v[0] = syncObj->Type; 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = 1; 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SYNC_CONDITION: 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v[0] = syncObj->SyncCondition; 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = 1; 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SYNC_STATUS: 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Update the state of the sync by dipping into the driver. Note that 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * this call won't block. It just updates state in the common object 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * data from the current driver state. 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.CheckSync(ctx, syncObj); 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v[0] = (syncObj->StatusFlag) ? GL_SIGNALED : GL_UNSIGNALED; 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = 1; 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SYNC_FLAGS: 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v[0] = syncObj->Flags; 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = 1; 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glGetSynciv(pname=0x%x)\n", pname); 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (size > 0) { 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLsizei copy_count = MIN2(size, bufSize); 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(values, v, sizeof(GLint) * copy_count); 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (length != NULL) { 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *length = size; 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* FEATURE_ARB_sync */ 431