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