Guts of a simple XVidMode-supporting DirectDraw HAL in x11drv.

This commit is contained in:
Ove Kaaven 2001-02-14 00:27:34 +00:00 committed by Alexandre Julliard
parent 0cfa278b02
commit 6e7ded456b
5 changed files with 263 additions and 1 deletions

View File

@ -7,7 +7,9 @@ EXTRALIBS = $(LIBTSX11) $(X_LIBS) $(XLIB)
IMPORTS = user32 gdi32 kernel32
C_SRCS = \
x11drv_main.c
x11ddraw.c \
x11drv_main.c \
xvidmode.c
PROGRAMS = \
$(TOPOBJDIR)/windows/x11drv/wineclipsrv

106
dlls/x11drv/x11ddraw.c Normal file
View File

@ -0,0 +1,106 @@
/*
* 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;
}

View File

@ -38,6 +38,7 @@ static int *ph_errno = &h_errno;
#include "win.h"
#include "wine_gl.h"
#include "x11drv.h"
#include "xvidmode.h"
DEFAULT_DEBUG_CHANNEL(x11drv);
@ -382,6 +383,11 @@ static void process_attach(void)
/* initialize event handling */
X11DRV_EVENT_Init();
#ifdef HAVE_LIBXXF86VM
/* initialize XVidMode */
X11DRV_XF86VM_Init();
#endif
/* load display.dll */
LoadLibrary16( "display" );
}
@ -404,6 +410,11 @@ static void process_detach(void)
XChangeKeyboardControl(display, KBKeyClickPercent | KBBellPercent |
KBBellPitch | KBBellDuration | KBAutoRepeatMode, &keyboard_value);
#ifdef HAVE_LIBXXF86VM
/* cleanup XVidMode */
X11DRV_XF86VM_Cleanup();
#endif
/* cleanup GDI */
X11DRV_GDI_Finalize();

121
dlls/x11drv/xvidmode.c Normal file
View File

@ -0,0 +1,121 @@
/*
* DirectDraw XVidMode interface
*
* Copyright 2001 TransGaming Technologies, Inc.
*/
#include "config.h"
/* FIXME: XVidMode also includes gamma functions,
* we could perhaps use it to implement Get/SetGammaRamp */
/* FIXME: ChangeDisplaySettings ought to be able to use this */
#ifdef HAVE_LIBXXF86VM
#include "ts_xlib.h"
#include "ts_xf86vmode.h"
#include "x11drv.h"
#include "windef.h"
#include "wingdi.h"
#include "ddrawi.h"
#include "debugtools.h"
DEFAULT_DEBUG_CHANNEL(x11drv);
LPDDHALMODEINFO xf86vm_modes;
unsigned xf86vm_mode_count;
XF86VidModeModeInfo** modes;
#define CONVERT_MODE(dotclock) \
info->dwWidth = mode->hdisplay; \
info->dwHeight = mode->vdisplay; \
info->wRefreshRate = dotclock * 1000 / (mode->htotal * mode->vtotal); \
TRACE(" width=%ld, height=%ld, refresh=%d\n", \
info->dwWidth, info->dwHeight, info->wRefreshRate); \
/* XVidMode cannot change display depths... */ \
/* let's not bother with filling out these then... */ \
info->lPitch = 0; \
info->dwBPP = 0; \
info->wFlags = 0; \
info->dwRBitMask = 0; \
info->dwGBitMask = 0; \
info->dwBBitMask = 0; \
info->dwAlphaBitMask = 0;
static void convert_modeinfo(XF86VidModeModeInfo *mode, LPDDHALMODEINFO info)
{
CONVERT_MODE(mode->dotclock)
}
static void convert_modeline(int dotclock, XF86VidModeModeLine *mode, LPDDHALMODEINFO info)
{
CONVERT_MODE(dotclock)
}
void X11DRV_XF86VM_Init(void)
{
int nmodes, major, minor, i;
if (xf86vm_modes) return; /* already initialized? */
/* if in desktop mode, don't use XVidMode */
if (X11DRV_GetXRootWindow() != DefaultRootWindow(display)) return;
/* see if XVidMode is available */
if (!TSXF86VidModeQueryVersion(display, &major, &minor)) return;
/* retrieve modes */
if (!TSXF86VidModeGetAllModeLines(display, DefaultScreen(display), &nmodes,
&modes))
return;
TRACE("XVidMode modes: count=%d\n", nmodes);
xf86vm_mode_count = nmodes;
xf86vm_modes = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DDHALMODEINFO) * nmodes);
/* convert modes to DDHALMODEINFO format */
for (i=0; i<nmodes; i++)
convert_modeinfo(modes[i], &xf86vm_modes[i]);
TRACE("Enabling XVidMode\n");
}
void X11DRV_XF86VM_Cleanup(void)
{
TSXFree(modes);
}
int X11DRV_XF86VM_GetCurrentMode(void)
{
XF86VidModeModeLine line;
int dotclock, i;
DDHALMODEINFO cmode;
TRACE("Querying XVidMode current mode\n");
TSXF86VidModeGetModeLine(display, DefaultScreen(display), &dotclock, &line);
convert_modeline(dotclock, &line, &cmode);
for (i=0; i<xf86vm_mode_count; i++)
if (memcmp(&xf86vm_modes[i], &cmode, sizeof(cmode)) == 0) {
TRACE("mode=%d\n", i);
return i;
}
ERR("unknown mode, shouldn't happen\n");
return 0; /* return first mode */
}
void X11DRV_XF86VM_SetCurrentMode(int mode)
{
TSXF86VidModeSwitchToMode(display, DefaultScreen(display), modes[mode]);
TSXF86VidModeSetViewPort(display, DefaultScreen(display), 0, 0);
TSXSync(display, False);
}
void X11DRV_XF86VM_SetExclusiveMode(int lock)
{
TSXF86VidModeLockModeSwitch(display, DefaultScreen(display), lock);
}
#endif /* HAVE_LIBXXF86VM */

22
dlls/x11drv/xvidmode.h Normal file
View File

@ -0,0 +1,22 @@
/*
* DirectDraw HAL XVidMode interface
*
* Copyright 2001 TransGaming Technologies, Inc.
*/
#ifndef __WINE_XVIDMODE_H
#define __WINE_XVIDMODE_H
#include "config.h"
#ifdef HAVE_LIBXXF86VM
#include "ddrawi.h"
extern LPDDHALMODEINFO xf86vm_modes;
extern unsigned xf86vm_mode_count;
void X11DRV_XF86VM_Init(void);
void X11DRV_XF86VM_Cleanup(void);
int X11DRV_XF86VM_GetCurrentMode(void);
void X11DRV_XF86VM_SetCurrentMode(int mode);
void X11DRV_XF86VM_SetExclusiveMode(int lock);
#endif /* HAVE_LIBXXF86VM */
#endif /* __WINE_XVIDMODE_H */