|
|
/*==========================================================================
* * Copyright (C) 1995 Microsoft Corporation. All Rights Reserved. * * File: w95priv.c * Content: Private interface between DDRAW and the display driver * History: * Date By Reason * ==== == ====== * 23-jan-95 craige initial implementation * 27-feb-95 craige new sync. macros * 01-apr-95 craige happy fun joy updated header file * 14-may-95 craige cleaned out obsolete junk * 16-jun-95 craige new surface structure * 19-jun-95 craige added DD32_StreamingNotify * 22-jun-95 craige added DD32_ClippingNotify * 24-jun-95 craige trap faults in ClippinyNotify * 25-jun-95 craige one ddraw mutex * 02-jul-95 craige commented out streaming, clipper notification * 18-jan-97 colinmc AGP support * 31-oct-97 johnstep Added DD32_HandleExternalModeChange * ***************************************************************************/ #include "ddrawpr.h"
#ifdef STREAMING
/*
* DD32_StreamingNotify */ void EXTERN_DDAPI DD32_StreamingNotify( DWORD ptr ) {
} /* DD32_StreamingNotify */ #endif
#ifdef CLIPPER_NOTIFY
/*
* DD32_ClippingNotify */ void EXTERN_DDAPI DD32_ClippingNotify( LPWINWATCH pww, DWORD code ) { LPDDRAWI_DDRAWCLIPPER_LCL this_lcl; LPDDRAWI_DDRAWCLIPPER_GBL this;
try { this_lcl = pww->lpDDClipper; this = this_lcl->lpGbl; if( pww->lpCallback != NULL ) { pww->lpCallback( (LPDIRECTDRAWCLIPPER) this_lcl, (HWND) pww->hWnd, code, pww->lpContext ); } } except( EXCEPTION_EXECUTE_HANDLER ) { DPF( 1, "Trapped Exception in ClippingNotify" ); }
} /* DD32_ClippingNotify */
/*
* DD32_WWClose */ void EXTERN_DDAPI DD32_WWClose( LPWINWATCH pww ) { WWClose( pww );
} /* DD32_WWClose */ #endif
/*
* DDHAL32_VidMemAlloc */ FLATPTR EXTERN_DDAPI DDHAL32_VidMemAlloc( LPDDRAWI_DIRECTDRAW_GBL this, int heap, DWORD dwWidth, DWORD dwHeight ) { FLATPTR ptr;
ENTER_DDRAW();
if( heap >= (int) this->vmiData.dwNumHeaps ) { ptr = (FLATPTR) NULL; } else { HANDLE hdev; #ifdef WIN95
BOOLEAN close; #endif /* WIN95 */
#ifdef WIN95
/* See if the global VXD handle contains a valid value. If not,
* then just get a valid VXD handle from GetDXVxdHandle(). * (snene 2/23/98) */ if( INVALID_HANDLE_VALUE == (HANDLE)this->hDDVxd ) { /*
* As we may need to commit AGP memory we need a VXD handle * to communicate with the DirectX VXD. Rather than hunting * through the driver object list hoping we will find a * local object for this process we just create a handle * and discard it after the allocation. This should not be * performance critical code to start with. */ hdev = GetDXVxdHandle(); if ( INVALID_HANDLE_VALUE == hdev ) { LEAVE_DDRAW() return (FLATPTR) NULL; } close = TRUE; } /* If the global handle is valid, then we are being called as a
* result of CreateSurface being called and so we just use the * global handle to speed things up. * (snene 2/23/98) */ else { hdev = (HANDLE)this->hDDVxd; close = FALSE; } #else /* WIN95 */
hdev = INVALID_HANDLE_VALUE; #endif /* WIN95 */
/* Pass NULL Alignment and new pitch pointer */ ptr = HeapVidMemAlloc( &(this->vmiData.pvmList[ heap ]), dwWidth, dwHeight, hdev , NULL , NULL, NULL );
#ifdef WIN95
if( close ) CloseHandle( hdev ); #endif /* WIN95 */
} LEAVE_DDRAW() return ptr;
} /* DDHAL32_VidMemAlloc */
/*
* DDHAL32_VidMemFree */ void EXTERN_DDAPI DDHAL32_VidMemFree( LPDDRAWI_DIRECTDRAW_GBL this, int heap, FLATPTR ptr ) { ENTER_DDRAW()
if( this && heap < (int) this->vmiData.dwNumHeaps ) { VidMemFree( this->vmiData.pvmList[ heap ].lpHeap, ptr ); } LEAVE_DDRAW()
} /* DDHAL32_VidMemFree */
#ifdef POSTPONED
//=============================================================================
//
// Function: DD32_HandleExternalModeChange
//
// This function is ONLY called by DDRAw16 on an external mode change.
//
// Parameters:
//
// LPDEVMODE pdm [IN] - includes the name of the display device
//
// Return:
//
// FALSE if display settings should not be changed
//
//=============================================================================
static char szDisplay[] = "display"; static char szDisplay1[] = "\\\\.\\Display1";
BOOL EXTERN_DDAPI DD32_HandleExternalModeChange(LPDEVMODE pdm) { LPDDRAWI_DIRECTDRAW_LCL pdrv_lcl; BOOL primary;
//
// This is ONLY called from DDRAW16 once we already have the Win16
// lock. We have to give it up before enterint DDraw because some other
// process may be inside DDraw.
//
INCW16CNT(); LEAVE_WIN16LOCK(); ENTER_DDRAW(); ENTER_WIN16LOCK();
//
// We'll get szDisplay for the primary display, rather than szDisplay1,
// but a multimon-aware app may have explicitly created a device object
// for szDisplay1, so we need to handle this case.
//
primary = !lstrcmpi(pdm->dmDeviceName, szDisplay);
for (pdrv_lcl = lpDriverLocalList; pdrv_lcl; pdrv_lcl = pdrv_lcl->lpLink) { if (!lstrcmpi(pdrv_lcl->lpGbl->cDriverName, pdm->dmDeviceName) || (primary && !lstrcmpi(pdrv_lcl->lpGbl->cDriverName, szDisplay1))) { DPF(4, "Mode change on device: %s", pdrv_lcl->lpGbl->cDriverName); InvalidateAllSurfaces(pdrv_lcl->lpGbl, NULL, FALSE); } }
LEAVE_DDRAW(); DECW16CNT();
return TRUE; } #endif
|