Blame va/x11/va_dri2.c

Packit Service 9402ce
/*
Packit Service 9402ce
 * Copyright © 2008 Red Hat, Inc.
Packit Service 9402ce
 *
Packit Service 9402ce
 * Permission is hereby granted, free of charge, to any person obtaining a
Packit Service 9402ce
 * copy of this software and associated documentation files (the "Soft-
Packit Service 9402ce
 * ware"), to deal in the Software without restriction, including without
Packit Service 9402ce
 * limitation the rights to use, copy, modify, merge, publish, distribute,
Packit Service 9402ce
 * and/or sell copies of the Software, and to permit persons to whom the
Packit Service 9402ce
 * Software is furnished to do so, provided that the above copyright
Packit Service 9402ce
 * notice(s) and this permission notice appear in all copies of the Soft-
Packit Service 9402ce
 * ware and that both the above copyright notice(s) and this permission
Packit Service 9402ce
 * notice appear in supporting documentation.
Packit Service 9402ce
 *
Packit Service 9402ce
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
Packit Service 9402ce
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
Packit Service 9402ce
 * ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY
Packit Service 9402ce
 * RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN
Packit Service 9402ce
 * THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSE-
Packit Service 9402ce
 * QUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
Packit Service 9402ce
 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
Packit Service 9402ce
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFOR-
Packit Service 9402ce
 * MANCE OF THIS SOFTWARE.
Packit Service 9402ce
 *
Packit Service 9402ce
 * Except as contained in this notice, the name of a copyright holder shall
Packit Service 9402ce
 * not be used in advertising or otherwise to promote the sale, use or
Packit Service 9402ce
 * other dealings in this Software without prior written authorization of
Packit Service 9402ce
 * the copyright holder.
Packit Service 9402ce
 *
Packit Service 9402ce
 * Authors:
Packit Service 9402ce
 *   Kristian Høgsberg (krh@redhat.com)
Packit Service 9402ce
 */
Packit Service 9402ce
Packit Service 9402ce
Packit Service 9402ce
#define NEED_REPLIES
Packit Service 9402ce
#include <X11/Xlibint.h>
Packit Service 9402ce
#include <X11/extensions/Xext.h>
Packit Service 9402ce
#include <X11/extensions/extutil.h>
Packit Service 9402ce
#include "xf86drm.h"
Packit Service 9402ce
#include "va_dri2.h"
Packit Service 9402ce
#include "va_dri2str.h"
Packit Service 9402ce
#include "va_dri2tokens.h"
Packit Service 9402ce
Packit Service 9402ce
#ifndef DRI2DriverDRI
Packit Service 9402ce
#define DRI2DriverDRI 0
Packit Service 9402ce
#endif
Packit Service 9402ce
Packit Service 9402ce
static int
Packit Service 9402ce
VA_DRI2Error(Display *dpy, xError *err, XExtCodes *codes, int *ret_code);
Packit Service 9402ce
Packit Service 9402ce
static VA_DRI2Buffer *
Packit Service 9402ce
VA_DRI2GetBuffers_internal(XExtDisplayInfo *info,
Packit Service 9402ce
                           Display *dpy, XID drawable,
Packit Service 9402ce
                           int *width, int *height,
Packit Service 9402ce
                           unsigned int *attachments,
Packit Service 9402ce
                           int count,
Packit Service 9402ce
                           int *outCount);
Packit Service 9402ce
Packit Service 9402ce
static char va_dri2ExtensionName[] = DRI2_NAME;
Packit Service 9402ce
static XExtensionInfo _va_dri2_info_data;
Packit Service 9402ce
static XExtensionInfo *va_dri2Info = &_va_dri2_info_data;
Packit Service 9402ce
static XEXT_GENERATE_CLOSE_DISPLAY (VA_DRI2CloseDisplay, va_dri2Info)
Packit Service 9402ce
static /* const */ XExtensionHooks va_dri2ExtensionHooks = {
Packit Service 9402ce
    NULL,				/* create_gc */
Packit Service 9402ce
    NULL,				/* copy_gc */
Packit Service 9402ce
    NULL,				/* flush_gc */
Packit Service 9402ce
    NULL,				/* free_gc */
Packit Service 9402ce
    NULL,				/* create_font */
Packit Service 9402ce
    NULL,				/* free_font */
Packit Service 9402ce
    VA_DRI2CloseDisplay,		/* close_display */
Packit Service 9402ce
    NULL,				/* wire_to_event */
Packit Service 9402ce
    NULL,				/* event_to_wire */
Packit Service 9402ce
    VA_DRI2Error,			/* error */
Packit Service 9402ce
    NULL,				/* error_string */
Packit Service 9402ce
};
Packit Service 9402ce
Packit Service 9402ce
static XEXT_GENERATE_FIND_DISPLAY (DRI2FindDisplay, va_dri2Info, 
Packit Service 9402ce
				   va_dri2ExtensionName, 
Packit Service 9402ce
				   &va_dri2ExtensionHooks, 
Packit Service 9402ce
				   0, NULL)
Packit Service 9402ce
Packit Service 9402ce
static CARD32 _va_resource_x_error_drawable = 0;
Packit Service 9402ce
static Bool   _va_resource_x_error_matched = False;
Packit Service 9402ce
Packit Service 9402ce
#define VA_EnterResourceError(drawable)                 \
Packit Service 9402ce
  do {                                                  \
Packit Service 9402ce
    _va_resource_x_error_drawable = (drawable);         \
Packit Service 9402ce
    _va_resource_x_error_matched = False;               \
Packit Service 9402ce
  } while (0)
Packit Service 9402ce
Packit Service 9402ce
#define VA_LeaveResourceError()                 \
Packit Service 9402ce
  do {                                          \
Packit Service 9402ce
    _va_resource_x_error_drawable = 0;          \
Packit Service 9402ce
  } while (0)
Packit Service 9402ce
Packit Service 9402ce
#define VA_ResourceErrorMatched()               \
Packit Service 9402ce
  (_va_resource_x_error_matched)
Packit Service 9402ce
Packit Service 9402ce
static int
Packit Service 9402ce
VA_DRI2Error(Display *dpy, xError *err, XExtCodes *codes, int *ret_code)
Packit Service 9402ce
{
Packit Service 9402ce
    if (_va_resource_x_error_drawable == err->resourceID) {
Packit Service 9402ce
      _va_resource_x_error_matched = True;
Packit Service 9402ce
      return True;
Packit Service 9402ce
    }
Packit Service 9402ce
Packit Service 9402ce
    return False;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
Bool VA_DRI2QueryExtension(Display *dpy, int *eventBase, int *errorBase)
Packit Service 9402ce
{
Packit Service 9402ce
    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
Packit Service 9402ce
Packit Service 9402ce
    if (XextHasExtension(info)) {
Packit Service 9402ce
	*eventBase = info->codes->first_event;
Packit Service 9402ce
	*errorBase = info->codes->first_error;
Packit Service 9402ce
	return True;
Packit Service 9402ce
    }
Packit Service 9402ce
Packit Service 9402ce
    return False;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
Bool VA_DRI2QueryVersion(Display *dpy, int *major, int *minor)
Packit Service 9402ce
{
Packit Service 9402ce
    XExtDisplayInfo *info = DRI2FindDisplay (dpy);
Packit Service 9402ce
    xDRI2QueryVersionReply rep;
Packit Service 9402ce
    xDRI2QueryVersionReq *req;
Packit Service 9402ce
Packit Service 9402ce
    XextCheckExtension (dpy, info, va_dri2ExtensionName, False);
Packit Service 9402ce
Packit Service 9402ce
    LockDisplay(dpy);
Packit Service 9402ce
    GetReq(DRI2QueryVersion, req);
Packit Service 9402ce
    req->reqType = info->codes->major_opcode;
Packit Service 9402ce
    req->dri2ReqType = X_DRI2QueryVersion;
Packit Service 9402ce
    req->majorVersion = DRI2_MAJOR;
Packit Service 9402ce
    req->minorVersion = DRI2_MINOR;
Packit Service 9402ce
    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
Packit Service 9402ce
	UnlockDisplay(dpy);
Packit Service 9402ce
	SyncHandle();
Packit Service 9402ce
	return False;
Packit Service 9402ce
    }
Packit Service 9402ce
    *major = rep.majorVersion;
Packit Service 9402ce
    *minor = rep.minorVersion;
Packit Service 9402ce
    UnlockDisplay(dpy);
Packit Service 9402ce
    SyncHandle();
Packit Service 9402ce
Packit Service 9402ce
    return True;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
Bool VA_DRI2Connect(Display *dpy, XID window,
Packit Service 9402ce
		 char **driverName, char **deviceName)
Packit Service 9402ce
{
Packit Service 9402ce
    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
Packit Service 9402ce
    xDRI2ConnectReply rep;
Packit Service 9402ce
    xDRI2ConnectReq *req;
Packit Service 9402ce
Packit Service 9402ce
    XextCheckExtension (dpy, info, va_dri2ExtensionName, False);
Packit Service 9402ce
Packit Service 9402ce
    LockDisplay(dpy);
Packit Service 9402ce
    GetReq(DRI2Connect, req);
Packit Service 9402ce
    req->reqType = info->codes->major_opcode;
Packit Service 9402ce
    req->dri2ReqType = X_DRI2Connect;
Packit Service 9402ce
    req->window = window;
Packit Service 9402ce
    req->driverType = DRI2DriverDRI;
Packit Service 9402ce
    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
Packit Service 9402ce
	UnlockDisplay(dpy);
Packit Service 9402ce
	SyncHandle();
Packit Service 9402ce
	return False;
Packit Service 9402ce
    }
Packit Service 9402ce
Packit Service 9402ce
    if (rep.driverNameLength == 0 && rep.deviceNameLength == 0) {
Packit Service 9402ce
	UnlockDisplay(dpy);
Packit Service 9402ce
	SyncHandle();
Packit Service 9402ce
	return False;
Packit Service 9402ce
    }
Packit Service 9402ce
Packit Service 9402ce
    *driverName = Xmalloc(rep.driverNameLength + 1);
Packit Service 9402ce
    if (*driverName == NULL) {
Packit Service 9402ce
	_XEatData(dpy, 
Packit Service 9402ce
		  ((rep.driverNameLength + 3) & ~3) +
Packit Service 9402ce
		  ((rep.deviceNameLength + 3) & ~3));
Packit Service 9402ce
	UnlockDisplay(dpy);
Packit Service 9402ce
	SyncHandle();
Packit Service 9402ce
	return False;
Packit Service 9402ce
    }
Packit Service 9402ce
    _XReadPad(dpy, *driverName, rep.driverNameLength);
Packit Service 9402ce
    (*driverName)[rep.driverNameLength] = '\0';
Packit Service 9402ce
Packit Service 9402ce
    *deviceName = Xmalloc(rep.deviceNameLength + 1);
Packit Service 9402ce
    if (*deviceName == NULL) {
Packit Service 9402ce
	Xfree(*driverName);
Packit Service 9402ce
	_XEatData(dpy, ((rep.deviceNameLength + 3) & ~3));
Packit Service 9402ce
	UnlockDisplay(dpy);
Packit Service 9402ce
	SyncHandle();
Packit Service 9402ce
	return False;
Packit Service 9402ce
    }
Packit Service 9402ce
    _XReadPad(dpy, *deviceName, rep.deviceNameLength);
Packit Service 9402ce
    (*deviceName)[rep.deviceNameLength] = '\0';
Packit Service 9402ce
Packit Service 9402ce
    UnlockDisplay(dpy);
Packit Service 9402ce
    SyncHandle();
Packit Service 9402ce
Packit Service 9402ce
    return True;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
Bool VA_DRI2Authenticate(Display *dpy, XID window, drm_magic_t magic)
Packit Service 9402ce
{
Packit Service 9402ce
    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
Packit Service 9402ce
    xDRI2AuthenticateReq *req;
Packit Service 9402ce
    xDRI2AuthenticateReply rep;
Packit Service 9402ce
Packit Service 9402ce
    XextCheckExtension (dpy, info, va_dri2ExtensionName, False);
Packit Service 9402ce
Packit Service 9402ce
    LockDisplay(dpy);
Packit Service 9402ce
    GetReq(DRI2Authenticate, req);
Packit Service 9402ce
    req->reqType = info->codes->major_opcode;
Packit Service 9402ce
    req->dri2ReqType = X_DRI2Authenticate;
Packit Service 9402ce
    req->window = window;
Packit Service 9402ce
    req->magic = magic;
Packit Service 9402ce
Packit Service 9402ce
    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
Packit Service 9402ce
	UnlockDisplay(dpy);
Packit Service 9402ce
	SyncHandle();
Packit Service 9402ce
	return False;
Packit Service 9402ce
    }
Packit Service 9402ce
Packit Service 9402ce
    UnlockDisplay(dpy);
Packit Service 9402ce
    SyncHandle();
Packit Service 9402ce
Packit Service 9402ce
    return rep.authenticated;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
void VA_DRI2CreateDrawable(Display *dpy, XID drawable)
Packit Service 9402ce
{
Packit Service 9402ce
    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
Packit Service 9402ce
    xDRI2CreateDrawableReq *req;
Packit Service 9402ce
Packit Service 9402ce
    XextSimpleCheckExtension (dpy, info, va_dri2ExtensionName);
Packit Service 9402ce
Packit Service 9402ce
    LockDisplay(dpy);
Packit Service 9402ce
    GetReq(DRI2CreateDrawable, req);
Packit Service 9402ce
    req->reqType = info->codes->major_opcode;
Packit Service 9402ce
    req->dri2ReqType = X_DRI2CreateDrawable;
Packit Service 9402ce
    req->drawable = drawable;
Packit Service 9402ce
    UnlockDisplay(dpy);
Packit Service 9402ce
    SyncHandle();
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
void VA_DRI2DestroyDrawable(Display *dpy, XID drawable)
Packit Service 9402ce
{
Packit Service 9402ce
    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
Packit Service 9402ce
    xDRI2DestroyDrawableReq *req;
Packit Service 9402ce
    unsigned int attachement = 0; // FRONT_LEFT
Packit Service 9402ce
    VA_DRI2Buffer *buffers;
Packit Service 9402ce
Packit Service 9402ce
    XextSimpleCheckExtension (dpy, info, va_dri2ExtensionName);
Packit Service 9402ce
Packit Service 9402ce
    XSync(dpy, False);
Packit Service 9402ce
Packit Service 9402ce
    LockDisplay(dpy);
Packit Service 9402ce
    /*
Packit Service 9402ce
     * We have no way of catching DRI2DestroyDrawable errors because
Packit Service 9402ce
     * this message doesn't have a defined answer. So we test whether
Packit Service 9402ce
     * the drawable is still alive by sending DRIGetBuffers first and
Packit Service 9402ce
     * checking whether we get an error.
Packit Service 9402ce
     */
Packit Service 9402ce
    VA_EnterResourceError(drawable);
Packit Service 9402ce
Packit Service 9402ce
    buffers = VA_DRI2GetBuffers_internal(info, dpy, drawable,
Packit Service 9402ce
                                         NULL, NULL,
Packit Service 9402ce
                                         &attachement, 1, NULL);
Packit Service 9402ce
    VA_LeaveResourceError();
Packit Service 9402ce
    if (buffers)
Packit Service 9402ce
      XFree(buffers);
Packit Service 9402ce
    if (VA_ResourceErrorMatched()) {
Packit Service 9402ce
      UnlockDisplay(dpy);
Packit Service 9402ce
      SyncHandle();
Packit Service 9402ce
      return;
Packit Service 9402ce
    }
Packit Service 9402ce
Packit Service 9402ce
    GetReq(DRI2DestroyDrawable, req);
Packit Service 9402ce
    req->reqType = info->codes->major_opcode;
Packit Service 9402ce
    req->dri2ReqType = X_DRI2DestroyDrawable;
Packit Service 9402ce
    req->drawable = drawable;
Packit Service 9402ce
    UnlockDisplay(dpy);
Packit Service 9402ce
    SyncHandle();
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VA_DRI2Buffer *VA_DRI2GetBuffers_internal(XExtDisplayInfo *info,
Packit Service 9402ce
                                          Display *dpy, XID drawable,
Packit Service 9402ce
                                          int *width, int *height,
Packit Service 9402ce
                                          unsigned int *attachments, int count,
Packit Service 9402ce
                                          int *outCount)
Packit Service 9402ce
{
Packit Service 9402ce
    xDRI2GetBuffersReply rep;
Packit Service 9402ce
    xDRI2GetBuffersReq *req;
Packit Service 9402ce
    VA_DRI2Buffer *buffers;
Packit Service 9402ce
    xDRI2Buffer repBuffer;
Packit Service 9402ce
    CARD32 *p;
Packit Service 9402ce
    int i;
Packit Service 9402ce
Packit Service 9402ce
    GetReqExtra(DRI2GetBuffers, count * 4, req);
Packit Service 9402ce
    req->reqType = info->codes->major_opcode;
Packit Service 9402ce
    req->dri2ReqType = X_DRI2GetBuffers;
Packit Service 9402ce
    req->drawable = drawable;
Packit Service 9402ce
    req->count = count;
Packit Service 9402ce
    p = (CARD32 *) &req[1];
Packit Service 9402ce
    for (i = 0; i < count; i++)
Packit Service 9402ce
	p[i] = attachments[i];
Packit Service 9402ce
Packit Service 9402ce
    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
Packit Service 9402ce
	return NULL;
Packit Service 9402ce
    }
Packit Service 9402ce
Packit Service 9402ce
    if (width)
Packit Service 9402ce
      *width = rep.width;
Packit Service 9402ce
    if (height)
Packit Service 9402ce
      *height = rep.height;
Packit Service 9402ce
    if (outCount)
Packit Service 9402ce
      *outCount = rep.count;
Packit Service 9402ce
Packit Service 9402ce
    buffers = Xmalloc(rep.count * sizeof buffers[0]);
Packit Service 9402ce
    if (buffers == NULL) {
Packit Service 9402ce
	_XEatData(dpy, rep.count * sizeof repBuffer);
Packit Service 9402ce
	return NULL;
Packit Service 9402ce
    }
Packit Service 9402ce
Packit Service 9402ce
    for (i = 0; i < rep.count; i++) {
Packit Service 9402ce
	_XReadPad(dpy, (char *) &repBuffer, sizeof repBuffer);
Packit Service 9402ce
	buffers[i].attachment = repBuffer.attachment;
Packit Service 9402ce
	buffers[i].name = repBuffer.name;
Packit Service 9402ce
	buffers[i].pitch = repBuffer.pitch;
Packit Service 9402ce
	buffers[i].cpp = repBuffer.cpp;
Packit Service 9402ce
	buffers[i].flags = repBuffer.flags;
Packit Service 9402ce
    }
Packit Service 9402ce
Packit Service 9402ce
    return buffers;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
VA_DRI2Buffer *VA_DRI2GetBuffers(Display *dpy, XID drawable,
Packit Service 9402ce
			   int *width, int *height,
Packit Service 9402ce
			   unsigned int *attachments, int count,
Packit Service 9402ce
			   int *outCount)
Packit Service 9402ce
{
Packit Service 9402ce
    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
Packit Service 9402ce
    VA_DRI2Buffer *buffers;
Packit Service 9402ce
Packit Service 9402ce
    XextCheckExtension (dpy, info, va_dri2ExtensionName, False);
Packit Service 9402ce
Packit Service 9402ce
    LockDisplay(dpy);
Packit Service 9402ce
Packit Service 9402ce
    buffers = VA_DRI2GetBuffers_internal(info, dpy, drawable, width, height,
Packit Service 9402ce
                                         attachments, count, outCount);
Packit Service 9402ce
Packit Service 9402ce
    UnlockDisplay(dpy);
Packit Service 9402ce
    SyncHandle();
Packit Service 9402ce
Packit Service 9402ce
    return buffers;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
void VA_DRI2CopyRegion(Display *dpy, XID drawable, XserverRegion region,
Packit Service 9402ce
		    CARD32 dest, CARD32 src)
Packit Service 9402ce
{
Packit Service 9402ce
    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
Packit Service 9402ce
    xDRI2CopyRegionReq *req;
Packit Service 9402ce
    xDRI2CopyRegionReply rep;
Packit Service 9402ce
Packit Service 9402ce
    XextSimpleCheckExtension (dpy, info, va_dri2ExtensionName);
Packit Service 9402ce
Packit Service 9402ce
    LockDisplay(dpy);
Packit Service 9402ce
    GetReq(DRI2CopyRegion, req);
Packit Service 9402ce
    req->reqType = info->codes->major_opcode;
Packit Service 9402ce
    req->dri2ReqType = X_DRI2CopyRegion;
Packit Service 9402ce
    req->drawable = drawable;
Packit Service 9402ce
    req->region = region;
Packit Service 9402ce
    req->dest = dest;
Packit Service 9402ce
    req->src = src;
Packit Service 9402ce
Packit Service 9402ce
    _XReply(dpy, (xReply *)&rep, 0, xFalse);
Packit Service 9402ce
Packit Service 9402ce
    UnlockDisplay(dpy);
Packit Service 9402ce
    SyncHandle();
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
static void
Packit Service 9402ce
load_swap_req(xDRI2SwapBuffersReq *req, CARD64 target, CARD64 divisor,
Packit Service 9402ce
              CARD64 remainder)
Packit Service 9402ce
{
Packit Service 9402ce
    req->target_msc_hi = target >> 32;
Packit Service 9402ce
    req->target_msc_lo = target & 0xffffffff;
Packit Service 9402ce
    req->divisor_hi = divisor >> 32;
Packit Service 9402ce
    req->divisor_lo = divisor & 0xffffffff;
Packit Service 9402ce
    req->remainder_hi = remainder >> 32;
Packit Service 9402ce
    req->remainder_lo = remainder & 0xffffffff;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
static CARD64
Packit Service 9402ce
vals_to_card64(CARD32 lo, CARD32 hi)
Packit Service 9402ce
{
Packit Service 9402ce
    return (CARD64)hi << 32 | lo;
Packit Service 9402ce
}
Packit Service 9402ce
Packit Service 9402ce
void VA_DRI2SwapBuffers(Display *dpy, XID drawable, CARD64 target_msc,
Packit Service 9402ce
                        CARD64 divisor, CARD64 remainder, CARD64 *count)
Packit Service 9402ce
{
Packit Service 9402ce
    XExtDisplayInfo *info = DRI2FindDisplay(dpy);
Packit Service 9402ce
    xDRI2SwapBuffersReq *req;
Packit Service 9402ce
    xDRI2SwapBuffersReply rep;
Packit Service 9402ce
Packit Service 9402ce
    XextSimpleCheckExtension (dpy, info, va_dri2ExtensionName);
Packit Service 9402ce
Packit Service 9402ce
    LockDisplay(dpy);
Packit Service 9402ce
    GetReq(DRI2SwapBuffers, req);
Packit Service 9402ce
    req->reqType = info->codes->major_opcode;
Packit Service 9402ce
    req->dri2ReqType = X_DRI2SwapBuffers;
Packit Service 9402ce
    req->drawable = drawable;
Packit Service 9402ce
    load_swap_req(req, target_msc, divisor, remainder);
Packit Service 9402ce
Packit Service 9402ce
    _XReply(dpy, (xReply *)&rep, 0, xFalse);
Packit Service 9402ce
Packit Service 9402ce
    *count = vals_to_card64(rep.swap_lo, rep.swap_hi);
Packit Service 9402ce
Packit Service 9402ce
    UnlockDisplay(dpy);
Packit Service 9402ce
    SyncHandle();
Packit Service 9402ce
}