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