comparison src/video/Xext/Xxf86dga/XF86DGA2.c @ 1168:045f186426e1

Dynamically load X11 libraries like we currently do for alsa, esd, etc. This allows you to run an SDL program on a system without Xlib, since it'll just report the x11 target unavailable at runtime.
author Ryan C. Gordon <icculus@icculus.org>
date Sat, 05 Nov 2005 19:53:37 +0000
parents f1b029d3b301
children dd2a8deeb26d
comparison
equal deleted inserted replaced
1167:435c2e481299 1168:045f186426e1
25 25
26 #if defined(ENABLE_FBCON) /* Needed for framebuffer console support */ 26 #if defined(ENABLE_FBCON) /* Needed for framebuffer console support */
27 #include <sys/ioctl.h> 27 #include <sys/ioctl.h>
28 #include <linux/fb.h> 28 #include <linux/fb.h>
29 #endif 29 #endif
30
31 #include "../../x11/SDL_x11dyn.h"
32
33 /* Workaround code in headers... */
34 #define _XFlush p_XFlush
35 #define _XFlushGCCache p_XFlushGCCache
36 #define _XReply p_XReply
37 #define _XSend p_XSend
30 38
31 /* If you change this, change the Bases[] array below as well */ 39 /* If you change this, change the Bases[] array below as well */
32 #define MAX_HEADS 16 40 #define MAX_HEADS 16
33 41
34 char *SDL_NAME(xdga_extension_name) = XF86DGANAME; 42 char *SDL_NAME(xdga_extension_name) = XF86DGANAME;
102 110
103 switch((wire->u.u.type & 0x7f) - info->codes->first_event) { 111 switch((wire->u.u.type & 0x7f) - info->codes->first_event) {
104 case MotionNotify: 112 case MotionNotify:
105 mevent = (SDL_NAME(XDGAMotionEvent)*)event; 113 mevent = (SDL_NAME(XDGAMotionEvent)*)event;
106 mevent->type = wire->u.u.type & 0x7F; 114 mevent->type = wire->u.u.type & 0x7F;
107 mevent->serial = _XSetLastRequestRead(dpy, (xGenericReply *)wire); 115 mevent->serial = p_XSetLastRequestRead(dpy, (xGenericReply *)wire);
108 mevent->display = dpy; 116 mevent->display = dpy;
109 mevent->screen = wire->u.event.screen; 117 mevent->screen = wire->u.event.screen;
110 mevent->time = wire->u.event.time; 118 mevent->time = wire->u.event.time;
111 mevent->state = wire->u.event.state; 119 mevent->state = wire->u.event.state;
112 mevent->dx = wire->u.event.dx; 120 mevent->dx = wire->u.event.dx;
114 return True; 122 return True;
115 case ButtonPress: 123 case ButtonPress:
116 case ButtonRelease: 124 case ButtonRelease:
117 bevent = (SDL_NAME(XDGAButtonEvent)*)event; 125 bevent = (SDL_NAME(XDGAButtonEvent)*)event;
118 bevent->type = wire->u.u.type & 0x7F; 126 bevent->type = wire->u.u.type & 0x7F;
119 bevent->serial = _XSetLastRequestRead(dpy, (xGenericReply *)wire); 127 bevent->serial = p_XSetLastRequestRead(dpy, (xGenericReply *)wire);
120 bevent->display = dpy; 128 bevent->display = dpy;
121 bevent->screen = wire->u.event.screen; 129 bevent->screen = wire->u.event.screen;
122 bevent->time = wire->u.event.time; 130 bevent->time = wire->u.event.time;
123 bevent->state = wire->u.event.state; 131 bevent->state = wire->u.event.state;
124 bevent->button = wire->u.u.detail; 132 bevent->button = wire->u.u.detail;
125 return True; 133 return True;
126 case KeyPress: 134 case KeyPress:
127 case KeyRelease: 135 case KeyRelease:
128 kevent = (SDL_NAME(XDGAKeyEvent)*)event; 136 kevent = (SDL_NAME(XDGAKeyEvent)*)event;
129 kevent->type = wire->u.u.type & 0x7F; 137 kevent->type = wire->u.u.type & 0x7F;
130 kevent->serial = _XSetLastRequestRead(dpy, (xGenericReply *)wire); 138 kevent->serial = p_XSetLastRequestRead(dpy, (xGenericReply *)wire);
131 kevent->display = dpy; 139 kevent->display = dpy;
132 kevent->screen = wire->u.event.screen; 140 kevent->screen = wire->u.event.screen;
133 kevent->time = wire->u.event.time; 141 kevent->time = wire->u.event.time;
134 kevent->state = wire->u.event.state; 142 kevent->state = wire->u.event.state;
135 kevent->keycode = wire->u.u.detail; 143 kevent->keycode = wire->u.u.detail;
170 178
171 LockDisplay(dpy); 179 LockDisplay(dpy);
172 GetReq(XDGAQueryVersion, req); 180 GetReq(XDGAQueryVersion, req);
173 req->reqType = info->codes->major_opcode; 181 req->reqType = info->codes->major_opcode;
174 req->dgaReqType = X_XDGAQueryVersion; 182 req->dgaReqType = X_XDGAQueryVersion;
175 if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) { 183 if (!p_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
176 UnlockDisplay(dpy); 184 UnlockDisplay(dpy);
177 SyncHandle(); 185 SyncHandle();
178 return False; 186 return False;
179 } 187 }
180 *majorVersion = rep.majorVersion; 188 *majorVersion = rep.majorVersion;
187 195
188 for (i = 0, j = info->codes->first_event; 196 for (i = 0, j = info->codes->first_event;
189 i < XF86DGANumberEvents; 197 i < XF86DGANumberEvents;
190 i++, j++) 198 i++, j++)
191 { 199 {
192 XESetWireToEvent (dpy, j, xdga_wire_to_event); 200 pXESetWireToEvent(dpy, j, xdga_wire_to_event);
193 XESetEventToWire (dpy, j, xdga_event_to_wire); 201 pXESetEventToWire(dpy, j, xdga_event_to_wire);
194 } 202 }
195 SDL_NAME(XDGASetClientVersion)(dpy); 203 SDL_NAME(XDGASetClientVersion)(dpy);
196 } 204 }
197 return True; 205 return True;
198 } 206 }
231 LockDisplay(dpy); 239 LockDisplay(dpy);
232 GetReq(XDGAOpenFramebuffer, req); 240 GetReq(XDGAOpenFramebuffer, req);
233 req->reqType = info->codes->major_opcode; 241 req->reqType = info->codes->major_opcode;
234 req->dgaReqType = X_XDGAOpenFramebuffer; 242 req->dgaReqType = X_XDGAOpenFramebuffer;
235 req->screen = screen; 243 req->screen = screen;
236 if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) { 244 if (!p_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
237 UnlockDisplay(dpy); 245 UnlockDisplay(dpy);
238 SyncHandle(); 246 SyncHandle();
239 return False; 247 return False;
240 } 248 }
241 249
242 if(rep.length) { 250 if(rep.length) {
243 deviceName = Xmalloc(rep.length << 2); 251 deviceName = Xmalloc(rep.length << 2);
244 _XRead(dpy, deviceName, rep.length << 2); 252 p_XRead(dpy, deviceName, rep.length << 2);
245 } 253 }
246 254
247 ret = SDL_NAME(XDGAMapFramebuffer)(screen, deviceName, 255 ret = SDL_NAME(XDGAMapFramebuffer)(screen, deviceName,
248 (unsigned char*)(long)rep.mem1, 256 (unsigned char*)(long)rep.mem1,
249 rep.size, rep.offset, rep.extra); 257 rep.size, rep.offset, rep.extra);
296 GetReq(XDGAQueryModes, req); 304 GetReq(XDGAQueryModes, req);
297 req->reqType = dinfo->codes->major_opcode; 305 req->reqType = dinfo->codes->major_opcode;
298 req->dgaReqType = X_XDGAQueryModes; 306 req->dgaReqType = X_XDGAQueryModes;
299 req->screen = screen; 307 req->screen = screen;
300 308
301 if (_XReply(dpy, (xReply *)&rep, 0, xFalse)) { 309 if (p_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
302 if(rep.length) { 310 if(rep.length) {
303 xXDGAModeInfo info; 311 xXDGAModeInfo info;
304 int i, size; 312 int i, size;
305 char *offset; 313 char *offset;
306 314
310 offset = (char*)(&modes[rep.number]); /* start of text */ 318 offset = (char*)(&modes[rep.number]); /* start of text */
311 319
312 320
313 if(modes) { 321 if(modes) {
314 for(i = 0; i < rep.number; i++) { 322 for(i = 0; i < rep.number; i++) {
315 _XRead(dpy, (char*)(&info), sz_xXDGAModeInfo); 323 p_XRead(dpy, (char*)(&info), sz_xXDGAModeInfo);
316 324
317 modes[i].num = info.num; 325 modes[i].num = info.num;
318 modes[i].verticalRefresh = 326 modes[i].verticalRefresh =
319 (float)info.vsync_num / (float)info.vsync_den; 327 (float)info.vsync_num / (float)info.vsync_den;
320 modes[i].flags = info.flags; 328 modes[i].flags = info.flags;
338 modes[i].maxViewportY = info.viewport_ymax; 346 modes[i].maxViewportY = info.viewport_ymax;
339 modes[i].viewportFlags = info.viewport_flags; 347 modes[i].viewportFlags = info.viewport_flags;
340 modes[i].reserved1 = info.reserved1; 348 modes[i].reserved1 = info.reserved1;
341 modes[i].reserved2 = info.reserved2; 349 modes[i].reserved2 = info.reserved2;
342 350
343 _XRead(dpy, offset, info.name_size); 351 p_XRead(dpy, offset, info.name_size);
344 modes[i].name = offset; 352 modes[i].name = offset;
345 offset += info.name_size; 353 offset += info.name_size;
346 } 354 }
347 *num = rep.number; 355 *num = rep.number;
348 } else 356 } else
349 _XEatData(dpy, rep.length << 2); 357 p_XEatData(dpy, rep.length << 2);
350 } 358 }
351 } 359 }
352 360
353 UnlockDisplay(dpy); 361 UnlockDisplay(dpy);
354 SyncHandle(); 362 SyncHandle();
377 req->dgaReqType = X_XDGASetMode; 385 req->dgaReqType = X_XDGASetMode;
378 req->screen = screen; 386 req->screen = screen;
379 req->mode = mode; 387 req->mode = mode;
380 req->pid = pid = XAllocID(dpy); 388 req->pid = pid = XAllocID(dpy);
381 389
382 if (_XReply(dpy, (xReply *)&rep, 0, xFalse)) { 390 if (p_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
383 if(rep.length) { 391 if(rep.length) {
384 xXDGAModeInfo info; 392 xXDGAModeInfo info;
385 int size; 393 int size;
386 394
387 size = rep.length << 2; 395 size = rep.length << 2;
388 size -= sz_xXDGAModeInfo; /* get text size */ 396 size -= sz_xXDGAModeInfo; /* get text size */
389 397
390 dev = (SDL_NAME(XDGADevice)*)Xmalloc(sizeof(SDL_NAME(XDGADevice)) + size); 398 dev = (SDL_NAME(XDGADevice)*)Xmalloc(sizeof(SDL_NAME(XDGADevice)) + size);
391 399
392 if(dev) { 400 if(dev) {
393 _XRead(dpy, (char*)(&info), sz_xXDGAModeInfo); 401 p_XRead(dpy, (char*)(&info), sz_xXDGAModeInfo);
394 402
395 dev->mode.num = info.num; 403 dev->mode.num = info.num;
396 dev->mode.verticalRefresh = 404 dev->mode.verticalRefresh =
397 (float)info.vsync_num / (float)info.vsync_den; 405 (float)info.vsync_num / (float)info.vsync_den;
398 dev->mode.flags = info.flags; 406 dev->mode.flags = info.flags;
417 dev->mode.viewportFlags = info.viewport_flags; 425 dev->mode.viewportFlags = info.viewport_flags;
418 dev->mode.reserved1 = info.reserved1; 426 dev->mode.reserved1 = info.reserved1;
419 dev->mode.reserved2 = info.reserved2; 427 dev->mode.reserved2 = info.reserved2;
420 428
421 dev->mode.name = (char*)(&dev[1]); 429 dev->mode.name = (char*)(&dev[1]);
422 _XRead(dpy, dev->mode.name, info.name_size); 430 p_XRead(dpy, dev->mode.name, info.name_size);
423 431
424 dev->pixmap = (rep.flags & XDGAPixmap) ? pid : 0; 432 dev->pixmap = (rep.flags & XDGAPixmap) ? pid : 0;
425 dev->data = SDL_NAME(XDGAGetMappedMemory)(screen); 433 dev->data = SDL_NAME(XDGAGetMappedMemory)(screen);
426 434
427 if(dev->data) 435 if(dev->data)
608 LockDisplay(dpy); 616 LockDisplay(dpy);
609 GetReq(XDGAGetViewportStatus, req); 617 GetReq(XDGAGetViewportStatus, req);
610 req->reqType = info->codes->major_opcode; 618 req->reqType = info->codes->major_opcode;
611 req->dgaReqType = X_XDGAGetViewportStatus; 619 req->dgaReqType = X_XDGAGetViewportStatus;
612 req->screen = screen; 620 req->screen = screen;
613 if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) 621 if (!p_XReply(dpy, (xReply *)&rep, 0, xFalse))
614 status = rep.status; 622 status = rep.status;
615 UnlockDisplay(dpy); 623 UnlockDisplay(dpy);
616 SyncHandle(); 624 SyncHandle();
617 return status; 625 return status;
618 } 626 }
630 LockDisplay(dpy); 638 LockDisplay(dpy);
631 GetReq(XDGASync, req); 639 GetReq(XDGASync, req);
632 req->reqType = info->codes->major_opcode; 640 req->reqType = info->codes->major_opcode;
633 req->dgaReqType = X_XDGASync; 641 req->dgaReqType = X_XDGASync;
634 req->screen = screen; 642 req->screen = screen;
635 _XReply(dpy, (xReply *)&rep, 0, xFalse); 643 p_XReply(dpy, (xReply *)&rep, 0, xFalse);
636 UnlockDisplay(dpy); 644 UnlockDisplay(dpy);
637 SyncHandle(); 645 SyncHandle();
638 } 646 }
639 647
640 648
657 req->dgaReqType = X_XDGAChangePixmapMode; 665 req->dgaReqType = X_XDGAChangePixmapMode;
658 req->screen = screen; 666 req->screen = screen;
659 req->x = *x; 667 req->x = *x;
660 req->y = *y; 668 req->y = *y;
661 req->flags = mode; 669 req->flags = mode;
662 _XReply(dpy, (xReply *)&rep, 0, xFalse); 670 p_XReply(dpy, (xReply *)&rep, 0, xFalse);
663 *x = rep.x; 671 *x = rep.x;
664 *y = rep.y; 672 *y = rep.y;
665 UnlockDisplay(dpy); 673 UnlockDisplay(dpy);
666 SyncHandle(); 674 SyncHandle();
667 } 675 }