19682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* $XFree86: xc/lib/Xxf86dga/XF86DGA.c,v 3.19 2001/08/18 02:41:30 dawes Exp $ */ 29682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* 39682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 49682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCopyright (c) 1995 Jon Tombs 59682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCopyright (c) 1995,1996 The XFree86 Project, Inc 69682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 79682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall*/ 89682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 99682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* THIS IS NOT AN X CONSORTIUM STANDARD */ 109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#ifdef __EMX__ /* needed here to override certain constants in X headers */ 129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define INCL_DOS 139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define INCL_DOSIOCTL 149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <os2.h> 159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif 169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#if defined(linux) 189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define HAS_MMAP_ANON 199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <sys/types.h> 209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <sys/mman.h> 219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/*#include <asm/page.h>*/ /* PAGE_SIZE */ 229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define HAS_SC_PAGESIZE /* _SC_PAGESIZE may be an enum for Linux */ 239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define HAS_GETPAGESIZE 249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif /* linux */ 259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#if defined(CSRG_BASED) 279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define HAS_MMAP_ANON 289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define HAS_GETPAGESIZE 299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <sys/types.h> 309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <sys/mman.h> 319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif /* CSRG_BASED */ 329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#if defined(DGUX) 349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define HAS_GETPAGESIZE 359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define MMAP_DEV_ZERO 369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <sys/types.h> 379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <sys/mman.h> 389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <unistd.h> 399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif /* DGUX */ 409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#if defined(SVR4) && !defined(DGUX) 429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define MMAP_DEV_ZERO 439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <sys/types.h> 449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <sys/mman.h> 459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <unistd.h> 469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif /* SVR4 && !DGUX */ 479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#if defined(sun) && !defined(SVR4) /* SunOS */ 499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define MMAP_DEV_ZERO /* doesn't SunOS have MAP_ANON ?? */ 509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define HAS_GETPAGESIZE 519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <sys/types.h> 529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <sys/mman.h> 539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif /* sun && !SVR4 */ 549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#ifdef XNO_SYSCONF 569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#undef _SC_PAGESIZE 579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif 589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define NEED_EVENTS 609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define NEED_REPLIES 619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* Apparently some X11 systems can't include this multiple times... */ 639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#ifndef SDL_INCLUDED_XLIBINT_H 649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define SDL_INCLUDED_XLIBINT_H 1 659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <X11/Xlibint.h> 669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif 679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include "../extensions/xf86dga.h" 699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include "../extensions/xf86dgastr.h" 709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include "../extensions/Xext.h" 719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include "../extensions/extutil.h" 729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallextern XExtDisplayInfo* SDL_NAME(xdga_find_display)(Display*); 749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallextern char *SDL_NAME(xdga_extension_name); 759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define XF86DGACheckExtension(dpy,i,val) \ 779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall XextCheckExtension (dpy, i, SDL_NAME(xdga_extension_name), val) 789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/***************************************************************************** 809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * * 819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * public XFree86-DGA Extension routines * 829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * * 839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *****************************************************************************/ 849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallBool SDL_NAME(XF86DGAQueryExtension) ( 869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Display *dpy, 879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int *event_basep, 889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int *error_basep 899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall){ 909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return SDL_NAME(XDGAQueryExtension)(dpy, event_basep, error_basep); 919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} 929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallBool SDL_NAME(XF86DGAQueryVersion)( 949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Display* dpy, 959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int* majorVersion, 969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int* minorVersion 979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall){ 989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return SDL_NAME(XDGAQueryVersion)(dpy, majorVersion, minorVersion); 999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} 1009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallBool SDL_NAME(XF86DGAGetVideoLL)( 1029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Display* dpy, 1039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int screen, 1049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int *offset, 1059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int *width, 1069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int *bank_size, 1079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int *ram_size 1089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall){ 1099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy); 1109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall xXF86DGAGetVideoLLReply rep; 1119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall xXF86DGAGetVideoLLReq *req; 1129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall XF86DGACheckExtension (dpy, info, False); 1149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall LockDisplay(dpy); 1169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall GetReq(XF86DGAGetVideoLL, req); 1179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->reqType = info->codes->major_opcode; 1189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->dgaReqType = X_XF86DGAGetVideoLL; 1199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->screen = screen; 1209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) { 1219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall UnlockDisplay(dpy); 1229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall SyncHandle(); 1239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return False; 1249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 1259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *offset = /*(char *)*/rep.offset; 1279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *width = rep.width; 1289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *bank_size = rep.bank_size; 1299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *ram_size = rep.ram_size; 1309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall UnlockDisplay(dpy); 1329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall SyncHandle(); 1339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return True; 1349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} 1359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallBool SDL_NAME(XF86DGADirectVideoLL)( 1389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Display* dpy, 1399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int screen, 1409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int enable 1419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall){ 1429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy); 1439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall xXF86DGADirectVideoReq *req; 1449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall XF86DGACheckExtension (dpy, info, False); 1469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall LockDisplay(dpy); 1489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall GetReq(XF86DGADirectVideo, req); 1499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->reqType = info->codes->major_opcode; 1509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->dgaReqType = X_XF86DGADirectVideo; 1519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->screen = screen; 1529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->enable = enable; 1539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall UnlockDisplay(dpy); 1549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall SyncHandle(); 1559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall XSync(dpy,False); 1569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return True; 1579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} 1589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallBool SDL_NAME(XF86DGAGetViewPortSize)( 1609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Display* dpy, 1619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int screen, 1629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int *width, 1639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int *height 1649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall){ 1659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy); 1669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall xXF86DGAGetViewPortSizeReply rep; 1679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall xXF86DGAGetViewPortSizeReq *req; 1689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall XF86DGACheckExtension (dpy, info, False); 1709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall LockDisplay(dpy); 1729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall GetReq(XF86DGAGetViewPortSize, req); 1739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->reqType = info->codes->major_opcode; 1749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->dgaReqType = X_XF86DGAGetViewPortSize; 1759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->screen = screen; 1769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) { 1779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall UnlockDisplay(dpy); 1789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall SyncHandle(); 1799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return False; 1809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 1819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *width = rep.width; 1839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *height = rep.height; 1849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall UnlockDisplay(dpy); 1869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall SyncHandle(); 1879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return True; 1889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} 1899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallBool SDL_NAME(XF86DGASetViewPort)( 1929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Display* dpy, 1939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int screen, 1949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int x, 1959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int y 1969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall){ 1979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy); 1989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall xXF86DGASetViewPortReq *req; 1999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall XF86DGACheckExtension (dpy, info, False); 2019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall LockDisplay(dpy); 2039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall GetReq(XF86DGASetViewPort, req); 2049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->reqType = info->codes->major_opcode; 2059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->dgaReqType = X_XF86DGASetViewPort; 2069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->screen = screen; 2079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->x = x; 2089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->y = y; 2099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall UnlockDisplay(dpy); 2109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall SyncHandle(); 2119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall XSync(dpy,False); 2129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return True; 2139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} 2149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallBool SDL_NAME(XF86DGAGetVidPage)( 2179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Display* dpy, 2189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int screen, 2199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int *vpage 2209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall){ 2219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy); 2229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall xXF86DGAGetVidPageReply rep; 2239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall xXF86DGAGetVidPageReq *req; 2249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall XF86DGACheckExtension (dpy, info, False); 2269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall LockDisplay(dpy); 2289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall GetReq(XF86DGAGetVidPage, req); 2299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->reqType = info->codes->major_opcode; 2309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->dgaReqType = X_XF86DGAGetVidPage; 2319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->screen = screen; 2329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) { 2339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall UnlockDisplay(dpy); 2349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall SyncHandle(); 2359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return False; 2369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 2379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *vpage = rep.vpage; 2399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall UnlockDisplay(dpy); 2409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall SyncHandle(); 2419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return True; 2429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} 2439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallBool SDL_NAME(XF86DGASetVidPage)( 2469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Display* dpy, 2479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int screen, 2489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int vpage 2499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall){ 2509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy); 2519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall xXF86DGASetVidPageReq *req; 2529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall XF86DGACheckExtension (dpy, info, False); 2549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall LockDisplay(dpy); 2569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall GetReq(XF86DGASetVidPage, req); 2579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->reqType = info->codes->major_opcode; 2589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->dgaReqType = X_XF86DGASetVidPage; 2599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->screen = screen; 2609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->vpage = vpage; 2619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall UnlockDisplay(dpy); 2629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall SyncHandle(); 2639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall XSync(dpy,False); 2649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return True; 2659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} 2669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallBool SDL_NAME(XF86DGAInstallColormap)( 2689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Display* dpy, 2699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int screen, 2709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Colormap cmap 2719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall){ 2729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy); 2739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall xXF86DGAInstallColormapReq *req; 2749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall XF86DGACheckExtension (dpy, info, False); 2769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall LockDisplay(dpy); 2789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall GetReq(XF86DGAInstallColormap, req); 2799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->reqType = info->codes->major_opcode; 2809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->dgaReqType = X_XF86DGAInstallColormap; 2819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->screen = screen; 2829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->id = cmap; 2839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall UnlockDisplay(dpy); 2849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall SyncHandle(); 2859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall XSync(dpy,False); 2869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return True; 2879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} 2889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallBool SDL_NAME(XF86DGAQueryDirectVideo)( 2909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Display *dpy, 2919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int screen, 2929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int *flags 2939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall){ 2949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy); 2959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall xXF86DGAQueryDirectVideoReply rep; 2969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall xXF86DGAQueryDirectVideoReq *req; 2979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall XF86DGACheckExtension (dpy, info, False); 2999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall LockDisplay(dpy); 3019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall GetReq(XF86DGAQueryDirectVideo, req); 3029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->reqType = info->codes->major_opcode; 3039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->dgaReqType = X_XF86DGAQueryDirectVideo; 3049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->screen = screen; 3059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) { 3069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall UnlockDisplay(dpy); 3079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall SyncHandle(); 3089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return False; 3099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 3109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *flags = rep.flags; 3119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall UnlockDisplay(dpy); 3129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall SyncHandle(); 3139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return True; 3149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} 3159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallBool SDL_NAME(XF86DGAViewPortChanged)( 3179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Display *dpy, 3189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int screen, 3199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int n 3209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall){ 3219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall XExtDisplayInfo *info = SDL_NAME(xdga_find_display) (dpy); 3229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall xXF86DGAViewPortChangedReply rep; 3239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall xXF86DGAViewPortChangedReq *req; 3249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall XF86DGACheckExtension (dpy, info, False); 3269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall LockDisplay(dpy); 3289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall GetReq(XF86DGAViewPortChanged, req); 3299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->reqType = info->codes->major_opcode; 3309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->dgaReqType = X_XF86DGAViewPortChanged; 3319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->screen = screen; 3329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall req->n = n; 3339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) { 3349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall UnlockDisplay(dpy); 3359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall SyncHandle(); 3369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return False; 3379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 3389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall UnlockDisplay(dpy); 3399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall SyncHandle(); 3409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return rep.result; 3419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} 3429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* Helper functions */ 3469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <X11/Xmd.h> 3489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include "../extensions/xf86dga.h" 3499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <stdlib.h> 3509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <stdio.h> 3519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <fcntl.h> 3529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#if defined(ISC) 3539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# define HAS_SVR3_MMAP 3549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# include <sys/types.h> 3559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# include <errno.h> 3569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# include <sys/at_ansi.h> 3589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# include <sys/kd.h> 3599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# include <sys/sysmacros.h> 3619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# include <sys/immu.h> 3629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# include <sys/region.h> 3639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# include <sys/mmap.h> 3659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#else 3669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# if !defined(Lynx) 3679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# if !defined(__EMX__) 3689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# include <sys/mman.h> 3699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# endif 3709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# else 3719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# include <sys/types.h> 3729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# include <errno.h> 3739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# include <smem.h> 3749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall# endif 3759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif 3769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <sys/wait.h> 3779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <signal.h> 3789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <unistd.h> 3799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#if defined(SVR4) && !defined(sun) && !defined(SCO325) 3819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define DEV_MEM "/dev/pmem" 3829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#elif defined(SVR4) && defined(sun) 3839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define DEV_MEM "/dev/xsvc" 3849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#else 3859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define DEV_MEM "/dev/mem" 3869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif 3879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Halltypedef struct { 3899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned long physaddr; /* actual requested physical address */ 3909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned long size; /* actual requested map size */ 3919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned long delta; /* delta to account for page alignment */ 3929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall void * vaddr; /* mapped address, without the delta */ 3939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int refcount; /* reference count */ 3949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} MapRec, *MapPtr; 3959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Halltypedef struct { 3979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Display * display; 3989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int screen; 3999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall MapPtr map; 4009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} ScrRec, *ScrPtr; 4019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallstatic int mapFd = -1; 4039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallstatic int numMaps = 0; 4049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallstatic int numScrs = 0; 4059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallstatic MapPtr *mapList = NULL; 4069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallstatic ScrPtr *scrList = NULL; 4079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallstatic MapPtr 4099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallAddMap(void) 4109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall{ 4119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall MapPtr *old; 4129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall old = mapList; 4149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mapList = realloc(mapList, sizeof(MapPtr) * (numMaps + 1)); 4159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (!mapList) { 4169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mapList = old; 4179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return NULL; 4189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 4199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mapList[numMaps] = malloc(sizeof(MapRec)); 4209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (!mapList[numMaps]) 4219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return NULL; 4229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return mapList[numMaps++]; 4239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} 4249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallstatic ScrPtr 4269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallAddScr(void) 4279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall{ 4289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall ScrPtr *old; 4299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall old = scrList; 4319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scrList = realloc(scrList, sizeof(ScrPtr) * (numScrs + 1)); 4329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (!scrList) { 4339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scrList = old; 4349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return NULL; 4359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 4369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scrList[numScrs] = malloc(sizeof(ScrRec)); 4379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (!scrList[numScrs]) 4389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return NULL; 4399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return scrList[numScrs++]; 4409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} 4419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallstatic MapPtr 4439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallFindMap(unsigned long address, unsigned long size) 4449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall{ 4459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int i; 4469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall for (i = 0; i < numMaps; i++) { 4489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (mapList[i]->physaddr == address && 4499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mapList[i]->size == size) 4509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return mapList[i]; 4519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 4529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return NULL; 4539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} 4549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallstatic ScrPtr 4569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallFindScr(Display *display, int screen) 4579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall{ 4589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int i; 4599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall for (i = 0; i < numScrs; i++) { 4619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (scrList[i]->display == display && 4629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scrList[i]->screen == screen) 4639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return scrList[i]; 4649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 4659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return NULL; 4669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} 4679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallstatic void * 4699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallMapPhysAddress(unsigned long address, unsigned long size) 4709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall{ 4719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned long offset, delta; 4729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int pagesize = -1; 4739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall void *vaddr; 4749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall MapPtr mp; 4759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#if defined(ISC) && defined(HAS_SVR3_MMAP) 4769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall struct kd_memloc mloc; 4779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#elif defined(__EMX__) 4789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall APIRET rc; 4799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall ULONG action; 4809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall HFILE hfd; 4819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif 4829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if ((mp = FindMap(address, size))) { 4849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mp->refcount++; 4859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return (void *)((unsigned long)mp->vaddr + mp->delta); 4869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 4879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#if defined(_SC_PAGESIZE) && defined(HAS_SC_PAGESIZE) 4899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall pagesize = sysconf(_SC_PAGESIZE); 4909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif 4919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#ifdef _SC_PAGE_SIZE 4929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (pagesize == -1) 4939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall pagesize = sysconf(_SC_PAGE_SIZE); 4949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif 4959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#ifdef HAS_GETPAGESIZE 4969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (pagesize == -1) 4979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall pagesize = getpagesize(); 4989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif 4999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#ifdef PAGE_SIZE 5009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (pagesize == -1) 5019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall pagesize = PAGE_SIZE; 5029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif 5039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (pagesize == -1) 5049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall pagesize = 4096; 5059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall delta = address % pagesize; 5079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall offset = address - delta; 5089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#if defined(ISC) && defined(HAS_SVR3_MMAP) 5109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (mapFd < 0) { 5119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if ((mapFd = open("/dev/mmap", O_RDWR)) < 0) 5129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return NULL; 5139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 5149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mloc.vaddr = (char *)0; 5159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mloc.physaddr = (char *)offset; 5169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mloc.length = size + delta; 5179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mloc.ioflg=1; 5189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if ((vaddr = (void *)ioctl(mapFd, MAP, &mloc)) == (void *)-1) 5209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return NULL; 5219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#elif defined (__EMX__) 5229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall /* 5239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * Dragon warning here! /dev/pmap$ is never closed, except on progam exit. 5249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * Consecutive calling of this routine will make PMAP$ driver run out 5259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * of memory handles. Some umap/close mechanism should be provided 5269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall */ 5279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall rc = DosOpen("/dev/pmap$", &hfd, &action, 0, FILE_NORMAL, FILE_OPEN, 5299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYNONE, (PEAOP2)NULL); 5309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (rc != 0) 5319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return NULL; 5329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 5339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall struct map_ioctl { 5349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall union { 5359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall ULONG phys; 5369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall void* user; 5379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } a; 5389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall ULONG size; 5399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } pmap,dmap; 5409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall ULONG plen,dlen; 5419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define XFREE86_PMAP 0x76 5429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define PMAP_MAP 0x44 5439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall pmap.a.phys = offset; 5459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall pmap.size = size + delta; 5469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall rc = DosDevIOCtl(hfd, XFREE86_PMAP, PMAP_MAP, 5479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (PULONG)&pmap, sizeof(pmap), &plen, 5489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (PULONG)&dmap, sizeof(dmap), &dlen); 5499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (rc == 0) { 5509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vaddr = dmap.a.user; 5519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 5529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 5539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (rc != 0) 5549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return NULL; 5559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#elif defined (Lynx) 5569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vaddr = (void *)smem_create("XF86DGA", (char *)offset, 5579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall size + delta, SM_READ|SM_WRITE); 5589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#else 5599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#ifndef MAP_FILE 5609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define MAP_FILE 0 5619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif 5629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (mapFd < 0) { 5639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if ((mapFd = open(DEV_MEM, O_RDWR)) < 0) 5649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return NULL; 5659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 5669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vaddr = (void *)mmap(NULL, size + delta, PROT_READ | PROT_WRITE, 5679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall MAP_FILE | MAP_SHARED, mapFd, (off_t)offset); 5689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (vaddr == (void *)-1) 5699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return NULL; 5709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif 5719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (!vaddr) { 5739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (!(mp = AddMap())) 5749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return NULL; 5759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mp->physaddr = address; 5769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mp->size = size; 5779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mp->delta = delta; 5789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mp->vaddr = vaddr; 5799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mp->refcount = 1; 5809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 5819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return (void *)((unsigned long)vaddr + delta); 5829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} 5839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* 5859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * Still need to find a clean way of detecting the death of a DGA app 5869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * and returning things to normal - Jon 5879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * This is here to help debugging without rebooting... Also C-A-BS 5889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * should restore text mode. 5899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall */ 5909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallint 5929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallSDL_NAME(XF86DGAForkApp)(int screen) 5939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall{ 5949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall pid_t pid; 5959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int status; 5969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int i; 5979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall /* fork the app, parent hangs around to clean up */ 5999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if ((pid = fork()) > 0) { 6009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall ScrPtr sp; 6019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall waitpid(pid, &status, 0); 6039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall for (i = 0; i < numScrs; i++) { 6049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall sp = scrList[i]; 6059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall SDL_NAME(XF86DGADirectVideoLL)(sp->display, sp->screen, 0); 6069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall XSync(sp->display, False); 6079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 608e4c5d95ed37611acc6a186522315195b4ebfb9efJesse Hall if (WIFEXITED(status)) 609e4c5d95ed37611acc6a186522315195b4ebfb9efJesse Hall exit(0); 6109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall else 611e4c5d95ed37611acc6a186522315195b4ebfb9efJesse Hall exit(-1); 6129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 6139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return pid; 6149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} 6159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallBool 6189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallSDL_NAME(XF86DGADirectVideo)( 6199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Display *dis, 6209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int screen, 6219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int enable 6229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall){ 6239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall ScrPtr sp; 6249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall MapPtr mp = NULL; 6259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if ((sp = FindScr(dis, screen))) 6279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mp = sp->map; 6289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (enable & XF86DGADirectGraphics) { 6309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#if !defined(ISC) && !defined(HAS_SVR3_MMAP) && !defined(Lynx) \ 6319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall && !defined(__EMX__) 6329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (mp && mp->vaddr) 6339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mprotect(mp->vaddr, mp->size + mp->delta, PROT_READ | PROT_WRITE); 6349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif 6359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } else { 6369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#if !defined(ISC) && !defined(HAS_SVR3_MMAP) && !defined(Lynx) \ 6379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall && !defined(__EMX__) 6389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (mp && mp->vaddr) 6399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mprotect(mp->vaddr, mp->size + mp->delta, PROT_READ); 6409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#elif defined(Lynx) 6419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall /* XXX this doesn't allow enable after disable */ 6429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall smem_create(NULL, mp->vaddr, mp->size + mp->delta, SM_DETACH); 6439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall smem_remove("XF86DGA"); 6449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif 6459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 6469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall SDL_NAME(XF86DGADirectVideoLL)(dis, screen, enable); 6489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return 1; 6499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} 6509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallstatic void 6539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallXF86cleanup(int sig) 6549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall{ 6559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall ScrPtr sp; 6569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int i; 6579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall static char beenhere = 0; 6589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (beenhere) 660e4c5d95ed37611acc6a186522315195b4ebfb9efJesse Hall exit(3); 6619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall beenhere = 1; 6629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall for (i = 0; i < numScrs; i++) { 6649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall sp = scrList[i]; 6659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall SDL_NAME(XF86DGADirectVideo)(sp->display, sp->screen, 0); 6669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall XSync(sp->display, False); 6679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 668e4c5d95ed37611acc6a186522315195b4ebfb9efJesse Hall exit(3); 6699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} 6709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallBool 6729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallSDL_NAME(XF86DGAGetVideo)( 6739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Display *dis, 6749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int screen, 6759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall char **addr, 6769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int *width, 6779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int *bank, 6789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall int *ram 6799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall){ 6809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall /*unsigned long*/ int offset; 6819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall static int beenHere = 0; 6829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall ScrPtr sp; 6839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall MapPtr mp; 6849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (!(sp = FindScr(dis, screen))) { 6869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (!(sp = AddScr())) { 6879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall fprintf(stderr, "XF86DGAGetVideo: malloc failure\n"); 6889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall exit(-2); 6899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 6909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall sp->display = dis; 6919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall sp->screen = screen; 6929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall sp->map = NULL; 6939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 6949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall SDL_NAME(XF86DGAGetVideoLL)(dis, screen , &offset, width, bank, ram); 6969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *addr = MapPhysAddress(offset, *bank); 6989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (*addr == NULL) { 6999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall fprintf(stderr, "XF86DGAGetVideo: failed to map video memory (%s)\n", 7009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall strerror(errno)); 7019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall exit(-2); 7029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 7039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if ((mp = FindMap(offset, *bank))) 7059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall sp->map = mp; 7069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if (!beenHere) { 7089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall beenHere = 1; 7099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall atexit((void(*)(void))XF86cleanup); 7109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall /* one shot XF86cleanup attempts */ 7119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall signal(SIGSEGV, XF86cleanup); 7129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#ifdef SIGBUS 7139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall signal(SIGBUS, XF86cleanup); 7149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif 7159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall signal(SIGHUP, XF86cleanup); 7169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall signal(SIGFPE, XF86cleanup); 7179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 7189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return 1; 7209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} 7219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 722