Blame synfig-osx/launcher/appledri.c

Carlos Lopez a09598
/* $XFree86: xc/programs/Xserver/GL/dri/xf86dri.c,v 1.10 2000/12/07 20:26:14 dawes Exp $ */
Carlos Lopez a09598
/**************************************************************************
Carlos Lopez a09598
Carlos Lopez a09598
Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
Carlos Lopez a09598
Copyright 2000 VA Linux Systems, Inc.
Carlos Lopez a09598
Copyright (c) 2002 Apple Computer, Inc.
Carlos Lopez a09598
All Rights Reserved.
Carlos Lopez a09598
Carlos Lopez a09598
Permission is hereby granted, free of charge, to any person obtaining a
Carlos Lopez a09598
copy of this software and associated documentation files (the
Carlos Lopez a09598
"Software"), to deal in the Software without restriction, including
Carlos Lopez a09598
without limitation the rights to use, copy, modify, merge, publish,
Carlos Lopez a09598
distribute, sub license, and/or sell copies of the Software, and to
Carlos Lopez a09598
permit persons to whom the Software is furnished to do so, subject to
Carlos Lopez a09598
the following conditions:
Carlos Lopez a09598
Carlos Lopez a09598
The above copyright notice and this permission notice (including the
Carlos Lopez a09598
next paragraph) shall be included in all copies or substantial portions
Carlos Lopez a09598
of the Software.
Carlos Lopez a09598
Carlos Lopez a09598
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
Carlos Lopez a09598
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Carlos Lopez a09598
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
Carlos Lopez a09598
IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
Carlos Lopez a09598
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
Carlos Lopez a09598
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
Carlos Lopez a09598
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Carlos Lopez a09598
Carlos Lopez a09598
**************************************************************************/
Carlos Lopez a09598
Carlos Lopez a09598
/*
Carlos Lopez a09598
 * Authors:
Carlos Lopez a09598
 *   Kevin E. Martin <martin@valinux.com></martin@valinux.com>
Carlos Lopez a09598
 *   Jens Owen <jens@valinux.com></jens@valinux.com>
Carlos Lopez a09598
 *   Rickard E. (Rik) Faith <faith@valinux.com></faith@valinux.com>
Carlos Lopez a09598
 *
Carlos Lopez a09598
 */
Carlos Lopez a09598
Carlos Lopez a09598
#define NEED_REPLIES
Carlos Lopez a09598
#define NEED_EVENTS
Carlos Lopez a09598
#include "X.h"
Carlos Lopez a09598
#include "Xproto.h"
Carlos Lopez a09598
#include "misc.h"
Carlos Lopez a09598
#include "dixstruct.h"
Carlos Lopez a09598
#include "extnsionst.h"
Carlos Lopez a09598
#include "colormapst.h"
Carlos Lopez a09598
#include "cursorstr.h"
Carlos Lopez a09598
#include "scrnintstr.h"
Carlos Lopez a09598
#include "servermd.h"
Carlos Lopez a09598
#define _APPLEDRI_SERVER_
Carlos Lopez a09598
#include "appledristr.h"
Carlos Lopez a09598
#include "swaprep.h"
Carlos Lopez a09598
#include "dri.h"
Carlos Lopez a09598
#include "dri-surface.h"
Carlos Lopez a09598
#include "dristruct.h"
Carlos Lopez a09598
#include "rootless-common.h"
Carlos Lopez a09598
#include "X11Application.h"
Carlos Lopez a09598
Carlos Lopez a09598
static int DRIErrorBase;
Carlos Lopez a09598
Carlos Lopez a09598
static DISPATCH_PROC(ProcAppleDRIDispatch);
Carlos Lopez a09598
static DISPATCH_PROC(SProcAppleDRIDispatch);
Carlos Lopez a09598
Carlos Lopez a09598
static void AppleDRIResetProc(ExtensionEntry* extEntry);
Carlos Lopez a09598
Carlos Lopez a09598
static unsigned char DRIReqCode = 0;
Carlos Lopez a09598
static int DRIEventBase = 0;
Carlos Lopez a09598
Carlos Lopez a09598
extern void AppleDRIExtensionInit(void);
Carlos Lopez a09598
Carlos Lopez a09598
static void SNotifyEvent(xAppleDRINotifyEvent *from, xAppleDRINotifyEvent *to);
Carlos Lopez a09598
Carlos Lopez a09598
typedef struct _DRIEvent *DRIEventPtr;
Carlos Lopez a09598
typedef struct _DRIEvent {
Carlos Lopez a09598
    DRIEventPtr     next;
Carlos Lopez a09598
    ClientPtr	    client;
Carlos Lopez a09598
    XID		    clientResource;
Carlos Lopez a09598
    unsigned int    mask;
Carlos Lopez a09598
} DRIEventRec;
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
AppleDRIExtensionInit(void)
Carlos Lopez a09598
{
Carlos Lopez a09598
    ExtensionEntry* extEntry;
Carlos Lopez a09598
Carlos Lopez a09598
    if (DRIExtensionInit() &&
Carlos Lopez a09598
	(extEntry = AddExtension(APPLEDRINAME,
Carlos Lopez a09598
				 AppleDRINumberEvents,
Carlos Lopez a09598
				 AppleDRINumberErrors,
Carlos Lopez a09598
				 ProcAppleDRIDispatch,
Carlos Lopez a09598
				 SProcAppleDRIDispatch,
Carlos Lopez a09598
				 AppleDRIResetProc,
Carlos Lopez a09598
				 StandardMinorOpcode))) {
Carlos Lopez a09598
	DRIReqCode = (unsigned char)extEntry->base;
Carlos Lopez a09598
	DRIErrorBase = extEntry->errorBase;
Carlos Lopez a09598
	DRIEventBase = extEntry->eventBase;
Carlos Lopez a09598
	EventSwapVector[DRIEventBase] = (EventSwapPtr) SNotifyEvent;
Carlos Lopez a09598
    }
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
/*ARGSUSED*/
Carlos Lopez a09598
static void
Carlos Lopez a09598
AppleDRIResetProc (
Carlos Lopez a09598
    ExtensionEntry* extEntry
Carlos Lopez a09598
)
Carlos Lopez a09598
{
Carlos Lopez a09598
    DRIReset();
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
static int
Carlos Lopez a09598
ProcAppleDRIQueryVersion(
Carlos Lopez a09598
    register ClientPtr client
Carlos Lopez a09598
)
Carlos Lopez a09598
{
Carlos Lopez a09598
    xAppleDRIQueryVersionReply rep;
Carlos Lopez a09598
    register int n;
Carlos Lopez a09598
Carlos Lopez a09598
    REQUEST_SIZE_MATCH(xAppleDRIQueryVersionReq);
Carlos Lopez a09598
    rep.type = X_Reply;
Carlos Lopez a09598
    rep.length = 0;
Carlos Lopez a09598
    rep.sequenceNumber = client->sequence;
Carlos Lopez a09598
    rep.majorVersion = APPLE_DRI_MAJOR_VERSION;
Carlos Lopez a09598
    rep.minorVersion = APPLE_DRI_MINOR_VERSION;
Carlos Lopez a09598
    rep.patchVersion = APPLE_DRI_PATCH_VERSION;
Carlos Lopez a09598
    if (client->swapped) {
Carlos Lopez a09598
    	swaps(&rep.sequenceNumber, n);
Carlos Lopez a09598
    	swapl(&rep.length, n);
Carlos Lopez a09598
    }
Carlos Lopez a09598
    WriteToClient(client, sizeof(xAppleDRIQueryVersionReply), (char *)&rep);
Carlos Lopez a09598
    return (client->noClientException);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598

Carlos Lopez a09598
/* surfaces */
Carlos Lopez a09598
Carlos Lopez a09598
static int
Carlos Lopez a09598
ProcAppleDRIQueryDirectRenderingCapable(
Carlos Lopez a09598
    register ClientPtr client
Carlos Lopez a09598
)
Carlos Lopez a09598
{
Carlos Lopez a09598
    xAppleDRIQueryDirectRenderingCapableReply	rep;
Carlos Lopez a09598
    Bool isCapable;
Carlos Lopez a09598
Carlos Lopez a09598
    REQUEST(xAppleDRIQueryDirectRenderingCapableReq);
Carlos Lopez a09598
    REQUEST_SIZE_MATCH(xAppleDRIQueryDirectRenderingCapableReq);
Carlos Lopez a09598
    rep.type = X_Reply;
Carlos Lopez a09598
    rep.length = 0;
Carlos Lopez a09598
    rep.sequenceNumber = client->sequence;
Carlos Lopez a09598
Carlos Lopez a09598
    if (!DRIQueryDirectRenderingCapable( screenInfo.screens[stuff->screen], 
Carlos Lopez a09598
					 &isCapable)) {
Carlos Lopez a09598
	return BadValue;
Carlos Lopez a09598
    }
Carlos Lopez a09598
    rep.isCapable = isCapable;
Carlos Lopez a09598
Carlos Lopez a09598
    if (!LocalClient(client))
Carlos Lopez a09598
	rep.isCapable = 0;
Carlos Lopez a09598
Carlos Lopez a09598
    WriteToClient(client, 
Carlos Lopez a09598
	sizeof(xAppleDRIQueryDirectRenderingCapableReply), (char *)&rep);
Carlos Lopez a09598
    return (client->noClientException);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
static int
Carlos Lopez a09598
ProcAppleDRIAuthConnection(
Carlos Lopez a09598
    register ClientPtr client
Carlos Lopez a09598
)
Carlos Lopez a09598
{
Carlos Lopez a09598
    xAppleDRIAuthConnectionReply rep;
Carlos Lopez a09598
    
Carlos Lopez a09598
    REQUEST(xAppleDRIAuthConnectionReq);
Carlos Lopez a09598
    REQUEST_SIZE_MATCH(xAppleDRIAuthConnectionReq);
Carlos Lopez a09598
Carlos Lopez a09598
    rep.type = X_Reply;
Carlos Lopez a09598
    rep.length = 0;
Carlos Lopez a09598
    rep.sequenceNumber = client->sequence;
Carlos Lopez a09598
    rep.authenticated = 1;
Carlos Lopez a09598
Carlos Lopez a09598
    if (!DRIAuthConnection( screenInfo.screens[stuff->screen], stuff->magic)) {
Carlos Lopez a09598
        ErrorF("Failed to authenticate %u\n", stuff->magic);
Carlos Lopez a09598
	rep.authenticated = 0;
Carlos Lopez a09598
    }
Carlos Lopez a09598
    WriteToClient(client, sizeof(xAppleDRIAuthConnectionReply), (char *)&rep);
Carlos Lopez a09598
    return (client->noClientException);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
static void surface_notify (void *_arg, void *data)
Carlos Lopez a09598
{
Carlos Lopez a09598
    DRISurfaceNotifyArg *arg = _arg;
Carlos Lopez a09598
    int client_index = (int) data;
Carlos Lopez a09598
    ClientPtr client;
Carlos Lopez a09598
    xAppleDRINotifyEvent se;
Carlos Lopez a09598
Carlos Lopez a09598
    if (client_index < 0 || client_index >= currentMaxClients)
Carlos Lopez a09598
	return;
Carlos Lopez a09598
Carlos Lopez a09598
    client = clients[client_index];
Carlos Lopez a09598
    if (client == NULL || client == serverClient || client->clientGone)
Carlos Lopez a09598
	return;
Carlos Lopez a09598
Carlos Lopez a09598
    se.type = DRIEventBase + AppleDRISurfaceNotify;
Carlos Lopez a09598
    se.kind = arg->kind;
Carlos Lopez a09598
    se.arg = arg->id;
Carlos Lopez a09598
    se.sequenceNumber = client->sequence;
Carlos Lopez a09598
    se.time = currentTime.milliseconds;
Carlos Lopez a09598
    WriteEventsToClient (client, 1, (xEvent *) &se);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
static int
Carlos Lopez a09598
ProcAppleDRICreateSurface(
Carlos Lopez a09598
    ClientPtr client
Carlos Lopez a09598
)
Carlos Lopez a09598
{
Carlos Lopez a09598
    xAppleDRICreateSurfaceReply	rep;
Carlos Lopez a09598
    DrawablePtr pDrawable;
Carlos Lopez a09598
    xp_surface_id sid;
Carlos Lopez a09598
    unsigned int key[2];
Carlos Lopez a09598
Carlos Lopez a09598
    REQUEST(xAppleDRICreateSurfaceReq);
Carlos Lopez a09598
    REQUEST_SIZE_MATCH(xAppleDRICreateSurfaceReq);
Carlos Lopez a09598
    rep.type = X_Reply;
Carlos Lopez a09598
    rep.length = 0;
Carlos Lopez a09598
    rep.sequenceNumber = client->sequence;
Carlos Lopez a09598
Carlos Lopez a09598
    if (!(pDrawable = (DrawablePtr)SecurityLookupDrawable(
Carlos Lopez a09598
						(Drawable)stuff->drawable,
Carlos Lopez a09598
						client, 
Carlos Lopez a09598
						SecurityReadAccess))) {
Carlos Lopez a09598
	return BadValue;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    rep.key_0 = rep.key_1 = rep.uid = 0;
Carlos Lopez a09598
Carlos Lopez a09598
    if (!DRICreateSurface( screenInfo.screens[stuff->screen],
Carlos Lopez a09598
			   (Drawable)stuff->drawable, pDrawable,
Carlos Lopez a09598
			   stuff->client_id, &sid, key,
Carlos Lopez a09598
			   surface_notify, (void *) client->index)) {
Carlos Lopez a09598
	return BadValue;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    rep.key_0 = key[0];
Carlos Lopez a09598
    rep.key_1 = key[1];
Carlos Lopez a09598
    rep.uid = sid;
Carlos Lopez a09598
Carlos Lopez a09598
    WriteToClient(client, sizeof(xAppleDRICreateSurfaceReply), (char *)&rep);
Carlos Lopez a09598
    return (client->noClientException);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
static int
Carlos Lopez a09598
ProcAppleDRIDestroySurface(
Carlos Lopez a09598
    register ClientPtr client
Carlos Lopez a09598
)
Carlos Lopez a09598
{
Carlos Lopez a09598
    REQUEST(xAppleDRIDestroySurfaceReq);
Carlos Lopez a09598
    DrawablePtr pDrawable;
Carlos Lopez a09598
    REQUEST_SIZE_MATCH(xAppleDRIDestroySurfaceReq);
Carlos Lopez a09598
Carlos Lopez a09598
    if (!(pDrawable = (DrawablePtr)SecurityLookupDrawable(
Carlos Lopez a09598
						(Drawable)stuff->drawable,
Carlos Lopez a09598
						client, 
Carlos Lopez a09598
						SecurityReadAccess))) {
Carlos Lopez a09598
	return BadValue;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    if (!DRIDestroySurface( screenInfo.screens[stuff->screen], 
Carlos Lopez a09598
			    (Drawable)stuff->drawable,
Carlos Lopez a09598
			    pDrawable, NULL, NULL)) {
Carlos Lopez a09598
	return BadValue;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    return (client->noClientException);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598

Carlos Lopez a09598
/* dispatch */
Carlos Lopez a09598
Carlos Lopez a09598
static int
Carlos Lopez a09598
ProcAppleDRIDispatch (
Carlos Lopez a09598
    register ClientPtr	client
Carlos Lopez a09598
)
Carlos Lopez a09598
{
Carlos Lopez a09598
    REQUEST(xReq);
Carlos Lopez a09598
Carlos Lopez a09598
    switch (stuff->data)
Carlos Lopez a09598
    {
Carlos Lopez a09598
    case X_AppleDRIQueryVersion:
Carlos Lopez a09598
	return ProcAppleDRIQueryVersion(client);
Carlos Lopez a09598
    case X_AppleDRIQueryDirectRenderingCapable:
Carlos Lopez a09598
	return ProcAppleDRIQueryDirectRenderingCapable(client);
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    if (!LocalClient(client))
Carlos Lopez a09598
	return DRIErrorBase + AppleDRIClientNotLocal;
Carlos Lopez a09598
Carlos Lopez a09598
    switch (stuff->data)
Carlos Lopez a09598
    {
Carlos Lopez a09598
    case X_AppleDRIAuthConnection:
Carlos Lopez a09598
	return ProcAppleDRIAuthConnection(client);
Carlos Lopez a09598
    case X_AppleDRICreateSurface:
Carlos Lopez a09598
	return ProcAppleDRICreateSurface(client);
Carlos Lopez a09598
    case X_AppleDRIDestroySurface:
Carlos Lopez a09598
	return ProcAppleDRIDestroySurface(client);
Carlos Lopez a09598
    default:
Carlos Lopez a09598
	return BadRequest;
Carlos Lopez a09598
    }
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
static void
Carlos Lopez a09598
SNotifyEvent(from, to)
Carlos Lopez a09598
    xAppleDRINotifyEvent *from, *to;
Carlos Lopez a09598
{
Carlos Lopez a09598
    to->type = from->type;
Carlos Lopez a09598
    to->kind = from->kind;
Carlos Lopez a09598
    cpswaps (from->sequenceNumber, to->sequenceNumber);
Carlos Lopez a09598
    cpswapl (from->time, to->time);
Carlos Lopez a09598
    cpswapl (from->arg, to->arg);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
static int
Carlos Lopez a09598
SProcAppleDRIQueryVersion(
Carlos Lopez a09598
    register ClientPtr	client
Carlos Lopez a09598
)
Carlos Lopez a09598
{
Carlos Lopez a09598
    register int n;
Carlos Lopez a09598
    REQUEST(xAppleDRIQueryVersionReq);
Carlos Lopez a09598
    swaps(&stuff->length, n);
Carlos Lopez a09598
    return ProcAppleDRIQueryVersion(client);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
static int
Carlos Lopez a09598
SProcAppleDRIDispatch (
Carlos Lopez a09598
    register ClientPtr	client
Carlos Lopez a09598
)
Carlos Lopez a09598
{
Carlos Lopez a09598
    REQUEST(xReq);
Carlos Lopez a09598
Carlos Lopez a09598
    /* It is bound to be non-local when there is byte swapping */
Carlos Lopez a09598
    if (!LocalClient(client))
Carlos Lopez a09598
	return DRIErrorBase + AppleDRIClientNotLocal;
Carlos Lopez a09598
Carlos Lopez a09598
    /* only local clients are allowed DRI access */
Carlos Lopez a09598
    switch (stuff->data)
Carlos Lopez a09598
    {
Carlos Lopez a09598
    case X_AppleDRIQueryVersion:
Carlos Lopez a09598
	return SProcAppleDRIQueryVersion(client);
Carlos Lopez a09598
    default:
Carlos Lopez a09598
	return BadRequest;
Carlos Lopez a09598
    }
Carlos Lopez a09598
}