Blame tests/ttmtest/src/xf86dri.c

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