Removed a few dependencies on kernel32 functions.
[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 "debugtools.h"
17 #include "ddraw.h"
18
19 DEFAULT_DEBUG_CHANNEL(ddraw);
20
21 #include "x11_private.h"
22
23 #ifdef HAVE_LIBXXSHM
24 int XShmErrorFlag = 0;
25 #endif
26
27 static inline BOOL get_option( const char *name, BOOL def ) {
28     return PROFILE_GetWineIniBool( "x11drv", name, def );
29 }
30
31 static BOOL
32 DDRAW_XSHM_Available(void) {
33 #ifdef HAVE_LIBXXSHM
34     if (get_option( "UseXShm", 1 )) {
35         if (TSXShmQueryExtension(display)) {
36             int         major,minor;
37             Bool        shpix;
38
39             if (TSXShmQueryVersion(display, &major, &minor, &shpix))
40                 return TRUE;
41         }
42     }
43 #endif
44     return FALSE;
45 }
46
47 #ifdef HAVE_XVIDEO
48 static BOOL
49 DDRAW_XVIDEO_Available(x11_dd_private *x11ddp) {
50   unsigned int p_version, p_release, p_request_base, p_event_base, p_error_base;
51   
52   if (TSXvQueryExtension(display, &p_version, &p_release, &p_request_base,
53                        &p_event_base, &p_error_base) == Success) {
54     XvAdaptorInfo *ai;
55     int num_adaptators, i, default_port;
56     
57     if ((p_version < 2) || ((p_version == 2) && (p_release < 2))) {
58       TRACE("XVideo extension does NOT support needed features (need version 2.2) !\n");
59       return FALSE;
60     }
61
62     if (TSXvQueryAdaptors(display, X11DRV_GetXRootWindow(), &num_adaptators, &ai) != Success) {
63       TRACE("Failed to get list of adaptators.\n");
64       return FALSE;
65     }
66     if (num_adaptators == 0) {
67       TRACE("No XVideo supporting adaptators found.\n");
68       return FALSE;
69     }
70
71     default_port = PROFILE_GetWineIniInt("x11drv", "XVideoPort", -1);
72     for (i = 0; i < num_adaptators; i++) {
73       if ((ai[i].type & XvInputMask) && (ai[i].type & XvImageMask)) {
74         /* This supports everything I want : XvImages and the possibility to put something */
75         if (default_port == -1) {
76           default_port = ai[i].base_id;
77           break;
78         } else {
79           if ((ai[i].base_id <= default_port) &&
80               ((ai[i].base_id + ai[i].num_ports) > default_port)) {
81             break;
82           }
83         }
84       }
85     }
86     if (i == num_adaptators) {
87       if (default_port != -1) {
88         ERR("User specified port (%d) not found.\n", default_port);
89       } else {
90         TRACE("No input + image capable device found.\n");
91       }
92       TSXvFreeAdaptorInfo(ai);
93       return FALSE;
94     }
95     x11ddp->port_id = default_port;
96
97     TRACE("XVideo support available (using version %d.%d)\n", p_version, p_release);
98     TSXvFreeAdaptorInfo(ai);
99     return TRUE;
100   }
101   return FALSE;
102 }
103 #endif
104
105 static HRESULT X11_Create( LPDIRECTDRAW *lplpDD ) {
106     IDirectDrawImpl*    ddraw;
107     int                 depth;
108     x11_dd_private      *x11priv;
109
110     if (lplpDD == NULL) /* Testing ... this driver works all the time */
111         return DD_OK;
112
113     *lplpDD = (LPDIRECTDRAW)HeapAlloc(
114         GetProcessHeap(),
115         HEAP_ZERO_MEMORY,
116         sizeof(IDirectDrawImpl)
117     );
118     ddraw = (IDirectDrawImpl*)*lplpDD;
119     ICOM_VTBL(ddraw)= &xlib_ddvt;
120     ddraw->ref  = 1;
121
122     ddraw->d = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*(ddraw->d)));
123     ddraw->d->ref = 1;
124     ddraw->d->private   = HeapAlloc(
125         GetProcessHeap(),
126         HEAP_ZERO_MEMORY,
127         sizeof(x11_dd_private)
128     );
129     x11priv = (x11_dd_private*)ddraw->d->private;
130
131     /* At DirectDraw creation, the depth is the default depth */
132     depth = DefaultDepthOfScreen(X11DRV_GetXScreen());
133
134     switch (_common_depth_to_pixelformat(depth,(LPDIRECTDRAW)ddraw)) {
135     case -2: ERR("no depth conversion mode for depth %d found\n",depth); break;
136     case -1: WARN("No conversion needed for depth %d.\n",depth); break;
137     case 0: MESSAGE("Conversion needed from %d.\n",depth); break;
138     }
139
140     ddraw->d->height = GetSystemMetrics(SM_CYSCREEN);
141     ddraw->d->width = GetSystemMetrics(SM_CXSCREEN);
142 #ifdef HAVE_LIBXXSHM
143     /* Test if XShm is available. */
144     if ((x11priv->xshm_active = DDRAW_XSHM_Available())) {
145         x11priv->xshm_compl = 0;
146         TRACE("Using XShm extension.\n");
147     }
148 #endif
149
150 #ifdef HAVE_XVIDEO
151     /* Test if XVideo support is available */
152     if ((x11priv->xvideo_active = DDRAW_XVIDEO_Available(x11priv))) {
153       TRACE("Using XVideo extension on port '%ld'.\n", x11priv->port_id);
154     }
155 #endif
156     return DD_OK;
157 }
158
159 /* Where do these GUIDs come from?  mkuuid.
160  * They exist solely to distinguish between the targets Wine support,
161  * and should be different than any other GUIDs in existence.
162  */
163 static GUID X11_DirectDraw_GUID = { /* 1574a740-dc61-11d1-8407-f7875a7d1879 */
164     0x1574a740,
165     0xdc61,
166     0x11d1,
167     {0x84, 0x07, 0xf7, 0x87, 0x5a, 0x7d, 0x18, 0x79}
168 };
169
170 ddraw_driver x11_driver = {
171     &X11_DirectDraw_GUID,
172     "display",
173     "WINE X11 DirectDraw Driver",
174     50,
175     X11_Create
176 }; 
177
178 DECL_GLOBAL_CONSTRUCTOR(X11_register) { ddraw_register_driver(&x11_driver); }