Blame tests/ttmtest/src/xf86dri.c

Packit Service 103f6b
/* $XFree86: xc/lib/GL/dri/XF86dri.c,v 1.13 2002/10/30 12:51:25 alanh Exp $ */
Packit Service 103f6b
/**************************************************************************
Packit Service 103f6b
Packit Service 103f6b
Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
Packit Service 103f6b
Copyright 2000 VA Linux Systems, Inc.
Packit Service 103f6b
All Rights Reserved.
Packit Service 103f6b
Packit Service 103f6b
Permission is hereby granted, free of charge, to any person obtaining a
Packit Service 103f6b
copy of this software and associated documentation files (the
Packit Service 103f6b
"Software"), to deal in the Software without restriction, including
Packit Service 103f6b
without limitation the rights to use, copy, modify, merge, publish,
Packit Service 103f6b
distribute, sub license, and/or sell copies of the Software, and to
Packit Service 103f6b
permit persons to whom the Software is furnished to do so, subject to
Packit Service 103f6b
the following conditions:
Packit Service 103f6b
Packit Service 103f6b
The above copyright notice and this permission notice (including the
Packit Service 103f6b
next paragraph) shall be included in all copies or substantial portions
Packit Service 103f6b
of the Software.
Packit Service 103f6b
Packit Service 103f6b
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
Packit Service 103f6b
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Packit Service 103f6b
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
Packit Service 103f6b
IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
Packit Service 103f6b
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
Packit Service 103f6b
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
Packit Service 103f6b
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Packit Service 103f6b
Packit Service 103f6b
**************************************************************************/
Packit Service 103f6b
Packit Service 103f6b
/*
Packit Service 103f6b
 * Authors:
Packit Service 103f6b
 *   Kevin E. Martin <martin@valinux.com>
Packit Service 103f6b
 *   Jens Owen <jens@tungstengraphics.com>
Packit Service 103f6b
 *   Rickard E. (Rik) Faith <faith@valinux.com>
Packit Service 103f6b
 *
Packit Service 103f6b
 */
Packit Service 103f6b
Packit Service 103f6b
/* THIS IS NOT AN X CONSORTIUM STANDARD */
Packit Service 103f6b
Packit Service 103f6b
#ifdef HAVE_CONFIG_H
Packit Service 103f6b
#include "config.h"
Packit Service 103f6b
#endif
Packit Service 103f6b
Packit Service 103f6b
#include <X11/Xlibint.h>
Packit Service 103f6b
#include <X11/extensions/Xext.h>
Packit Service 103f6b
#include <X11/extensions/extutil.h>
Packit Service 103f6b
#include <stdint.h>
Packit Service 103f6b
#include "xf86dristr.h"
Packit Service 103f6b
Packit Service 103f6b
static XExtensionInfo _xf86dri_info_data;
Packit Service 103f6b
static XExtensionInfo *xf86dri_info = &_xf86dri_info_data;
Packit Service 103f6b
static char xf86dri_extension_name[] = XF86DRINAME;
Packit Service 103f6b
Packit Service 103f6b
#define uniDRICheckExtension(dpy,i,val) \
Packit Service 103f6b
  XextCheckExtension (dpy, i, xf86dri_extension_name, val)
Packit Service 103f6b
Packit Service 103f6b
/*****************************************************************************
Packit Service 103f6b
 *                                                                           *
Packit Service 103f6b
 *			   private utility routines                          *
Packit Service 103f6b
 *                                                                           *
Packit Service 103f6b
 *****************************************************************************/
Packit Service 103f6b
Packit Service 103f6b
static int close_display(Display * dpy, XExtCodes * extCodes);
Packit Service 103f6b
static /* const */ XExtensionHooks xf86dri_extension_hooks = {
Packit Service 103f6b
    NULL,			       /* create_gc */
Packit Service 103f6b
    NULL,			       /* copy_gc */
Packit Service 103f6b
    NULL,			       /* flush_gc */
Packit Service 103f6b
    NULL,			       /* free_gc */
Packit Service 103f6b
    NULL,			       /* create_font */
Packit Service 103f6b
    NULL,			       /* free_font */
Packit Service 103f6b
    close_display,		       /* close_display */
Packit Service 103f6b
    NULL,			       /* wire_to_event */
Packit Service 103f6b
    NULL,			       /* event_to_wire */
Packit Service 103f6b
    NULL,			       /* error */
Packit Service 103f6b
    NULL,			       /* error_string */
Packit Service 103f6b
};
Packit Service 103f6b
Packit Service 103f6b
static
Packit Service 103f6b
XEXT_GENERATE_FIND_DISPLAY(find_display, xf86dri_info,
Packit Service 103f6b
    xf86dri_extension_name, &xf86dri_extension_hooks, 0, NULL)
Packit Service 103f6b
Packit Service 103f6b
    static XEXT_GENERATE_CLOSE_DISPLAY(close_display, xf86dri_info)
Packit Service 103f6b
Packit Service 103f6b
/*****************************************************************************
Packit Service 103f6b
 *                                                                           *
Packit Service 103f6b
 *		    public XFree86-DRI Extension routines                    *
Packit Service 103f6b
 *                                                                           *
Packit Service 103f6b
 *****************************************************************************/
Packit Service 103f6b
#if 0
Packit Service 103f6b
#include <stdio.h>
Packit Service 103f6b
#define TRACE(msg)  fprintf(stderr,"uniDRI%s\n", msg);
Packit Service 103f6b
#else
Packit Service 103f6b
#define TRACE(msg)
Packit Service 103f6b
#endif
Packit Service 103f6b
    Bool uniDRIQueryExtension(dpy, event_basep, error_basep)
Packit Service 103f6b
    Display *dpy;
Packit Service 103f6b
    int *event_basep, *error_basep;
Packit Service 103f6b
{
Packit Service 103f6b
    XExtDisplayInfo *info = find_display(dpy);
Packit Service 103f6b
Packit Service 103f6b
    TRACE("QueryExtension...");
Packit Service 103f6b
    if (XextHasExtension(info)) {
Packit Service 103f6b
	*event_basep = info->codes->first_event;
Packit Service 103f6b
	*error_basep = info->codes->first_error;
Packit Service 103f6b
	TRACE("QueryExtension... return True");
Packit Service 103f6b
	return True;
Packit Service 103f6b
    } else {
Packit Service 103f6b
	TRACE("QueryExtension... return False");
Packit Service 103f6b
	return False;
Packit Service 103f6b
    }
Packit Service 103f6b
}
Packit Service 103f6b
Packit Service 103f6b
Bool
Packit Service 103f6b
uniDRIQueryVersion(dpy, majorVersion, minorVersion, patchVersion)
Packit Service 103f6b
    Display *dpy;
Packit Service 103f6b
    int *majorVersion;
Packit Service 103f6b
    int *minorVersion;
Packit Service 103f6b
    int *patchVersion;
Packit Service 103f6b
{
Packit Service 103f6b
    XExtDisplayInfo *info = find_display(dpy);
Packit Service 103f6b
    xXF86DRIQueryVersionReply rep;
Packit Service 103f6b
    xXF86DRIQueryVersionReq *req;
Packit Service 103f6b
Packit Service 103f6b
    TRACE("QueryVersion...");
Packit Service 103f6b
    uniDRICheckExtension(dpy, info, False);
Packit Service 103f6b
Packit Service 103f6b
    LockDisplay(dpy);
Packit Service 103f6b
    GetReq(XF86DRIQueryVersion, req);
Packit Service 103f6b
    req->reqType = info->codes->major_opcode;
Packit Service 103f6b
    req->driReqType = X_XF86DRIQueryVersion;
Packit Service 103f6b
    if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
Packit Service 103f6b
	UnlockDisplay(dpy);
Packit Service 103f6b
	SyncHandle();
Packit Service 103f6b
	TRACE("QueryVersion... return False");
Packit Service 103f6b
	return False;
Packit Service 103f6b
    }
Packit Service 103f6b
    *majorVersion = rep.majorVersion;
Packit Service 103f6b
    *minorVersion = rep.minorVersion;
Packit Service 103f6b
    *patchVersion = rep.patchVersion;
Packit Service 103f6b
    UnlockDisplay(dpy);
Packit Service 103f6b
    SyncHandle();
Packit Service 103f6b
    TRACE("QueryVersion... return True");
Packit Service 103f6b
    return True;
Packit Service 103f6b
}
Packit Service 103f6b
Packit Service 103f6b
Bool
Packit Service 103f6b
uniDRIQueryDirectRenderingCapable(dpy, screen, isCapable)
Packit Service 103f6b
    Display *dpy;
Packit Service 103f6b
    int screen;
Packit Service 103f6b
    Bool *isCapable;
Packit Service 103f6b
{
Packit Service 103f6b
    XExtDisplayInfo *info = find_display(dpy);
Packit Service 103f6b
    xXF86DRIQueryDirectRenderingCapableReply rep;
Packit Service 103f6b
    xXF86DRIQueryDirectRenderingCapableReq *req;
Packit Service 103f6b
Packit Service 103f6b
    TRACE("QueryDirectRenderingCapable...");
Packit Service 103f6b
    uniDRICheckExtension(dpy, info, False);
Packit Service 103f6b
Packit Service 103f6b
    LockDisplay(dpy);
Packit Service 103f6b
    GetReq(XF86DRIQueryDirectRenderingCapable, req);
Packit Service 103f6b
    req->reqType = info->codes->major_opcode;
Packit Service 103f6b
    req->driReqType = X_XF86DRIQueryDirectRenderingCapable;
Packit Service 103f6b
    req->screen = screen;
Packit Service 103f6b
    if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
Packit Service 103f6b
	UnlockDisplay(dpy);
Packit Service 103f6b
	SyncHandle();
Packit Service 103f6b
	TRACE("QueryDirectRenderingCapable... return False");
Packit Service 103f6b
	return False;
Packit Service 103f6b
    }
Packit Service 103f6b
    *isCapable = rep.isCapable;
Packit Service 103f6b
    UnlockDisplay(dpy);
Packit Service 103f6b
    SyncHandle();
Packit Service 103f6b
    TRACE("QueryDirectRenderingCapable... return True");
Packit Service 103f6b
    return True;
Packit Service 103f6b
}
Packit Service 103f6b
Packit Service 103f6b
Bool
Packit Service 103f6b
uniDRIOpenConnection(dpy, screen, hSAREA, busIdString)
Packit Service 103f6b
    Display *dpy;
Packit Service 103f6b
    int screen;
Packit Service 103f6b
    drm_handle_t *hSAREA;
Packit Service 103f6b
    char **busIdString;
Packit Service 103f6b
{
Packit Service 103f6b
    XExtDisplayInfo *info = find_display(dpy);
Packit Service 103f6b
    xXF86DRIOpenConnectionReply rep;
Packit Service 103f6b
    xXF86DRIOpenConnectionReq *req;
Packit Service 103f6b
Packit Service 103f6b
    TRACE("OpenConnection...");
Packit Service 103f6b
    uniDRICheckExtension(dpy, info, False);
Packit Service 103f6b
Packit Service 103f6b
    LockDisplay(dpy);
Packit Service 103f6b
    GetReq(XF86DRIOpenConnection, req);
Packit Service 103f6b
    req->reqType = info->codes->major_opcode;
Packit Service 103f6b
    req->driReqType = X_XF86DRIOpenConnection;
Packit Service 103f6b
    req->screen = screen;
Packit Service 103f6b
    if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
Packit Service 103f6b
	UnlockDisplay(dpy);
Packit Service 103f6b
	SyncHandle();
Packit Service 103f6b
	TRACE("OpenConnection... return False");
Packit Service 103f6b
	return False;
Packit Service 103f6b
    }
Packit Service 103f6b
Packit Service 103f6b
    *hSAREA = rep.hSAREALow;
Packit Service 103f6b
#ifdef LONG64
Packit Service 103f6b
    if (sizeof(drm_handle_t) == 8) {
Packit Service 103f6b
	*hSAREA |= ((unsigned long)rep.hSAREAHigh) << 32;
Packit Service 103f6b
    }
Packit Service 103f6b
#endif
Packit Service 103f6b
    if (rep.length) {
Packit Service 103f6b
	if (!(*busIdString = (char *)Xcalloc(rep.busIdStringLength + 1, 1))) {
Packit Service 103f6b
	    _XEatData(dpy, ((rep.busIdStringLength + 3) & ~3));
Packit Service 103f6b
	    UnlockDisplay(dpy);
Packit Service 103f6b
	    SyncHandle();
Packit Service 103f6b
	    TRACE("OpenConnection... return False");
Packit Service 103f6b
	    return False;
Packit Service 103f6b
	}
Packit Service 103f6b
	_XReadPad(dpy, *busIdString, rep.busIdStringLength);
Packit Service 103f6b
    } else {
Packit Service 103f6b
	*busIdString = NULL;
Packit Service 103f6b
    }
Packit Service 103f6b
    UnlockDisplay(dpy);
Packit Service 103f6b
    SyncHandle();
Packit Service 103f6b
    TRACE("OpenConnection... return True");
Packit Service 103f6b
    return True;
Packit Service 103f6b
}
Packit Service 103f6b
Packit Service 103f6b
Bool
Packit Service 103f6b
uniDRIAuthConnection(dpy, screen, magic)
Packit Service 103f6b
    Display *dpy;
Packit Service 103f6b
    int screen;
Packit Service 103f6b
    drm_magic_t magic;
Packit Service 103f6b
{
Packit Service 103f6b
    XExtDisplayInfo *info = find_display(dpy);
Packit Service 103f6b
    xXF86DRIAuthConnectionReq *req;
Packit Service 103f6b
    xXF86DRIAuthConnectionReply rep;
Packit Service 103f6b
Packit Service 103f6b
    TRACE("AuthConnection...");
Packit Service 103f6b
    uniDRICheckExtension(dpy, info, False);
Packit Service 103f6b
Packit Service 103f6b
    LockDisplay(dpy);
Packit Service 103f6b
    GetReq(XF86DRIAuthConnection, req);
Packit Service 103f6b
    req->reqType = info->codes->major_opcode;
Packit Service 103f6b
    req->driReqType = X_XF86DRIAuthConnection;
Packit Service 103f6b
    req->screen = screen;
Packit Service 103f6b
    req->magic = magic;
Packit Service 103f6b
    rep.authenticated = 0;
Packit Service 103f6b
    if (!_XReply(dpy, (xReply *) & rep, 0, xFalse) || !rep.authenticated) {
Packit Service 103f6b
	UnlockDisplay(dpy);
Packit Service 103f6b
	SyncHandle();
Packit Service 103f6b
	TRACE("AuthConnection... return False");
Packit Service 103f6b
	return False;
Packit Service 103f6b
    }
Packit Service 103f6b
    UnlockDisplay(dpy);
Packit Service 103f6b
    SyncHandle();
Packit Service 103f6b
    TRACE("AuthConnection... return True");
Packit Service 103f6b
    return True;
Packit Service 103f6b
}
Packit Service 103f6b
Packit Service 103f6b
Bool
Packit Service 103f6b
uniDRICloseConnection(dpy, screen)
Packit Service 103f6b
    Display *dpy;
Packit Service 103f6b
    int screen;
Packit Service 103f6b
{
Packit Service 103f6b
    XExtDisplayInfo *info = find_display(dpy);
Packit Service 103f6b
    xXF86DRICloseConnectionReq *req;
Packit Service 103f6b
Packit Service 103f6b
    TRACE("CloseConnection...");
Packit Service 103f6b
Packit Service 103f6b
    uniDRICheckExtension(dpy, info, False);
Packit Service 103f6b
Packit Service 103f6b
    LockDisplay(dpy);
Packit Service 103f6b
    GetReq(XF86DRICloseConnection, req);
Packit Service 103f6b
    req->reqType = info->codes->major_opcode;
Packit Service 103f6b
    req->driReqType = X_XF86DRICloseConnection;
Packit Service 103f6b
    req->screen = screen;
Packit Service 103f6b
    UnlockDisplay(dpy);
Packit Service 103f6b
    SyncHandle();
Packit Service 103f6b
    TRACE("CloseConnection... return True");
Packit Service 103f6b
    return True;
Packit Service 103f6b
}
Packit Service 103f6b
Packit Service 103f6b
Bool
Packit Service 103f6b
uniDRIGetClientDriverName(dpy, screen, ddxDriverMajorVersion,
Packit Service 103f6b
    ddxDriverMinorVersion, ddxDriverPatchVersion, clientDriverName)
Packit Service 103f6b
    Display *dpy;
Packit Service 103f6b
    int screen;
Packit Service 103f6b
    int *ddxDriverMajorVersion;
Packit Service 103f6b
    int *ddxDriverMinorVersion;
Packit Service 103f6b
    int *ddxDriverPatchVersion;
Packit Service 103f6b
    char **clientDriverName;
Packit Service 103f6b
{
Packit Service 103f6b
    XExtDisplayInfo *info = find_display(dpy);
Packit Service 103f6b
    xXF86DRIGetClientDriverNameReply rep;
Packit Service 103f6b
    xXF86DRIGetClientDriverNameReq *req;
Packit Service 103f6b
Packit Service 103f6b
    TRACE("GetClientDriverName...");
Packit Service 103f6b
    uniDRICheckExtension(dpy, info, False);
Packit Service 103f6b
Packit Service 103f6b
    LockDisplay(dpy);
Packit Service 103f6b
    GetReq(XF86DRIGetClientDriverName, req);
Packit Service 103f6b
    req->reqType = info->codes->major_opcode;
Packit Service 103f6b
    req->driReqType = X_XF86DRIGetClientDriverName;
Packit Service 103f6b
    req->screen = screen;
Packit Service 103f6b
    if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
Packit Service 103f6b
	UnlockDisplay(dpy);
Packit Service 103f6b
	SyncHandle();
Packit Service 103f6b
	TRACE("GetClientDriverName... return False");
Packit Service 103f6b
	return False;
Packit Service 103f6b
    }
Packit Service 103f6b
Packit Service 103f6b
    *ddxDriverMajorVersion = rep.ddxDriverMajorVersion;
Packit Service 103f6b
    *ddxDriverMinorVersion = rep.ddxDriverMinorVersion;
Packit Service 103f6b
    *ddxDriverPatchVersion = rep.ddxDriverPatchVersion;
Packit Service 103f6b
Packit Service 103f6b
    if (rep.length) {
Packit Service 103f6b
	if (!(*clientDriverName =
Packit Service 103f6b
		(char *)Xcalloc(rep.clientDriverNameLength + 1, 1))) {
Packit Service 103f6b
	    _XEatData(dpy, ((rep.clientDriverNameLength + 3) & ~3));
Packit Service 103f6b
	    UnlockDisplay(dpy);
Packit Service 103f6b
	    SyncHandle();
Packit Service 103f6b
	    TRACE("GetClientDriverName... return False");
Packit Service 103f6b
	    return False;
Packit Service 103f6b
	}
Packit Service 103f6b
	_XReadPad(dpy, *clientDriverName, rep.clientDriverNameLength);
Packit Service 103f6b
    } else {
Packit Service 103f6b
	*clientDriverName = NULL;
Packit Service 103f6b
    }
Packit Service 103f6b
    UnlockDisplay(dpy);
Packit Service 103f6b
    SyncHandle();
Packit Service 103f6b
    TRACE("GetClientDriverName... return True");
Packit Service 103f6b
    return True;
Packit Service 103f6b
}
Packit Service 103f6b
Packit Service 103f6b
Bool
Packit Service 103f6b
uniDRICreateContextWithConfig(dpy, screen, configID, context, hHWContext)
Packit Service 103f6b
    Display *dpy;
Packit Service 103f6b
    int screen;
Packit Service 103f6b
    int configID;
Packit Service 103f6b
    XID *context;
Packit Service 103f6b
    drm_context_t *hHWContext;
Packit Service 103f6b
{
Packit Service 103f6b
    XExtDisplayInfo *info = find_display(dpy);
Packit Service 103f6b
    xXF86DRICreateContextReply rep;
Packit Service 103f6b
    xXF86DRICreateContextReq *req;
Packit Service 103f6b
Packit Service 103f6b
    TRACE("CreateContext...");
Packit Service 103f6b
    uniDRICheckExtension(dpy, info, False);
Packit Service 103f6b
Packit Service 103f6b
    LockDisplay(dpy);
Packit Service 103f6b
    GetReq(XF86DRICreateContext, req);
Packit Service 103f6b
    req->reqType = info->codes->major_opcode;
Packit Service 103f6b
    req->driReqType = X_XF86DRICreateContext;
Packit Service 103f6b
    req->visual = configID;
Packit Service 103f6b
    req->screen = screen;
Packit Service 103f6b
    *context = XAllocID(dpy);
Packit Service 103f6b
    req->context = *context;
Packit Service 103f6b
    if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
Packit Service 103f6b
	UnlockDisplay(dpy);
Packit Service 103f6b
	SyncHandle();
Packit Service 103f6b
	TRACE("CreateContext... return False");
Packit Service 103f6b
	return False;
Packit Service 103f6b
    }
Packit Service 103f6b
    *hHWContext = rep.hHWContext;
Packit Service 103f6b
    UnlockDisplay(dpy);
Packit Service 103f6b
    SyncHandle();
Packit Service 103f6b
    TRACE("CreateContext... return True");
Packit Service 103f6b
    return True;
Packit Service 103f6b
}
Packit Service 103f6b
Packit Service 103f6b
Bool
Packit Service 103f6b
uniDRICreateContext(dpy, screen, visual, context, hHWContext)
Packit Service 103f6b
    Display *dpy;
Packit Service 103f6b
    int screen;
Packit Service 103f6b
    Visual *visual;
Packit Service 103f6b
    XID *context;
Packit Service 103f6b
    drm_context_t *hHWContext;
Packit Service 103f6b
{
Packit Service 103f6b
    return uniDRICreateContextWithConfig(dpy, screen, visual->visualid,
Packit Service 103f6b
	context, hHWContext);
Packit Service 103f6b
}
Packit Service 103f6b
Packit Service 103f6b
Bool
Packit Service 103f6b
uniDRIDestroyContext(Display * ndpy, int screen, XID context)
Packit Service 103f6b
{
Packit Service 103f6b
    Display *const dpy = (Display *) ndpy;
Packit Service 103f6b
    XExtDisplayInfo *info = find_display(dpy);
Packit Service 103f6b
    xXF86DRIDestroyContextReq *req;
Packit Service 103f6b
Packit Service 103f6b
    TRACE("DestroyContext...");
Packit Service 103f6b
    uniDRICheckExtension(dpy, info, False);
Packit Service 103f6b
Packit Service 103f6b
    LockDisplay(dpy);
Packit Service 103f6b
    GetReq(XF86DRIDestroyContext, req);
Packit Service 103f6b
    req->reqType = info->codes->major_opcode;
Packit Service 103f6b
    req->driReqType = X_XF86DRIDestroyContext;
Packit Service 103f6b
    req->screen = screen;
Packit Service 103f6b
    req->context = context;
Packit Service 103f6b
    UnlockDisplay(dpy);
Packit Service 103f6b
    SyncHandle();
Packit Service 103f6b
    TRACE("DestroyContext... return True");
Packit Service 103f6b
    return True;
Packit Service 103f6b
}
Packit Service 103f6b
Packit Service 103f6b
Bool
Packit Service 103f6b
uniDRICreateDrawable(Display * ndpy, int screen,
Packit Service 103f6b
    Drawable drawable, drm_drawable_t * hHWDrawable)
Packit Service 103f6b
{
Packit Service 103f6b
    Display *const dpy = (Display *) ndpy;
Packit Service 103f6b
    XExtDisplayInfo *info = find_display(dpy);
Packit Service 103f6b
    xXF86DRICreateDrawableReply rep;
Packit Service 103f6b
    xXF86DRICreateDrawableReq *req;
Packit Service 103f6b
Packit Service 103f6b
    TRACE("CreateDrawable...");
Packit Service 103f6b
    uniDRICheckExtension(dpy, info, False);
Packit Service 103f6b
Packit Service 103f6b
    LockDisplay(dpy);
Packit Service 103f6b
    GetReq(XF86DRICreateDrawable, req);
Packit Service 103f6b
    req->reqType = info->codes->major_opcode;
Packit Service 103f6b
    req->driReqType = X_XF86DRICreateDrawable;
Packit Service 103f6b
    req->screen = screen;
Packit Service 103f6b
    req->drawable = drawable;
Packit Service 103f6b
    if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
Packit Service 103f6b
	UnlockDisplay(dpy);
Packit Service 103f6b
	SyncHandle();
Packit Service 103f6b
	TRACE("CreateDrawable... return False");
Packit Service 103f6b
	return False;
Packit Service 103f6b
    }
Packit Service 103f6b
    *hHWDrawable = rep.hHWDrawable;
Packit Service 103f6b
    UnlockDisplay(dpy);
Packit Service 103f6b
    SyncHandle();
Packit Service 103f6b
    TRACE("CreateDrawable... return True");
Packit Service 103f6b
    return True;
Packit Service 103f6b
}
Packit Service 103f6b
Packit Service 103f6b
Bool
Packit Service 103f6b
uniDRIDestroyDrawable(Display * ndpy, int screen, Drawable drawable)
Packit Service 103f6b
{
Packit Service 103f6b
    Display *const dpy = (Display *) ndpy;
Packit Service 103f6b
    XExtDisplayInfo *info = find_display(dpy);
Packit Service 103f6b
    xXF86DRIDestroyDrawableReq *req;
Packit Service 103f6b
Packit Service 103f6b
    TRACE("DestroyDrawable...");
Packit Service 103f6b
    uniDRICheckExtension(dpy, info, False);
Packit Service 103f6b
Packit Service 103f6b
    LockDisplay(dpy);
Packit Service 103f6b
    GetReq(XF86DRIDestroyDrawable, req);
Packit Service 103f6b
    req->reqType = info->codes->major_opcode;
Packit Service 103f6b
    req->driReqType = X_XF86DRIDestroyDrawable;
Packit Service 103f6b
    req->screen = screen;
Packit Service 103f6b
    req->drawable = drawable;
Packit Service 103f6b
    UnlockDisplay(dpy);
Packit Service 103f6b
    SyncHandle();
Packit Service 103f6b
    TRACE("DestroyDrawable... return True");
Packit Service 103f6b
    return True;
Packit Service 103f6b
}
Packit Service 103f6b
Packit Service 103f6b
Bool
Packit Service 103f6b
uniDRIGetDrawableInfo(Display * dpy, int screen, Drawable drawable,
Packit Service 103f6b
    unsigned int *index, unsigned int *stamp,
Packit Service 103f6b
    int *X, int *Y, int *W, int *H,
Packit Service 103f6b
    int *numClipRects, drm_clip_rect_t ** pClipRects,
Packit Service 103f6b
    int *backX, int *backY,
Packit Service 103f6b
    int *numBackClipRects, drm_clip_rect_t ** pBackClipRects)
Packit Service 103f6b
{
Packit Service 103f6b
    XExtDisplayInfo *info = find_display(dpy);
Packit Service 103f6b
    xXF86DRIGetDrawableInfoReply rep;
Packit Service 103f6b
    xXF86DRIGetDrawableInfoReq *req;
Packit Service 103f6b
    int total_rects;
Packit Service 103f6b
Packit Service 103f6b
    TRACE("GetDrawableInfo...");
Packit Service 103f6b
    uniDRICheckExtension(dpy, info, False);
Packit Service 103f6b
Packit Service 103f6b
    LockDisplay(dpy);
Packit Service 103f6b
    GetReq(XF86DRIGetDrawableInfo, req);
Packit Service 103f6b
    req->reqType = info->codes->major_opcode;
Packit Service 103f6b
    req->driReqType = X_XF86DRIGetDrawableInfo;
Packit Service 103f6b
    req->screen = screen;
Packit Service 103f6b
    req->drawable = drawable;
Packit Service 103f6b
Packit Service 103f6b
    if (!_XReply(dpy, (xReply *) & rep, 1, xFalse)) {
Packit Service 103f6b
	UnlockDisplay(dpy);
Packit Service 103f6b
	SyncHandle();
Packit Service 103f6b
	TRACE("GetDrawableInfo... return False");
Packit Service 103f6b
	return False;
Packit Service 103f6b
    }
Packit Service 103f6b
    *index = rep.drawableTableIndex;
Packit Service 103f6b
    *stamp = rep.drawableTableStamp;
Packit Service 103f6b
    *X = (int)rep.drawableX;
Packit Service 103f6b
    *Y = (int)rep.drawableY;
Packit Service 103f6b
    *W = (int)rep.drawableWidth;
Packit Service 103f6b
    *H = (int)rep.drawableHeight;
Packit Service 103f6b
    *numClipRects = rep.numClipRects;
Packit Service 103f6b
    total_rects = *numClipRects;
Packit Service 103f6b
Packit Service 103f6b
    *backX = rep.backX;
Packit Service 103f6b
    *backY = rep.backY;
Packit Service 103f6b
    *numBackClipRects = rep.numBackClipRects;
Packit Service 103f6b
    total_rects += *numBackClipRects;
Packit Service 103f6b
Packit Service 103f6b
#if 0
Packit Service 103f6b
    /* Because of the fix in Xserver/GL/dri/xf86dri.c, this check breaks
Packit Service 103f6b
     * backwards compatibility (Because of the >> 2 shift) but the fix
Packit Service 103f6b
     * enables multi-threaded apps to work.
Packit Service 103f6b
     */
Packit Service 103f6b
    if (rep.length != ((((SIZEOF(xXF86DRIGetDrawableInfoReply) -
Packit Service 103f6b
			SIZEOF(xGenericReply) +
Packit Service 103f6b
			total_rects * sizeof(drm_clip_rect_t)) +
Packit Service 103f6b
		    3) & ~3) >> 2)) {
Packit Service 103f6b
	_XEatData(dpy, rep.length);
Packit Service 103f6b
	UnlockDisplay(dpy);
Packit Service 103f6b
	SyncHandle();
Packit Service 103f6b
	TRACE("GetDrawableInfo... return False");
Packit Service 103f6b
	return False;
Packit Service 103f6b
    }
Packit Service 103f6b
#endif
Packit Service 103f6b
Packit Service 103f6b
    if (*numClipRects) {
Packit Service 103f6b
	int len = sizeof(drm_clip_rect_t) * (*numClipRects);
Packit Service 103f6b
Packit Service 103f6b
	*pClipRects = (drm_clip_rect_t *) Xcalloc(len, 1);
Packit Service 103f6b
	if (*pClipRects)
Packit Service 103f6b
	    _XRead(dpy, (char *)*pClipRects, len);
Packit Service 103f6b
    } else {
Packit Service 103f6b
	*pClipRects = NULL;
Packit Service 103f6b
    }
Packit Service 103f6b
Packit Service 103f6b
    if (*numBackClipRects) {
Packit Service 103f6b
	int len = sizeof(drm_clip_rect_t) * (*numBackClipRects);
Packit Service 103f6b
Packit Service 103f6b
	*pBackClipRects = (drm_clip_rect_t *) Xcalloc(len, 1);
Packit Service 103f6b
	if (*pBackClipRects)
Packit Service 103f6b
	    _XRead(dpy, (char *)*pBackClipRects, len);
Packit Service 103f6b
    } else {
Packit Service 103f6b
	*pBackClipRects = NULL;
Packit Service 103f6b
    }
Packit Service 103f6b
Packit Service 103f6b
    UnlockDisplay(dpy);
Packit Service 103f6b
    SyncHandle();
Packit Service 103f6b
    TRACE("GetDrawableInfo... return True");
Packit Service 103f6b
    return True;
Packit Service 103f6b
}
Packit Service 103f6b
Packit Service 103f6b
Bool
Packit Service 103f6b
uniDRIGetDeviceInfo(dpy, screen, hFrameBuffer,
Packit Service 103f6b
    fbOrigin, fbSize, fbStride, devPrivateSize, pDevPrivate)
Packit Service 103f6b
    Display *dpy;
Packit Service 103f6b
    int screen;
Packit Service 103f6b
    drm_handle_t *hFrameBuffer;
Packit Service 103f6b
    int *fbOrigin;
Packit Service 103f6b
    int *fbSize;
Packit Service 103f6b
    int *fbStride;
Packit Service 103f6b
    int *devPrivateSize;
Packit Service 103f6b
    void **pDevPrivate;
Packit Service 103f6b
{
Packit Service 103f6b
    XExtDisplayInfo *info = find_display(dpy);
Packit Service 103f6b
    xXF86DRIGetDeviceInfoReply rep;
Packit Service 103f6b
    xXF86DRIGetDeviceInfoReq *req;
Packit Service 103f6b
Packit Service 103f6b
    TRACE("GetDeviceInfo...");
Packit Service 103f6b
    uniDRICheckExtension(dpy, info, False);
Packit Service 103f6b
Packit Service 103f6b
    LockDisplay(dpy);
Packit Service 103f6b
    GetReq(XF86DRIGetDeviceInfo, req);
Packit Service 103f6b
    req->reqType = info->codes->major_opcode;
Packit Service 103f6b
    req->driReqType = X_XF86DRIGetDeviceInfo;
Packit Service 103f6b
    req->screen = screen;
Packit Service 103f6b
    if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
Packit Service 103f6b
	UnlockDisplay(dpy);
Packit Service 103f6b
	SyncHandle();
Packit Service 103f6b
	TRACE("GetDeviceInfo... return False");
Packit Service 103f6b
	return False;
Packit Service 103f6b
    }
Packit Service 103f6b
Packit Service 103f6b
    *hFrameBuffer = rep.hFrameBufferLow;
Packit Service 103f6b
#ifdef LONG64
Packit Service 103f6b
    if (sizeof(drm_handle_t) == 8) {
Packit Service 103f6b
	*hFrameBuffer |= ((unsigned long)rep.hFrameBufferHigh) << 32;
Packit Service 103f6b
    }
Packit Service 103f6b
#endif
Packit Service 103f6b
Packit Service 103f6b
    *fbOrigin = rep.framebufferOrigin;
Packit Service 103f6b
    *fbSize = rep.framebufferSize;
Packit Service 103f6b
    *fbStride = rep.framebufferStride;
Packit Service 103f6b
    *devPrivateSize = rep.devPrivateSize;
Packit Service 103f6b
Packit Service 103f6b
    if (rep.length) {
Packit Service 103f6b
	if (!(*pDevPrivate = (void *)Xcalloc(rep.devPrivateSize, 1))) {
Packit Service 103f6b
	    _XEatData(dpy, ((rep.devPrivateSize + 3) & ~3));
Packit Service 103f6b
	    UnlockDisplay(dpy);
Packit Service 103f6b
	    SyncHandle();
Packit Service 103f6b
	    TRACE("GetDeviceInfo... return False");
Packit Service 103f6b
	    return False;
Packit Service 103f6b
	}
Packit Service 103f6b
	_XRead(dpy, (char *)*pDevPrivate, rep.devPrivateSize);
Packit Service 103f6b
    } else {
Packit Service 103f6b
	*pDevPrivate = NULL;
Packit Service 103f6b
    }
Packit Service 103f6b
Packit Service 103f6b
    UnlockDisplay(dpy);
Packit Service 103f6b
    SyncHandle();
Packit Service 103f6b
    TRACE("GetDeviceInfo... return True");
Packit Service 103f6b
    return True;
Packit Service 103f6b
}