| /* |
| * DirectDraw driver interface |
| * |
| * Copyright 2001 TransGaming Technologies, Inc. |
| */ |
| |
| #include "windef.h" |
| #include "wingdi.h" |
| #include "ddrawi.h" |
| #include "xvidmode.h" |
| #include "debugtools.h" |
| |
| DEFAULT_DEBUG_CHANNEL(x11drv); |
| |
| static DWORD PASCAL X11DRV_DDHAL_DestroyDriver(LPDDHAL_DESTROYDRIVERDATA data) |
| { |
| data->ddRVal = DD_OK; |
| return DDHAL_DRIVER_HANDLED; |
| } |
| |
| static DWORD PASCAL X11DRV_DDHAL_SetMode(LPDDHAL_SETMODEDATA data) |
| { |
| #ifdef HAVE_LIBXXF86VM |
| if (xf86vm_mode_count) { |
| X11DRV_XF86VM_SetCurrentMode(data->dwModeIndex); |
| data->ddRVal = DD_OK; |
| return DDHAL_DRIVER_HANDLED; |
| } |
| #endif |
| return DDHAL_DRIVER_NOTHANDLED; |
| } |
| |
| static DDHAL_DDCALLBACKS hal_ddcallbacks = { |
| sizeof(DDHAL_DDCALLBACKS), |
| 0x3ff, /* all callbacks are 32-bit */ |
| X11DRV_DDHAL_DestroyDriver, |
| NULL, /* CreateSurface */ |
| NULL, /* SetColorKey */ |
| X11DRV_DDHAL_SetMode, |
| NULL, /* WaitForVerticalBlank */ |
| NULL, /* CanCreateSurface */ |
| NULL, /* CreatePalette */ |
| NULL, /* GetScanLine */ |
| NULL, /* SetExclusiveMode */ |
| NULL /* FlipToGDISurface */ |
| }; |
| |
| static DDHALINFO hal_info = { |
| sizeof(DDHALINFO), |
| &hal_ddcallbacks, |
| /* more stuff */ |
| }; |
| |
| static LPDDHALDDRAWFNS ddraw_fns; |
| static DWORD ddraw_ver; |
| |
| INT X11DRV_DCICommand(INT cbInput, LPVOID lpInData, LPVOID lpOutData) |
| { |
| LPDCICMD lpCmd = (LPDCICMD)lpInData; |
| |
| TRACE("(%d,(%ld,%ld,%ld),%p)\n", cbInput, lpCmd->dwCommand, |
| lpCmd->dwParam1, lpCmd->dwParam2, lpOutData); |
| |
| switch (lpCmd->dwCommand) { |
| case DDNEWCALLBACKFNS: |
| ddraw_fns = (LPDDHALDDRAWFNS)lpCmd->dwParam1; |
| return TRUE; |
| case DDVERSIONINFO: |
| { |
| LPDDVERSIONDATA lpVer = (LPDDVERSIONDATA)lpOutData; |
| ddraw_ver = lpCmd->dwParam1; |
| if (!lpVer) break; |
| /* well, whatever... the DDK says so */ |
| lpVer->dwHALVersion = DD_RUNTIME_VERSION; |
| } |
| return TRUE; |
| case DDGET32BITDRIVERNAME: |
| { |
| LPDD32BITDRIVERDATA lpData = (LPDD32BITDRIVERDATA)lpOutData; |
| /* here, we could ask ddraw to load a separate DLL, that |
| * would contain the 32-bit ddraw HAL */ |
| strcpy(lpData->szName,"x11drv"); |
| /* the entry point named here should initialize our hal_info |
| * with 32-bit entry points */ |
| strcpy(lpData->szEntryPoint,"DriverInit"); |
| lpData->dwContext = 0; |
| } |
| return TRUE; |
| case DDCREATEDRIVEROBJECT: |
| { |
| LPDWORD lpInstance = (LPDWORD)lpOutData; |
| |
| #ifdef HAVE_LIBXXF86VM |
| hal_info.dwNumModes = xf86vm_mode_count; |
| hal_info.lpModeInfo = xf86vm_modes; |
| hal_info.dwModeIndex = X11DRV_XF86VM_GetCurrentMode(); |
| #endif |
| /* FIXME: get x11drv's hInstance */ |
| |
| (ddraw_fns->lpSetInfo)(&hal_info, FALSE); |
| *lpInstance = hal_info.hInstance; |
| } |
| return TRUE; |
| } |
| return 0; |
| } |