/* DirectDraw using DGA or Xlib(XSHM) * * Copyright 1997-1999 Marcus Meissner * Copyright 1998 Lionel Ulmer (most of Direct3D stuff) */ #include "config.h" #include #include #include #include #include #include "winerror.h" #include "options.h" #include "debugtools.h" #include "ddraw.h" DEFAULT_DEBUG_CHANNEL(ddraw); #include "x11_private.h" #ifdef HAVE_LIBXXSHM int XShmErrorFlag = 0; #endif static inline BOOL get_option( const char *name, BOOL def ) { return PROFILE_GetWineIniBool( "x11drv", name, def ); } static BOOL DDRAW_XSHM_Available(void) { #ifdef HAVE_LIBXXSHM if (get_option( "UseXShm", 1 )) { if (TSXShmQueryExtension(display)) { int major,minor; Bool shpix; if (TSXShmQueryVersion(display, &major, &minor, &shpix)) return TRUE; } } #endif return FALSE; } #ifdef HAVE_XVIDEO static BOOL DDRAW_XVIDEO_Available(x11_dd_private *x11ddp) { unsigned int p_version, p_release, p_request_base, p_event_base, p_error_base; if (TSXvQueryExtension(display, &p_version, &p_release, &p_request_base, &p_event_base, &p_error_base) == Success) { XvAdaptorInfo *ai; int num_adaptators, i, default_port; if ((p_version < 2) || ((p_version == 2) && (p_release < 2))) { TRACE("XVideo extension does NOT support needed features (need version 2.2) !\n"); return FALSE; } if (TSXvQueryAdaptors(display, X11DRV_GetXRootWindow(), &num_adaptators, &ai) != Success) { TRACE("Failed to get list of adaptators.\n"); return FALSE; } if (num_adaptators == 0) { TRACE("No XVideo supporting adaptators found.\n"); return FALSE; } default_port = PROFILE_GetWineIniInt("x11drv", "XVideoPort", -1); for (i = 0; i < num_adaptators; i++) { if ((ai[i].type & XvInputMask) && (ai[i].type & XvImageMask)) { /* This supports everything I want : XvImages and the possibility to put something */ if (default_port == -1) { default_port = ai[i].base_id; break; } else { if ((ai[i].base_id <= default_port) && ((ai[i].base_id + ai[i].num_ports) > default_port)) { break; } } } } if (i == num_adaptators) { if (default_port != -1) { ERR("User specified port (%d) not found.\n", default_port); } else { TRACE("No input + image capable device found.\n"); } TSXvFreeAdaptorInfo(ai); return FALSE; } x11ddp->port_id = default_port; TRACE("XVideo support available (using version %d.%d)\n", p_version, p_release); TSXvFreeAdaptorInfo(ai); return TRUE; } return FALSE; } #endif static HRESULT X11_Create( LPDIRECTDRAW *lplpDD ) { IDirectDrawImpl* ddraw; int depth; x11_dd_private *x11priv; if (lplpDD == NULL) /* Testing ... this driver works all the time */ return DD_OK; *lplpDD = (LPDIRECTDRAW)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawImpl) ); ddraw = (IDirectDrawImpl*)*lplpDD; ICOM_VTBL(ddraw)= &xlib_ddvt; ddraw->ref = 1; ddraw->d = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*(ddraw->d))); ddraw->d->ref = 1; ddraw->d->private = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(x11_dd_private) ); x11priv = (x11_dd_private*)ddraw->d->private; /* At DirectDraw creation, the depth is the default depth */ depth = DefaultDepthOfScreen(X11DRV_GetXScreen()); switch (_common_depth_to_pixelformat(depth,(LPDIRECTDRAW)ddraw)) { case -2: ERR("no depth conversion mode for depth %d found\n",depth); break; case -1: WARN("No conversion needed for depth %d.\n",depth); break; case 0: MESSAGE("Conversion needed from %d.\n",depth); break; } ddraw->d->height = GetSystemMetrics(SM_CYSCREEN); ddraw->d->width = GetSystemMetrics(SM_CXSCREEN); #ifdef HAVE_LIBXXSHM /* Test if XShm is available. */ if ((x11priv->xshm_active = DDRAW_XSHM_Available())) { x11priv->xshm_compl = 0; TRACE("Using XShm extension.\n"); } #endif #ifdef HAVE_XVIDEO /* Test if XVideo support is available */ if ((x11priv->xvideo_active = DDRAW_XVIDEO_Available(x11priv))) { TRACE("Using XVideo extension on port '%ld'.\n", x11priv->port_id); } #endif return DD_OK; } /* Where do these GUIDs come from? mkuuid. * They exist solely to distinguish between the targets Wine support, * and should be different than any other GUIDs in existence. */ static GUID X11_DirectDraw_GUID = { /* 1574a740-dc61-11d1-8407-f7875a7d1879 */ 0x1574a740, 0xdc61, 0x11d1, {0x84, 0x07, 0xf7, 0x87, 0x5a, 0x7d, 0x18, 0x79} }; ddraw_driver x11_driver = { &X11_DirectDraw_GUID, "display", "WINE X11 DirectDraw Driver", 50, X11_Create }; DECL_GLOBAL_CONSTRUCTOR(X11_register) { ddraw_register_driver(&x11_driver); }