Added DGA2 driver to DirectDraw.
[wine] / dlls / ddraw / x11.c
1 /*              DirectDraw using DGA or Xlib(XSHM)
2  *
3  * Copyright 1997-1999 Marcus Meissner
4  * Copyright 1998 Lionel Ulmer (most of Direct3D stuff)
5  */
6 #include "config.h"
7
8 #include <unistd.h>
9 #include <assert.h>
10 #include <fcntl.h>
11 #include <string.h>
12 #include <stdio.h>
13
14 #include "winerror.h"
15 #include "options.h"
16 #include "monitor.h"
17 #include "debugtools.h"
18 #include "ddraw.h"
19
20 DEFAULT_DEBUG_CHANNEL(ddraw);
21
22 #include "x11_private.h"
23
24 #ifdef HAVE_LIBXXSHM
25 int XShmErrorFlag = 0;
26 #endif
27
28 static inline BOOL get_option( const char *name, BOOL def ) {
29     return PROFILE_GetWineIniBool( "x11drv", name, def );
30 }
31
32 static BOOL
33 DDRAW_XSHM_Available(void) {
34 #ifdef HAVE_LIBXXSHM
35     if (get_option( "UseXShm", 1 )) {
36         if (TSXShmQueryExtension(display)) {
37             int         major,minor;
38             Bool        shpix;
39
40             if (TSXShmQueryVersion(display, &major, &minor, &shpix))
41                 return TRUE;
42         }
43     }
44 #endif
45     return FALSE;
46 }
47
48 static HRESULT X11_Create( LPDIRECTDRAW *lplpDD ) {
49     IDirectDrawImpl*    ddraw;
50     int                 depth;
51     x11_dd_private      *x11priv;
52
53     if (lplpDD == NULL) /* Testing ... this driver works all the time */
54         return DD_OK;
55
56     *lplpDD = (LPDIRECTDRAW)HeapAlloc(
57         GetProcessHeap(),
58         HEAP_ZERO_MEMORY,
59         sizeof(IDirectDrawImpl)
60     );
61     ddraw = (IDirectDrawImpl*)*lplpDD;
62     ICOM_VTBL(ddraw)= &xlib_ddvt;
63     ddraw->ref  = 1;
64     ddraw->private      = HeapAlloc(
65         GetProcessHeap(),
66         HEAP_ZERO_MEMORY,
67         sizeof(x11_dd_private)
68     );
69     x11priv = (x11_dd_private*)ddraw->private;
70
71     /* At DirectDraw creation, the depth is the default depth */
72     depth = DefaultDepthOfScreen(X11DRV_GetXScreen());
73     _common_depth_to_pixelformat(depth,
74                                  &(ddraw->d.directdraw_pixelformat),
75                                  &(ddraw->d.screen_pixelformat),
76                                  &(ddraw->d.pixmap_depth));
77     ddraw->d.height = MONITOR_GetHeight(&MONITOR_PrimaryMonitor);
78     ddraw->d.width = MONITOR_GetWidth(&MONITOR_PrimaryMonitor);
79 #ifdef HAVE_LIBXXSHM
80     /* Test if XShm is available. */
81     if ((x11priv->xshm_active = DDRAW_XSHM_Available())) {
82         x11priv->xshm_compl = 0;
83         TRACE("Using XShm extension.\n");
84     }
85 #endif
86     return DD_OK;
87 }
88
89 /* Where do these GUIDs come from?  mkuuid.
90  * They exist solely to distinguish between the targets Wine support,
91  * and should be different than any other GUIDs in existence.
92  */
93 static GUID X11_DirectDraw_GUID = { /* 1574a740-dc61-11d1-8407-f7875a7d1879 */
94     0x1574a740,
95     0xdc61,
96     0x11d1,
97     {0x84, 0x07, 0xf7, 0x87, 0x5a, 0x7d, 0x18, 0x79}
98 };
99
100 ddraw_driver x11_driver = {
101     &X11_DirectDraw_GUID,
102     "display",
103     "WINE X11 DirectDraw Driver",
104     50,
105     X11_Create
106 }; 
107
108 #ifdef __GNUC__
109 static void X11_register(void) __attribute__((constructor));
110 #else /* defined(__GNUC__) */
111 static void __asm__dummy_dll_init(void) {
112     asm("\t.section .init ,\"ax\"\n"
113                 "\tcall X11_register\n"
114                     "\t.previous\n");
115 }
116 #endif /* defined(__GNUC__) */
117 static void X11_register(void) { ddraw_register_driver(&x11_driver); }