Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

493 lines
13 KiB

/**************************************************************************
***************************************************************************
*
* Copyright (c) 1997, Cirrus Logic, Inc.
* All Rights Reserved
*
* FILE: overlay.c
*
* DESCRIPTION:
*
* REVISION HISTORY:
*
* $Log: //uinac/log/log/laguna/ddraw/src/overlay.c $
*
* Rev 1.20 Apr 07 1998 10:48:04 frido
* PDR#11299. We should always handle the DDOVER_HIDE flag in
* UpdateSurface32, even when the device is in background mode.
* Otherwise we might end up having the overlay disabled when it is no
* longer updated.
*
* Rev 1.19 06 Jan 1998 14:58:22 xcong
* Passs lpDDHALData into SyncWithQueusManager().
*
* Rev 1.18 06 Jan 1998 11:53:16 xcong
* Change pDriverData into local lpDDHALData for multi-monitor support.
*
* Rev 1.17 08 Dec 1997 14:43:40 BERSABE
* used in fw162b12, fixed PDR# 10991. OverFly disappeared after switch back and
* and forth to DOS full several times
*
* Rev 1.16.1.2 Dec 06 1997 14:45:48 bersabe
* * Fixed PDR# 10991. OverFly disappered after switch back and forth to DOS ful
* * several times.
*
* Rev 1.16.1.2 06 Dec 1997 14:35:00 chaoyi #cyl1
*
* Fixed PDR# 10991. OverFly disappered after switch back and forth to DOS full screen
* several times.
*
* Rev 1.16.1.1 25 Nov 1997 16:39:32 randys
*
* Updated VDD API values to maintain backward compatibility
*
* Rev 1.16.1.0 10 Nov 1997 13:44:24 randys
*
* Updated hard coded Win32 overlay API function number 12 ----> 13
*
* Rev 1.16 23 Oct 1997 11:17:30 frido
* Merged file with 161 tree.
*
* Rev 1.11.1.0 21 Oct 1997 17:49:10 frido
* HP#75. Added call to VXD whenever we get a request to update the position
* of an overlay so the VXD knows it has been updated.
*
* Rev 1.15 17 Oct 1997 11:31:32 bennyn
*
* For NT, in UpdateOverlay32 & SetOverlayPosition32, return if dwReser0
*
* Rev 1.14 09 Oct 1997 15:16:18 bennyn
* Removed Noel's hack in QueryOverlaySupport.
*
* Rev 1.13 08 Oct 1997 11:15:44 RUSSL
* Fix for NT40 build without overlay support
*
* Rev 1.12 08 Oct 1997 10:34:28 noelv
* HAcked QueryOverlaySupport to always return FALSE for NT.
*
* Rev 1.11 19 Sep 1997 14:33:42 bennyn
* Fixed the NT4.0 5462/64 build problem
*
* Rev 1.10 16 Sep 1997 15:10:26 bennyn
* Modified for NT DD overlay
*
* Rev 1.9 29 Aug 1997 16:25:28 RUSSL
* Added support for NT
*
* Rev 1.8 09 Jul 1997 14:47:58 RUSSL
* For forward compatibility, assume future chips support overlay
*
* Rev 1.7 27 Apr 1997 22:10:38 cjl
* Added DX5-related test code.
* Added code, wrapped by "#ifdef TEST_DX5_AGP_HBT," that forces
* overlay support off.
*
* Rev 1.6 01 Apr 1997 09:14:36 RUSSL
* Added calls to SyncWithQueueManager in UpdateOverlay32, SetOverlayPosition32
* & SetColorKey32
*
* Rev 1.5 12 Mar 1997 15:18:16 RUSSL
* replaced a block of includes with include of precomp.h for
* precompiled headers
* Added check of pDriverData->bInBackground flag in UpdateOverlay32 and
* SetOverlayPosition32. If this flag is set then we want to fail the
* call because we are in fullscreen DOS.
*
* Rev 1.4 07 Mar 1997 12:57:44 RUSSL
* Modified DDRAW_COMPAT usage
*
* Rev 1.3 31 Jan 1997 08:51:48 RUSSL
* Added better chip checking to QueryOverlaySupport
*
* Rev 1.2 27 Jan 1997 18:36:02 RUSSL
* Moved GetFormatInfo to surface.c
*
* Rev 1.1 21 Jan 1997 14:37:12 RUSSL
* Added OverlayReInit and GetFormatInfo functions
*
* Rev 1.0 15 Jan 1997 10:33:36 RUSSL
* Initial revision.
*
***************************************************************************
***************************************************************************/
/***************************************************************************
* I N C L U D E S
****************************************************************************/
#include "precomp.h"
#if defined WINNT_VER35 // WINNT_VER35
// If WinNT 3.5 skip all the source code
#elif defined (NTDRIVER_546x)
// If WinNT 4.0 and 5462/64 build skip all the source code
#elif defined(WINNT_VER40) && !defined(OVERLAY)
// if nt40 without overlay, skip all the source code
#else
#ifndef WINNT_VER40
#include "flip.h"
#include "surface.h"
#include "blt.h"
#include "overlay.h"
#endif
/***************************************************************************
* D E F I N E S
****************************************************************************/
// VW_CAP0 bits
#define VWCAP_VW_PRESENT 0x00000001
#ifdef WINNT_VER40
#define lpDDHALData ((DRIVERDATA *)(&(ppdev->DriverData)))
#endif
/***************************************************************************
* G L O B A L V A R I A B L E S
****************************************************************************/
#ifndef WINNT_VER40
OVERLAYTABLE OverlayTable;
#endif
/***************************************************************************
* S T A T I C V A R I A B L E S
****************************************************************************/
#ifndef WINNT_VER40
ASSERTFILE("overlay.c");
#endif
/***************************************************************************
*
* FUNCTION: QueryOverlaySupport()
*
* DESCRIPTION:
*
****************************************************************************/
BOOL QueryOverlaySupport
(
#ifdef WINNT_VER40
PDEV *ppdev,
#else
LPGLOBALDATA lpDDHALData,
#endif
DWORD dwChipType
)
{
#ifdef TEST_DX5_AGP_HBT
lpDDHALData->fOverlaySupport = FALSE;
return lpDDHALData->fOverlaySupport;
#endif // TEST_DX5_AGP_HBT
// We should check the capabilities register on the chip
// but it's busted
#ifdef WINNT_VER40
if (CL_GD5465 > dwChipType)
lpDDHALData->fOverlaySupport = FALSE;
else if (CL_GD5465 == dwChipType)
lpDDHALData->fOverlaySupport = TRUE;
#else
if (REVID_PRE65 & lpDDHALData->bRevInfoBits)
lpDDHALData->fOverlaySupport = FALSE;
else if (GD5465_PCI_DEVICE_ID == dwChipType)
lpDDHALData->fOverlaySupport = TRUE;
#endif
else
{
#if 1
// assume overlay hw exists
lpDDHALData->fOverlaySupport = TRUE;
#else
int i;
PVGAR pREG = (PVGAR)lpDDHALData->RegsAddress;
// assume no overlay hw
lpDDHALData->fOverlaySupport = FALSE;
// now check caps to see if any overlay hw present
for (i = 0; i < MAX_VIDEO_WINDOWS; i++)
{
if (VWCAP_VW_PRESENT & pREG->VideoWindow[i].grVW_CAP0)
lpDDHALData->fOverlaySupport = TRUE;
}
#endif
}
return lpDDHALData->fOverlaySupport;
}
/***************************************************************************
*
* FUNCTION: OverlayInit()
*
* DESCRIPTION:
*
****************************************************************************/
VOID OverlayInit
(
#ifdef WINNT_VER40
PDEV *ppdev,
DWORD dwChipType,
PDD_SURFACECALLBACKS pSurfaceCallbacks,
PDD_HALINFO pDDHalInfo
#else
DWORD dwChipType,
LPDDHAL_DDSURFACECALLBACKS pSurfaceCallbacks,
LPDDHALINFO pDDHalInfo,
LPGLOBALDATA lpDDHALData
#endif
)
{
#ifdef WINNT_VER40
#else
memset(&OverlayTable,0, sizeof(OVERLAYTABLE));
#endif
#ifdef WINNT_VER40
if (! QueryOverlaySupport(ppdev,dwChipType))
#else
if (! QueryOverlaySupport(lpDDHALData,dwChipType))
#endif
return;
#ifdef WINNT_VER40
// NT passes pSurfaceCallbacks as NULL from DrvGetDirectDrawInfo
if (NULL != pSurfaceCallbacks)
#endif
{
// fill in overlay callbacks
pSurfaceCallbacks->UpdateOverlay = UpdateOverlay32;
pSurfaceCallbacks->dwFlags |= DDHAL_SURFCB32_UPDATEOVERLAY;
pSurfaceCallbacks->SetOverlayPosition = SetOverlayPosition32;
pSurfaceCallbacks->dwFlags |= DDHAL_SURFCB32_SETOVERLAYPOSITION;
pSurfaceCallbacks->SetColorKey = SetColorKey32;
pSurfaceCallbacks->dwFlags |= DDHAL_SURFCB32_SETCOLORKEY;
}
#ifdef WINNT_VER40
// NT passes pDDHalInfo as NULL from DrvEnableDirectDraw
if ((NULL != pDDHalInfo) && (CL_GD5465 == dwChipType))
Init5465Overlay(ppdev, dwChipType, pDDHalInfo, &ppdev->DriverData.OverlayTable);
#else
if (GD5465_PCI_DEVICE_ID == dwChipType)
Init5465Overlay(dwChipType, pDDHalInfo, &OverlayTable, lpDDHALData);
#endif
}
#ifndef WINNT_VER40
/***************************************************************************
*
* FUNCTION: OverlayReInit()
*
* DESCRIPTION:
*
****************************************************************************/
VOID OverlayReInit
(
#ifdef WINNT_VER40
PDEV *ppdev,
DWORD dwChipType,
PDD_HALINFO pDDHalInfo
#else
DWORD dwChipType,
LPDDHALINFO pDDHalInfo,
LPGLOBALDATA lpDDHALData
#endif
)
{
#ifdef WINNT_VER40
if (! QueryOverlaySupport(ppdev,dwChipType))
#else
if (! QueryOverlaySupport(lpDDHALData, dwChipType))
#endif
return;
#ifdef WINNT_VER40
#pragma message("OverlayReInit: Is this function even needed for NT?")
if (CL_GD5465 == dwChipType)
Init5465Info(ppdev, pDDHalInfo);
#else
if (GD5465_PCI_DEVICE_ID == dwChipType)
Init5465Info(pDDHalInfo, lpDDHALData);
#endif
}
#endif // ifndef WINNT_VER40
/***************************************************************************
*
* FUNCTION: UpdateOverlay32
*
* DESCRIPTION:
*
****************************************************************************/
DWORD __stdcall UpdateOverlay32
(
#ifdef WINNT_VER40
PDD_UPDATEOVERLAYDATA pInput
#else
LPDDHAL_UPDATEOVERLAYDATA pInput
#endif
)
{
#ifdef WINNT_VER40
PDEV* ppdev = (PDEV *)pInput->lpDD->dhpdev;
#else
DWORD cbBytesReturned;
HANDLE vxd;
LPGLOBALDATA lpDDHALData = GetDDHALContext(pInput->lpDD);
#endif
DD_LOG(("UpdateOverlay32 Entry\r\n"));
#ifndef WINNT_VER40
DBG_MESSAGE(("UpdateOverlay32 (lpInput = 0x%08lX)", pInput));
vxd = CreateFile("\\\\.\\546X.VXD", 0, 0, 0, CREATE_NEW,
FILE_FLAG_DELETE_ON_CLOSE, 0);
if (vxd != INVALID_HANDLE_VALUE)
{
DeviceIoControl(vxd, 12, NULL, 0, NULL, 0, &cbBytesReturned, NULL);
CloseHandle(vxd);
}
#endif
#ifdef WINNT_VER40
//#pragma message("UpdateOverlay32: Does NT ddraw call this function while in fullscreen DOS?")
if (pInput->lpDDSrcSurface->dwReserved1 == 0)
{
pInput->ddRVal = DDERR_SURFACEBUSY;
return DDHAL_DRIVER_HANDLED;
}
#else
if (lpDDHALData->bInBackground
#if 1 // PDR#11299. Always handle an overlaydisable call.
&& !(pInput->dwFlags & DDOVER_HIDE)
#endif
)
{
//#cyl1 pInput->ddRVal = DDERR_SURFACEBUSY;
pInput->ddRVal = DD_OK; //#cyl1
return DDHAL_DRIVER_HANDLED;
}
#endif
#ifdef WINNT_VER40
SYNC_W_3D(ppdev);
return ppdev->DriverData.OverlayTable.pfnUpdateOverlay(ppdev,pInput);
#else
SyncWithQueueManager(lpDDHALData);
return OverlayTable.pfnUpdateOverlay(pInput);
#endif
} /* UpdateOverlay32 */
/***************************************************************************
*
* FUNCTION: SetOverlayPosition32
*
* DESCRIPTION:
*
****************************************************************************/
DWORD __stdcall SetOverlayPosition32
(
#ifdef WINNT_VER40
PDD_SETOVERLAYPOSITIONDATA pInput
#else
LPDDHAL_SETOVERLAYPOSITIONDATA pInput
#endif
)
{
#ifdef WINNT_VER40
PDEV* ppdev = (PDEV *)pInput->lpDD->dhpdev;
#else
LPGLOBALDATA lpDDHALData = GetDDHALContext(pInput->lpDD);
#endif
DD_LOG(("SetOverlayPosition32 Entry\r\n"));
#ifndef WINNT_VER40
DBG_MESSAGE(("SetOverlayPosition32 (lpInput = 0x%08lX)", pInput));
#endif
#ifdef WINNT_VER40
//#pragma message("SetOverlayPosition32: Does NT ddraw call this function while in fullscreen DOS?")
if (pInput->lpDDSrcSurface->dwReserved1 == 0)
{
pInput->ddRVal = DDERR_SURFACEBUSY;
return DDHAL_DRIVER_HANDLED;
}
#else
if (lpDDHALData->bInBackground)
{
pInput->ddRVal = DDERR_SURFACEBUSY;
return DDHAL_DRIVER_HANDLED;
}
#endif
#ifdef WINNT_VER40
SYNC_W_3D(ppdev);
return ppdev->DriverData.OverlayTable.pfnSetOverlayPos(ppdev,pInput);
#else
SyncWithQueueManager(lpDDHALData);
return OverlayTable.pfnSetOverlayPos(pInput);
#endif
} /* SetOverlayPosition32 */
/***************************************************************************
*
* FUNCTION: SetColorKey32
*
* DESCRIPTION:
*
****************************************************************************/
DWORD __stdcall SetColorKey32
(
#ifdef WINNT_VER40
PDD_SETCOLORKEYDATA pInput
#else
LPDDHAL_SETCOLORKEYDATA pInput
#endif
)
{
#ifdef WINNT_VER40
PDEV* ppdev = (PDEV *)pInput->lpDD->dhpdev;
#else
LPGLOBALDATA lpDDHALData = GetDDHALContext( pInput->lpDD);
#endif
DD_LOG(("SetColorKey32 Entry\r\n"));
#ifndef WINNT_VER40
DBG_MESSAGE(("SetColorKey32 (lpInput = 0x%08lX)", pInput));
#endif
// make sure it's a colorkey for an overlay surface
if ((DDCKEY_DESTOVERLAY | DDCKEY_SRCOVERLAY) & pInput->dwFlags)
{
#ifdef WINNT_VER40
SYNC_W_3D(ppdev);
ppdev->DriverData.OverlayTable.pfnSetColorKey(ppdev,pInput);
#else
SyncWithQueueManager(lpDDHALData);
OverlayTable.pfnSetColorKey(pInput);
#endif
}
return DDHAL_DRIVER_NOTHANDLED;
} /* SetColorKey32 */
#endif // WINNT_VER35