XF86DGA2.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:25k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* $XFree86: xc/lib/Xxf86dga/XF86DGA2.c,v 1.18 2001/08/17 13:27:51 dawes Exp $ */
  2. /*
  3. Copyright (c) 1995  Jon Tombs
  4. Copyright (c) 1995,1996  The XFree86 Project, Inc
  5. */
  6. /* THIS IS NOT AN X CONSORTIUM STANDARD */
  7. #ifdef __EMX__ /* needed here to override certain constants in X headers */
  8. #define INCL_DOS
  9. #define INCL_DOSIOCTL
  10. #include <os2.h>
  11. #endif
  12. #define NEED_EVENTS
  13. #define NEED_REPLIES
  14. #include <X11/Xlibint.h>
  15. #include "xf86dga.h"
  16. #include "xf86dgastr.h"
  17. #include <X11/extensions/Xext.h>
  18. #include "extutil.h"
  19. #include <stdio.h>
  20. #if defined(linux)  /* Needed for framebuffer console support */
  21. #include <sys/ioctl.h>
  22. #include <linux/fb.h>
  23. #endif
  24. /* If you change this, change the Bases[] array below as well */
  25. #define MAX_HEADS 16
  26. char *SDL_NAME(xdga_extension_name) = XF86DGANAME;
  27. static XExtensionInfo _xdga_info_data;
  28. static XExtensionInfo *xdga_info = &_xdga_info_data;
  29.  
  30. Bool SDL_NAME(XDGAMapFramebuffer)(int, char *, unsigned char*, CARD32, CARD32, CARD32);
  31. void SDL_NAME(XDGAUnmapFramebuffer)(int);
  32. unsigned char* SDL_NAME(XDGAGetMappedMemory)(int);
  33. #define XDGACheckExtension(dpy,i,val) 
  34.   XextCheckExtension (dpy, i, SDL_NAME(xdga_extension_name), val)
  35. /*****************************************************************************
  36.  *                                                                           *
  37.  *    private utility routines                          *
  38.  *                                                                           *
  39.  *****************************************************************************/
  40. static int xdga_close_display(Display *dpy, XExtCodes *codes);
  41. static Bool xdga_wire_to_event(Display *dpy, XEvent *event, xEvent *wire_ev);
  42. static Status xdga_event_to_wire(Display *dpy, XEvent *event, xEvent *wire_ev);
  43. static XExtensionHooks xdga_extension_hooks = {
  44.     NULL, /* create_gc */
  45.     NULL, /* copy_gc */
  46.     NULL, /* flush_gc */
  47.     NULL, /* free_gc */
  48.     NULL, /* create_font */
  49.     NULL, /* free_font */
  50.     xdga_close_display, /* close_display */
  51.     xdga_wire_to_event, /* wire_to_event */
  52.     xdga_event_to_wire, /* event_to_wire */
  53.     NULL, /* error */
  54.     NULL, /* error_string */
  55. };
  56. static XEXT_GENERATE_CLOSE_DISPLAY (xdga_close_display, xdga_info)
  57. XEXT_GENERATE_FIND_DISPLAY (SDL_NAME(xdga_find_display), xdga_info, 
  58.    "XFree86-DGA", 
  59.    &xdga_extension_hooks, 
  60.    0, NULL)
  61. static Status
  62. xdga_event_to_wire(
  63.   Display *dpy,
  64.   XEvent *event,
  65.   xEvent *wire_ev
  66. ){
  67.     return True;
  68. }
  69. static Bool
  70. xdga_wire_to_event(
  71.   Display *dpy,
  72.   XEvent *event,
  73.   xEvent *wire_ev
  74. ){
  75.   dgaEvent *wire = (dgaEvent *) wire_ev;
  76.   SDL_NAME(XDGAButtonEvent) *bevent;
  77.   SDL_NAME(XDGAKeyEvent) *kevent;
  78.   SDL_NAME(XDGAMotionEvent) *mevent;
  79.   XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
  80.   XDGACheckExtension (dpy, info, False);
  81.   switch((wire->u.u.type & 0x7f) - info->codes->first_event) {
  82.   case MotionNotify:
  83. mevent = (SDL_NAME(XDGAMotionEvent)*)event;
  84. mevent->type = wire->u.u.type & 0x7F;
  85. mevent->serial = _XSetLastRequestRead(dpy, (xGenericReply *)wire);
  86. mevent->display = dpy;
  87. mevent->screen = wire->u.event.screen;
  88. mevent->time = wire->u.event.time;
  89. mevent->state = wire->u.event.state;
  90. mevent->dx = wire->u.event.dx;
  91. mevent->dy = wire->u.event.dy;
  92. return True;
  93.   case ButtonPress:
  94.   case ButtonRelease:
  95. bevent = (SDL_NAME(XDGAButtonEvent)*)event;
  96. bevent->type = wire->u.u.type & 0x7F;
  97. bevent->serial = _XSetLastRequestRead(dpy, (xGenericReply *)wire);
  98. bevent->display = dpy;
  99. bevent->screen = wire->u.event.screen;
  100. bevent->time = wire->u.event.time;
  101. bevent->state = wire->u.event.state;
  102. bevent->button = wire->u.u.detail;
  103. return True;
  104.   case KeyPress:
  105.   case KeyRelease:
  106. kevent = (SDL_NAME(XDGAKeyEvent)*)event;
  107. kevent->type = wire->u.u.type & 0x7F;
  108. kevent->serial = _XSetLastRequestRead(dpy, (xGenericReply *)wire);
  109. kevent->display = dpy;
  110. kevent->screen = wire->u.event.screen;
  111. kevent->time = wire->u.event.time;
  112. kevent->state = wire->u.event.state;
  113. kevent->keycode = wire->u.u.detail;
  114. return True;
  115.   }
  116.   return False;
  117. }
  118. Bool SDL_NAME(XDGAQueryExtension) (
  119.     Display *dpy,
  120.     int *event_basep,
  121.     int *error_basep
  122. ){
  123.     XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
  124.     if (XextHasExtension(info)) {
  125. *event_basep = info->codes->first_event;
  126. *error_basep = info->codes->first_error;
  127. return True;
  128.     } else {
  129. return False;
  130.     }
  131. }
  132. Bool SDL_NAME(XDGAQueryVersion)(
  133.     Display *dpy,
  134.     int *majorVersion, 
  135.     int *minorVersion
  136. ){
  137.     XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
  138.     xXDGAQueryVersionReply rep;
  139.     xXDGAQueryVersionReq *req;
  140.     XDGACheckExtension (dpy, info, False);
  141.     LockDisplay(dpy);
  142.     GetReq(XDGAQueryVersion, req);
  143.     req->reqType = info->codes->major_opcode;
  144.     req->dgaReqType = X_XDGAQueryVersion;
  145.     if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
  146. UnlockDisplay(dpy);
  147. SyncHandle();
  148. return False;
  149.     }
  150.     *majorVersion = rep.majorVersion;
  151.     *minorVersion = rep.minorVersion;
  152.     UnlockDisplay(dpy);
  153.     SyncHandle();
  154.     if (*majorVersion >= 2)
  155.     {
  156. int i, j;
  157. for (i = 0, j = info->codes->first_event;
  158.      i < XF86DGANumberEvents;
  159.      i++, j++) 
  160. {
  161.     XESetWireToEvent (dpy, j, xdga_wire_to_event);
  162.     XESetEventToWire (dpy, j, xdga_event_to_wire);
  163. }
  164. SDL_NAME(XDGASetClientVersion)(dpy);
  165.     }
  166.     return True;
  167. }
  168. Bool SDL_NAME(XDGASetClientVersion)(
  169.     Display *dpy
  170. ){
  171.     XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
  172.     xXDGASetClientVersionReq *req;
  173.     XDGACheckExtension (dpy, info, False);
  174.     LockDisplay(dpy);
  175.     GetReq(XDGASetClientVersion, req);
  176.     req->reqType = info->codes->major_opcode;
  177.     req->dgaReqType = X_XDGASetClientVersion;
  178.     req->major = XDGA_MAJOR_VERSION;
  179.     req->minor = XDGA_MINOR_VERSION;
  180.     UnlockDisplay(dpy);
  181.     SyncHandle();
  182.     return True;
  183. }
  184. Bool SDL_NAME(XDGAOpenFramebuffer)(
  185.     Display *dpy,
  186.     int  screen
  187. ){
  188.     XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
  189.     xXDGAOpenFramebufferReply rep;
  190.     xXDGAOpenFramebufferReq *req;
  191.     char *deviceName = NULL;
  192.     Bool ret;
  193.     XDGACheckExtension (dpy, info, False);
  194.     LockDisplay(dpy);
  195.     GetReq(XDGAOpenFramebuffer, req);
  196.     req->reqType = info->codes->major_opcode;
  197.     req->dgaReqType = X_XDGAOpenFramebuffer;
  198.     req->screen = screen;
  199.     if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
  200. UnlockDisplay(dpy);
  201. SyncHandle();
  202. return False;
  203.     }
  204.     if(rep.length) {
  205. deviceName = Xmalloc(rep.length << 2);
  206. _XRead(dpy, deviceName, rep.length << 2);
  207.     }
  208.     ret = SDL_NAME(XDGAMapFramebuffer)(screen, deviceName,
  209. (unsigned char*)(long)rep.mem1, 
  210. rep.size, rep.offset, rep.extra);
  211.     if(deviceName)
  212. Xfree(deviceName);
  213.     UnlockDisplay(dpy);
  214.     SyncHandle();
  215.     return ret;
  216. }
  217. void SDL_NAME(XDGACloseFramebuffer)(
  218.     Display *dpy,
  219.     int screen
  220. ){
  221.     XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
  222.     xXDGACloseFramebufferReq *req;
  223.     XextSimpleCheckExtension (dpy, info, SDL_NAME(xdga_extension_name));
  224.     SDL_NAME(XDGAUnmapFramebuffer)(screen);
  225.     LockDisplay(dpy);
  226.     GetReq(XDGACloseFramebuffer, req);
  227.     req->reqType = info->codes->major_opcode;
  228.     req->dgaReqType = X_XDGACloseFramebuffer;
  229.     req->screen = screen;
  230.     UnlockDisplay(dpy);
  231.     SyncHandle();
  232. }
  233. SDL_NAME(XDGAMode)* SDL_NAME(XDGAQueryModes)(
  234.     Display *dpy,
  235.     int screen,
  236.     int *num
  237. ){
  238.     XExtDisplayInfo *dinfo = SDL_NAME(xdga_find_display) (dpy);
  239.     xXDGAQueryModesReply rep;
  240.     xXDGAQueryModesReq *req;
  241.     SDL_NAME(XDGAMode) *modes = NULL;
  242.     *num = 0;
  243.     XDGACheckExtension (dpy, dinfo, NULL);
  244.     LockDisplay(dpy);
  245.     GetReq(XDGAQueryModes, req);
  246.     req->reqType = dinfo->codes->major_opcode;
  247.     req->dgaReqType = X_XDGAQueryModes;
  248.     req->screen = screen;
  249.     if (_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
  250. if(rep.length) {
  251.    xXDGAModeInfo info;
  252.    int i, size;
  253.    char *offset;
  254.    size = rep.length << 2;
  255.    size -= rep.number * sz_xXDGAModeInfo; /* find text size */
  256.    modes = (SDL_NAME(XDGAMode)*)Xmalloc((rep.number * sizeof(SDL_NAME(XDGAMode))) + size);
  257.    offset = (char*)(&modes[rep.number]); /* start of text */
  258.    if(modes) {
  259.       for(i = 0; i < rep.number; i++) {
  260. _XRead(dpy, (char*)(&info), sz_xXDGAModeInfo);
  261. modes[i].num = info.num;
  262. modes[i].verticalRefresh = 
  263. (float)info.vsync_num / (float)info.vsync_den;
  264. modes[i].flags = info.flags;
  265. modes[i].imageWidth = info.image_width;
  266. modes[i].imageHeight = info.image_height;
  267. modes[i].pixmapWidth = info.pixmap_width;
  268. modes[i].pixmapHeight = info.pixmap_height;
  269. modes[i].bytesPerScanline = info.bytes_per_scanline;
  270. modes[i].byteOrder = info.byte_order;
  271. modes[i].depth = info.depth;
  272. modes[i].bitsPerPixel = info.bpp;
  273. modes[i].redMask = info.red_mask;
  274. modes[i].greenMask = info.green_mask;
  275. modes[i].blueMask = info.blue_mask;
  276. modes[i].visualClass = info.visual_class;
  277. modes[i].viewportWidth = info.viewport_width;
  278. modes[i].viewportHeight = info.viewport_height;
  279. modes[i].xViewportStep = info.viewport_xstep;
  280. modes[i].yViewportStep = info.viewport_ystep;
  281. modes[i].maxViewportX = info.viewport_xmax;
  282. modes[i].maxViewportY = info.viewport_ymax;
  283. modes[i].viewportFlags = info.viewport_flags;
  284. modes[i].reserved1 = info.reserved1;
  285. modes[i].reserved2 = info.reserved2;
  286. _XRead(dpy, offset, info.name_size);
  287. modes[i].name = offset;
  288. offset += info.name_size;
  289.       }
  290.       *num = rep.number;
  291.    } else
  292. _XEatData(dpy, rep.length << 2);
  293. }
  294.     }
  295.     UnlockDisplay(dpy);
  296.     SyncHandle();
  297.     return modes;
  298. }
  299. SDL_NAME(XDGADevice) * 
  300. SDL_NAME(XDGASetMode)(
  301.     Display *dpy,
  302.     int screen,
  303.     int mode
  304. ){
  305.     XExtDisplayInfo *dinfo = SDL_NAME(xdga_find_display) (dpy);
  306.     xXDGASetModeReply rep;
  307.     xXDGASetModeReq *req;
  308.     SDL_NAME(XDGADevice) *dev = NULL;
  309.     Pixmap pid;
  310.     XDGACheckExtension (dpy, dinfo, NULL);
  311.     LockDisplay(dpy);
  312.     GetReq(XDGASetMode, req);
  313.     req->reqType = dinfo->codes->major_opcode;
  314.     req->dgaReqType = X_XDGASetMode;
  315.     req->screen = screen;
  316.     req->mode = mode;
  317.     req->pid = pid = XAllocID(dpy);
  318.     
  319.     if (_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
  320. if(rep.length) {
  321.    xXDGAModeInfo info;
  322.    int size;
  323.    size = rep.length << 2;
  324.    size -= sz_xXDGAModeInfo; /* get text size */
  325.    dev = (SDL_NAME(XDGADevice)*)Xmalloc(sizeof(SDL_NAME(XDGADevice)) + size);
  326.     
  327.    if(dev) {
  328. _XRead(dpy, (char*)(&info), sz_xXDGAModeInfo);
  329. dev->mode.num = info.num;
  330. dev->mode.verticalRefresh = 
  331. (float)info.vsync_num / (float)info.vsync_den;
  332. dev->mode.flags = info.flags;
  333. dev->mode.imageWidth = info.image_width;
  334. dev->mode.imageHeight = info.image_height;
  335. dev->mode.pixmapWidth = info.pixmap_width;
  336. dev->mode.pixmapHeight = info.pixmap_height;
  337. dev->mode.bytesPerScanline = info.bytes_per_scanline;
  338. dev->mode.byteOrder = info.byte_order;
  339. dev->mode.depth = info.depth;
  340. dev->mode.bitsPerPixel = info.bpp;
  341. dev->mode.redMask = info.red_mask;
  342. dev->mode.greenMask = info.green_mask;
  343. dev->mode.blueMask = info.blue_mask;
  344. dev->mode.visualClass = info.visual_class;
  345. dev->mode.viewportWidth = info.viewport_width;
  346. dev->mode.viewportHeight = info.viewport_height;
  347. dev->mode.xViewportStep = info.viewport_xstep;
  348. dev->mode.yViewportStep = info.viewport_ystep;
  349. dev->mode.maxViewportX = info.viewport_xmax;
  350. dev->mode.maxViewportY = info.viewport_ymax;
  351. dev->mode.viewportFlags = info.viewport_flags;
  352. dev->mode.reserved1 = info.reserved1;
  353. dev->mode.reserved2 = info.reserved2;
  354. dev->mode.name = (char*)(&dev[1]);
  355. _XRead(dpy, dev->mode.name, info.name_size);
  356. dev->pixmap = (rep.flags & XDGAPixmap) ? pid : 0;
  357. dev->data = SDL_NAME(XDGAGetMappedMemory)(screen);
  358. if(dev->data)
  359.     dev->data += rep.offset;
  360.    } 
  361.    /* not sure what to do if the allocation fails */
  362. }
  363.     }
  364.     UnlockDisplay(dpy);
  365.     SyncHandle();
  366.     return dev;
  367. }
  368. void SDL_NAME(XDGASetViewport)(
  369.     Display *dpy,
  370.     int screen,
  371.     int x,
  372.     int y,
  373.     int flags
  374. ){
  375.     XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
  376.     xXDGASetViewportReq *req;
  377.     XextSimpleCheckExtension (dpy, info, SDL_NAME(xdga_extension_name));
  378.     LockDisplay(dpy);
  379.     GetReq(XDGASetViewport, req);
  380.     req->reqType = info->codes->major_opcode;
  381.     req->dgaReqType = X_XDGASetViewport;
  382.     req->screen = screen;
  383.     req->x = x;
  384.     req->y = y;
  385.     req->flags = flags;
  386.     UnlockDisplay(dpy);
  387.     SyncHandle();
  388. }
  389. void SDL_NAME(XDGAInstallColormap)(
  390.     Display *dpy,
  391.     int screen,
  392.     Colormap cmap
  393. ){
  394.     XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
  395.     xXDGAInstallColormapReq *req;
  396.     XextSimpleCheckExtension (dpy, info, SDL_NAME(xdga_extension_name));
  397.     LockDisplay(dpy);
  398.     GetReq(XDGAInstallColormap, req);
  399.     req->reqType = info->codes->major_opcode;
  400.     req->dgaReqType = X_XDGAInstallColormap;
  401.     req->screen = screen;
  402.     req->cmap = cmap;
  403.     UnlockDisplay(dpy);
  404.     SyncHandle();
  405. }
  406. void SDL_NAME(XDGASelectInput)(
  407.     Display *dpy,
  408.     int screen,
  409.     long mask
  410. ){
  411.     XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
  412.     xXDGASelectInputReq *req;
  413.     XextSimpleCheckExtension (dpy, info, SDL_NAME(xdga_extension_name));
  414.     LockDisplay(dpy);
  415.     GetReq(XDGASelectInput, req);
  416.     req->reqType = info->codes->major_opcode;
  417.     req->dgaReqType = X_XDGASelectInput;
  418.     req->screen = screen;
  419.     req->mask = mask;
  420.     UnlockDisplay(dpy);
  421.     SyncHandle();
  422. }
  423. void SDL_NAME(XDGAFillRectangle)(
  424.     Display *dpy,
  425.     int screen,
  426.     int x,
  427.     int y,
  428.     unsigned int width,
  429.     unsigned int height,
  430.     unsigned long color
  431. ){
  432.     XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
  433.     xXDGAFillRectangleReq *req;
  434.     XextSimpleCheckExtension (dpy, info, SDL_NAME(xdga_extension_name));
  435.     LockDisplay(dpy);
  436.     GetReq(XDGAFillRectangle, req);
  437.     req->reqType = info->codes->major_opcode;
  438.     req->dgaReqType = X_XDGAFillRectangle;
  439.     req->screen = screen;
  440.     req->x = x;
  441.     req->y = y;
  442.     req->width = width;
  443.     req->height = height;
  444.     req->color = color;
  445.     UnlockDisplay(dpy);
  446.     SyncHandle();
  447. }
  448. void SDL_NAME(XDGACopyArea)(
  449.     Display *dpy,
  450.     int screen,
  451.     int srcx,
  452.     int srcy,
  453.     unsigned int width,
  454.     unsigned int height,
  455.     int dstx,
  456.     int dsty
  457. ){
  458.     XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
  459.     xXDGACopyAreaReq *req;
  460.     XextSimpleCheckExtension (dpy, info, SDL_NAME(xdga_extension_name));
  461.     LockDisplay(dpy);
  462.     GetReq(XDGACopyArea, req);
  463.     req->reqType = info->codes->major_opcode;
  464.     req->dgaReqType = X_XDGACopyArea;
  465.     req->screen = screen;
  466.     req->srcx = srcx;
  467.     req->srcy = srcy;
  468.     req->width = width;
  469.     req->height = height;
  470.     req->dstx = dstx;
  471.     req->dsty = dsty;
  472.     UnlockDisplay(dpy);
  473.     SyncHandle();
  474. }
  475. void SDL_NAME(XDGACopyTransparentArea)(
  476.     Display *dpy,
  477.     int screen,
  478.     int srcx,
  479.     int srcy,
  480.     unsigned int width,
  481.     unsigned int height,
  482.     int dstx,
  483.     int dsty,
  484.     unsigned long key
  485. ){
  486.     XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
  487.     xXDGACopyTransparentAreaReq *req;
  488.     XextSimpleCheckExtension (dpy, info, SDL_NAME(xdga_extension_name));
  489.     LockDisplay(dpy);
  490.     GetReq(XDGACopyTransparentArea, req);
  491.     req->reqType = info->codes->major_opcode;
  492.     req->dgaReqType = X_XDGACopyTransparentArea;
  493.     req->screen = screen;
  494.     req->srcx = srcx;
  495.     req->srcy = srcy;
  496.     req->width = width;
  497.     req->height = height;
  498.     req->dstx = dstx;
  499.     req->dsty = dsty;
  500.     req->key = key;
  501.     UnlockDisplay(dpy);
  502.     SyncHandle();
  503. }
  504. int SDL_NAME(XDGAGetViewportStatus)(
  505.     Display *dpy,
  506.     int screen 
  507. ){
  508.     XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
  509.     xXDGAGetViewportStatusReply rep;
  510.     xXDGAGetViewportStatusReq *req;
  511.     int status = 0;
  512.     XDGACheckExtension (dpy, info, 0);
  513.     LockDisplay(dpy);
  514.     GetReq(XDGAGetViewportStatus, req);
  515.     req->reqType = info->codes->major_opcode;
  516.     req->dgaReqType = X_XDGAGetViewportStatus;
  517.     req->screen = screen;
  518.     if (!_XReply(dpy, (xReply *)&rep, 0, xFalse))
  519. status = rep.status;
  520.     UnlockDisplay(dpy);
  521.     SyncHandle();
  522.     return status;
  523. }
  524. void SDL_NAME(XDGASync)(
  525.     Display *dpy,
  526.     int screen 
  527. ){
  528.     XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
  529.     xXDGASyncReply rep;
  530.     xXDGASyncReq *req;
  531.     XextSimpleCheckExtension (dpy, info, SDL_NAME(xdga_extension_name));
  532.     LockDisplay(dpy);
  533.     GetReq(XDGASync, req);
  534.     req->reqType = info->codes->major_opcode;
  535.     req->dgaReqType = X_XDGASync;
  536.     req->screen = screen;
  537.     _XReply(dpy, (xReply *)&rep, 0, xFalse);
  538.     UnlockDisplay(dpy);
  539.     SyncHandle();
  540. }
  541. void SDL_NAME(XDGAChangePixmapMode)(
  542.     Display *dpy,
  543.     int screen,
  544.     int *x,
  545.     int *y,
  546.     int mode 
  547. ){
  548.     XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
  549.     xXDGAChangePixmapModeReq *req;
  550.     xXDGAChangePixmapModeReply rep;
  551.     XextSimpleCheckExtension (dpy, info, SDL_NAME(xdga_extension_name));
  552.     LockDisplay(dpy);
  553.     GetReq(XDGAChangePixmapMode, req);
  554.     req->reqType = info->codes->major_opcode;
  555.     req->dgaReqType = X_XDGAChangePixmapMode;
  556.     req->screen = screen;
  557.     req->x = *x;
  558.     req->y = *y;
  559.     req->flags = mode;
  560.     _XReply(dpy, (xReply *)&rep, 0, xFalse);
  561.     *x = rep.x;
  562.     *y = rep.y;
  563.     UnlockDisplay(dpy);
  564.     SyncHandle();
  565. }
  566. Colormap SDL_NAME(XDGACreateColormap)(
  567.     Display *dpy,
  568.     int screen,
  569.     SDL_NAME(XDGADevice) *dev,
  570.     int alloc
  571. ){
  572.     XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy);
  573.     xXDGACreateColormapReq *req;
  574.     Colormap cid;
  575.     XDGACheckExtension (dpy, info, -1);
  576.     LockDisplay(dpy);
  577.     GetReq(XDGACreateColormap, req);
  578.     req->reqType = info->codes->major_opcode;
  579.     req->dgaReqType = X_XDGACreateColormap;
  580.     req->screen = screen;
  581.     req->mode = dev->mode.num;
  582.     req->alloc = alloc;
  583.     cid = req->id = XAllocID(dpy);
  584.     UnlockDisplay(dpy);
  585.     SyncHandle();
  586.     return cid;
  587. }
  588. void SDL_NAME(XDGAKeyEventToXKeyEvent)(
  589.     SDL_NAME(XDGAKeyEvent)* dk, 
  590.     XKeyEvent* xk
  591. ){
  592.     xk->type = dk->type;
  593.     xk->serial = dk->serial;
  594.     xk->send_event = False;
  595.     xk->display = dk->display;
  596.     xk->window = RootWindow(dk->display, dk->screen);
  597.     xk->root = xk->window;
  598.     xk->subwindow = None;
  599.     xk->time = dk->time;
  600.     xk->x = xk->y = xk->x_root = xk->y_root = 0;
  601.     xk->state = dk->state;
  602.     xk->keycode = dk->keycode;
  603.     xk->same_screen = True;
  604. }
  605. #include <X11/Xmd.h>
  606. #include <stdlib.h>
  607. #include <stdio.h>
  608. #include <fcntl.h>
  609. #if defined(ISC) 
  610. # define HAS_SVR3_MMAP
  611. # include <sys/types.h>
  612. # include <errno.h>
  613. # include <sys/at_ansi.h>
  614. # include <sys/kd.h>
  615. # include <sys/sysmacros.h>
  616. # include <sys/immu.h>
  617. # include <sys/region.h>
  618. # include <sys/mmap.h>
  619. #else
  620. # if !defined(Lynx)
  621. #  if !defined(__EMX__)
  622. #   include <sys/mman.h>
  623. #  endif
  624. # else
  625. #  include <sys/types.h>
  626. #  include <errno.h>
  627. #  include <smem.h>
  628. # endif
  629. #endif
  630. #include <sys/wait.h>
  631. #include <signal.h>
  632. #include <unistd.h>
  633. #if defined(SVR4) && !defined(sun) && !defined(SCO325)
  634. #define DEV_MEM "/dev/pmem"
  635. #elif defined(SVR4) && defined(sun)
  636. #define DEV_MEM "/dev/xsvc"
  637. #else
  638. #define DEV_MEM "/dev/mem"
  639. #endif
  640. typedef struct _DGAMapRec{
  641.   unsigned char *physical;
  642.   unsigned char *virtual;
  643.   CARD32 size;
  644.   int fd;
  645.   int screen;
  646.   struct _DGAMapRec *next;
  647. } DGAMapRec, *DGAMapPtr;
  648. static Bool
  649. DGAMapPhysical(int, char*, unsigned char*, CARD32, CARD32, CARD32, DGAMapPtr); 
  650. static void DGAUnmapPhysical(DGAMapPtr);
  651. static DGAMapPtr _Maps = NULL;
  652. unsigned char*
  653. SDL_NAME(XDGAGetMappedMemory)(int screen)
  654. {
  655.     DGAMapPtr pMap = _Maps;
  656.     unsigned char *pntr = NULL;
  657.     while(pMap != NULL) {
  658. if(pMap->screen == screen) {
  659.     pntr = pMap->virtual;
  660.     break;
  661. }
  662. pMap = pMap->next;
  663.     }
  664.     return pntr;
  665. }
  666. Bool
  667. SDL_NAME(XDGAMapFramebuffer)(
  668.    int screen,
  669.    char *name, /* optional device name */
  670.    unsigned char* base, /* physical memory */
  671.    CARD32 size, /* size */
  672.    CARD32 offset, /* optional offset */
  673.    CARD32 extra /* optional extra data */
  674. ){
  675.    DGAMapPtr pMap = _Maps;
  676.    Bool result;
  677.    
  678.    /* is it already mapped ? */
  679.    while(pMap != NULL) {
  680.      if(pMap->screen == screen)
  681. return True;
  682.      pMap = pMap->next;
  683.    }
  684.    if(extra & XDGANeedRoot) {
  685.     /* we should probably check if we have root permissions and
  686.        return False here */
  687.    }
  688.    pMap = (DGAMapPtr)Xmalloc(sizeof(DGAMapRec));
  689.    result = DGAMapPhysical(screen, name, base, size, offset, extra, pMap);
  690.    if(result) {
  691.       pMap->next = _Maps;
  692.       _Maps = pMap;
  693.    } else 
  694.       Xfree(pMap);
  695.    
  696.    return result;
  697. }
  698. void
  699. SDL_NAME(XDGAUnmapFramebuffer)(int screen)
  700. {
  701.    DGAMapPtr pMap = _Maps;
  702.    DGAMapPtr pPrev = NULL;
  703.    /* is it already mapped */
  704.     while(pMap != NULL) {
  705. if(pMap->screen == screen)
  706.     break;
  707. pPrev = pMap;
  708. pMap = pMap->next;
  709.     }
  710.     if(!pMap)
  711. return;
  712.     DGAUnmapPhysical(pMap);
  713.     if(!pPrev)
  714. _Maps = pMap->next;
  715.     else
  716. pPrev->next = pMap->next;
  717.     Xfree(pMap);
  718. }
  719. static Bool
  720. DGAMapPhysical(
  721.    int screen,
  722.    char *name, /* optional device name */
  723.    unsigned char* base, /* physical memory */
  724.    CARD32 size, /* size */
  725.    CARD32 offset, /* optional offset */
  726.    CARD32 extra, /* optional extra data */
  727.    DGAMapPtr pMap
  728. ) {
  729. #if defined(ISC) && defined(HAS_SVR3_MMAP)
  730.     struct kd_memloc mloc;
  731. #elif defined(__EMX__)
  732.     APIRET rc;
  733.     ULONG action;
  734.     HFILE hfd;
  735. #endif
  736.   
  737.     base += offset;
  738.     pMap->screen = screen;
  739.     pMap->physical = base;
  740.     pMap->size = size;
  741. #if defined(ISC) && defined(HAS_SVR3_MMAP)
  742.     if ((pMap->fd = open("/dev/mmap", O_RDWR)) < 0)
  743. return False;
  744.     mloc.vaddr = (char *)0;
  745.     mloc.physaddr = (char *)base;
  746.     mloc.length = size;
  747.     mloc.ioflg=1;
  748.     if ((pMap->virtual = (void *)ioctl(pMap->fd, MAP, &mloc)) == (void *)-1)
  749. return False;
  750. #elif defined (__EMX__)
  751.     /*
  752.      * Dragon warning here! /dev/pmap$ is never closed, except on progam exit.
  753.      * Consecutive calling of this routine will make PMAP$ driver run out
  754.      * of memory handles. Some umap/close mechanism should be provided
  755.      */
  756.     rc = DosOpen("/dev/pmap$", &hfd, &action, 0, FILE_NORMAL, FILE_OPEN,
  757.  OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYNONE, (PEAOP2)NULL);
  758.     if (rc != 0)
  759. return False;
  760.     {
  761. struct map_ioctl {
  762. union {
  763. ULONG phys;
  764. void* user;
  765. } a;
  766. ULONG size;
  767. } pmap,dmap;
  768. ULONG plen,dlen;
  769. #define XFREE86_PMAP 0x76
  770. #define PMAP_MAP 0x44
  771. pmap.a.phys = base;
  772. pmap.size = size;
  773. rc = DosDevIOCtl(hfd, XFREE86_PMAP, PMAP_MAP,
  774.  (PULONG)&pmap, sizeof(pmap), &plen,
  775.  (PULONG)&dmap, sizeof(dmap), &dlen);
  776. if (rc == 0) {
  777. pMap->virtual = dmap.a.user;
  778. }
  779.    }
  780.    if (rc != 0)
  781. return False;
  782. #elif defined (Lynx)
  783.     pMap->virtual = smem_create("XF86DGA", (char*)base, size, SM_READ|SM_WRITE);
  784. #else
  785. #ifndef MAP_FILE
  786. #define MAP_FILE 0
  787. #endif
  788.     if (!name)
  789.     name = DEV_MEM;
  790.     if ((pMap->fd = open(name, O_RDWR)) < 0)
  791. #if defined(linux)
  792.     { /* /dev/fb0 fallback added by Sam Lantinga <hercules@lokigames.com> */
  793.         /* Try to fall back to /dev/fb on Linux - FIXME: verify the device */
  794.         struct fb_fix_screeninfo finfo;
  795.         if ((pMap->fd = open("/dev/fb0", O_RDWR)) < 0) {
  796.             return False;
  797.         }
  798.         /* The useable framebuffer console memory may not be the whole
  799.            framebuffer that X has access to. :-(
  800.          */
  801.         if ( ioctl(pMap->fd, FBIOGET_FSCREENINFO, &finfo) < 0 ) {
  802.             close(pMap->fd);
  803.             return False;
  804.         }
  805.         /* Warning: On PPC, the size and virtual need to be offset by:
  806.            (((long)finfo.smem_start) -
  807.            (((long)finfo.smem_start)&~(PAGE_SIZE-1)))
  808.          */
  809.         base = 0;
  810.         size = finfo.smem_len;
  811.     }
  812. #else
  813. return False;
  814. #endif
  815.     pMap->virtual = mmap(NULL, size, PROT_READ | PROT_WRITE, 
  816. MAP_FILE | MAP_SHARED, pMap->fd, (off_t)base);
  817.     if (pMap->virtual == (void *)-1)
  818. return False;
  819. #endif
  820. #if !defined(ISC) && !defined(HAS_SVR3_MMAP) && !defined(Lynx) 
  821. && !defined(__EMX__)
  822.     mprotect(pMap->virtual, size, PROT_READ | PROT_WRITE);
  823. #endif
  824.     return True;
  825. }
  826. static void
  827. DGAUnmapPhysical(DGAMapPtr pMap)
  828. {
  829. #if !defined(ISC) && !defined(HAS_SVR3_MMAP) && !defined(Lynx) 
  830. && !defined(__EMX__)
  831.     mprotect(pMap->virtual,pMap->size, PROT_READ);
  832. #elif defined(Lynx)
  833. /* XXX this doesn't allow enable after disable */
  834.     smem_create(NULL, pMap->virtual, pMap->size, SM_DETACH);
  835.     smem_remove("XF86DGA");
  836. #endif
  837.    /* We need to unmap and close too !!!!!!!!!!*/
  838. }