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