/*========================================================================== * * Copyright (C) 1995 Microsoft Corporation. All Rights Reserved. * * File: w95hal.c * Content: routines to invoke HAL on Win95 * These routines redirect the callbacks from the 32-bit * side to the driver * History: * Date By Reason * ==== == ====== * 20-jan-95 craige initial implementation * 03-feb-95 craige performance tuning, ongoing work * 11-mar-95 craige palette stuff * 01-apr-95 craige happy fun joy updated header file * 07-apr-95 craige check src surface ptrs for NULL in blt * 13-apr-95 craige thunk pointer for WaitForVerticalBlank flip test * 15-apr-95 craige more flags for pointer thunking in WaitForVerticalBlank * 14-may-95 craige cleaned out obsolete junk * 22-may-95 craige 16:16 ptrs always avail. for surfaces/palettes * 28-may-95 craige cleaned up HAL: added GetBltStatus; GetFlipStatus; * GetScanLine * 19-jun-95 craige removed _DDHAL_EnumAllSurfacesCallback * 26-jun-95 craige reorganized surface structure * 27-jun-95 craige duplicate surfaces caused crash * 29-jun-95 craige fully alias CreateSurface * 10-jul-95 craige support SetOverlayPosition * 10-aug-95 toddla Blt, Lock, Flip need to not trash the driver data * because it might get reused if the DDXXX_WAIT flag * is used, or if a clipper is attached. * 10-dec-95 colinmc added dummy _DDHAL_ entry points for the execute * buffer HAL. * 13-apr-95 colinmc Bug 17736: No driver notfication of flip to GDI * 01-oct-96 ketand added GetAvailDriverMemory * 20-jan-97 colinmc AGP support * ***************************************************************************/ #include "ddrawpr.h" #ifdef WIN95 #define GETSURFALIAS( psurf_lcl ) \ GetPtr16( psurf_lcl ) #define GETDATAALIAS( psx, sv ) \ if( !(psx->dwFlags & DDRAWISURF_DATAISALIASED) ) \ { \ sv = psx->lpGbl; \ psx->lpGbl = GetPtr16( psx->lpGbl ); \ psx->dwFlags |= DDRAWISURF_DATAISALIASED; \ } \ else \ { \ sv = (LPVOID) 0xffffffff; \ } #define RESTOREDATAALIAS( psx, sv ) \ if( sv != (LPVOID) 0xffffffff ) \ { \ psx->lpGbl = sv; \ psx->dwFlags &= ~DDRAWISURF_DATAISALIASED; \ } /**************************************************************************** * * DRIVER CALLBACK HELPER FNS * ***************************************************************************/ /* * _DDHAL_CreatePalette */ DWORD DDAPI _DDHAL_CreatePalette( LPDDHAL_CREATEPALETTEDATA pcpd ) { DWORD rc; /* * get 16:16 ptrs */ pcpd->lpDD = pcpd->lpDD->lp16DD; /* * make the CreatePalette call in the driver */ rc = DDThunk16_CreatePalette( pcpd ); /* * clean up any 16:16 ptrs */ return rc; } /* _DDHAL_CreatePalette */ /* * _DDHAL_CreateSurface */ DWORD DDAPI _DDHAL_CreateSurface( LPDDHAL_CREATESURFACEDATA pcsd ) { DWORD rc; int i; LPVOID FAR *ppslist; LPVOID FAR *psave; LPDDRAWI_DDRAWSURFACE_LCL FAR *slistx; DWORD lplp16slist; /* * alias pointers to surfaces in new array... */ pcsd->lpDDSurfaceDesc = (LPVOID) MapLS( pcsd->lpDDSurfaceDesc ); if( pcsd->lpDDSurfaceDesc == NULL ) { pcsd->ddRVal = DDERR_OUTOFMEMORY; return DDHAL_DRIVER_HANDLED; } ppslist = MemAlloc( pcsd->dwSCnt * sizeof( DWORD ) ); if( ppslist == NULL ) { UnMapLS( (DWORD) pcsd->lpDDSurfaceDesc ); pcsd->ddRVal = DDERR_OUTOFMEMORY; return DDHAL_DRIVER_HANDLED; } psave = MemAlloc( pcsd->dwSCnt * sizeof( DWORD ) ); if( psave == NULL ) { MemFree( ppslist ); UnMapLS( (DWORD) pcsd->lpDDSurfaceDesc ); pcsd->ddRVal = DDERR_OUTOFMEMORY; return DDHAL_DRIVER_HANDLED; } lplp16slist = MapLS( ppslist ); if( lplp16slist == 0 ) { MemFree( ppslist ); MemFree( psave ); UnMapLS( (DWORD) pcsd->lpDDSurfaceDesc ); pcsd->ddRVal = DDERR_OUTOFMEMORY; return DDHAL_DRIVER_HANDLED; } slistx = pcsd->lplpSList; for( i=0;i<(int)pcsd->dwSCnt;i++ ) { ppslist[i] = GETSURFALIAS( slistx[i] ); GETDATAALIAS( slistx[i], psave[i] ); } /* * fix up structure with aliased ptrs */ pcsd->lplpSList = (LPDDRAWI_DDRAWSURFACE_LCL FAR *)lplp16slist; pcsd->lpDD = (LPDDRAWI_DIRECTDRAW_GBL) pcsd->lpDD->lp16DD; /* * make the CreateSurface call in the driver */ rc = DDThunk16_CreateSurface( pcsd ); /* * clean up any 16:16 ptrs */ UnMapLS( lplp16slist ); UnMapLS( (DWORD) pcsd->lpDDSurfaceDesc ); for( i=0;i<(int)pcsd->dwSCnt;i++ ) { RESTOREDATAALIAS( slistx[i], psave[i] ); } MemFree( psave ); MemFree( ppslist ); return rc; } /* _DDHAL_CreateSurface */ /* * _DDHAL_CanCreateSurface */ DWORD DDAPI _DDHAL_CanCreateSurface( LPDDHAL_CANCREATESURFACEDATA pccsd ) { DWORD rc; pccsd->lpDD = (LPDDRAWI_DIRECTDRAW_GBL) pccsd->lpDD->lp16DD; pccsd->lpDDSurfaceDesc = (LPVOID) MapLS( pccsd->lpDDSurfaceDesc ); if( pccsd->lpDDSurfaceDesc == NULL ) { pccsd->ddRVal = DDERR_OUTOFMEMORY; return DDHAL_DRIVER_HANDLED; } /* * make the CanCreateSurface call in the driver */ rc = DDThunk16_CanCreateSurface( pccsd ); UnMapLS( (DWORD) pccsd->lpDDSurfaceDesc ); return rc; } /* _DDHAL_CanCreateSurface */ /* * _DDHAL_WaitForVerticalBlank */ DWORD DDAPI _DDHAL_WaitForVerticalBlank( LPDDHAL_WAITFORVERTICALBLANKDATA pwfvbd ) { DWORD rc; pwfvbd->lpDD = (LPDDRAWI_DIRECTDRAW_GBL) pwfvbd->lpDD->lp16DD; /* * make the WaitForVerticalBlank call in the driver */ rc = DDThunk16_WaitForVerticalBlank( pwfvbd ); return rc; } /* _DDHAL_WaitForVerticalBlank */ /* * _DDHAL_DestroyDriver */ DWORD DDAPI _DDHAL_DestroyDriver( LPDDHAL_DESTROYDRIVERDATA pddd ) { DWORD rc; pddd->lpDD = (LPDDRAWI_DIRECTDRAW_GBL) pddd->lpDD->lp16DD; /* * make the DestroyDriver call in the driver */ rc = DDThunk16_DestroyDriver( pddd ); return rc; } /* _DDHAL_DestroyDriver */ /* * _DDHAL_SetMode */ DWORD DDAPI _DDHAL_SetMode( LPDDHAL_SETMODEDATA psmd ) { DWORD rc; psmd->lpDD = (LPDDRAWI_DIRECTDRAW_GBL) psmd->lpDD->lp16DD; /* * make the SetMode call in the driver */ rc = DDThunk16_SetMode( psmd ); return rc; } /* _DDHAL_SetMode */ /* * _DDHAL_GetScanLine */ DWORD DDAPI _DDHAL_GetScanLine( LPDDHAL_GETSCANLINEDATA pgsld ) { DWORD rc; pgsld->lpDD = (LPDDRAWI_DIRECTDRAW_GBL) pgsld->lpDD->lp16DD; /* * make the GetScanLine call in the driver */ rc = DDThunk16_GetScanLine( pgsld ); return rc; } /* _DDHAL_GetScanLine */ /* * _DDHAL_SetExclusiveMode */ DWORD DDAPI _DDHAL_SetExclusiveMode( LPDDHAL_SETEXCLUSIVEMODEDATA psemd ) { DWORD rc; psemd->lpDD = (LPDDRAWI_DIRECTDRAW_GBL) psemd->lpDD->lp16DD; /* * make the SetExclusiveMode call in the driver */ rc = DDThunk16_SetExclusiveMode( psemd ); return rc; } /* _DDHAL_SetExclusiveMode */ /* * _DDHAL_FlipToGDISurface */ DWORD DDAPI _DDHAL_FlipToGDISurface( LPDDHAL_FLIPTOGDISURFACEDATA pftgsd ) { DWORD rc; pftgsd->lpDD = (LPDDRAWI_DIRECTDRAW_GBL) pftgsd->lpDD->lp16DD; /* * make the SetExclusiveMode call in the driver */ rc = DDThunk16_FlipToGDISurface( pftgsd ); return rc; } /* _DDHAL_FlipToGDISurface */ /* * _DDHAL_GetAvailDriverMemory */ DWORD DDAPI _DDHAL_GetAvailDriverMemory( LPDDHAL_GETAVAILDRIVERMEMORYDATA pgadmd ) { DWORD rc; pgadmd->lpDD = (LPDDRAWI_DIRECTDRAW_GBL) pgadmd->lpDD->lp16DD; rc = DDThunk16_GetAvailDriverMemory( pgadmd ); return rc; } /* * _DDHAL_UpdateNonLocalHeap */ DWORD DDAPI _DDHAL_UpdateNonLocalHeap( LPDDHAL_UPDATENONLOCALHEAPDATA unlhd ) { DWORD rc; unlhd->lpDD = (LPDDRAWI_DIRECTDRAW_GBL) unlhd->lpDD->lp16DD; rc = DDThunk16_UpdateNonLocalHeap( unlhd ); return rc; } /* * unmapSurfaceDescArray * * free an array of 16:16 ptrs */ static void unmapSurfaceDescArray( DWORD cnt, DWORD FAR *lp16sdlist ) { int i; if( cnt == 0 ) { return; } for( i=0;i<(int)cnt;i++ ) { UnMapLS( lp16sdlist[i] ); } MemFree( lp16sdlist ); } /* unmapSurfaceDescArray */ /* * mapSurfaceDescArray * * make 16:16 pointers for an array of surface descriptions */ static DWORD FAR *mapSurfaceDescArray( DWORD cnt, LPDDSURFACEDESC FAR *sdlist ) { DWORD FAR *lp16sdlist; int i; if( cnt == 0 || sdlist == NULL ) { return NULL; } lp16sdlist = MemAlloc( cnt * sizeof( DWORD ) ); if( lp16sdlist == NULL ) { return NULL; } for( i=0;i<(int)cnt;i++ ) { lp16sdlist[i] = MapLS( sdlist[i] ); if( lp16sdlist[i] == 0 ) { unmapSurfaceDescArray( i, lp16sdlist ); return NULL; } } return lp16sdlist; } /* mapSurfaceDescArray */ /**************************************************************************** * * SURFACE CALLBACK HELPER FNS * ***************************************************************************/ /* * _DDHAL_DestroySurface */ DWORD DDAPI _DDHAL_DestroySurface( LPDDHAL_DESTROYSURFACEDATA pdsd ) { LPDDRAWI_DDRAWSURFACE_LCL psurf_lcl; DWORD rc; LPVOID save; pdsd->lpDD = pdsd->lpDD->lp16DD; psurf_lcl = pdsd->lpDDSurface; pdsd->lpDDSurface = GETSURFALIAS( psurf_lcl ); GETDATAALIAS( psurf_lcl, save ); rc = DDThunk16_DestroySurface( pdsd ); RESTOREDATAALIAS( psurf_lcl, save ); return rc; } /* _DDHAL_DestroySurface */ /* * _DDHAL_Flip */ DWORD DDAPI _DDHAL_Flip( LPDDHAL_FLIPDATA pfd ) { LPDDRAWI_DIRECTDRAW_GBL lp32DD; LPDDRAWI_DDRAWSURFACE_LCL psurfcurrx; LPDDRAWI_DDRAWSURFACE_LCL psurftargx; DWORD rc; LPVOID save1; LPVOID save2; /* * get 16:16 ptrs to original and target surface */ lp32DD = pfd->lpDD; pfd->lpDD = pfd->lpDD->lp16DD; psurfcurrx = pfd->lpSurfCurr; pfd->lpSurfCurr = GETSURFALIAS( psurfcurrx ); GETDATAALIAS( psurfcurrx, save1 ); if( pfd->lpSurfTarg != NULL ) { psurftargx = pfd->lpSurfTarg; pfd->lpSurfTarg = GETSURFALIAS( psurftargx ); GETDATAALIAS( psurftargx, save2 ); } else { psurftargx = NULL; } /* * make the Flip call in the driver */ rc = DDThunk16_Flip( pfd ); /* * restore original ptrs */ RESTOREDATAALIAS( psurfcurrx, save1 ); if( psurftargx != NULL ) { RESTOREDATAALIAS( psurftargx, save2 ); } pfd->lpDD = lp32DD; pfd->lpSurfCurr = psurfcurrx; pfd->lpSurfTarg = psurftargx; return rc; } /* _DDHAL_Flip */ /* * _DDHAL_Blt */ DWORD DDAPI _DDHAL_Blt( LPDDHAL_BLTDATA pbd ) { DWORD flags; DWORD rc; LPDDRAWI_DIRECTDRAW_GBL lp32DD; LPDDRAWI_DDRAWSURFACE_LCL psurfsrcx; LPDDRAWI_DDRAWSURFACE_LCL psurfdestx; LPDDRAWI_DDRAWSURFACE_LCL ppatternsurf_lcl; LPDDRAWI_DDRAWSURFACE_LCL pzsrcsurf_lcl; LPDDRAWI_DDRAWSURFACE_LCL pzdestsurf_lcl; #ifdef USE_ALPHA LPDDRAWI_DDRAWSURFACE_LCL pasrcsurf_lcl; LPDDRAWI_DDRAWSURFACE_LCL padestsurf_lcl; LPVOID saveasrc; LPVOID saveadest; #endif LPVOID savesrc; LPVOID savedest; LPVOID savepattern; LPVOID savezsrc; LPVOID savezdest; /* * get 16:16 ptrs to source and destination surfaces */ lp32DD = pbd->lpDD; pbd->lpDD = pbd->lpDD->lp16DD; psurfsrcx = pbd->lpDDSrcSurface; if( psurfsrcx != NULL ) { pbd->lpDDSrcSurface = GETSURFALIAS( psurfsrcx ); GETDATAALIAS( psurfsrcx, savesrc ); } psurfdestx = pbd->lpDDDestSurface; pbd->lpDDDestSurface = GETSURFALIAS( psurfdestx ); GETDATAALIAS( psurfdestx, savedest ); /* * see if we need to do any other surface aliases */ flags = pbd->dwFlags; if( flags & (DDBLT_ALPHASRCSURFACEOVERRIDE| DDBLT_ALPHADESTSURFACEOVERRIDE| DDBLT_PRIVATE_ALIASPATTERN | DDBLT_ZBUFFERDESTOVERRIDE | DDBLT_ZBUFFERSRCOVERRIDE ) ) { #ifdef USE_ALPHA /* * set up 16:16 ptr for alpha src */ if( flags & DDBLT_ALPHASRCSURFACEOVERRIDE ) { pasrcsurf_lcl = (LPDDRAWI_DDRAWSURFACE_LCL) pbd->bltFX.lpDDSAlphaSrc; pbd->bltFX.lpDDSAlphaSrc = GETSURFALIAS( pasrcsurf_lcl ); GETDATAALIAS( pasrcsurf_lcl, saveasrc ); } /* * set up 16:16 ptr for alpha dest */ if( flags & DDBLT_ALPHADESTSURFACEOVERRIDE ) { padestsurf_lcl = (LPDDRAWI_DDRAWSURFACE_LCL) pbd->bltFX.lpDDSAlphaDest; pbd->bltFX.lpDDSAlphaDest = GETSURFALIAS( padestsurf_lcl ); GETDATAALIAS( padestsurf_lcl, saveadest ); } #endif /* * set up 16:16 ptr for pattern */ if( flags & DDBLT_PRIVATE_ALIASPATTERN ) { ppatternsurf_lcl = (LPDDRAWI_DDRAWSURFACE_LCL) pbd->bltFX.lpDDSPattern; pbd->bltFX.lpDDSPattern = GETSURFALIAS( ppatternsurf_lcl ); GETDATAALIAS( ppatternsurf_lcl, savepattern ); } /* * set up 16:16 ptr for Z Buffer src */ if( flags & DDBLT_ZBUFFERSRCOVERRIDE ) { pzsrcsurf_lcl = (LPDDRAWI_DDRAWSURFACE_LCL) pbd->bltFX.lpDDSZBufferSrc; pbd->bltFX.lpDDSZBufferSrc = GETSURFALIAS( pzsrcsurf_lcl ); GETDATAALIAS( pzsrcsurf_lcl, savezsrc ); } /* * set up 16:16 ptr for Z Buffer dest */ if( flags & DDBLT_ZBUFFERDESTOVERRIDE ) { pzdestsurf_lcl = (LPDDRAWI_DDRAWSURFACE_LCL) pbd->bltFX.lpDDSZBufferDest; pbd->bltFX.lpDDSZBufferDest = GETSURFALIAS( pzdestsurf_lcl ); GETDATAALIAS( pzdestsurf_lcl, savezdest ); } } /* * make the Blt call in the driver */ rc = DDThunk16_Blt( pbd ); /* * see if we need to restore any surface ptrs */ if( flags & (DDBLT_ALPHASRCSURFACEOVERRIDE| DDBLT_ALPHADESTSURFACEOVERRIDE| DDBLT_PRIVATE_ALIASPATTERN | DDBLT_ZBUFFERDESTOVERRIDE | DDBLT_ZBUFFERSRCOVERRIDE ) ) { #ifdef USE_ALPHA if( flags & DDBLT_ALPHASRCSURFACEOVERRIDE ) { pbd->bltFX.lpDDSAlphaSrc = (LPDIRECTDRAWSURFACE) pasrcsurf_lcl; RESTOREDATAALIAS( pasrcsurf_lcl, saveasrc ); } if( flags & DDBLT_ALPHADESTSURFACEOVERRIDE ) { pbd->bltFX.lpDDSAlphaDest = (LPDIRECTDRAWSURFACE) padestsurf_lcl; RESTOREDATAALIAS( padestsurf_lcl, saveadest ); } #endif if( flags & DDBLT_PRIVATE_ALIASPATTERN ) { pbd->bltFX.lpDDSPattern = (LPDIRECTDRAWSURFACE) ppatternsurf_lcl; RESTOREDATAALIAS( ppatternsurf_lcl, savepattern ); } if( flags & DDBLT_ZBUFFERSRCOVERRIDE ) { pbd->bltFX.lpDDSZBufferSrc = (LPDIRECTDRAWSURFACE) pzsrcsurf_lcl; RESTOREDATAALIAS( pzsrcsurf_lcl, savezsrc ); } if( flags & DDBLT_ZBUFFERDESTOVERRIDE ) { pbd->bltFX.lpDDSZBufferDest = (LPDIRECTDRAWSURFACE) pzdestsurf_lcl; RESTOREDATAALIAS( pzdestsurf_lcl, savezdest ); } } if( psurfsrcx != NULL ) { RESTOREDATAALIAS( psurfsrcx, savesrc ); } RESTOREDATAALIAS( psurfdestx, savedest ); pbd->lpDD = lp32DD; pbd->lpDDSrcSurface = psurfsrcx; pbd->lpDDDestSurface = psurfdestx; return rc; } /* _DDHAL_Blt */ /* * _DDHAL_Lock */ DWORD DDAPI _DDHAL_Lock( LPDDHAL_LOCKDATA pld ) { LPDDRAWI_DIRECTDRAW_GBL lp32DD; LPDDRAWI_DDRAWSURFACE_LCL psurf_lcl; DWORD rc; LPVOID save; lp32DD = pld->lpDD; pld->lpDD = pld->lpDD->lp16DD; psurf_lcl = pld->lpDDSurface; pld->lpDDSurface = GETSURFALIAS( psurf_lcl ); GETDATAALIAS( psurf_lcl, save ); rc = DDThunk16_Lock( pld ); RESTOREDATAALIAS( psurf_lcl, save ); pld->lpDD = lp32DD; pld->lpDDSurface = psurf_lcl; return rc; } /* _DDHAL_Lock */ /* * _DDHAL_Unlock */ DWORD DDAPI _DDHAL_Unlock( LPDDHAL_UNLOCKDATA puld ) { LPDDRAWI_DDRAWSURFACE_LCL psurf_lcl; DWORD rc; LPVOID save; puld->lpDD = puld->lpDD->lp16DD; psurf_lcl = puld->lpDDSurface; puld->lpDDSurface = GETSURFALIAS( psurf_lcl ); GETDATAALIAS( psurf_lcl, save ); rc = DDThunk16_Unlock( puld ); RESTOREDATAALIAS( psurf_lcl, save ); return rc; } /* _DDHAL_UnLock */ /* * _DDHAL_AddAttachedSurface */ DWORD DDAPI _DDHAL_AddAttachedSurface( LPDDHAL_ADDATTACHEDSURFACEDATA paasd ) { LPDDRAWI_DDRAWSURFACE_LCL psurf_lcl; LPDDRAWI_DDRAWSURFACE_LCL psurfattachedx; DWORD rc; LPVOID save; LPVOID saveattached; /* * get 16:16 ptrs to surface and surface to become attached */ paasd->lpDD = paasd->lpDD->lp16DD; psurf_lcl = paasd->lpDDSurface; paasd->lpDDSurface = GETSURFALIAS( psurf_lcl ); GETDATAALIAS( psurf_lcl, save ); psurfattachedx = paasd->lpSurfAttached; paasd->lpSurfAttached = GETSURFALIAS( psurfattachedx ); GETDATAALIAS( psurfattachedx, saveattached ); /* * make the AddAttachedSurface call in the driver */ rc = DDThunk16_AddAttachedSurface( paasd ); /* * restore any ptrs */ RESTOREDATAALIAS( psurf_lcl, save ); RESTOREDATAALIAS( psurfattachedx, saveattached ); return rc; } /* _DDHAL_AddAttachedSurface */ /* * _DDHAL_SetColorKey */ DWORD DDAPI _DDHAL_SetColorKey( LPDDHAL_SETCOLORKEYDATA psckd ) { LPDDRAWI_DDRAWSURFACE_LCL psurf_lcl; DWORD rc; LPVOID save; psckd->lpDD = psckd->lpDD->lp16DD; psurf_lcl = psckd->lpDDSurface; psckd->lpDDSurface = GETSURFALIAS( psurf_lcl ); GETDATAALIAS( psurf_lcl, save ); rc = DDThunk16_SetColorKey( psckd ); RESTOREDATAALIAS( psurf_lcl, save ); return rc; } /* _DDHAL_SetColorKey */ /* * _DDHAL_SetClipList */ DWORD DDAPI _DDHAL_SetClipList( LPDDHAL_SETCLIPLISTDATA pscld ) { LPDDRAWI_DDRAWSURFACE_LCL psurf_lcl; DWORD rc; LPVOID save; pscld->lpDD = pscld->lpDD->lp16DD; psurf_lcl = pscld->lpDDSurface; pscld->lpDDSurface = GETSURFALIAS( psurf_lcl ); GETDATAALIAS( psurf_lcl, save ); rc = DDThunk16_SetClipList( pscld ); RESTOREDATAALIAS( psurf_lcl, save ); return rc; } /* _DDHAL_SetClipList */ /* * _DDHAL_UpdateOverlay */ DWORD DDAPI _DDHAL_UpdateOverlay( LPDDHAL_UPDATEOVERLAYDATA puod ) { DWORD rc; LPDDRAWI_DDRAWSURFACE_LCL psurfdestx; LPDDRAWI_DDRAWSURFACE_LCL psurfsrcx; #ifdef USE_ALPHA LPDDRAWI_DDRAWSURFACE_LCL psurfalphadestx; LPDDRAWI_DDRAWSURFACE_LCL psurfalphasrcx; LPVOID savealphadest; LPVOID savealphasrc; #endif LPVOID savedest; LPVOID savesrc; /* * get 16:16 ptrs to the dest surface and the overlay surface */ puod->lpDD = puod->lpDD->lp16DD; psurfsrcx = puod->lpDDSrcSurface; puod->lpDDSrcSurface = GETSURFALIAS( psurfsrcx ); psurfdestx = puod->lpDDDestSurface; puod->lpDDDestSurface = GETSURFALIAS( psurfdestx ); GETDATAALIAS( psurfsrcx, savesrc ); GETDATAALIAS( psurfdestx, savedest ); #ifdef USE_ALPHA /* * set up 16:16 ptr for alpha */ if( puod->dwFlags & DDOVER_ALPHASRCSURFACEOVERRIDE ) { psurfalphasrcx = (LPDDRAWI_DDRAWSURFACE_LCL) puod->overlayFX.lpDDSAlphaSrc; puod->overlayFX.lpDDSAlphaSrc = GETSURFALIAS( psurfalphasrcx ); GETDATAALIAS( psurfalphasrcx, savealphasrc ); } if( puod->dwFlags & DDOVER_ALPHADESTSURFACEOVERRIDE ) { psurfalphadestx = (LPDDRAWI_DDRAWSURFACE_LCL) puod->overlayFX.lpDDSAlphaDest; puod->overlayFX.lpDDSAlphaDest = GETSURFALIAS( psurfalphadestx ); GETDATAALIAS( psurfalphadestx, savealphadest ); } #endif /* * make the UpdateOverlay call in the driver */ rc = DDThunk16_UpdateOverlay( puod ); /* * restore any surfaces */ #ifdef USE_ALPHA if( puod->dwFlags & DDOVER_ALPHASRCSURFACEOVERRIDE ) { puod->overlayFX.lpDDSAlphaSrc = (LPDIRECTDRAWSURFACE) psurfalphasrcx; RESTOREDATAALIAS( psurfalphasrcx, savealphasrc ); } if( puod->dwFlags & DDOVER_ALPHADESTSURFACEOVERRIDE ) { puod->overlayFX.lpDDSAlphaDest = (LPDIRECTDRAWSURFACE) psurfalphadestx; RESTOREDATAALIAS( psurfalphadestx, savealphadest ); } #endif RESTOREDATAALIAS( psurfsrcx, savesrc ); RESTOREDATAALIAS( psurfdestx, savedest ); return rc; } /* _DDHAL_UpdateOverlay */ /* * _DDHAL_SetOverlayPosition */ DWORD DDAPI _DDHAL_SetOverlayPosition( LPDDHAL_SETOVERLAYPOSITIONDATA psopd ) { LPDDRAWI_DDRAWSURFACE_LCL psurfdestx; LPDDRAWI_DDRAWSURFACE_LCL psurfsrcx; DWORD rc; LPVOID savedest; LPVOID savesrc; /* * get 16:16 ptrs to the dest surface and the overlay surface */ psopd->lpDD = psopd->lpDD->lp16DD; psurfsrcx = psopd->lpDDSrcSurface; psopd->lpDDSrcSurface = GETSURFALIAS( psurfsrcx ); psurfdestx = psopd->lpDDDestSurface; psopd->lpDDDestSurface = GETSURFALIAS( psurfdestx ); GETDATAALIAS( psurfsrcx, savesrc ); GETDATAALIAS( psurfdestx, savedest ); /* * make the SetOverlayPosition call in the driver */ rc = DDThunk16_SetOverlayPosition( psopd ); /* * restore any surfaces */ RESTOREDATAALIAS( psurfsrcx, savesrc ); RESTOREDATAALIAS( psurfdestx, savedest ); return rc; } /* _DDHAL_SetOverlayPosition */ /* * _DDHAL_SetPalette */ DWORD DDAPI _DDHAL_SetPalette( LPDDHAL_SETPALETTEDATA pspd ) { LPDDRAWI_DDRAWSURFACE_LCL psurf_lcl; DWORD rc; LPVOID save; /* * get 16:16 ptrs */ pspd->lpDD = pspd->lpDD->lp16DD; psurf_lcl = pspd->lpDDSurface; pspd->lpDDSurface = GETSURFALIAS( psurf_lcl ); pspd->lpDDPalette = (LPDDRAWI_DDRAWPALETTE_GBL) MapLS( pspd->lpDDPalette ); if( pspd->lpDDPalette == NULL ) { pspd->ddRVal = DDERR_OUTOFMEMORY; return DDHAL_DRIVER_HANDLED; } GETDATAALIAS( psurf_lcl, save ); /* * make the SetPalette call in the driver */ rc = DDThunk16_SetPalette( pspd ); /* * clean up any 16:16 ptrs */ UnMapLS( (DWORD) pspd->lpDDPalette ); RESTOREDATAALIAS( psurf_lcl, save ); return rc; } /* _DDHAL_SetPalette */ /* * _DDHAL_GetBltStatus */ DWORD DDAPI _DDHAL_GetBltStatus( LPDDHAL_GETBLTSTATUSDATA pgbsd ) { LPDDRAWI_DDRAWSURFACE_LCL psurf_lcl; DWORD rc; LPVOID save; pgbsd->lpDD = pgbsd->lpDD->lp16DD; psurf_lcl = pgbsd->lpDDSurface; pgbsd->lpDDSurface = GETSURFALIAS( psurf_lcl ); GETDATAALIAS( psurf_lcl, save ); rc = DDThunk16_GetBltStatus( pgbsd ); RESTOREDATAALIAS( psurf_lcl, save ); return rc; } /* _DDHAL_GetBltStatus */ /* * _DDHAL_GetFlipStatus */ DWORD DDAPI _DDHAL_GetFlipStatus( LPDDHAL_GETFLIPSTATUSDATA pgfsd ) { LPDDRAWI_DDRAWSURFACE_LCL psurf_lcl; DWORD rc; LPVOID save; pgfsd->lpDD = pgfsd->lpDD->lp16DD; psurf_lcl = pgfsd->lpDDSurface; pgfsd->lpDDSurface = GETSURFALIAS( psurf_lcl ); GETDATAALIAS( psurf_lcl, save ); rc = DDThunk16_GetFlipStatus( pgfsd ); RESTOREDATAALIAS( psurf_lcl, save ); return rc; } /* _DDHAL_GetFlipStatus */ /**************************************************************************** * * EXECUTE BUFFER CALLBACK HELPER FNS * ***************************************************************************/ /* * _DDHAL_CanCreateExecuteBuffer * * NOTE: Dummy entry point just to keep DOHALCALL happy. Execute buffer * entry points must be 32-bit, no thunking support is provided. */ DWORD DDAPI _DDHAL_CanCreateExecuteBuffer( LPDDHAL_CANCREATESURFACEDATA pccsd ) { pccsd->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_CanCreateExecuteBuffer */ /* * _DDHAL_CreateExecuteBuffer * * NOTE: Dummy entry point just to keep DOHALCALL happy. Execute buffer * entry points must be 32-bit, no thunking support is provided. */ DWORD DDAPI _DDHAL_CreateExecuteBuffer( LPDDHAL_CREATESURFACEDATA pcsd ) { pcsd->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_CreateExecuteBuffer */ /* * NOTE: All these babies are dummy entry points. They are only here to keep * DOHALCALL happy. Execute buffer HAL functions must be true 32-bit code. * No thunking support is offered. */ /* * _DDHAL_DestroyExecuteBuffer */ DWORD DDAPI _DDHAL_DestroyExecuteBuffer( LPDDHAL_DESTROYSURFACEDATA pdsd ) { pdsd->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_DestroySurface */ /* * _DDHAL_LockExecuteBuffer */ DWORD DDAPI _DDHAL_LockExecuteBuffer( LPDDHAL_LOCKDATA pld ) { pld->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_Lock */ /* * _DDHAL_UnlockExecuteBuffer */ DWORD DDAPI _DDHAL_UnlockExecuteBuffer( LPDDHAL_UNLOCKDATA puld ) { puld->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_UnlockExecuteBuffer */ /**************************************************************************** * * VIDEO PORT CALLBACK HELPER FNS * ***************************************************************************/ /* * _DDHAL_GetVideoPortConnectionGUID * * NOTE: Dummy entry point just to keep DOHALCALL happy. Video Port * entry points must be 32-bit, no thunking support is provided. */ DWORD DDAPI _DDHAL_GetVideoPortConnectInfo( LPDDHAL_GETVPORTCONNECTDATA lpGetTypeData ) { lpGetTypeData->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_GetVideoPortTypeGUID */ /* * _DDHAL_CanCreateVideoPort */ DWORD DDAPI _DDHAL_CanCreateVideoPort( LPDDHAL_CANCREATEVPORTDATA lpCanCreateData ) { lpCanCreateData->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_CanCreateVideoPort */ /* * _DDHAL_CreateVideoPort */ DWORD DDAPI _DDHAL_CreateVideoPort( LPDDHAL_CREATEVPORTDATA lpCreateData ) { lpCreateData->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_CreateVideoPort */ /* * _DDHAL_DestroyVideoPort */ DWORD DDAPI _DDHAL_DestroyVideoPort( LPDDHAL_DESTROYVPORTDATA lpDestroyData ) { lpDestroyData->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_DestroyVideoPort */ /* * _DDHAL_GetVideoPortInputFormats */ DWORD DDAPI _DDHAL_GetVideoPortInputFormats( LPDDHAL_GETVPORTINPUTFORMATDATA lpGetFormatData ) { lpGetFormatData->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_GetVideoPortInputFormats */ /* * _DDHAL_GetVideoPortOutputFormats */ DWORD DDAPI _DDHAL_GetVideoPortOutputFormats( LPDDHAL_GETVPORTOUTPUTFORMATDATA lpGetFormatData ) { lpGetFormatData->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_GetVideoPortOutputFormats */ /* * _DDHAL_GetVideoPortBandwidthInfo */ DWORD DDAPI _DDHAL_GetVideoPortBandwidthInfo( LPDDHAL_GETVPORTBANDWIDTHDATA lpGetBandwidthData ) { lpGetBandwidthData->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_GetVideoPortBandwidthInfo */ /* * _DDHAL_UpdateVideoPort */ DWORD DDAPI _DDHAL_UpdateVideoPort( LPDDHAL_UPDATEVPORTDATA lpUpdateData ) { lpUpdateData->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_UpdateVideoPort */ /* * _DDHAL_GetVideoPortField */ DWORD DDAPI _DDHAL_GetVideoPortField( LPDDHAL_GETVPORTFIELDDATA lpGetFieldData ) { lpGetFieldData->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_GetVideoPortField */ /* * _DDHAL_GetVideoPortLine */ DWORD DDAPI _DDHAL_GetVideoPortLine( LPDDHAL_GETVPORTLINEDATA lpGetLineData ) { lpGetLineData->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_GetVideoPortLine */ /* * _DDHAL_WaitForVideoPortSync */ DWORD DDAPI _DDHAL_WaitForVideoPortSync( LPDDHAL_WAITFORVPORTSYNCDATA lpWaitSyncData ) { lpWaitSyncData->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_WaitForVideoPortSync */ /* * _DDHAL_FlipVideoPort */ DWORD DDAPI _DDHAL_FlipVideoPort( LPDDHAL_FLIPVPORTDATA lpFlipData ) { lpFlipData->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_FlipVideoPort */ /* * _DDHAL_GetVideoPortFlipStatus */ DWORD DDAPI _DDHAL_GetVideoPortFlipStatus( LPDDHAL_GETVPORTFLIPSTATUSDATA lpFlipData ) { lpFlipData->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_GetVideoPortFlipStatus */ /* * _DDHAL_GetVideoSignalStatus */ DWORD DDAPI _DDHAL_GetVideoSignalStatus( LPDDHAL_GETVPORTSIGNALDATA lpData ) { lpData->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_GetVideoSignalStatus */ /* * _DDHAL_VideoColorControl */ DWORD DDAPI _DDHAL_VideoColorControl( LPDDHAL_VPORTCOLORDATA lpData ) { lpData->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_VideoColorControl */ /**************************************************************************** * * COLORCONTROL CALLBACK HELPER FNS * ***************************************************************************/ /* * _DDHAL_ColorControl */ DWORD DDAPI _DDHAL_ColorControl( LPDDHAL_COLORCONTROLDATA pccd ) { LPDDRAWI_DIRECTDRAW_GBL lp32DD; LPDDRAWI_DDRAWSURFACE_LCL psurf; LPVOID save1; DWORD rc; /* * get 16:16 ptr to surface */ lp32DD = pccd->lpDD; pccd->lpDD = pccd->lpDD->lp16DD; psurf = pccd->lpDDSurface; pccd->lpDDSurface = GETSURFALIAS( psurf ); GETDATAALIAS( psurf, save1 ); /* * make the ColorControl call in the driver */ rc = DDThunk16_ColorControl( pccd ); /* * restore original ptrs */ RESTOREDATAALIAS( psurf, save1 ); pccd->lpDD = lp32DD; pccd->lpDDSurface = psurf; return rc; } /* _DDHAL_ColorControl */ /**************************************************************************** * * KERNEL CALLBACK HELPER FNS * ***************************************************************************/ /* * _DDHAL_SyncSurfaceData */ DWORD DDAPI _DDHAL_SyncSurfaceData( LPDDHAL_SYNCSURFACEDATA lpData ) { lpData->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_SyncSurfaceData */ /* * _DDHAL_SyncVideoPortData */ DWORD DDAPI _DDHAL_SyncVideoPortData( LPDDHAL_SYNCVIDEOPORTDATA lpData ) { lpData->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_SyncVideoPortData */ /**************************************************************************** * * MOTION COMP CALLBACK HELPER FNS * ***************************************************************************/ /* * _DDHAL_GetMoCompGuids */ DWORD DDAPI _DDHAL_GetMoCompGuids( LPDDHAL_GETMOCOMPGUIDSDATA lpData ) { lpData->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_GetVideoGuids */ /* * _DDHAL_GetMoCompFormats */ DWORD DDAPI _DDHAL_GetMoCompFormats( LPDDHAL_GETMOCOMPFORMATSDATA lpData ) { lpData->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_GetMoCompFormats */ /* * _DDHAL_CreateMoComp */ DWORD DDAPI _DDHAL_CreateMoComp( LPDDHAL_CREATEMOCOMPDATA lpData ) { lpData->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_CreateMoComp */ /* * _DDHAL_GetMoCompBuffInfo */ DWORD DDAPI _DDHAL_GetMoCompBuffInfo( LPDDHAL_GETMOCOMPCOMPBUFFDATA lpData ) { lpData->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_GetMoCompBuffInfo */ /* * _DDHAL_GetInternalMoCompInfo */ DWORD DDAPI _DDHAL_GetInternalMoCompInfo( LPDDHAL_GETINTERNALMOCOMPDATA lpData ) { lpData->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_GetInternalMoCompInfo */ /* * _DDHAL_DestroyMoComp */ DWORD DDAPI _DDHAL_DestroyMoComp( LPDDHAL_DESTROYMOCOMPDATA lpData ) { lpData->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_DestroyMoComp */ /* * _DDHAL_BeginMoCompFrame */ DWORD DDAPI _DDHAL_BeginMoCompFrame( LPDDHAL_BEGINMOCOMPFRAMEDATA lpData ) { lpData->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_BeginMoCompFrame */ /* * _DDHAL_EndMoCompFrame */ DWORD DDAPI _DDHAL_EndMoCompFrame( LPDDHAL_ENDMOCOMPFRAMEDATA lpData ) { lpData->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_EndMoCompFrame */ /* * _DDHAL_RenderMoComp */ DWORD DDAPI _DDHAL_RenderMoComp( LPDDHAL_RENDERMOCOMPDATA lpData ) { lpData->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_RenderMoComp */ /* * _DDHAL_QueryMoCompStatus */ DWORD DDAPI _DDHAL_QueryMoCompStatus( LPDDHAL_QUERYMOCOMPSTATUSDATA lpData ) { lpData->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_NOTHANDLED; } /* _DDHAL_QueryMoCompStatus */ /**************************************************************************** * * PALETTE CALLBACK HELPER FNS * ***************************************************************************/ /* * _DDHAL_DestroyPalette */ DWORD DDAPI _DDHAL_DestroyPalette( LPDDHAL_DESTROYPALETTEDATA pdpd ) { DWORD rc; /* * get 16:16 ptrs */ pdpd->lpDD = pdpd->lpDD->lp16DD; pdpd->lpDDPalette = (LPDDRAWI_DDRAWPALETTE_GBL) MapLS( pdpd->lpDDPalette ); if( pdpd->lpDDPalette == NULL ) { pdpd->ddRVal = DDERR_OUTOFMEMORY; return DDHAL_DRIVER_HANDLED; } /* * make the DestroyPalette call in the driver */ rc = DDThunk16_DestroyPalette( pdpd ); /* * clean up any 16:16 ptrs */ UnMapLS( (DWORD) pdpd->lpDDPalette ); return rc; } /* _DDHAL_DestroyPalette */ /* * _DDHAL_SetEntries */ DWORD DDAPI _DDHAL_SetEntries( LPDDHAL_SETENTRIESDATA psed ) { DWORD rc; /* * get 16:16 ptrs */ psed->lpDD = psed->lpDD->lp16DD; psed->lpDDPalette = (LPDDRAWI_DDRAWPALETTE_GBL) MapLS( psed->lpDDPalette ); if( psed->lpDDPalette == NULL ) { psed->ddRVal = DDERR_OUTOFMEMORY; return DDHAL_DRIVER_HANDLED; } /* * make the DestroyPalette call in the driver */ rc = DDThunk16_SetEntries( psed ); /* * clean up any 16:16 ptrs */ UnMapLS( (DWORD) psed->lpDDPalette ); return rc; } /* _DDHAL_SetEntries */ #endif