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