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