1e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg/*
2e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * Copyright © 2008 Red Hat, Inc.
3e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg *
4e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * Permission is hereby granted, free of charge, to any person obtaining a
5e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * copy of this software and associated documentation files (the "Soft-
6e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * ware"), to deal in the Software without restriction, including without
7e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * limitation the rights to use, copy, modify, merge, publish, distribute,
8e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * and/or sell copies of the Software, and to permit persons to whom the
9e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * Software is furnished to do so, provided that the above copyright
10e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * notice(s) and this permission notice appear in all copies of the Soft-
11e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * ware and that both the above copyright notice(s) and this permission
12e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * notice appear in supporting documentation.
13e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg *
14e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
16e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY
17e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN
18e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSE-
19e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * QUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
20e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
21e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFOR-
22e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * MANCE OF THIS SOFTWARE.
23e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg *
24e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * Except as contained in this notice, the name of a copyright holder shall
25e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * not be used in advertising or otherwise to promote the sale, use or
26e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * other dealings in this Software without prior written authorization of
27e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * the copyright holder.
28e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg *
29e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg * Authors:
30e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg *   Kristian Høgsberg (krh@redhat.com)
31e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg */
32e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
33e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
34cf02484fb668ca20afb8e426b44dc01397d83f87Vinson Lee#ifdef GLX_DIRECT_RENDERING
35cf02484fb668ca20afb8e426b44dc01397d83f87Vinson Lee
36daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes#include <stdio.h>
37e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#include <X11/Xlibint.h>
38e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#include <X11/extensions/Xext.h>
39e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#include <X11/extensions/extutil.h>
40e786924bf08583f74fff135a211c040843abd0bbKristian Høgsberg#include <X11/extensions/dri2proto.h>
41e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg#include "dri2.h"
427f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes#include "glxclient.h"
437f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes#include "GL/glxext.h"
44e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
45d8d7b2c3955fa2204bb031fea17afae994de79f7Ian Romanick/* Allow the build to work with an older versions of dri2proto.h and
46d8d7b2c3955fa2204bb031fea17afae994de79f7Ian Romanick * dri2tokens.h.
47d8d7b2c3955fa2204bb031fea17afae994de79f7Ian Romanick */
48d8d7b2c3955fa2204bb031fea17afae994de79f7Ian Romanick#if DRI2_MINOR < 1
49d8d7b2c3955fa2204bb031fea17afae994de79f7Ian Romanick#undef DRI2_MINOR
50d8d7b2c3955fa2204bb031fea17afae994de79f7Ian Romanick#define DRI2_MINOR 1
51d8d7b2c3955fa2204bb031fea17afae994de79f7Ian Romanick#define X_DRI2GetBuffersWithFormat 7
52d8d7b2c3955fa2204bb031fea17afae994de79f7Ian Romanick#endif
53d8d7b2c3955fa2204bb031fea17afae994de79f7Ian Romanick
54d8d7b2c3955fa2204bb031fea17afae994de79f7Ian Romanick
55e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic char dri2ExtensionName[] = DRI2_NAME;
56b0eada1707f0b7b4346663b98a7fb1a803580327Emil Velikovstatic XExtensionInfo _dri2Info_data;
57b0eada1707f0b7b4346663b98a7fb1a803580327Emil Velikovstatic XExtensionInfo *dri2Info = &_dri2Info_data;
5877c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsbergstatic XEXT_GENERATE_CLOSE_DISPLAY (DRI2CloseDisplay, dri2Info)
590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
607f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnesstatic Bool
617f170573ea486f2f2dd474c2590346f1a0110773Jesse BarnesDRI2WireToEvent(Display *dpy, XEvent *event, xEvent *wire);
627f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnesstatic Status
637f170573ea486f2f2dd474c2590346f1a0110773Jesse BarnesDRI2EventToWire(Display *dpy, XEvent *event, xEvent *wire);
64094c6fbc45cee1b53d9f1d7d4123d6da6a8958a3Kristian Høgsbergstatic int
65094c6fbc45cee1b53d9f1d7d4123d6da6a8958a3Kristian HøgsbergDRI2Error(Display *display, xError *err, XExtCodes *codes, int *ret_code);
667f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes
6777c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsbergstatic /* const */ XExtensionHooks dri2ExtensionHooks = {
680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  NULL,                   /* create_gc */
690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  NULL,                   /* copy_gc */
700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  NULL,                   /* flush_gc */
710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  NULL,                   /* free_gc */
720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  NULL,                   /* create_font */
730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  NULL,                   /* free_font */
740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  DRI2CloseDisplay,       /* close_display */
757f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes  DRI2WireToEvent,        /* wire_to_event */
767f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes  DRI2EventToWire,        /* event_to_wire */
77094c6fbc45cee1b53d9f1d7d4123d6da6a8958a3Kristian Høgsberg  DRI2Error,              /* error */
780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  NULL,                   /* error_string */
7977c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg};
8077c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg
810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic XEXT_GENERATE_FIND_DISPLAY (DRI2FindDisplay,
820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                   dri2Info,
830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                   dri2ExtensionName,
840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                   &dri2ExtensionHooks,
85215d0dae6151e83ca4dc1a65c96d56b0835d27e7Kristian Høgsberg                                   0, NULL)
8677c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg
877f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnesstatic Bool
887f170573ea486f2f2dd474c2590346f1a0110773Jesse BarnesDRI2WireToEvent(Display *dpy, XEvent *event, xEvent *wire)
897f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes{
907f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
914df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   struct glx_drawable *glxDraw;
927f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes
937f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes   XextCheckExtension(dpy, info, dri2ExtensionName, False);
947f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes
957f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes   switch ((wire->u.u.type & 0x7f) - info->codes->first_event) {
9601923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell
9701923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#ifdef X_DRI2SwapBuffers
987f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes   case DRI2_BufferSwapComplete:
997f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes   {
1007f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes      GLXBufferSwapComplete *aevent = (GLXBufferSwapComplete *)event;
1011e39fc784bc3d0d5ad01d9c147529ac0e10f1262Jesse Barnes      xDRI2BufferSwapComplete2 *awire = (xDRI2BufferSwapComplete2 *)wire;
1024df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes      __GLXDRIdrawable *pdraw;
1034df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes
1044df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes      pdraw = dri2GetGlxDrawableFromXDrawableId(dpy, awire->drawable);
10584b1716b5efa98c21db32ff7f55bb7608d6a11dfJuha-Pekka Heikkila      if (pdraw == NULL)
10684b1716b5efa98c21db32ff7f55bb7608d6a11dfJuha-Pekka Heikkila         return False;
107f8d81c31cee30821da3aab331a57f484f6a07a5dNick Bowler
108f8d81c31cee30821da3aab331a57f484f6a07a5dNick Bowler      /* Ignore swap events if we're not looking for them */
109a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri      aevent->type = dri2GetSwapEventType(dpy, awire->drawable);
110a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri      if(!aevent->type)
111a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri         return False;
112f8d81c31cee30821da3aab331a57f484f6a07a5dNick Bowler
1137a9329ba99fe1242c07fbf4fd04e7a4dbeba2e72Robert Bragg      aevent->serial = _XSetLastRequestRead(dpy, (xGenericReply *) wire);
1147a9329ba99fe1242c07fbf4fd04e7a4dbeba2e72Robert Bragg      aevent->send_event = (awire->type & 0x80) != 0;
1157a9329ba99fe1242c07fbf4fd04e7a4dbeba2e72Robert Bragg      aevent->display = dpy;
1167a9329ba99fe1242c07fbf4fd04e7a4dbeba2e72Robert Bragg      aevent->drawable = awire->drawable;
1177a9329ba99fe1242c07fbf4fd04e7a4dbeba2e72Robert Bragg      switch (awire->event_type) {
1187f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes      case DRI2_EXCHANGE_COMPLETE:
1197a9329ba99fe1242c07fbf4fd04e7a4dbeba2e72Robert Bragg	 aevent->event_type = GLX_EXCHANGE_COMPLETE_INTEL;
1207f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes	 break;
1217f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes      case DRI2_BLIT_COMPLETE:
12242ea25cb4ecae09b5cc011a95d42ba7f0645dde3Ian Romanick	 aevent->event_type = GLX_COPY_COMPLETE_INTEL;
1237f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes	 break;
1247f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes      case DRI2_FLIP_COMPLETE:
1257a9329ba99fe1242c07fbf4fd04e7a4dbeba2e72Robert Bragg	 aevent->event_type = GLX_FLIP_COMPLETE_INTEL;
1267f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes	 break;
1277f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes      default:
1287f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes	 /* unknown swap completion type */
1297f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes	 return False;
1307f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes      }
1317f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes      aevent->ust = ((CARD64)awire->ust_hi << 32) | awire->ust_lo;
1327f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes      aevent->msc = ((CARD64)awire->msc_hi << 32) | awire->msc_lo;
1334df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes
1344df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes      glxDraw = GetGLXDrawable(dpy, pdraw->drawable);
13586bd2196b4ccec50443e99e6c8bf1659e1df9f37Daniel Manjarres      if (glxDraw != NULL) {
13686bd2196b4ccec50443e99e6c8bf1659e1df9f37Daniel Manjarres         if (awire->sbc < glxDraw->lastEventSbc)
13786bd2196b4ccec50443e99e6c8bf1659e1df9f37Daniel Manjarres            glxDraw->eventSbcWrap += 0x100000000;
13886bd2196b4ccec50443e99e6c8bf1659e1df9f37Daniel Manjarres         glxDraw->lastEventSbc = awire->sbc;
13986bd2196b4ccec50443e99e6c8bf1659e1df9f37Daniel Manjarres         aevent->sbc = awire->sbc + glxDraw->eventSbcWrap;
14086bd2196b4ccec50443e99e6c8bf1659e1df9f37Daniel Manjarres      } else {
14186bd2196b4ccec50443e99e6c8bf1659e1df9f37Daniel Manjarres         aevent->sbc = awire->sbc;
14286bd2196b4ccec50443e99e6c8bf1659e1df9f37Daniel Manjarres      }
1434df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes
1447f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes      return True;
1457f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes   }
14601923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell#endif
14761d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez#ifdef DRI2_InvalidateBuffers
14861d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez   case DRI2_InvalidateBuffers:
14961d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez   {
15061d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez      xDRI2InvalidateBuffers *awire = (xDRI2InvalidateBuffers *)wire;
15101923fb72d755b319dde521c3c81a20caa95b540Keith Whitwell
15261d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez      dri2InvalidateBuffers(dpy, awire->drawable);
15361d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez      return False;
15461d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez   }
15561d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez#endif
1567f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes   default:
1577f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes      /* client doesn't support server event */
1587f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes      break;
1597f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes   }
1607f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes
1617f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes   return False;
1627f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes}
1637f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes
1647f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes/* We don't actually support this.  It doesn't make sense for clients to
1657f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes * send each other DRI2 events.
1667f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes */
1677f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnesstatic Status
1687f170573ea486f2f2dd474c2590346f1a0110773Jesse BarnesDRI2EventToWire(Display *dpy, XEvent *event, xEvent *wire)
1697f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes{
1707f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
1717f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes
1727f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes   XextCheckExtension(dpy, info, dri2ExtensionName, False);
1737f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes
1747f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes   switch (event->type) {
1757f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes   default:
1767f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes      /* client doesn't support server event */
1777f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes      break;
1787f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes   }
1797f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes
1807f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes   return Success;
1817f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes}
1827f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes
183094c6fbc45cee1b53d9f1d7d4123d6da6a8958a3Kristian Høgsbergstatic int
184094c6fbc45cee1b53d9f1d7d4123d6da6a8958a3Kristian HøgsbergDRI2Error(Display *display, xError *err, XExtCodes *codes, int *ret_code)
185094c6fbc45cee1b53d9f1d7d4123d6da6a8958a3Kristian Høgsberg{
186094c6fbc45cee1b53d9f1d7d4123d6da6a8958a3Kristian Høgsberg    if (err->majorCode == codes->major_opcode &&
187094c6fbc45cee1b53d9f1d7d4123d6da6a8958a3Kristian Høgsberg	err->errorCode == BadDrawable &&
188094c6fbc45cee1b53d9f1d7d4123d6da6a8958a3Kristian Høgsberg	err->minorCode == X_DRI2CopyRegion)
189094c6fbc45cee1b53d9f1d7d4123d6da6a8958a3Kristian Høgsberg	return True;
190094c6fbc45cee1b53d9f1d7d4123d6da6a8958a3Kristian Høgsberg
19116887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg    /* If the X drawable was destroyed before the GLX drawable, the
19216887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg     * DRI2 drawble will be gone by the time we call
19316887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg     * DRI2DestroyDrawable.  So just ignore BadDrawable here. */
19416887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg    if (err->majorCode == codes->major_opcode &&
19516887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg	err->errorCode == BadDrawable &&
19616887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg	err->minorCode == X_DRI2DestroyDrawable)
19716887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg	return True;
19816887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg
199fbc2fcf685d22ec9bc9465e1f731529979497eaaChristopher James Halse Rogers    /* If the server is non-local DRI2Connect will raise BadRequest.
200fbc2fcf685d22ec9bc9465e1f731529979497eaaChristopher James Halse Rogers     * Swallow this so that DRI2Connect can signal this in its return code */
201fbc2fcf685d22ec9bc9465e1f731529979497eaaChristopher James Halse Rogers    if (err->majorCode == codes->major_opcode &&
202fbc2fcf685d22ec9bc9465e1f731529979497eaaChristopher James Halse Rogers        err->minorCode == X_DRI2Connect &&
203fbc2fcf685d22ec9bc9465e1f731529979497eaaChristopher James Halse Rogers        err->errorCode == BadRequest) {
204fbc2fcf685d22ec9bc9465e1f731529979497eaaChristopher James Halse Rogers	*ret_code = False;
205fbc2fcf685d22ec9bc9465e1f731529979497eaaChristopher James Halse Rogers	return True;
206fbc2fcf685d22ec9bc9465e1f731529979497eaaChristopher James Halse Rogers    }
207fbc2fcf685d22ec9bc9465e1f731529979497eaaChristopher James Halse Rogers
208094c6fbc45cee1b53d9f1d7d4123d6da6a8958a3Kristian Høgsberg    return False;
209094c6fbc45cee1b53d9f1d7d4123d6da6a8958a3Kristian Høgsberg}
210094c6fbc45cee1b53d9f1d7d4123d6da6a8958a3Kristian Høgsberg
2110896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófBool
2120896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófDRI2QueryExtension(Display * dpy, int *eventBase, int *errorBase)
213e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{
2140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
215e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
2160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (XextHasExtension(info)) {
2170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      *eventBase = info->codes->first_event;
2180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      *errorBase = info->codes->first_error;
2190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return True;
2200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
221e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
2220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return False;
223e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}
224e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
2250896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófBool
2260896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófDRI2QueryVersion(Display * dpy, int *major, int *minor)
227e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{
2280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
2290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xDRI2QueryVersionReply rep;
2300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xDRI2QueryVersionReq *req;
231215d0dae6151e83ca4dc1a65c96d56b0835d27e7Kristian Høgsberg   int i, nevents;
2320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
2330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XextCheckExtension(dpy, info, dri2ExtensionName, False);
2340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
2350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
2360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReq(DRI2QueryVersion, req);
2370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = info->codes->major_opcode;
2380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->dri2ReqType = X_DRI2QueryVersion;
2390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->majorVersion = DRI2_MAJOR;
2400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->minorVersion = DRI2_MINOR;
2410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
2420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      UnlockDisplay(dpy);
2430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      SyncHandle();
2440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return False;
2450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
2460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *major = rep.majorVersion;
2470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *minor = rep.minorVersion;
2480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
2490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
2500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
251215d0dae6151e83ca4dc1a65c96d56b0835d27e7Kristian Høgsberg   switch (rep.minorVersion) {
252215d0dae6151e83ca4dc1a65c96d56b0835d27e7Kristian Høgsberg   case 1:
253215d0dae6151e83ca4dc1a65c96d56b0835d27e7Kristian Høgsberg	   nevents = 0;
254215d0dae6151e83ca4dc1a65c96d56b0835d27e7Kristian Høgsberg	   break;
255215d0dae6151e83ca4dc1a65c96d56b0835d27e7Kristian Høgsberg   case 2:
256215d0dae6151e83ca4dc1a65c96d56b0835d27e7Kristian Høgsberg	   nevents = 1;
257215d0dae6151e83ca4dc1a65c96d56b0835d27e7Kristian Høgsberg	   break;
258215d0dae6151e83ca4dc1a65c96d56b0835d27e7Kristian Høgsberg   case 3:
259215d0dae6151e83ca4dc1a65c96d56b0835d27e7Kristian Høgsberg   default:
260215d0dae6151e83ca4dc1a65c96d56b0835d27e7Kristian Høgsberg	   nevents = 2;
261215d0dae6151e83ca4dc1a65c96d56b0835d27e7Kristian Høgsberg	   break;
262215d0dae6151e83ca4dc1a65c96d56b0835d27e7Kristian Høgsberg   }
263215d0dae6151e83ca4dc1a65c96d56b0835d27e7Kristian Høgsberg
264215d0dae6151e83ca4dc1a65c96d56b0835d27e7Kristian Høgsberg   for (i = 0; i < nevents; i++) {
265215d0dae6151e83ca4dc1a65c96d56b0835d27e7Kristian Høgsberg       XESetWireToEvent (dpy, info->codes->first_event + i, DRI2WireToEvent);
266215d0dae6151e83ca4dc1a65c96d56b0835d27e7Kristian Høgsberg       XESetEventToWire (dpy, info->codes->first_event + i, DRI2EventToWire);
267215d0dae6151e83ca4dc1a65c96d56b0835d27e7Kristian Høgsberg   }
268215d0dae6151e83ca4dc1a65c96d56b0835d27e7Kristian Høgsberg
2690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return True;
270e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}
271e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
2720896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófBool
2730896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófDRI2Connect(Display * dpy, XID window, char **driverName, char **deviceName)
274e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{
2750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
2760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xDRI2ConnectReply rep;
2770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xDRI2ConnectReq *req;
2780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
2790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XextCheckExtension(dpy, info, dri2ExtensionName, False);
2800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
2810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
2820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReq(DRI2Connect, req);
2830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = info->codes->major_opcode;
2840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->dri2ReqType = X_DRI2Connect;
2850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->window = window;
2866a3ac03f2b80c80655d66b31c0218754f70156deDave Airlie
2870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->driverType = DRI2DriverDRI;
2886a3ac03f2b80c80655d66b31c0218754f70156deDave Airlie#ifdef DRI2DriverPrimeShift
28914f55869a4f9d54442aa4e10089ba1e5ec211b37Brian Paul   {
29014f55869a4f9d54442aa4e10089ba1e5ec211b37Brian Paul      char *prime = getenv("DRI_PRIME");
29114f55869a4f9d54442aa4e10089ba1e5ec211b37Brian Paul      if (prime) {
29214f55869a4f9d54442aa4e10089ba1e5ec211b37Brian Paul         uint32_t primeid;
29314f55869a4f9d54442aa4e10089ba1e5ec211b37Brian Paul         errno = 0;
29414f55869a4f9d54442aa4e10089ba1e5ec211b37Brian Paul         primeid = strtoul(prime, NULL, 0);
29514f55869a4f9d54442aa4e10089ba1e5ec211b37Brian Paul         if (errno == 0)
29614f55869a4f9d54442aa4e10089ba1e5ec211b37Brian Paul            req->driverType |=
29714f55869a4f9d54442aa4e10089ba1e5ec211b37Brian Paul               ((primeid & DRI2DriverPrimeMask) << DRI2DriverPrimeShift);
29814f55869a4f9d54442aa4e10089ba1e5ec211b37Brian Paul      }
2996a3ac03f2b80c80655d66b31c0218754f70156deDave Airlie   }
3006a3ac03f2b80c80655d66b31c0218754f70156deDave Airlie#endif
3016a3ac03f2b80c80655d66b31c0218754f70156deDave Airlie
3020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
3030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      UnlockDisplay(dpy);
3040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      SyncHandle();
3050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return False;
3060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
3070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
3080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (rep.driverNameLength == 0 && rep.deviceNameLength == 0) {
3090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      UnlockDisplay(dpy);
3100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      SyncHandle();
3110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return False;
3120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
3130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
3147c7b7b068b1d0dc8e14b87dab5dbd4108f874f74Matt Turner   *driverName = malloc(rep.driverNameLength + 1);
3150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (*driverName == NULL) {
3160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      _XEatData(dpy,
3170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                ((rep.driverNameLength + 3) & ~3) +
3180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                ((rep.deviceNameLength + 3) & ~3));
3190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      UnlockDisplay(dpy);
3200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      SyncHandle();
3210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return False;
3220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
3230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   _XReadPad(dpy, *driverName, rep.driverNameLength);
3240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   (*driverName)[rep.driverNameLength] = '\0';
3250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
3267c7b7b068b1d0dc8e14b87dab5dbd4108f874f74Matt Turner   *deviceName = malloc(rep.deviceNameLength + 1);
3270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (*deviceName == NULL) {
3287c7b7b068b1d0dc8e14b87dab5dbd4108f874f74Matt Turner      free(*driverName);
3290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      _XEatData(dpy, ((rep.deviceNameLength + 3) & ~3));
3300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      UnlockDisplay(dpy);
3310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      SyncHandle();
3320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return False;
3330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
3340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   _XReadPad(dpy, *deviceName, rep.deviceNameLength);
3350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   (*deviceName)[rep.deviceNameLength] = '\0';
3360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
3370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
3380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
3390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
3400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return True;
341e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}
342e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
3430896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófBool
3440896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófDRI2Authenticate(Display * dpy, XID window, drm_magic_t magic)
345e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{
3460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
3470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xDRI2AuthenticateReq *req;
3480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xDRI2AuthenticateReply rep;
34977c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg
3500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XextCheckExtension(dpy, info, dri2ExtensionName, False);
35177c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg
3520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
3530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReq(DRI2Authenticate, req);
3540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = info->codes->major_opcode;
3550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->dri2ReqType = X_DRI2Authenticate;
3560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->window = window;
3570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->magic = magic;
3584830809524b20e517e949151957512b14d7e679aKristian Høgsberg
3590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
3600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      UnlockDisplay(dpy);
3610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      SyncHandle();
3620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return False;
3630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
3644830809524b20e517e949151957512b14d7e679aKristian Høgsberg
3650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
3660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
36777c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg
3680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return rep.authenticated;
369e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}
370e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
3710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófvoid
3720896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófDRI2CreateDrawable(Display * dpy, XID drawable)
373e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{
3740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
3750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xDRI2CreateDrawableReq *req;
3760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
3770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XextSimpleCheckExtension(dpy, info, dri2ExtensionName);
3780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
3790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
3800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReq(DRI2CreateDrawable, req);
3810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = info->codes->major_opcode;
3820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->dri2ReqType = X_DRI2CreateDrawable;
3830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->drawable = drawable;
3840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
3850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
386f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg}
387f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg
3880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófvoid
3890896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófDRI2DestroyDrawable(Display * dpy, XID drawable)
3904830809524b20e517e949151957512b14d7e679aKristian Høgsberg{
3910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
3920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xDRI2DestroyDrawableReq *req;
3934830809524b20e517e949151957512b14d7e679aKristian Høgsberg
3940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XextSimpleCheckExtension(dpy, info, dri2ExtensionName);
3954830809524b20e517e949151957512b14d7e679aKristian Høgsberg
3960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XSync(dpy, False);
3974830809524b20e517e949151957512b14d7e679aKristian Høgsberg
3980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
3990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReq(DRI2DestroyDrawable, req);
4000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = info->codes->major_opcode;
4010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->dri2ReqType = X_DRI2DestroyDrawable;
4020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->drawable = drawable;
4030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
4040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
4054830809524b20e517e949151957512b14d7e679aKristian Høgsberg}
4064830809524b20e517e949151957512b14d7e679aKristian Høgsberg
4070896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófDRI2Buffer *
4080896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófDRI2GetBuffers(Display * dpy, XID drawable,
4090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf               int *width, int *height,
4100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf               unsigned int *attachments, int count, int *outCount)
411f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg{
4120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
4130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xDRI2GetBuffersReply rep;
4140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xDRI2GetBuffersReq *req;
4150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   DRI2Buffer *buffers;
4160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xDRI2Buffer repBuffer;
4170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD32 *p;
4180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int i;
4190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
4200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XextCheckExtension(dpy, info, dri2ExtensionName, False);
4210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
4220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
4230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReqExtra(DRI2GetBuffers, count * 4, req);
4240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = info->codes->major_opcode;
4250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->dri2ReqType = X_DRI2GetBuffers;
4260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->drawable = drawable;
4270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->count = count;
4280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   p = (CARD32 *) & req[1];
4290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   for (i = 0; i < count; i++)
4300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      p[i] = attachments[i];
4310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
4320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
4330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      UnlockDisplay(dpy);
4340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      SyncHandle();
4350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
4360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
4370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
4380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *width = rep.width;
4390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *height = rep.height;
4400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *outCount = rep.count;
4410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
4427c7b7b068b1d0dc8e14b87dab5dbd4108f874f74Matt Turner   buffers = malloc(rep.count * sizeof buffers[0]);
4430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (buffers == NULL) {
4440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      _XEatData(dpy, rep.count * sizeof repBuffer);
4450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      UnlockDisplay(dpy);
4460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      SyncHandle();
4470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
4480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
4490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
4500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   for (i = 0; i < rep.count; i++) {
4510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      _XReadPad(dpy, (char *) &repBuffer, sizeof repBuffer);
4520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      buffers[i].attachment = repBuffer.attachment;
4530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      buffers[i].name = repBuffer.name;
4540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      buffers[i].pitch = repBuffer.pitch;
4550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      buffers[i].cpp = repBuffer.cpp;
4560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      buffers[i].flags = repBuffer.flags;
4570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
4580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
4590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
4600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
4610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
4620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return buffers;
463e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}
464e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
465d8d7b2c3955fa2204bb031fea17afae994de79f7Ian Romanick
4660896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófDRI2Buffer *
4670896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófDRI2GetBuffersWithFormat(Display * dpy, XID drawable,
4680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                         int *width, int *height,
4690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                         unsigned int *attachments, int count, int *outCount)
470d8d7b2c3955fa2204bb031fea17afae994de79f7Ian Romanick{
4710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
4720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xDRI2GetBuffersReply rep;
4730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xDRI2GetBuffersReq *req;
4740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   DRI2Buffer *buffers;
4750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xDRI2Buffer repBuffer;
4760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD32 *p;
4770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int i;
4780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
4790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XextCheckExtension(dpy, info, dri2ExtensionName, False);
4800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
4810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
4820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReqExtra(DRI2GetBuffers, count * (4 * 2), req);
4830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = info->codes->major_opcode;
4840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->dri2ReqType = X_DRI2GetBuffersWithFormat;
4850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->drawable = drawable;
4860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->count = count;
4870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   p = (CARD32 *) & req[1];
4880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   for (i = 0; i < (count * 2); i++)
4890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      p[i] = attachments[i];
4900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
4910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
4920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      UnlockDisplay(dpy);
4930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      SyncHandle();
4940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
4950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
4960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
4970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *width = rep.width;
4980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *height = rep.height;
4990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *outCount = rep.count;
5000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
5017c7b7b068b1d0dc8e14b87dab5dbd4108f874f74Matt Turner   buffers = malloc(rep.count * sizeof buffers[0]);
5020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (buffers == NULL) {
5030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      _XEatData(dpy, rep.count * sizeof repBuffer);
5040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      UnlockDisplay(dpy);
5050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      SyncHandle();
5060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
5070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
5080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
5090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   for (i = 0; i < rep.count; i++) {
5100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      _XReadPad(dpy, (char *) &repBuffer, sizeof repBuffer);
5110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      buffers[i].attachment = repBuffer.attachment;
5120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      buffers[i].name = repBuffer.name;
5130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      buffers[i].pitch = repBuffer.pitch;
5140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      buffers[i].cpp = repBuffer.cpp;
5150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      buffers[i].flags = repBuffer.flags;
5160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
5170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
5180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
5190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
5200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
5210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return buffers;
522d8d7b2c3955fa2204bb031fea17afae994de79f7Ian Romanick}
523d8d7b2c3955fa2204bb031fea17afae994de79f7Ian Romanick
524d8d7b2c3955fa2204bb031fea17afae994de79f7Ian Romanick
5250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófvoid
5260896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófDRI2CopyRegion(Display * dpy, XID drawable, XserverRegion region,
5270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf               CARD32 dest, CARD32 src)
528e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg{
5290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XExtDisplayInfo *info = DRI2FindDisplay(dpy);
5300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xDRI2CopyRegionReq *req;
5310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xDRI2CopyRegionReply rep;
53277c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg
5330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XextSimpleCheckExtension(dpy, info, dri2ExtensionName);
53477c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg
5350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
5360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReq(DRI2CopyRegion, req);
5370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = info->codes->major_opcode;
5380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->dri2ReqType = X_DRI2CopyRegion;
5390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->drawable = drawable;
5400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->region = region;
5410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->dest = dest;
5420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->src = src;
54377c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg
5440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   _XReply(dpy, (xReply *) & rep, 0, xFalse);
54577c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg
5460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
5470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
548e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}
549cf02484fb668ca20afb8e426b44dc01397d83f87Vinson Lee
550cf02484fb668ca20afb8e426b44dc01397d83f87Vinson Lee#endif /* GLX_DIRECT_RENDERING */
551