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
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
|
|
|
|
|