1 /* DirectDraw using DGA or Xlib(XSHM)
3 * Copyright 1997-1999 Marcus Meissner
4 * Copyright 1998 Lionel Ulmer (most of Direct3D stuff)
16 #include "debugtools.h"
19 DEFAULT_DEBUG_CHANNEL(ddraw
);
21 #include "x11_private.h"
24 int XShmErrorFlag
= 0;
27 static inline BOOL
get_option( const char *name
, BOOL def
) {
28 return PROFILE_GetWineIniBool( "x11drv", name
, def
);
32 DDRAW_XSHM_Available(void) {
34 if (get_option( "UseXShm", 1 )) {
35 if (TSXShmQueryExtension(display
)) {
39 if (TSXShmQueryVersion(display
, &major
, &minor
, &shpix
))
49 DDRAW_XVIDEO_Available(x11_dd_private
*x11ddp
) {
50 unsigned int p_version
, p_release
, p_request_base
, p_event_base
, p_error_base
;
52 if (TSXvQueryExtension(display
, &p_version
, &p_release
, &p_request_base
,
53 &p_event_base
, &p_error_base
) == Success
) {
55 int num_adaptators
, i
, default_port
;
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");
62 if (TSXvQueryAdaptors(display
, X11DRV_GetXRootWindow(), &num_adaptators
, &ai
) != Success
) {
63 TRACE("Failed to get list of adaptators.\n");
66 if (num_adaptators
== 0) {
67 TRACE("No XVideo supporting adaptators found.\n");
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
;
79 if ((ai
[i
].base_id
<= default_port
) &&
80 ((ai
[i
].base_id
+ ai
[i
].num_ports
) > default_port
)) {
86 if (i
== num_adaptators
) {
87 if (default_port
!= -1) {
88 ERR("User specified port (%d) not found.\n", default_port
);
90 TRACE("No input + image capable device found.\n");
92 TSXvFreeAdaptorInfo(ai
);
95 x11ddp
->port_id
= default_port
;
97 TRACE("XVideo support available (using version %d.%d)\n", p_version
, p_release
);
98 TSXvFreeAdaptorInfo(ai
);
105 static HRESULT
X11_Create( LPDIRECTDRAW
*lplpDD
) {
106 IDirectDrawImpl
* ddraw
;
108 x11_dd_private
*x11priv
;
110 if (lplpDD
== NULL
) /* Testing ... this driver works all the time */
113 *lplpDD
= (LPDIRECTDRAW
)HeapAlloc(
116 sizeof(IDirectDrawImpl
)
118 ddraw
= (IDirectDrawImpl
*)*lplpDD
;
119 ICOM_VTBL(ddraw
)= &xlib_ddvt
;
122 ddraw
->d
= HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(*(ddraw
->d
)));
124 ddraw
->d
->private = HeapAlloc(
127 sizeof(x11_dd_private
)
129 x11priv
= (x11_dd_private
*)ddraw
->d
->private;
131 /* At DirectDraw creation, the depth is the default depth */
132 depth
= DefaultDepthOfScreen(X11DRV_GetXScreen());
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;
140 ddraw
->d
->height
= GetSystemMetrics(SM_CYSCREEN
);
141 ddraw
->d
->width
= GetSystemMetrics(SM_CXSCREEN
);
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");
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
);
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.
163 static GUID X11_DirectDraw_GUID
= { /* 1574a740-dc61-11d1-8407-f7875a7d1879 */
167 {0x84, 0x07, 0xf7, 0x87, 0x5a, 0x7d, 0x18, 0x79}
170 ddraw_driver x11_driver
= {
171 &X11_DirectDraw_GUID
,
173 "WINE X11 DirectDraw Driver",
178 DECL_GLOBAL_CONSTRUCTOR(X11_register
) { ddraw_register_driver(&x11_driver
); }