1706f2543Smrg/*
2706f2543Smrg * Copyright (c) 1995  Jon Tombs
3706f2543Smrg * Copyright (c) 1995, 1996, 1999  XFree86 Inc
4706f2543Smrg * Copyright (c) 1999 - The XFree86 Project Inc.
5706f2543Smrg *
6706f2543Smrg * Written by Mark Vojkovich
7706f2543Smrg */
8706f2543Smrg
9706f2543Smrg
10706f2543Smrg#ifdef HAVE_XORG_CONFIG_H
11706f2543Smrg#include <xorg-config.h>
12706f2543Smrg#endif
13706f2543Smrg
14706f2543Smrg#include <X11/X.h>
15706f2543Smrg#include <X11/Xproto.h>
16706f2543Smrg#include "misc.h"
17706f2543Smrg#include "dixstruct.h"
18706f2543Smrg#include "dixevents.h"
19706f2543Smrg#include "pixmapstr.h"
20706f2543Smrg#include "extnsionst.h"
21706f2543Smrg#include "colormapst.h"
22706f2543Smrg#include "cursorstr.h"
23706f2543Smrg#include "scrnintstr.h"
24706f2543Smrg#include "servermd.h"
25706f2543Smrg#include <X11/extensions/xf86dgaproto.h>
26706f2543Smrg#include "swaprep.h"
27706f2543Smrg#include "dgaproc.h"
28706f2543Smrg#include "protocol-versions.h"
29706f2543Smrg
30706f2543Smrg#include <string.h>
31706f2543Smrg
32706f2543Smrg#include "modinit.h"
33706f2543Smrg
34706f2543Smrg#define DGA_PROTOCOL_OLD_SUPPORT 1
35706f2543Smrg
36706f2543Smrg
37706f2543Smrgstatic void XDGAResetProc(ExtensionEntry *extEntry);
38706f2543Smrg
39706f2543Smrgstatic void DGAClientStateChange (CallbackListPtr*, pointer, pointer);
40706f2543Smrg
41706f2543Smrgunsigned char DGAReqCode = 0;
42706f2543Smrgint DGAErrorBase;
43706f2543Smrgint DGAEventBase;
44706f2543Smrg
45706f2543Smrgstatic DevPrivateKeyRec DGAScreenPrivateKeyRec;
46706f2543Smrg#define DGAScreenPrivateKey (&DGAScreenPrivateKeyRec)
47706f2543Smrg#define DGAScreenPrivateKeyRegistered (DGAScreenPrivateKeyRec.initialized)
48706f2543Smrgstatic DevPrivateKeyRec DGAClientPrivateKeyRec;
49706f2543Smrg#define DGAClientPrivateKey (&DGAClientPrivateKeyRec)
50706f2543Smrgstatic int DGACallbackRefCount = 0;
51706f2543Smrg
52706f2543Smrg/* This holds the client's version information */
53706f2543Smrgtypedef struct {
54706f2543Smrg    int		major;
55706f2543Smrg    int		minor;
56706f2543Smrg} DGAPrivRec, *DGAPrivPtr;
57706f2543Smrg
58706f2543Smrg#define DGA_GETCLIENT(idx) ((ClientPtr) \
59706f2543Smrg    dixLookupPrivate(&screenInfo.screens[idx]->devPrivates, DGAScreenPrivateKey))
60706f2543Smrg#define DGA_SETCLIENT(idx,p) \
61706f2543Smrg    dixSetPrivate(&screenInfo.screens[idx]->devPrivates, DGAScreenPrivateKey, p)
62706f2543Smrg
63706f2543Smrg#define DGA_GETPRIV(c) ((DGAPrivPtr) \
64706f2543Smrg    dixLookupPrivate(&(c)->devPrivates, DGAClientPrivateKey))
65706f2543Smrg#define DGA_SETPRIV(c,p) \
66706f2543Smrg    dixSetPrivate(&(c)->devPrivates, DGAClientPrivateKey, p)
67706f2543Smrg
68706f2543Smrg
69706f2543Smrgstatic void
70706f2543SmrgXDGAResetProc (ExtensionEntry *extEntry)
71706f2543Smrg{
72706f2543Smrg   DeleteCallback (&ClientStateCallback, DGAClientStateChange, NULL);
73706f2543Smrg   DGACallbackRefCount = 0;
74706f2543Smrg}
75706f2543Smrg
76706f2543Smrg
77706f2543Smrgstatic int
78706f2543SmrgProcXDGAQueryVersion(ClientPtr client)
79706f2543Smrg{
80706f2543Smrg    xXDGAQueryVersionReply rep;
81706f2543Smrg
82706f2543Smrg    REQUEST_SIZE_MATCH(xXDGAQueryVersionReq);
83706f2543Smrg    rep.type = X_Reply;
84706f2543Smrg    rep.length = 0;
85706f2543Smrg    rep.sequenceNumber = client->sequence;
86706f2543Smrg    rep.majorVersion = SERVER_XDGA_MAJOR_VERSION;
87706f2543Smrg    rep.minorVersion = SERVER_XDGA_MINOR_VERSION;
88706f2543Smrg
89706f2543Smrg    WriteToClient(client, sizeof(xXDGAQueryVersionReply), (char *)&rep);
90706f2543Smrg    return Success;
91706f2543Smrg}
92706f2543Smrg
93706f2543Smrg
94706f2543Smrgstatic int
95706f2543SmrgProcXDGAOpenFramebuffer(ClientPtr client)
96706f2543Smrg{
97706f2543Smrg    REQUEST(xXDGAOpenFramebufferReq);
9848a68b89Smrg
9948a68b89Smrg    REQUEST_SIZE_MATCH(xXDGAOpenFramebufferReq);
10048a68b89Smrg
101706f2543Smrg    xXDGAOpenFramebufferReply rep;
102706f2543Smrg    char *deviceName;
103706f2543Smrg    int nameSize;
104706f2543Smrg
105706f2543Smrg    if (stuff->screen >= screenInfo.numScreens)
106706f2543Smrg        return BadValue;
107706f2543Smrg
108706f2543Smrg    if (!DGAAvailable(stuff->screen))
109706f2543Smrg        return DGAErrorBase + XF86DGANoDirectVideoMode;
110706f2543Smrg
111706f2543Smrg    rep.type = X_Reply;
112706f2543Smrg    rep.length = 0;
113706f2543Smrg    rep.sequenceNumber = client->sequence;
114706f2543Smrg
115706f2543Smrg    if(!DGAOpenFramebuffer(stuff->screen, &deviceName,
116706f2543Smrg			(unsigned char**)(&rep.mem1),
117706f2543Smrg			(int*)&rep.size, (int*)&rep.offset, (int*)&rep.extra))
118706f2543Smrg    {
119706f2543Smrg	return BadAlloc;
120706f2543Smrg    }
121706f2543Smrg
122706f2543Smrg    nameSize = deviceName ? (strlen(deviceName) + 1) : 0;
123706f2543Smrg    rep.length = bytes_to_int32(nameSize);
124706f2543Smrg
125706f2543Smrg    WriteToClient(client, sizeof(xXDGAOpenFramebufferReply), (char *)&rep);
126706f2543Smrg    if(rep.length)
127706f2543Smrg	WriteToClient(client, nameSize, deviceName);
128706f2543Smrg
129706f2543Smrg    return Success;
130706f2543Smrg}
131706f2543Smrg
132706f2543Smrg
133706f2543Smrgstatic int
134706f2543SmrgProcXDGACloseFramebuffer(ClientPtr client)
135706f2543Smrg{
136706f2543Smrg    REQUEST(xXDGACloseFramebufferReq);
137706f2543Smrg
13848a68b89Smrg    REQUEST_SIZE_MATCH(xXDGACloseFramebufferReq);
13948a68b89Smrg
140706f2543Smrg    if (stuff->screen >= screenInfo.numScreens)
141706f2543Smrg        return BadValue;
142706f2543Smrg
143706f2543Smrg    if (!DGAAvailable(stuff->screen))
144706f2543Smrg        return DGAErrorBase + XF86DGANoDirectVideoMode;
145706f2543Smrg
146706f2543Smrg    DGACloseFramebuffer(stuff->screen);
147706f2543Smrg
148706f2543Smrg    return Success;
149706f2543Smrg}
150706f2543Smrg
151706f2543Smrgstatic int
152706f2543SmrgProcXDGAQueryModes(ClientPtr client)
153706f2543Smrg{
154706f2543Smrg    int i, num, size;
155706f2543Smrg    REQUEST(xXDGAQueryModesReq);
156706f2543Smrg    xXDGAQueryModesReply rep;
157706f2543Smrg    xXDGAModeInfo info;
158706f2543Smrg    XDGAModePtr mode;
159706f2543Smrg
16048a68b89Smrg    REQUEST_SIZE_MATCH(xXDGAQueryModesReq);
16148a68b89Smrg
162706f2543Smrg    if (stuff->screen >= screenInfo.numScreens)
163706f2543Smrg        return BadValue;
164706f2543Smrg
165706f2543Smrg    rep.type = X_Reply;
166706f2543Smrg    rep.length = 0;
167706f2543Smrg    rep.number = 0;
168706f2543Smrg    rep.sequenceNumber = client->sequence;
169706f2543Smrg
170706f2543Smrg    if (!DGAAvailable(stuff->screen)) {
171706f2543Smrg	rep.number = 0;
172706f2543Smrg	rep.length = 0;
173706f2543Smrg	WriteToClient(client, sz_xXDGAQueryModesReply, (char*)&rep);
174706f2543Smrg	return Success;
175706f2543Smrg    }
176706f2543Smrg
177706f2543Smrg    if(!(num = DGAGetModes(stuff->screen))) {
178706f2543Smrg	WriteToClient(client, sz_xXDGAQueryModesReply, (char*)&rep);
179706f2543Smrg	return Success;
180706f2543Smrg    }
181706f2543Smrg
182706f2543Smrg    if(!(mode = (XDGAModePtr)malloc(num * sizeof(XDGAModeRec))))
183706f2543Smrg	return BadAlloc;
184706f2543Smrg
185706f2543Smrg    for(i = 0; i < num; i++)
186706f2543Smrg	DGAGetModeInfo(stuff->screen, mode + i, i + 1);
187706f2543Smrg
188706f2543Smrg    size = num * sz_xXDGAModeInfo;
189706f2543Smrg    for(i = 0; i < num; i++)
190706f2543Smrg	size += pad_to_int32(strlen(mode[i].name) + 1);  /* plus NULL */
191706f2543Smrg
192706f2543Smrg    rep.number = num;
193706f2543Smrg    rep.length = bytes_to_int32(size);
194706f2543Smrg
195706f2543Smrg    WriteToClient(client, sz_xXDGAQueryModesReply, (char*)&rep);
196706f2543Smrg
197706f2543Smrg    for(i = 0; i < num; i++) {
198706f2543Smrg	size = strlen(mode[i].name) + 1;
199706f2543Smrg
200706f2543Smrg	info.byte_order = mode[i].byteOrder;
201706f2543Smrg	info.depth = mode[i].depth;
202706f2543Smrg	info.num = mode[i].num;
203706f2543Smrg	info.bpp = mode[i].bitsPerPixel;
204706f2543Smrg	info.name_size = (size + 3) & ~3L;
205706f2543Smrg	info.vsync_num = mode[i].VSync_num;
206706f2543Smrg	info.vsync_den = mode[i].VSync_den;
207706f2543Smrg	info.flags = mode[i].flags;
208706f2543Smrg	info.image_width = mode[i].imageWidth;
209706f2543Smrg	info.image_height = mode[i].imageHeight;
210706f2543Smrg	info.pixmap_width = mode[i].pixmapWidth;
211706f2543Smrg	info.pixmap_height = mode[i].pixmapHeight;
212706f2543Smrg	info.bytes_per_scanline = mode[i].bytesPerScanline;
213706f2543Smrg	info.red_mask = mode[i].red_mask;
214706f2543Smrg	info.green_mask = mode[i].green_mask;
215706f2543Smrg	info.blue_mask = mode[i].blue_mask;
216706f2543Smrg	info.visual_class = mode[i].visualClass;
217706f2543Smrg	info.viewport_width = mode[i].viewportWidth;
218706f2543Smrg	info.viewport_height = mode[i].viewportHeight;
219706f2543Smrg	info.viewport_xstep = mode[i].xViewportStep;
220706f2543Smrg	info.viewport_ystep = mode[i].yViewportStep;
221706f2543Smrg 	info.viewport_xmax = mode[i].maxViewportX;
222706f2543Smrg	info.viewport_ymax = mode[i].maxViewportY;
223706f2543Smrg	info.viewport_flags = mode[i].viewportFlags;
224706f2543Smrg	info.reserved1 = mode[i].reserved1;
225706f2543Smrg	info.reserved2 = mode[i].reserved2;
226706f2543Smrg
227706f2543Smrg	WriteToClient(client, sz_xXDGAModeInfo, (char*)(&info));
228706f2543Smrg	WriteToClient(client, size, mode[i].name);
229706f2543Smrg    }
230706f2543Smrg
231706f2543Smrg    free(mode);
232706f2543Smrg
233706f2543Smrg    return Success;
234706f2543Smrg}
235706f2543Smrg
236706f2543Smrg
237706f2543Smrgstatic void
238706f2543SmrgDGAClientStateChange (
239706f2543Smrg    CallbackListPtr* pcbl,
240706f2543Smrg    pointer nulldata,
241706f2543Smrg    pointer calldata
242706f2543Smrg){
243706f2543Smrg    NewClientInfoRec* pci = (NewClientInfoRec*) calldata;
244706f2543Smrg    ClientPtr client = NULL;
245706f2543Smrg    int i;
246706f2543Smrg
247706f2543Smrg    for(i = 0; i < screenInfo.numScreens; i++) {
248706f2543Smrg	if(DGA_GETCLIENT(i) == pci->client) {
249706f2543Smrg	   client = pci->client;
250706f2543Smrg	   break;
251706f2543Smrg	}
252706f2543Smrg    }
253706f2543Smrg
254706f2543Smrg    if(client &&
255706f2543Smrg      ((client->clientState == ClientStateGone) ||
256706f2543Smrg       (client->clientState == ClientStateRetained))) {
257706f2543Smrg	XDGAModeRec mode;
258706f2543Smrg	PixmapPtr pPix;
259706f2543Smrg
260706f2543Smrg	DGA_SETCLIENT(i, NULL);
261706f2543Smrg	DGASelectInput(i, NULL, 0);
262706f2543Smrg	DGASetMode(i, 0, &mode, &pPix);
263706f2543Smrg
264706f2543Smrg	if(--DGACallbackRefCount == 0)
265706f2543Smrg	    DeleteCallback(&ClientStateCallback, DGAClientStateChange, NULL);
266706f2543Smrg    }
267706f2543Smrg}
268706f2543Smrg
269706f2543Smrgstatic int
270706f2543SmrgProcXDGASetMode(ClientPtr client)
271706f2543Smrg{
272706f2543Smrg    REQUEST(xXDGASetModeReq);
273706f2543Smrg    xXDGASetModeReply rep;
274706f2543Smrg    XDGAModeRec mode;
275706f2543Smrg    xXDGAModeInfo info;
276706f2543Smrg    PixmapPtr pPix;
277706f2543Smrg    ClientPtr owner;
278706f2543Smrg    int size;
279706f2543Smrg
28048a68b89Smrg    REQUEST_SIZE_MATCH(xXDGASetModeReq);
28148a68b89Smrg
282706f2543Smrg    if (stuff->screen >= screenInfo.numScreens)
283706f2543Smrg        return BadValue;
284706f2543Smrg    owner = DGA_GETCLIENT(stuff->screen);
285706f2543Smrg
286706f2543Smrg    rep.type = X_Reply;
287706f2543Smrg    rep.length = 0;
288706f2543Smrg    rep.offset = 0;
289706f2543Smrg    rep.flags = 0;
290706f2543Smrg    rep.sequenceNumber = client->sequence;
291706f2543Smrg
292706f2543Smrg    if (!DGAAvailable(stuff->screen))
293706f2543Smrg        return DGAErrorBase + XF86DGANoDirectVideoMode;
294706f2543Smrg
295706f2543Smrg    if(owner && owner != client)
296706f2543Smrg        return DGAErrorBase + XF86DGANoDirectVideoMode;
297706f2543Smrg
298706f2543Smrg    if(!stuff->mode) {
299706f2543Smrg	if(owner) {
300706f2543Smrg	  if(--DGACallbackRefCount == 0)
301706f2543Smrg	    DeleteCallback(&ClientStateCallback, DGAClientStateChange, NULL);
302706f2543Smrg	}
303706f2543Smrg	DGA_SETCLIENT(stuff->screen, NULL);
304706f2543Smrg	DGASelectInput(stuff->screen, NULL, 0);
305706f2543Smrg	DGASetMode(stuff->screen, 0, &mode, &pPix);
306706f2543Smrg	WriteToClient(client, sz_xXDGASetModeReply, (char*)&rep);
307706f2543Smrg	return Success;
308706f2543Smrg    }
309706f2543Smrg
310706f2543Smrg    if(Success != DGASetMode(stuff->screen, stuff->mode, &mode, &pPix))
311706f2543Smrg	return BadValue;
312706f2543Smrg
313706f2543Smrg    if(!owner) {
314706f2543Smrg	if(DGACallbackRefCount++ == 0)
315706f2543Smrg	   AddCallback (&ClientStateCallback, DGAClientStateChange, NULL);
316706f2543Smrg    }
317706f2543Smrg
318706f2543Smrg    DGA_SETCLIENT(stuff->screen, client);
319706f2543Smrg
320706f2543Smrg    if(pPix) {
321706f2543Smrg	if(AddResource(stuff->pid, RT_PIXMAP, (pointer)(pPix))) {
322706f2543Smrg	    pPix->drawable.id = (int)stuff->pid;
323706f2543Smrg	    rep.flags = DGA_PIXMAP_AVAILABLE;
324706f2543Smrg	}
325706f2543Smrg    }
326706f2543Smrg
327706f2543Smrg    size = strlen(mode.name) + 1;
328706f2543Smrg
329706f2543Smrg    info.byte_order = mode.byteOrder;
330706f2543Smrg    info.depth = mode.depth;
331706f2543Smrg    info.num = mode.num;
332706f2543Smrg    info.bpp = mode.bitsPerPixel;
333706f2543Smrg    info.name_size = (size + 3) & ~3L;
334706f2543Smrg    info.vsync_num = mode.VSync_num;
335706f2543Smrg    info.vsync_den = mode.VSync_den;
336706f2543Smrg    info.flags = mode.flags;
337706f2543Smrg    info.image_width = mode.imageWidth;
338706f2543Smrg    info.image_height = mode.imageHeight;
339706f2543Smrg    info.pixmap_width = mode.pixmapWidth;
340706f2543Smrg    info.pixmap_height = mode.pixmapHeight;
341706f2543Smrg    info.bytes_per_scanline = mode.bytesPerScanline;
342706f2543Smrg    info.red_mask = mode.red_mask;
343706f2543Smrg    info.green_mask = mode.green_mask;
344706f2543Smrg    info.blue_mask = mode.blue_mask;
345706f2543Smrg    info.visual_class = mode.visualClass;
346706f2543Smrg    info.viewport_width = mode.viewportWidth;
347706f2543Smrg    info.viewport_height = mode.viewportHeight;
348706f2543Smrg    info.viewport_xstep = mode.xViewportStep;
349706f2543Smrg    info.viewport_ystep = mode.yViewportStep;
350706f2543Smrg    info.viewport_xmax = mode.maxViewportX;
351706f2543Smrg    info.viewport_ymax = mode.maxViewportY;
352706f2543Smrg    info.viewport_flags = mode.viewportFlags;
353706f2543Smrg    info.reserved1 = mode.reserved1;
354706f2543Smrg    info.reserved2 = mode.reserved2;
355706f2543Smrg
356706f2543Smrg    rep.length = bytes_to_int32(sz_xXDGAModeInfo + info.name_size);
357706f2543Smrg
358706f2543Smrg    WriteToClient(client, sz_xXDGASetModeReply, (char*)&rep);
359706f2543Smrg    WriteToClient(client, sz_xXDGAModeInfo, (char*)(&info));
360706f2543Smrg    WriteToClient(client, size, mode.name);
361706f2543Smrg
362706f2543Smrg    return Success;
363706f2543Smrg}
364706f2543Smrg
365706f2543Smrgstatic int
366706f2543SmrgProcXDGASetViewport(ClientPtr client)
367706f2543Smrg{
368706f2543Smrg    REQUEST(xXDGASetViewportReq);
369706f2543Smrg
37048a68b89Smrg    REQUEST_SIZE_MATCH(xXDGASetViewportReq);
37148a68b89Smrg
372706f2543Smrg    if (stuff->screen >= screenInfo.numScreens)
373706f2543Smrg        return BadValue;
374706f2543Smrg
375706f2543Smrg    if(DGA_GETCLIENT(stuff->screen) != client)
376706f2543Smrg        return DGAErrorBase + XF86DGADirectNotActivated;
377706f2543Smrg
378706f2543Smrg    DGASetViewport(stuff->screen, stuff->x, stuff->y, stuff->flags);
379706f2543Smrg
380706f2543Smrg    return Success;
381706f2543Smrg}
382706f2543Smrg
383706f2543Smrgstatic int
384706f2543SmrgProcXDGAInstallColormap(ClientPtr client)
385706f2543Smrg{
386706f2543Smrg    ColormapPtr cmap;
387706f2543Smrg    int rc;
388706f2543Smrg    REQUEST(xXDGAInstallColormapReq);
389706f2543Smrg
39048a68b89Smrg    REQUEST_SIZE_MATCH(xXDGAInstallColormapReq);
39148a68b89Smrg
392706f2543Smrg    if (stuff->screen >= screenInfo.numScreens)
393706f2543Smrg        return BadValue;
394706f2543Smrg
395706f2543Smrg    if(DGA_GETCLIENT(stuff->screen) != client)
396706f2543Smrg        return DGAErrorBase + XF86DGADirectNotActivated;
397706f2543Smrg
398706f2543Smrg    rc = dixLookupResourceByType((pointer *)&cmap, stuff->cmap, RT_COLORMAP,
399706f2543Smrg				 client, DixInstallAccess);
400706f2543Smrg    if (rc != Success)
401706f2543Smrg        return rc;
402706f2543Smrg    DGAInstallCmap(cmap);
403706f2543Smrg    return Success;
404706f2543Smrg}
405706f2543Smrg
406706f2543Smrg
407706f2543Smrgstatic int
408706f2543SmrgProcXDGASelectInput(ClientPtr client)
409706f2543Smrg{
410706f2543Smrg    REQUEST(xXDGASelectInputReq);
411706f2543Smrg
41248a68b89Smrg    REQUEST_SIZE_MATCH(xXDGASelectInputReq);
41348a68b89Smrg
414706f2543Smrg    if (stuff->screen >= screenInfo.numScreens)
415706f2543Smrg        return BadValue;
416706f2543Smrg
417706f2543Smrg    if(DGA_GETCLIENT(stuff->screen) != client)
418706f2543Smrg        return DGAErrorBase + XF86DGADirectNotActivated;
419706f2543Smrg
420706f2543Smrg    if(DGA_GETCLIENT(stuff->screen) == client)
421706f2543Smrg	DGASelectInput(stuff->screen, client, stuff->mask);
422706f2543Smrg
423706f2543Smrg    return Success;
424706f2543Smrg}
425706f2543Smrg
426706f2543Smrg
427706f2543Smrgstatic int
428706f2543SmrgProcXDGAFillRectangle(ClientPtr client)
429706f2543Smrg{
430706f2543Smrg    REQUEST(xXDGAFillRectangleReq);
431706f2543Smrg
43248a68b89Smrg    REQUEST_SIZE_MATCH(xXDGAFillRectangleReq);
43348a68b89Smrg
434706f2543Smrg    if (stuff->screen >= screenInfo.numScreens)
435706f2543Smrg        return BadValue;
436706f2543Smrg
437706f2543Smrg    if(DGA_GETCLIENT(stuff->screen) != client)
438706f2543Smrg        return DGAErrorBase + XF86DGADirectNotActivated;
439706f2543Smrg
440706f2543Smrg    if(Success != DGAFillRect(stuff->screen, stuff->x, stuff->y,
441706f2543Smrg			stuff->width, stuff->height, stuff->color))
442706f2543Smrg	return BadMatch;
443706f2543Smrg
444706f2543Smrg    return Success;
445706f2543Smrg}
446706f2543Smrg
447706f2543Smrgstatic int
448706f2543SmrgProcXDGACopyArea(ClientPtr client)
449706f2543Smrg{
450706f2543Smrg    REQUEST(xXDGACopyAreaReq);
451706f2543Smrg
45248a68b89Smrg    REQUEST_SIZE_MATCH(xXDGACopyAreaReq);
45348a68b89Smrg
454706f2543Smrg    if (stuff->screen >= screenInfo.numScreens)
455706f2543Smrg        return BadValue;
456706f2543Smrg
457706f2543Smrg    if(DGA_GETCLIENT(stuff->screen) != client)
458706f2543Smrg        return DGAErrorBase + XF86DGADirectNotActivated;
459706f2543Smrg
460706f2543Smrg    if(Success != DGABlitRect(stuff->screen, stuff->srcx, stuff->srcy,
461706f2543Smrg		stuff->width, stuff->height, stuff->dstx, stuff->dsty))
462706f2543Smrg	return BadMatch;
463706f2543Smrg
464706f2543Smrg    return Success;
465706f2543Smrg}
466706f2543Smrg
467706f2543Smrg
468706f2543Smrgstatic int
469706f2543SmrgProcXDGACopyTransparentArea(ClientPtr client)
470706f2543Smrg{
471706f2543Smrg    REQUEST(xXDGACopyTransparentAreaReq);
472706f2543Smrg
47348a68b89Smrg    REQUEST_SIZE_MATCH(xXDGACopyTransparentAreaReq);
47448a68b89Smrg
475706f2543Smrg    if (stuff->screen >= screenInfo.numScreens)
476706f2543Smrg        return BadValue;
477706f2543Smrg
478706f2543Smrg    if(DGA_GETCLIENT(stuff->screen) != client)
479706f2543Smrg        return DGAErrorBase + XF86DGADirectNotActivated;
480706f2543Smrg
481706f2543Smrg    if(Success != DGABlitTransRect(stuff->screen, stuff->srcx, stuff->srcy,
482706f2543Smrg	stuff->width, stuff->height, stuff->dstx, stuff->dsty, stuff->key))
483706f2543Smrg	return BadMatch;
484706f2543Smrg
485706f2543Smrg    return Success;
486706f2543Smrg}
487706f2543Smrg
488706f2543Smrg
489706f2543Smrgstatic int
490706f2543SmrgProcXDGAGetViewportStatus(ClientPtr client)
491706f2543Smrg{
492706f2543Smrg    REQUEST(xXDGAGetViewportStatusReq);
49348a68b89Smrg
49448a68b89Smrg    REQUEST_SIZE_MATCH(xXDGAGetViewportStatusReq);
49548a68b89Smrg
496706f2543Smrg    xXDGAGetViewportStatusReply rep;
497706f2543Smrg
498706f2543Smrg    if (stuff->screen >= screenInfo.numScreens)
499706f2543Smrg        return BadValue;
500706f2543Smrg
501706f2543Smrg    if(DGA_GETCLIENT(stuff->screen) != client)
502706f2543Smrg        return DGAErrorBase + XF86DGADirectNotActivated;
503706f2543Smrg
504706f2543Smrg    rep.type = X_Reply;
505706f2543Smrg    rep.length = 0;
506706f2543Smrg    rep.sequenceNumber = client->sequence;
507706f2543Smrg
508706f2543Smrg    rep.status = DGAGetViewportStatus(stuff->screen);
509706f2543Smrg
510706f2543Smrg    WriteToClient(client, sizeof(xXDGAGetViewportStatusReply), (char *)&rep);
511706f2543Smrg    return Success;
512706f2543Smrg}
513706f2543Smrg
514706f2543Smrgstatic int
515706f2543SmrgProcXDGASync(ClientPtr client)
516706f2543Smrg{
517706f2543Smrg    REQUEST(xXDGASyncReq);
51848a68b89Smrg
51948a68b89Smrg    REQUEST_SIZE_MATCH(xXDGASyncReq);
52048a68b89Smrg
521706f2543Smrg    xXDGASyncReply rep;
522706f2543Smrg
523706f2543Smrg    if (stuff->screen >= screenInfo.numScreens)
524706f2543Smrg        return BadValue;
525706f2543Smrg
526706f2543Smrg    if(DGA_GETCLIENT(stuff->screen) != client)
527706f2543Smrg        return DGAErrorBase + XF86DGADirectNotActivated;
528706f2543Smrg
529706f2543Smrg    rep.type = X_Reply;
530706f2543Smrg    rep.length = 0;
531706f2543Smrg    rep.sequenceNumber = client->sequence;
532706f2543Smrg
533706f2543Smrg    DGASync(stuff->screen);
534706f2543Smrg
535706f2543Smrg    WriteToClient(client, sizeof(xXDGASyncReply), (char *)&rep);
536706f2543Smrg    return Success;
537706f2543Smrg}
538706f2543Smrg
539706f2543Smrgstatic int
540706f2543SmrgProcXDGASetClientVersion(ClientPtr client)
541706f2543Smrg{
542706f2543Smrg    REQUEST(xXDGASetClientVersionReq);
543706f2543Smrg
544706f2543Smrg    DGAPrivPtr pPriv;
545706f2543Smrg
546706f2543Smrg    REQUEST_SIZE_MATCH(xXDGASetClientVersionReq);
547706f2543Smrg    if ((pPriv = DGA_GETPRIV(client)) == NULL) {
548706f2543Smrg	pPriv = malloc(sizeof(DGAPrivRec));
549706f2543Smrg	/* XXX Need to look into freeing this */
550706f2543Smrg	if (!pPriv)
551706f2543Smrg	    return BadAlloc;
552706f2543Smrg	DGA_SETPRIV(client, pPriv);
553706f2543Smrg    }
554706f2543Smrg    pPriv->major = stuff->major;
555706f2543Smrg    pPriv->minor = stuff->minor;
556706f2543Smrg
557706f2543Smrg    return Success;
558706f2543Smrg}
559706f2543Smrg
560706f2543Smrgstatic int
561706f2543SmrgProcXDGAChangePixmapMode(ClientPtr client)
562706f2543Smrg{
563706f2543Smrg    REQUEST(xXDGAChangePixmapModeReq);
564706f2543Smrg    xXDGAChangePixmapModeReply rep;
565706f2543Smrg    int x, y;
566706f2543Smrg
56748a68b89Smrg    REQUEST_SIZE_MATCH(xXDGAChangePixmapModeReq);
56848a68b89Smrg
569706f2543Smrg    if (stuff->screen >= screenInfo.numScreens)
570706f2543Smrg        return BadValue;
571706f2543Smrg
572706f2543Smrg    if(DGA_GETCLIENT(stuff->screen) != client)
573706f2543Smrg        return DGAErrorBase + XF86DGADirectNotActivated;
574706f2543Smrg
575706f2543Smrg    rep.type = X_Reply;
576706f2543Smrg    rep.length = 0;
577706f2543Smrg    rep.sequenceNumber = client->sequence;
578706f2543Smrg
579706f2543Smrg    x = stuff->x;
580706f2543Smrg    y = stuff->y;
581706f2543Smrg
582706f2543Smrg    if(!DGAChangePixmapMode(stuff->screen, &x, &y, stuff->flags))
583706f2543Smrg	return BadMatch;
584706f2543Smrg
585706f2543Smrg    rep.x = x;
586706f2543Smrg    rep.y = y;
587706f2543Smrg    WriteToClient(client, sizeof(xXDGAChangePixmapModeReply), (char *)&rep);
588706f2543Smrg
589706f2543Smrg    return Success;
590706f2543Smrg}
591706f2543Smrg
592706f2543Smrg
593706f2543Smrgstatic int
594706f2543SmrgProcXDGACreateColormap(ClientPtr client)
595706f2543Smrg{
596706f2543Smrg    REQUEST(xXDGACreateColormapReq);
597706f2543Smrg    int result;
598706f2543Smrg
59948a68b89Smrg    REQUEST_SIZE_MATCH(xXDGACreateColormapReq);
60048a68b89Smrg
601706f2543Smrg    if (stuff->screen >= screenInfo.numScreens)
602706f2543Smrg        return BadValue;
603706f2543Smrg
604706f2543Smrg    if(DGA_GETCLIENT(stuff->screen) != client)
605706f2543Smrg        return DGAErrorBase + XF86DGADirectNotActivated;
606706f2543Smrg
607706f2543Smrg    if(!stuff->mode)
608706f2543Smrg	return BadValue;
609706f2543Smrg
610706f2543Smrg    result = DGACreateColormap(stuff->screen, client, stuff->id,
611706f2543Smrg				stuff->mode, stuff->alloc);
612706f2543Smrg    if(result != Success)
613706f2543Smrg	return result;
614706f2543Smrg
615706f2543Smrg    return Success;
616706f2543Smrg}
617706f2543Smrg
618706f2543Smrg/*
619706f2543Smrg *
620706f2543Smrg * Support for the old DGA protocol, used to live in xf86dga.c
621706f2543Smrg *
622706f2543Smrg */
623706f2543Smrg
624706f2543Smrg#ifdef DGA_PROTOCOL_OLD_SUPPORT
625706f2543Smrg
626706f2543Smrg
627706f2543Smrg
628706f2543Smrgstatic int
629706f2543SmrgProcXF86DGAGetVideoLL(ClientPtr client)
630706f2543Smrg{
631706f2543Smrg    REQUEST(xXF86DGAGetVideoLLReq);
632706f2543Smrg    xXF86DGAGetVideoLLReply rep;
633706f2543Smrg    XDGAModeRec mode;
634706f2543Smrg    int num, offset, flags;
635706f2543Smrg    char *name;
636706f2543Smrg
63748a68b89Smrg    REQUEST_SIZE_MATCH(xXF86DGAGetVideoLLReq);
63848a68b89Smrg
639706f2543Smrg    if (stuff->screen >= screenInfo.numScreens)
640706f2543Smrg	return BadValue;
641706f2543Smrg
642706f2543Smrg    rep.type = X_Reply;
643706f2543Smrg    rep.length = 0;
644706f2543Smrg    rep.sequenceNumber = client->sequence;
645706f2543Smrg
646706f2543Smrg    if(!DGAAvailable(stuff->screen))
647706f2543Smrg	return DGAErrorBase + XF86DGANoDirectVideoMode;
648706f2543Smrg
649706f2543Smrg    if(!(num = DGAGetOldDGAMode(stuff->screen)))
650706f2543Smrg	return DGAErrorBase + XF86DGANoDirectVideoMode;
651706f2543Smrg
652706f2543Smrg    /* get the parameters for the mode that best matches */
653706f2543Smrg    DGAGetModeInfo(stuff->screen, &mode, num);
654706f2543Smrg
655706f2543Smrg    if(!DGAOpenFramebuffer(stuff->screen, &name,
656706f2543Smrg			(unsigned char**)(&rep.offset),
657706f2543Smrg			(int*)(&rep.bank_size), &offset, &flags))
658706f2543Smrg	return BadAlloc;
659706f2543Smrg
660706f2543Smrg    rep.offset += mode.offset;
661706f2543Smrg    rep.width = mode.bytesPerScanline / (mode.bitsPerPixel >> 3);
662706f2543Smrg    rep.ram_size = rep.bank_size >> 10;
663706f2543Smrg
664706f2543Smrg    WriteToClient(client, SIZEOF(xXF86DGAGetVideoLLReply), (char *)&rep);
665706f2543Smrg    return Success;
666706f2543Smrg}
667706f2543Smrg
668706f2543Smrgstatic int
669706f2543SmrgProcXF86DGADirectVideo(ClientPtr client)
670706f2543Smrg{
671706f2543Smrg    int num;
672706f2543Smrg    PixmapPtr pix;
673706f2543Smrg    XDGAModeRec mode;
674706f2543Smrg    ClientPtr owner;
675706f2543Smrg    REQUEST(xXF86DGADirectVideoReq);
676706f2543Smrg
67748a68b89Smrg    REQUEST_SIZE_MATCH(xXF86DGADirectVideoReq);
67848a68b89Smrg
679706f2543Smrg    if (stuff->screen >= screenInfo.numScreens)
680706f2543Smrg	return BadValue;
681706f2543Smrg
682706f2543Smrg    if (!DGAAvailable(stuff->screen))
683706f2543Smrg	return DGAErrorBase + XF86DGANoDirectVideoMode;
684706f2543Smrg
685706f2543Smrg    owner = DGA_GETCLIENT(stuff->screen);
686706f2543Smrg
687706f2543Smrg    if (owner && owner != client)
688706f2543Smrg        return DGAErrorBase + XF86DGANoDirectVideoMode;
689706f2543Smrg
690706f2543Smrg    if (stuff->enable & XF86DGADirectGraphics) {
691706f2543Smrg	if(!(num = DGAGetOldDGAMode(stuff->screen)))
692706f2543Smrg	    return DGAErrorBase + XF86DGANoDirectVideoMode;
693706f2543Smrg    } else
694706f2543Smrg	num = 0;
695706f2543Smrg
696706f2543Smrg    if(Success != DGASetMode(stuff->screen, num, &mode, &pix))
697706f2543Smrg	return DGAErrorBase + XF86DGAScreenNotActive;
698706f2543Smrg
699706f2543Smrg    DGASetInputMode (stuff->screen,
700706f2543Smrg		     (stuff->enable & XF86DGADirectKeyb) != 0,
701706f2543Smrg		     (stuff->enable & XF86DGADirectMouse) != 0);
702706f2543Smrg
703706f2543Smrg    /* We need to track the client and attach the teardown callback */
704706f2543Smrg    if (stuff->enable &
705706f2543Smrg	(XF86DGADirectGraphics | XF86DGADirectKeyb | XF86DGADirectMouse)) {
706706f2543Smrg	if (!owner) {
707706f2543Smrg	    if (DGACallbackRefCount++ == 0)
708706f2543Smrg		AddCallback (&ClientStateCallback, DGAClientStateChange, NULL);
709706f2543Smrg	}
710706f2543Smrg
711706f2543Smrg	DGA_SETCLIENT(stuff->screen, client);
712706f2543Smrg    } else {
713706f2543Smrg	if (owner) {
714706f2543Smrg	    if (--DGACallbackRefCount == 0)
715706f2543Smrg		DeleteCallback(&ClientStateCallback, DGAClientStateChange, NULL);
716706f2543Smrg	}
717706f2543Smrg
718706f2543Smrg	DGA_SETCLIENT(stuff->screen, NULL);
719706f2543Smrg    }
720706f2543Smrg
721706f2543Smrg    return Success;
722706f2543Smrg}
723706f2543Smrg
724706f2543Smrgstatic int
725706f2543SmrgProcXF86DGAGetViewPortSize(ClientPtr client)
726706f2543Smrg{
727706f2543Smrg    int num;
728706f2543Smrg    XDGAModeRec mode;
729706f2543Smrg    xXF86DGAGetViewPortSizeReply rep;
730706f2543Smrg
73148a68b89Smrg    REQUEST(xXF86DGAGetViewPortSizeReq);
73248a68b89Smrg
73348a68b89Smrg    REQUEST_SIZE_MATCH(xXF86DGAGetViewPortSizeReq);
73448a68b89Smrg
735706f2543Smrg    if (stuff->screen >= screenInfo.numScreens)
736706f2543Smrg	return BadValue;
737706f2543Smrg
738706f2543Smrg    rep.type = X_Reply;
739706f2543Smrg    rep.length = 0;
740706f2543Smrg    rep.sequenceNumber = client->sequence;
741706f2543Smrg
742706f2543Smrg    if (!DGAAvailable(stuff->screen))
743706f2543Smrg	return DGAErrorBase + XF86DGANoDirectVideoMode;
744706f2543Smrg
745706f2543Smrg    if(!(num = DGAGetOldDGAMode(stuff->screen)))
746706f2543Smrg	return DGAErrorBase + XF86DGANoDirectVideoMode;
747706f2543Smrg
748706f2543Smrg    DGAGetModeInfo(stuff->screen, &mode, num);
749706f2543Smrg
750706f2543Smrg    rep.width = mode.viewportWidth;
751706f2543Smrg    rep.height = mode.viewportHeight;
752706f2543Smrg
753706f2543Smrg    WriteToClient(client, SIZEOF(xXF86DGAGetViewPortSizeReply), (char *)&rep);
754706f2543Smrg    return Success;
755706f2543Smrg}
756706f2543Smrg
757706f2543Smrgstatic int
758706f2543SmrgProcXF86DGASetViewPort(ClientPtr client)
759706f2543Smrg{
760706f2543Smrg    REQUEST(xXF86DGASetViewPortReq);
761706f2543Smrg
76248a68b89Smrg    REQUEST_SIZE_MATCH(xXF86DGASetViewPortReq);
76348a68b89Smrg
764706f2543Smrg    if (stuff->screen >= screenInfo.numScreens)
765706f2543Smrg	return BadValue;
766706f2543Smrg
767706f2543Smrg    if (DGA_GETCLIENT(stuff->screen) != client)
768706f2543Smrg        return DGAErrorBase + XF86DGADirectNotActivated;
769706f2543Smrg
770706f2543Smrg    if (!DGAAvailable(stuff->screen))
771706f2543Smrg	return DGAErrorBase + XF86DGANoDirectVideoMode;
772706f2543Smrg
773706f2543Smrg    if (!DGAActive(stuff->screen))
774706f2543Smrg	return DGAErrorBase + XF86DGADirectNotActivated;
775706f2543Smrg
776706f2543Smrg    if (DGASetViewport(stuff->screen, stuff->x, stuff->y, DGA_FLIP_RETRACE)
777706f2543Smrg		!= Success)
778706f2543Smrg	return DGAErrorBase + XF86DGADirectNotActivated;
779706f2543Smrg
780706f2543Smrg    return Success;
781706f2543Smrg}
782706f2543Smrg
783706f2543Smrgstatic int
784706f2543SmrgProcXF86DGAGetVidPage(ClientPtr client)
785706f2543Smrg{
786706f2543Smrg    REQUEST(xXF86DGAGetVidPageReq);
787706f2543Smrg    xXF86DGAGetVidPageReply rep;
788706f2543Smrg
78948a68b89Smrg    REQUEST_SIZE_MATCH(xXF86DGAGetVidPageReq);
79048a68b89Smrg
791706f2543Smrg    if (stuff->screen >= screenInfo.numScreens)
792706f2543Smrg	return BadValue;
793706f2543Smrg
794706f2543Smrg    rep.type = X_Reply;
795706f2543Smrg    rep.length = 0;
796706f2543Smrg    rep.sequenceNumber = client->sequence;
797706f2543Smrg    rep.vpage = 0;  /* silently fail */
798706f2543Smrg
799706f2543Smrg    WriteToClient(client, SIZEOF(xXF86DGAGetVidPageReply), (char *)&rep);
800706f2543Smrg    return Success;
801706f2543Smrg}
802706f2543Smrg
803706f2543Smrg
804706f2543Smrgstatic int
805706f2543SmrgProcXF86DGASetVidPage(ClientPtr client)
806706f2543Smrg{
807706f2543Smrg    REQUEST(xXF86DGASetVidPageReq);
808706f2543Smrg
80948a68b89Smrg    REQUEST_SIZE_MATCH(xXF86DGASetVidPageReq);
81048a68b89Smrg
811706f2543Smrg    if (stuff->screen >= screenInfo.numScreens)
812706f2543Smrg	return BadValue;
813706f2543Smrg
814706f2543Smrg    /* silently fail */
815706f2543Smrg
816706f2543Smrg    return Success;
817706f2543Smrg}
818706f2543Smrg
819706f2543Smrg
820706f2543Smrgstatic int
821706f2543SmrgProcXF86DGAInstallColormap(ClientPtr client)
822706f2543Smrg{
823706f2543Smrg    ColormapPtr pcmp;
824706f2543Smrg    int rc;
82548a68b89Smrg
826706f2543Smrg    REQUEST(xXF86DGAInstallColormapReq);
827706f2543Smrg
82848a68b89Smrg    REQUEST_SIZE_MATCH(xXF86DGAInstallColormapReq);
82948a68b89Smrg
830706f2543Smrg    if (stuff->screen >= screenInfo.numScreens)
831706f2543Smrg	return BadValue;
832706f2543Smrg
833706f2543Smrg    if (DGA_GETCLIENT(stuff->screen) != client)
834706f2543Smrg        return DGAErrorBase + XF86DGADirectNotActivated;
835706f2543Smrg
836706f2543Smrg    if (!DGAActive(stuff->screen))
837706f2543Smrg	return DGAErrorBase + XF86DGADirectNotActivated;
838706f2543Smrg
839706f2543Smrg    rc = dixLookupResourceByType((pointer *)&pcmp, stuff->id, RT_COLORMAP,
840706f2543Smrg				 client, DixInstallAccess);
841706f2543Smrg    if (rc == Success) {
842706f2543Smrg	DGAInstallCmap(pcmp);
843706f2543Smrg        return Success;
844706f2543Smrg    } else {
845706f2543Smrg        return rc;
846706f2543Smrg    }
847706f2543Smrg}
848706f2543Smrg
849706f2543Smrgstatic int
850706f2543SmrgProcXF86DGAQueryDirectVideo(ClientPtr client)
851706f2543Smrg{
852706f2543Smrg    REQUEST(xXF86DGAQueryDirectVideoReq);
85348a68b89Smrg
85448a68b89Smrg    REQUEST_SIZE_MATCH(xXF86DGAQueryDirectVideoReq);
85548a68b89Smrg
856706f2543Smrg    xXF86DGAQueryDirectVideoReply rep;
857706f2543Smrg
858706f2543Smrg    if (stuff->screen >= screenInfo.numScreens)
859706f2543Smrg	return BadValue;
860706f2543Smrg
861706f2543Smrg    rep.type = X_Reply;
862706f2543Smrg    rep.length = 0;
863706f2543Smrg    rep.sequenceNumber = client->sequence;
864706f2543Smrg    rep.flags = 0;
865706f2543Smrg
866706f2543Smrg    if (DGAAvailable(stuff->screen))
867706f2543Smrg	rep.flags = XF86DGADirectPresent;
868706f2543Smrg
869706f2543Smrg    WriteToClient(client, SIZEOF(xXF86DGAQueryDirectVideoReply), (char *)&rep);
870706f2543Smrg    return Success;
871706f2543Smrg}
872706f2543Smrg
873706f2543Smrgstatic int
874706f2543SmrgProcXF86DGAViewPortChanged(ClientPtr client)
875706f2543Smrg{
876706f2543Smrg    REQUEST(xXF86DGAViewPortChangedReq);
877706f2543Smrg    xXF86DGAViewPortChangedReply rep;
878706f2543Smrg
87948a68b89Smrg    REQUEST_SIZE_MATCH(xXF86DGAViewPortChangedReq);
88048a68b89Smrg
881706f2543Smrg    if (stuff->screen >= screenInfo.numScreens)
882706f2543Smrg	return BadValue;
883706f2543Smrg
884706f2543Smrg    if (DGA_GETCLIENT(stuff->screen) != client)
885706f2543Smrg        return DGAErrorBase + XF86DGADirectNotActivated;
886706f2543Smrg
887706f2543Smrg    if (!DGAActive(stuff->screen))
888706f2543Smrg	return DGAErrorBase + XF86DGADirectNotActivated;
889706f2543Smrg
890706f2543Smrg    rep.type = X_Reply;
891706f2543Smrg    rep.length = 0;
892706f2543Smrg    rep.sequenceNumber = client->sequence;
893706f2543Smrg    rep.result = 1;
894706f2543Smrg
895706f2543Smrg    WriteToClient(client, SIZEOF(xXF86DGAViewPortChangedReply), (char *)&rep);
896706f2543Smrg    return Success;
897706f2543Smrg}
898706f2543Smrg
899706f2543Smrg#endif /* DGA_PROTOCOL_OLD_SUPPORT */
900706f2543Smrg
901706f2543Smrgstatic int
902706f2543SmrgSProcXDGADispatch (ClientPtr client)
903706f2543Smrg{
904706f2543Smrg   return DGAErrorBase + XF86DGAClientNotLocal;
905706f2543Smrg}
906706f2543Smrg
907706f2543Smrg#if 0
908706f2543Smrg#define DGA_REQ_DEBUG
909706f2543Smrg#endif
910706f2543Smrg
911706f2543Smrg#ifdef DGA_REQ_DEBUG
912706f2543Smrgstatic char *dgaMinor[] = {
913706f2543Smrg    "QueryVersion",
914706f2543Smrg    "GetVideoLL",
915706f2543Smrg    "DirectVideo",
916706f2543Smrg    "GetViewPortSize",
917706f2543Smrg    "SetViewPort",
918706f2543Smrg    "GetVidPage",
919706f2543Smrg    "SetVidPage",
920706f2543Smrg    "InstallColormap",
921706f2543Smrg    "QueryDirectVideo",
922706f2543Smrg    "ViewPortChanged",
923706f2543Smrg    "10",
924706f2543Smrg    "11",
925706f2543Smrg    "QueryModes",
926706f2543Smrg    "SetMode",
927706f2543Smrg    "SetViewport",
928706f2543Smrg    "InstallColormap",
929706f2543Smrg    "SelectInput",
930706f2543Smrg    "FillRectangle",
931706f2543Smrg    "CopyArea",
932706f2543Smrg    "CopyTransparentArea",
933706f2543Smrg    "GetViewportStatus",
934706f2543Smrg    "Sync",
935706f2543Smrg    "OpenFramebuffer",
936706f2543Smrg    "CloseFramebuffer",
937706f2543Smrg    "SetClientVersion",
938706f2543Smrg    "ChangePixmapMode",
939706f2543Smrg    "CreateColormap",
940706f2543Smrg};
941706f2543Smrg#endif
942706f2543Smrg
943706f2543Smrgstatic int
944706f2543SmrgProcXDGADispatch (ClientPtr client)
945706f2543Smrg{
946706f2543Smrg    REQUEST(xReq);
947706f2543Smrg
948706f2543Smrg    if (!LocalClient(client))
949706f2543Smrg	return DGAErrorBase + XF86DGAClientNotLocal;
950706f2543Smrg
951706f2543Smrg#ifdef DGA_REQ_DEBUG
952706f2543Smrg    if (stuff->data <= X_XDGACreateColormap)
953706f2543Smrg	fprintf (stderr, "    DGA %s\n", dgaMinor[stuff->data]);
954706f2543Smrg#endif
955706f2543Smrg
956706f2543Smrg    switch (stuff->data){
957706f2543Smrg    /*
958706f2543Smrg     * DGA2 Protocol
959706f2543Smrg     */
960706f2543Smrg    case X_XDGAQueryVersion:
961706f2543Smrg	return ProcXDGAQueryVersion(client);
962706f2543Smrg    case X_XDGAQueryModes:
963706f2543Smrg	return ProcXDGAQueryModes(client);
964706f2543Smrg    case X_XDGASetMode:
965706f2543Smrg	return ProcXDGASetMode(client);
966706f2543Smrg    case X_XDGAOpenFramebuffer:
967706f2543Smrg	return ProcXDGAOpenFramebuffer(client);
968706f2543Smrg    case X_XDGACloseFramebuffer:
969706f2543Smrg	return ProcXDGACloseFramebuffer(client);
970706f2543Smrg    case X_XDGASetViewport:
971706f2543Smrg	return ProcXDGASetViewport(client);
972706f2543Smrg    case X_XDGAInstallColormap:
973706f2543Smrg	return ProcXDGAInstallColormap(client);
974706f2543Smrg    case X_XDGASelectInput:
975706f2543Smrg	return ProcXDGASelectInput(client);
976706f2543Smrg    case X_XDGAFillRectangle:
977706f2543Smrg	return ProcXDGAFillRectangle(client);
978706f2543Smrg    case X_XDGACopyArea:
979706f2543Smrg	return ProcXDGACopyArea(client);
980706f2543Smrg    case X_XDGACopyTransparentArea:
981706f2543Smrg	return ProcXDGACopyTransparentArea(client);
982706f2543Smrg    case X_XDGAGetViewportStatus:
983706f2543Smrg	return ProcXDGAGetViewportStatus(client);
984706f2543Smrg    case X_XDGASync:
985706f2543Smrg	return ProcXDGASync(client);
986706f2543Smrg    case X_XDGASetClientVersion:
987706f2543Smrg	return ProcXDGASetClientVersion(client);
988706f2543Smrg    case X_XDGAChangePixmapMode:
989706f2543Smrg	return ProcXDGAChangePixmapMode(client);
990706f2543Smrg    case X_XDGACreateColormap:
991706f2543Smrg	return ProcXDGACreateColormap(client);
992706f2543Smrg    /*
993706f2543Smrg     * Old DGA Protocol
994706f2543Smrg     */
995706f2543Smrg#ifdef DGA_PROTOCOL_OLD_SUPPORT
996706f2543Smrg    case X_XF86DGAGetVideoLL:
997706f2543Smrg	return ProcXF86DGAGetVideoLL(client);
998706f2543Smrg    case X_XF86DGADirectVideo:
999706f2543Smrg	return ProcXF86DGADirectVideo(client);
1000706f2543Smrg    case X_XF86DGAGetViewPortSize:
1001706f2543Smrg	return ProcXF86DGAGetViewPortSize(client);
1002706f2543Smrg    case X_XF86DGASetViewPort:
1003706f2543Smrg	return ProcXF86DGASetViewPort(client);
1004706f2543Smrg    case X_XF86DGAGetVidPage:
1005706f2543Smrg	return ProcXF86DGAGetVidPage(client);
1006706f2543Smrg    case X_XF86DGASetVidPage:
1007706f2543Smrg	return ProcXF86DGASetVidPage(client);
1008706f2543Smrg    case X_XF86DGAInstallColormap:
1009706f2543Smrg	return ProcXF86DGAInstallColormap(client);
1010706f2543Smrg    case X_XF86DGAQueryDirectVideo:
1011706f2543Smrg	return ProcXF86DGAQueryDirectVideo(client);
1012706f2543Smrg    case X_XF86DGAViewPortChanged:
1013706f2543Smrg	return ProcXF86DGAViewPortChanged(client);
1014706f2543Smrg#endif /* DGA_PROTOCOL_OLD_SUPPORT */
1015706f2543Smrg    default:
1016706f2543Smrg	return BadRequest;
1017706f2543Smrg    }
1018706f2543Smrg}
1019706f2543Smrg
1020706f2543Smrgvoid
1021706f2543SmrgXFree86DGARegister(INITARGS)
1022706f2543Smrg{
1023706f2543Smrg  XDGAEventBase = &DGAEventBase;
1024706f2543Smrg}
1025706f2543Smrg
1026706f2543Smrgvoid
1027706f2543SmrgXFree86DGAExtensionInit(INITARGS)
1028706f2543Smrg{
1029706f2543Smrg    ExtensionEntry* extEntry;
1030706f2543Smrg
1031706f2543Smrg    if (!dixRegisterPrivateKey(&DGAClientPrivateKeyRec, PRIVATE_CLIENT, 0))
1032706f2543Smrg	return;
1033706f2543Smrg
1034706f2543Smrg    if (!dixRegisterPrivateKey(&DGAScreenPrivateKeyRec, PRIVATE_SCREEN, 0))
1035706f2543Smrg	return;
1036706f2543Smrg
1037706f2543Smrg    if ((extEntry = AddExtension(XF86DGANAME,
1038706f2543Smrg				XF86DGANumberEvents,
1039706f2543Smrg				XF86DGANumberErrors,
1040706f2543Smrg				ProcXDGADispatch,
1041706f2543Smrg				SProcXDGADispatch,
1042706f2543Smrg				XDGAResetProc,
1043706f2543Smrg				StandardMinorOpcode))) {
1044706f2543Smrg	int i;
1045706f2543Smrg
1046706f2543Smrg	DGAReqCode = (unsigned char)extEntry->base;
1047706f2543Smrg	DGAErrorBase = extEntry->errorBase;
1048706f2543Smrg	DGAEventBase = extEntry->eventBase;
1049706f2543Smrg	for (i = KeyPress; i <= MotionNotify; i++)
1050706f2543Smrg	    SetCriticalEvent (DGAEventBase + i);
1051706f2543Smrg    }
1052706f2543Smrg}
1053