Implemented the XF86DGA2 driver for the ddraw HAL.
Entered some basic HAL device capabilities data.
Added a GetDriverInfo handler.
diff --git a/dlls/x11drv/x11ddraw.c b/dlls/x11drv/x11ddraw.c
index b5054fc..635a3b9 100644
--- a/dlls/x11drv/x11ddraw.c
+++ b/dlls/x11drv/x11ddraw.c
@@ -9,6 +9,7 @@
#include "x11drv.h"
#include "x11ddraw.h"
#include "xvidmode.h"
+#include "dga2.h"
#include "windef.h"
#include "wingdi.h"
@@ -20,6 +21,7 @@
LPDDRAWI_DDRAWSURFACE_LCL X11DRV_DD_Primary;
LPDDRAWI_DDRAWSURFACE_GBL X11DRV_DD_PrimaryGbl;
+HWND X11DRV_DD_PrimaryWnd;
HBITMAP X11DRV_DD_PrimaryDIB;
Drawable X11DRV_DD_PrimaryDrawable;
ATOM X11DRV_DD_UserClass;
@@ -48,6 +50,7 @@
{
if (data->lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) {
X11DRV_DD_Primary = *data->lplpSList;
+ X11DRV_DD_PrimaryWnd = (HWND)X11DRV_DD_Primary->lpSurfMore->lpDDRAWReserved;
X11DRV_DD_PrimaryGbl = X11DRV_DD_Primary->lpGbl;
SetPrimaryDIB(GET_LPDDRAWSURFACE_GBL_MORE(X11DRV_DD_PrimaryGbl)->hKernelSurface);
X11DRV_DD_UserClass = GlobalFindAtomA("WINE_DDRAW");
@@ -84,6 +87,7 @@
{
if (data->lpDDSurface == X11DRV_DD_Primary) {
X11DRV_DD_Primary = NULL;
+ X11DRV_DD_PrimaryWnd = 0;
X11DRV_DD_PrimaryGbl = NULL;
SetPrimaryDIB(0);
X11DRV_DD_UserClass = 0;
@@ -149,6 +153,28 @@
X11DRV_DDHAL_SetPaletteEntries
};
+static X11DEVICE x11device = {
+ NULL
+};
+
+static DWORD PASCAL X11DRV_DDHAL_GetDriverInfo(LPDDHAL_GETDRIVERINFODATA data)
+{
+ LPX11DRIVERINFO info = x11device.lpInfo;
+ while (info) {
+ if (IsEqualGUID(&data->guidInfo, info->lpGuid)) {
+ DWORD dwSize = info->dwSize;
+ data->dwActualSize = dwSize;
+ if (data->dwExpectedSize < dwSize) dwSize = data->dwExpectedSize;
+ memcpy(data->lpvData, info->lpvData, dwSize);
+ data->ddRVal = DD_OK;
+ return DDHAL_DRIVER_HANDLED;
+ }
+ info = info->lpNext;
+ }
+ data->ddRVal = DDERR_CURRENTLYNOTAVAIL;
+ return DDHAL_DRIVER_HANDLED;
+}
+
static DDHALINFO hal_info = {
sizeof(DDHALINFO),
&hal_ddcallbacks,
@@ -157,18 +183,77 @@
{ /* vmiData */
0 /* fpPrimary */
},
- { /* ddCaps */
- sizeof(DDCORECAPS)
+ { /* ddCaps (only stuff the HAL implements here) */
+ sizeof(DDCORECAPS), /* dwSize */
+ DDCAPS_GDI | DDCAPS_PALETTE, /* dwCaps */
+ DDCAPS2_CERTIFIED | DDCAPS2_NONLOCALVIDMEM | DDCAPS2_NOPAGELOCKREQUIRED |
+ DDCAPS2_WIDESURFACES | DDCAPS2_PRIMARYGAMMA | DDCAPS2_FLIPNOVSYNC, /* dwCaps2 */
+ 0, /* dwCKeyCaps */
+ 0, /* dwFXCaps */
+ 0, /* dwFXAlphaCaps */
+ DDPCAPS_8BIT | DDPCAPS_PRIMARYSURFACE, /* dwPalCaps */
+ 0, /* dwSVCaps */
+ 0, /* dwAlphaBltConstBitDepths */
+ 0, /* dwAlphaBltPixelBitDepths */
+ 0, /* dwAlphaBltSurfaceBitDepths */
+ 0, /* dwAlphaOverlayBltConstBitDepths */
+ 0, /* dwAlphaOverlayBltPixelBitDepths */
+ 0, /* dwAlphaOverlayBltSurfaceBitDepths */
+ 0, /* dwZBufferBitDepths */
+ 16*1024*1024, /* dwVidMemTotal */
+ 16*1024*1024, /* dwVidMemFree */
+ 0, /* dwMaxVisibleOverlays */
+ 0, /* dwCurrVisibleOverlays */
+ 0, /* dwNumFourCCCodes */
+ 0, /* dwAlignBoundarySrc */
+ 0, /* dwAlignSizeSrc */
+ 0, /* dwAlignBoundaryDest */
+ 0, /* dwAlignSizeDest */
+ 0, /* dwAlignStrideAlign */
+ {0}, /* dwRops */
+ { /* ddsCaps */
+ DDSCAPS_BACKBUFFER | DDSCAPS_FLIP | DDSCAPS_FRONTBUFFER |
+ DDSCAPS_OFFSCREENPLAIN | DDSCAPS_PALETTE | DDSCAPS_PRIMARYSURFACE |
+ DDSCAPS_SYSTEMMEMORY | DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY |
+ DDSCAPS_VISIBLE | DDSCAPS_LOCALVIDMEM | DDSCAPS_NONLOCALVIDMEM /* dwCaps */
+ },
+ 0, /* dwMinOverlayStretch */
+ 0, /* dwMaxOverlayStretch */
+ 0, /* dwMinLiveVideoStretch */
+ 0, /* dwMaxLiveVideoStretch */
+ 0, /* dwMinHwCodecStretch */
+ 0, /* dwMaxHwCodecStretch */
+ 0, /* dwReserved1 */
+ 0, /* dwReserved2 */
+ 0, /* dwReserved2 */
+ 0, /* dwSVBCaps */
+ 0, /* dwSVBCKeyCaps */
+ 0, /* dwSVBFXCaps */
+ {0}, /* dwSVBRops */
+ 0, /* dwVSBCaps */
+ 0, /* dwVSBCKeyCaps */
+ 0, /* dwVSBFXCaps */
+ {0}, /* dwVSBRops */
+ 0, /* dwSSBCaps */
+ 0, /* dwSSBCKeyCaps */
+ 0, /* dwSSBFXCaps */
+ {0}, /* dwSSBRops */
+ 0, /* dwMaxVideoPorts */
+ 0, /* dwCurrVideoPorts */
+ 0 /* dwSVBCaps */
},
0, /* dwMonitorFrequency */
- NULL, /* GetDriverInfo */
+ X11DRV_DDHAL_GetDriverInfo,
0, /* dwModeIndex */
NULL, /* lpdwFourCC */
0, /* dwNumModes */
NULL, /* lpModeInfo */
- DDHALINFO_ISPRIMARYDISPLAY | DDHALINFO_MODEXILLEGAL, /* dwFlags */
- NULL, /* lpPDevice */
- 0 /* hInstance */
+ DDHALINFO_ISPRIMARYDISPLAY | DDHALINFO_MODEXILLEGAL | DDHALINFO_GETDRIVERINFOSET, /* dwFlags */
+ &x11device,
+ 0, /* hInstance */
+ 0, /* lpD3DGlobalDriverData */
+ 0, /* lpD3DHALCallbacks */
+ NULL /* lpDDExeBufCallbacks */
};
static LPDDHALDDRAWFNS ddraw_fns;
@@ -217,13 +302,16 @@
/* FIXME: get x11drv's hInstance */
#ifdef HAVE_LIBXXF86DGA2
- /*if (!X11DRV_XF86DGA2_CreateDriver(&hal_info))*/
+ if (!X11DRV_XF86DGA2_CreateDriver(&hal_info))
#endif
{
#ifdef HAVE_LIBXXF86VM
X11DRV_XF86VM_CreateDriver(&hal_info);
#endif
}
+#ifdef HAVE_OPENGL
+ /*X11DRV_GLX_CreateDriver(&hal_info);*/
+#endif
(ddraw_fns->lpSetInfo)(&hal_info, FALSE);
*lpInstance = hal_info.hInstance;
@@ -233,7 +321,7 @@
return 0;
}
-void X11DRV_DDHAL_SwitchMode(DWORD dwModeIndex, LPVOID fb_addr)
+void X11DRV_DDHAL_SwitchMode(DWORD dwModeIndex, LPVOID fb_addr, LPVIDMEM fb_mem)
{
LPDDHALMODEINFO info = &hal_info.lpModeInfo[dwModeIndex];
@@ -249,6 +337,8 @@
hal_info.vmiData.ddpfDisplay.u2.dwRBitMask = info->dwRBitMask;
hal_info.vmiData.ddpfDisplay.u3.dwGBitMask = info->dwGBitMask;
hal_info.vmiData.ddpfDisplay.u4.dwBBitMask = info->dwBBitMask;
+ hal_info.vmiData.dwNumHeaps = fb_mem ? 1 : 0;
+ hal_info.vmiData.pvmList = fb_mem;
X11DRV_DDHAL_SetInfo();
}