1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright © 2008 Red Hat, Inc.
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 "Soft-
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ware"), to deal in the Software without restriction, including without
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * limitation the rights to use, copy, modify, merge, publish, distribute,
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, provided that the above copyright
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * notice(s) and this permission notice appear in all copies of the Soft-
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ware and that both the above copyright notice(s) and this permission
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * notice appear in supporting documentation.
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSE-
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * QUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFOR-
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MANCE OF THIS SOFTWARE.
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Except as contained in this notice, the name of a copyright holder shall
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * not be used in advertising or otherwise to promote the sale, use or
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * other dealings in this Software without prior written authorization of
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the copyright holder.
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors:
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *   Kristian Høgsberg (krh@redhat.com)
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_DIRECT_RENDERING
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdio.h>
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <X11/Xlibint.h>
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <X11/extensions/Xext.h>
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <X11/extensions/extutil.h>
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <X11/extensions/dri2proto.h>
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "xf86drm.h"
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "dri2.h"
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glxclient.h"
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "GL/glxext.h"
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Allow the build to work with an older versions of dri2proto.h and
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * dri2tokens.h.
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if DRI2_MINOR < 1
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef DRI2_MINOR
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DRI2_MINOR 1
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define X_DRI2GetBuffersWithFormat 7
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic char dri2ExtensionName[] = DRI2_NAME;
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic XExtensionInfo *dri2Info;
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic XEXT_GENERATE_CLOSE_DISPLAY (DRI2CloseDisplay, dri2Info)
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic Bool
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDRI2WireToEvent(Display *dpy, XEvent *event, xEvent *wire);
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic Status
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDRI2EventToWire(Display *dpy, XEvent *event, xEvent *wire);
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDRI2Error(Display *display, xError *err, XExtCodes *codes, int *ret_code);
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic /* const */ XExtensionHooks dri2ExtensionHooks = {
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  NULL,                   /* create_gc */
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  NULL,                   /* copy_gc */
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  NULL,                   /* flush_gc */
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  NULL,                   /* free_gc */
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  NULL,                   /* create_font */
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  NULL,                   /* free_font */
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  DRI2CloseDisplay,       /* close_display */
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  DRI2WireToEvent,        /* wire_to_event */
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  DRI2EventToWire,        /* event_to_wire */
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  DRI2Error,              /* error */
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  NULL,                   /* error_string */
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic XEXT_GENERATE_FIND_DISPLAY (DRI2FindDisplay,
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   dri2Info,
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   dri2ExtensionName,
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   &dri2ExtensionHooks,
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   0, NULL)
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic Bool
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDRI2WireToEvent(Display *dpy, XEvent *event, xEvent *wire)
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct glx_drawable *glxDraw;
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XextCheckExtension(dpy, info, dri2ExtensionName, False);
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch ((wire->u.u.type & 0x7f) - info->codes->first_event) {
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef X_DRI2SwapBuffers
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case DRI2_BufferSwapComplete:
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLXBufferSwapComplete *aevent = (GLXBufferSwapComplete *)event;
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xDRI2BufferSwapComplete2 *awire = (xDRI2BufferSwapComplete2 *)wire;
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      __GLXDRIdrawable *pdraw;
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pdraw = dri2GetGlxDrawableFromXDrawableId(dpy, awire->drawable);
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Ignore swap events if we're not looking for them */
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      aevent->type = dri2GetSwapEventType(dpy, awire->drawable);
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if(!aevent->type)
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return False;
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      aevent->serial = _XSetLastRequestRead(dpy, (xGenericReply *) wire);
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      aevent->send_event = (awire->type & 0x80) != 0;
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      aevent->display = dpy;
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      aevent->drawable = awire->drawable;
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (awire->event_type) {
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case DRI2_EXCHANGE_COMPLETE:
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 aevent->event_type = GLX_EXCHANGE_COMPLETE_INTEL;
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case DRI2_BLIT_COMPLETE:
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 aevent->event_type = GLX_COPY_COMPLETE_INTEL;
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case DRI2_FLIP_COMPLETE:
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 aevent->event_type = GLX_FLIP_COMPLETE_INTEL;
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* unknown swap completion type */
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return False;
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      aevent->ust = ((CARD64)awire->ust_hi << 32) | awire->ust_lo;
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      aevent->msc = ((CARD64)awire->msc_hi << 32) | awire->msc_lo;
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      glxDraw = GetGLXDrawable(dpy, pdraw->drawable);
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (awire->sbc < glxDraw->lastEventSbc)
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 glxDraw->eventSbcWrap += 0x100000000;
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      glxDraw->lastEventSbc = awire->sbc;
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      aevent->sbc = awire->sbc + glxDraw->eventSbcWrap;
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return True;
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DRI2_InvalidateBuffers
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case DRI2_InvalidateBuffers:
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xDRI2InvalidateBuffers *awire = (xDRI2InvalidateBuffers *)wire;
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dri2InvalidateBuffers(dpy, awire->drawable);
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return False;
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* client doesn't support server event */
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return False;
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* We don't actually support this.  It doesn't make sense for clients to
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * send each other DRI2 events.
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic Status
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDRI2EventToWire(Display *dpy, XEvent *event, xEvent *wire)
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XextCheckExtension(dpy, info, dri2ExtensionName, False);
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (event->type) {
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* client doesn't support server event */
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return Success;
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDRI2Error(Display *display, xError *err, XExtCodes *codes, int *ret_code)
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (err->majorCode == codes->major_opcode &&
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	err->errorCode == BadDrawable &&
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	err->minorCode == X_DRI2CopyRegion)
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return True;
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* If the X drawable was destroyed before the GLX drawable, the
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * DRI2 drawble will be gone by the time we call
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * DRI2DestroyDrawable.  So just ignore BadDrawable here. */
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (err->majorCode == codes->major_opcode &&
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	err->errorCode == BadDrawable &&
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	err->minorCode == X_DRI2DestroyDrawable)
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return True;
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /* If the server is non-local DRI2Connect will raise BadRequest.
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     * Swallow this so that DRI2Connect can signal this in its return code */
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (err->majorCode == codes->major_opcode &&
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        err->minorCode == X_DRI2Connect &&
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        err->errorCode == BadRequest) {
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	*ret_code = False;
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return True;
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return False;
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgBool
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDRI2QueryExtension(Display * dpy, int *eventBase, int *errorBase)
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (XextHasExtension(info)) {
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *eventBase = info->codes->first_event;
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *errorBase = info->codes->first_error;
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return True;
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return False;
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgBool
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDRI2QueryVersion(Display * dpy, int *major, int *minor)
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xDRI2QueryVersionReply rep;
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xDRI2QueryVersionReq *req;
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i, nevents;
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XextCheckExtension(dpy, info, dri2ExtensionName, False);
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   LockDisplay(dpy);
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GetReq(DRI2QueryVersion, req);
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->reqType = info->codes->major_opcode;
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->dri2ReqType = X_DRI2QueryVersion;
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->majorVersion = DRI2_MAJOR;
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->minorVersion = DRI2_MINOR;
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      UnlockDisplay(dpy);
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SyncHandle();
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return False;
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *major = rep.majorVersion;
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *minor = rep.minorVersion;
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UnlockDisplay(dpy);
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SyncHandle();
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (rep.minorVersion) {
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 1:
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   nevents = 0;
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   break;
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 2:
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   nevents = 1;
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   break;
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 3:
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   nevents = 2;
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   break;
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < nevents; i++) {
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       XESetWireToEvent (dpy, info->codes->first_event + i, DRI2WireToEvent);
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       XESetEventToWire (dpy, info->codes->first_event + i, DRI2EventToWire);
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return True;
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgBool
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDRI2Connect(Display * dpy, XID window, char **driverName, char **deviceName)
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xDRI2ConnectReply rep;
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xDRI2ConnectReq *req;
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   char *prime;
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XextCheckExtension(dpy, info, dri2ExtensionName, False);
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   LockDisplay(dpy);
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GetReq(DRI2Connect, req);
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->reqType = info->codes->major_opcode;
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->dri2ReqType = X_DRI2Connect;
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->window = window;
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->driverType = DRI2DriverDRI;
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DRI2DriverPrimeShift
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prime = getenv("DRI_PRIME");
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (prime) {
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t primeid;
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      errno = 0;
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      primeid = strtoul(prime, NULL, 0);
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (errno == 0)
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         req->driverType |= ((primeid & DRI2DriverPrimeMask) << DRI2DriverPrimeShift);
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      UnlockDisplay(dpy);
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SyncHandle();
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return False;
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (rep.driverNameLength == 0 && rep.deviceNameLength == 0) {
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      UnlockDisplay(dpy);
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SyncHandle();
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return False;
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *driverName = Xmalloc(rep.driverNameLength + 1);
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (*driverName == NULL) {
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _XEatData(dpy,
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                ((rep.driverNameLength + 3) & ~3) +
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                ((rep.deviceNameLength + 3) & ~3));
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      UnlockDisplay(dpy);
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SyncHandle();
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return False;
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _XReadPad(dpy, *driverName, rep.driverNameLength);
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (*driverName)[rep.driverNameLength] = '\0';
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *deviceName = Xmalloc(rep.deviceNameLength + 1);
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (*deviceName == NULL) {
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      Xfree(*driverName);
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _XEatData(dpy, ((rep.deviceNameLength + 3) & ~3));
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      UnlockDisplay(dpy);
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SyncHandle();
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return False;
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _XReadPad(dpy, *deviceName, rep.deviceNameLength);
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (*deviceName)[rep.deviceNameLength] = '\0';
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UnlockDisplay(dpy);
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SyncHandle();
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return True;
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgBool
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDRI2Authenticate(Display * dpy, XID window, drm_magic_t magic)
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xDRI2AuthenticateReq *req;
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xDRI2AuthenticateReply rep;
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XextCheckExtension(dpy, info, dri2ExtensionName, False);
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   LockDisplay(dpy);
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GetReq(DRI2Authenticate, req);
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->reqType = info->codes->major_opcode;
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->dri2ReqType = X_DRI2Authenticate;
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->window = window;
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->magic = magic;
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      UnlockDisplay(dpy);
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SyncHandle();
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return False;
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UnlockDisplay(dpy);
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SyncHandle();
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return rep.authenticated;
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDRI2CreateDrawable(Display * dpy, XID drawable)
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xDRI2CreateDrawableReq *req;
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XextSimpleCheckExtension(dpy, info, dri2ExtensionName);
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   LockDisplay(dpy);
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GetReq(DRI2CreateDrawable, req);
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->reqType = info->codes->major_opcode;
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->dri2ReqType = X_DRI2CreateDrawable;
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->drawable = drawable;
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UnlockDisplay(dpy);
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SyncHandle();
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDRI2DestroyDrawable(Display * dpy, XID drawable)
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xDRI2DestroyDrawableReq *req;
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XextSimpleCheckExtension(dpy, info, dri2ExtensionName);
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XSync(dpy, False);
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   LockDisplay(dpy);
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GetReq(DRI2DestroyDrawable, req);
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->reqType = info->codes->major_opcode;
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->dri2ReqType = X_DRI2DestroyDrawable;
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->drawable = drawable;
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UnlockDisplay(dpy);
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SyncHandle();
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDRI2Buffer *
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDRI2GetBuffers(Display * dpy, XID drawable,
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               int *width, int *height,
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               unsigned int *attachments, int count, int *outCount)
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xDRI2GetBuffersReply rep;
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xDRI2GetBuffersReq *req;
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DRI2Buffer *buffers;
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xDRI2Buffer repBuffer;
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CARD32 *p;
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i;
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XextCheckExtension(dpy, info, dri2ExtensionName, False);
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   LockDisplay(dpy);
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GetReqExtra(DRI2GetBuffers, count * 4, req);
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->reqType = info->codes->major_opcode;
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->dri2ReqType = X_DRI2GetBuffers;
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->drawable = drawable;
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->count = count;
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p = (CARD32 *) & req[1];
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < count; i++)
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p[i] = attachments[i];
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      UnlockDisplay(dpy);
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SyncHandle();
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *width = rep.width;
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *height = rep.height;
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *outCount = rep.count;
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   buffers = Xmalloc(rep.count * sizeof buffers[0]);
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (buffers == NULL) {
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _XEatData(dpy, rep.count * sizeof repBuffer);
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      UnlockDisplay(dpy);
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SyncHandle();
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < rep.count; i++) {
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _XReadPad(dpy, (char *) &repBuffer, sizeof repBuffer);
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      buffers[i].attachment = repBuffer.attachment;
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      buffers[i].name = repBuffer.name;
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      buffers[i].pitch = repBuffer.pitch;
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      buffers[i].cpp = repBuffer.cpp;
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      buffers[i].flags = repBuffer.flags;
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UnlockDisplay(dpy);
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SyncHandle();
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return buffers;
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDRI2Buffer *
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDRI2GetBuffersWithFormat(Display * dpy, XID drawable,
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         int *width, int *height,
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         unsigned int *attachments, int count, int *outCount)
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xDRI2GetBuffersReply rep;
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xDRI2GetBuffersReq *req;
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DRI2Buffer *buffers;
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xDRI2Buffer repBuffer;
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CARD32 *p;
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i;
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XextCheckExtension(dpy, info, dri2ExtensionName, False);
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   LockDisplay(dpy);
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GetReqExtra(DRI2GetBuffers, count * (4 * 2), req);
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->reqType = info->codes->major_opcode;
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->dri2ReqType = X_DRI2GetBuffersWithFormat;
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->drawable = drawable;
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->count = count;
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p = (CARD32 *) & req[1];
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < (count * 2); i++)
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p[i] = attachments[i];
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      UnlockDisplay(dpy);
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SyncHandle();
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *width = rep.width;
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *height = rep.height;
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *outCount = rep.count;
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   buffers = Xmalloc(rep.count * sizeof buffers[0]);
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (buffers == NULL) {
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _XEatData(dpy, rep.count * sizeof repBuffer);
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      UnlockDisplay(dpy);
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SyncHandle();
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < rep.count; i++) {
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _XReadPad(dpy, (char *) &repBuffer, sizeof repBuffer);
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      buffers[i].attachment = repBuffer.attachment;
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      buffers[i].name = repBuffer.name;
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      buffers[i].pitch = repBuffer.pitch;
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      buffers[i].cpp = repBuffer.cpp;
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      buffers[i].flags = repBuffer.flags;
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UnlockDisplay(dpy);
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SyncHandle();
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return buffers;
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDRI2CopyRegion(Display * dpy, XID drawable, XserverRegion region,
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               CARD32 dest, CARD32 src)
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xDRI2CopyRegionReq *req;
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xDRI2CopyRegionReply rep;
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XextSimpleCheckExtension(dpy, info, dri2ExtensionName);
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   LockDisplay(dpy);
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GetReq(DRI2CopyRegion, req);
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->reqType = info->codes->major_opcode;
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->dri2ReqType = X_DRI2CopyRegion;
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->drawable = drawable;
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->region = region;
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->dest = dest;
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   req->src = src;
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _XReply(dpy, (xReply *) & rep, 0, xFalse);
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UnlockDisplay(dpy);
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SyncHandle();
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef X_DRI2SwapBuffers
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgload_swap_req(xDRI2SwapBuffersReq *req, CARD64 target, CARD64 divisor,
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     CARD64 remainder)
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->target_msc_hi = target >> 32;
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->target_msc_lo = target & 0xffffffff;
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->divisor_hi = divisor >> 32;
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->divisor_lo = divisor & 0xffffffff;
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->remainder_hi = remainder >> 32;
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->remainder_lo = remainder & 0xffffffff;
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic CARD64
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvals_to_card64(CARD32 lo, CARD32 hi)
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return (CARD64)hi << 32 | lo;
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid DRI2SwapBuffers(Display *dpy, XID drawable, CARD64 target_msc,
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     CARD64 divisor, CARD64 remainder, CARD64 *count)
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    xDRI2SwapBuffersReq *req;
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    xDRI2SwapBuffersReply rep;
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    XextSimpleCheckExtension (dpy, info, dri2ExtensionName);
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    LockDisplay(dpy);
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GetReq(DRI2SwapBuffers, req);
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->reqType = info->codes->major_opcode;
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->dri2ReqType = X_DRI2SwapBuffers;
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->drawable = drawable;
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    load_swap_req(req, target_msc, divisor, remainder);
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    _XReply(dpy, (xReply *)&rep, 0, xFalse);
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *count = vals_to_card64(rep.swap_lo, rep.swap_hi);
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    UnlockDisplay(dpy);
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    SyncHandle();
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef X_DRI2GetMSC
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgBool DRI2GetMSC(Display *dpy, XID drawable, CARD64 *ust, CARD64 *msc,
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		CARD64 *sbc)
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    xDRI2GetMSCReq *req;
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    xDRI2MSCReply rep;
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    XextCheckExtension (dpy, info, dri2ExtensionName, False);
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    LockDisplay(dpy);
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GetReq(DRI2GetMSC, req);
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->reqType = info->codes->major_opcode;
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->dri2ReqType = X_DRI2GetMSC;
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->drawable = drawable;
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UnlockDisplay(dpy);
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	SyncHandle();
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return False;
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *ust = vals_to_card64(rep.ust_lo, rep.ust_hi);
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *msc = vals_to_card64(rep.msc_lo, rep.msc_hi);
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *sbc = vals_to_card64(rep.sbc_lo, rep.sbc_hi);
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    UnlockDisplay(dpy);
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    SyncHandle();
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return True;
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef X_DRI2WaitMSC
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgload_msc_req(xDRI2WaitMSCReq *req, CARD64 target, CARD64 divisor,
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     CARD64 remainder)
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->target_msc_hi = target >> 32;
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->target_msc_lo = target & 0xffffffff;
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->divisor_hi = divisor >> 32;
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->divisor_lo = divisor & 0xffffffff;
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->remainder_hi = remainder >> 32;
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->remainder_lo = remainder & 0xffffffff;
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgBool DRI2WaitMSC(Display *dpy, XID drawable, CARD64 target_msc, CARD64 divisor,
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 CARD64 remainder, CARD64 *ust, CARD64 *msc, CARD64 *sbc)
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    xDRI2WaitMSCReq *req;
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    xDRI2MSCReply rep;
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    XextCheckExtension (dpy, info, dri2ExtensionName, False);
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    LockDisplay(dpy);
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GetReq(DRI2WaitMSC, req);
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->reqType = info->codes->major_opcode;
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->dri2ReqType = X_DRI2WaitMSC;
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->drawable = drawable;
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    load_msc_req(req, target_msc, divisor, remainder);
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UnlockDisplay(dpy);
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	SyncHandle();
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return False;
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *ust = ((CARD64)rep.ust_hi << 32) | (CARD64)rep.ust_lo;
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *msc = ((CARD64)rep.msc_hi << 32) | (CARD64)rep.msc_lo;
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *sbc = ((CARD64)rep.sbc_hi << 32) | (CARD64)rep.sbc_lo;
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    UnlockDisplay(dpy);
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    SyncHandle();
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return True;
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef X_DRI2WaitSBC
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgload_sbc_req(xDRI2WaitSBCReq *req, CARD64 target)
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->target_sbc_hi = target >> 32;
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->target_sbc_lo = target & 0xffffffff;
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgBool DRI2WaitSBC(Display *dpy, XID drawable, CARD64 target_sbc, CARD64 *ust,
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 CARD64 *msc, CARD64 *sbc)
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    xDRI2WaitSBCReq *req;
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    xDRI2MSCReply rep;
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    XextCheckExtension (dpy, info, dri2ExtensionName, False);
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    LockDisplay(dpy);
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GetReq(DRI2WaitSBC, req);
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->reqType = info->codes->major_opcode;
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->dri2ReqType = X_DRI2WaitSBC;
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->drawable = drawable;
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    load_sbc_req(req, target_sbc);
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UnlockDisplay(dpy);
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	SyncHandle();
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return False;
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *ust = ((CARD64)rep.ust_hi << 32) | rep.ust_lo;
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *msc = ((CARD64)rep.msc_hi << 32) | rep.msc_lo;
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *sbc = ((CARD64)rep.sbc_hi << 32) | rep.sbc_lo;
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    UnlockDisplay(dpy);
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    SyncHandle();
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return True;
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef X_DRI2SwapInterval
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid DRI2SwapInterval(Display *dpy, XID drawable, int interval)
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    xDRI2SwapIntervalReq *req;
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    XextSimpleCheckExtension (dpy, info, dri2ExtensionName);
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    LockDisplay(dpy);
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    GetReq(DRI2SwapInterval, req);
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->reqType = info->codes->major_opcode;
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->dri2ReqType = X_DRI2SwapInterval;
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->drawable = drawable;
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    req->interval = interval;
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    UnlockDisplay(dpy);
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    SyncHandle();
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* GLX_DIRECT_RENDERING */
726