|
|
/******************************Module*Header*******************************\
* Module Name: thunk.c * * This module exists solely for testing, to make it is easy to instrument * all the driver's Drv calls. * * Note that most of this stuff will only be compiled in a checked (debug) * build. * * Copyright (c) 1993-1996 Microsoft Corporation * Copyright (c) 1993-1996 Matrox Electronic Systems, Ltd. \**************************************************************************/
#include "precomp.h"
////////////////////////////////////////////////////////////////////////////
#if DBG
// This entire module is only enabled for Checked builds
#define SYNCH_ENTER() 0 // do nothing
#define SYNCH_LEAVE() 0 // do nothing
////////////////////////////////////////////////////////////////////////////
BOOL gbNull = FALSE; // Set to TRUE with the debugger to test the speed
// of NT with an inifinitely fast display driver
// (actually, almost infinitely fast since we're
// not hooking all the calls we could be)
DHPDEV DbgEnablePDEV( DEVMODEW* pDevmode, PWSTR pwszLogAddress, ULONG cPatterns, HSURF* ahsurfPatterns, ULONG cjGdiInfo, ULONG* pGdiInfo, ULONG cjDevInfo, DEVINFO* pDevInfo, HDEV hdev, PWSTR pwszDeviceName, HANDLE hDriver) { DHPDEV bRet;
SYNCH_ENTER(); DISPDBG((5, ">> DrvEnablePDEV"));
bRet = DrvEnablePDEV( pDevmode, pwszLogAddress, cPatterns, ahsurfPatterns, cjGdiInfo, pGdiInfo, cjDevInfo, pDevInfo, hdev, pwszDeviceName, hDriver);
DISPDBG((6, "<< DrvEnablePDEV")); SYNCH_LEAVE();
return(bRet); }
VOID DbgCompletePDEV( DHPDEV dhpdev, HDEV hdev) { SYNCH_ENTER(); DISPDBG((5, ">> DrvCompletePDEV"));
DrvCompletePDEV( dhpdev, hdev);
DISPDBG((6, "<< DrvCompletePDEV")); SYNCH_LEAVE(); }
VOID DbgDisablePDEV(DHPDEV dhpdev) { PDEV* ppdev; BOOL bNeedSync; ppdev = (PDEV*) dhpdev;
bNeedSync = ppdev->bEnabled;
//
// If a PDEV has not been disabled by DrvAssertMode
// then this call is synchronized as access to the
// hardware may occur. If the PDEV has been disabled
// by DrvAssertMode then access to the hardware is not
// allowed (all hardware access needs to be done in the
// DrvAssertMode handling) and synchronization is not done
// as drawing may be occurring in a different PDEV.
//
if (bNeedSync) { SYNCH_ENTER(); }
DISPDBG((5, ">> DrvDisable"));
DrvDisablePDEV(dhpdev);
DISPDBG((6, "<< DrvDisable"));
if (bNeedSync) { SYNCH_LEAVE(); } }
HSURF DbgEnableSurface(DHPDEV dhpdev) { HSURF h;
SYNCH_ENTER(); DISPDBG((5, ">> DrvEnableSurface"));
h = DrvEnableSurface(dhpdev);
DISPDBG((6, "<< DrvEnableSurface")); SYNCH_LEAVE();
return(h); }
VOID DbgDisableSurface(DHPDEV dhpdev) { PDEV* ppdev; BOOL bNeedSync; ppdev = (PDEV*) dhpdev;
bNeedSync = ppdev->bEnabled;
//
// If a PDEV has not been disabled by DrvAssertMode
// then this call is synchronized as access to the
// hardware may occur. If the PDEV has been disabled
// by DrvAssertMode then access to the hardware is not
// allowed (all hardware access needs to be done in the
// DrvAssertMode handling) and synchronization is not done
// as drawing may be occurring in a different PDEV.
//
if (bNeedSync) { SYNCH_ENTER(); }
DISPDBG((5, ">> DrvDisableSurface"));
DrvDisableSurface(dhpdev);
DISPDBG((6, "<< DrvDisableSurface"));
if (bNeedSync) { SYNCH_LEAVE(); } }
BOOL DbgAssertMode( DHPDEV dhpdev, BOOL bEnable) { BOOL b;
SYNCH_ENTER(); DISPDBG((5, ">> DrvAssertMode"));
b = DrvAssertMode(dhpdev,bEnable);
DISPDBG((6, "<< DrvAssertMode")); SYNCH_LEAVE();
return (b); }
BOOL DbgOffset( SURFOBJ* pso, LONG x, LONG y, FLONG fl) { BOOL b;
SYNCH_ENTER(); DISPDBG((5, ">> DrvOffset"));
b = DrvOffset(pso,x,y,fl);
DISPDBG((6, "<< DrvOffset")); SYNCH_LEAVE();
return (b); }
//
// We do not SYNCH_ENTER since we have not initalized the driver.
// We just want to get the list of modes from the miniport.
//
ULONG DbgGetModes( HANDLE hDriver, ULONG cjSize, DEVMODEW* pdm) { ULONG u;
DISPDBG((5, ">> DrvGetModes"));
u = DrvGetModes( hDriver, cjSize, pdm);
DISPDBG((6, "<< DrvGetModes"));
return(u); }
VOID DbgMovePointer(SURFOBJ *pso,LONG x,LONG y,RECTL *prcl) { if (gbNull) return;
// Note: Because we set GCAPS_ASYNCMOVE, we don't want to do a
// SYNCH_ENTER/LEAVE here.
DISPDBG((5, ">> DrvMovePointer"));
DrvMovePointer(pso,x,y,prcl);
DISPDBG((6, "<< DrvMovePointer")); }
ULONG DbgSetPointerShape( SURFOBJ* pso, SURFOBJ* psoMask, SURFOBJ* psoColor, XLATEOBJ* pxlo, LONG xHot, LONG yHot, LONG x, LONG y, RECTL* prcl, FLONG fl) { ULONG u;
if (gbNull) return(SPS_ACCEPT_NOEXCLUDE);
SYNCH_ENTER(); DISPDBG((5, ">> DrvSetPointerShape"));
u = DrvSetPointerShape( pso, psoMask, psoColor, pxlo, xHot, yHot, x, y, prcl, fl);
DISPDBG((6, "<< DrvSetPointerShape")); SYNCH_LEAVE();
return(u); }
ULONG DbgDitherColor( DHPDEV dhpdev, ULONG iMode, ULONG rgb, ULONG* pul) { ULONG u;
if (gbNull) return(DCR_DRIVER);
//
// No need to Synchronize Dither color.
//
DISPDBG((5, ">> DrvDitherColor"));
u = DrvDitherColor( dhpdev, iMode, rgb, pul);
DISPDBG((6, "<< DrvDitherColor"));
return(u); }
BOOL DbgSetPalette( DHPDEV dhpdev, PALOBJ* ppalo, FLONG fl, ULONG iStart, ULONG cColors) { BOOL u;
if (gbNull) return(TRUE);
SYNCH_ENTER(); DISPDBG((5, ">> DrvSetPalette"));
u = DrvSetPalette( dhpdev, ppalo, fl, iStart, cColors);
DISPDBG((6, "<< DrvSetPalette")); SYNCH_LEAVE();
return(u); }
BOOL DbgCopyBits( SURFOBJ* psoDst, SURFOBJ* psoSrc, CLIPOBJ* pco, XLATEOBJ* pxlo, RECTL* prclDst, POINTL* pptlSrc) { BOOL u;
if (gbNull) return(TRUE);
SYNCH_ENTER(); DISPDBG((5, ">> DrvCopyBits"));
u = DrvCopyBits( psoDst, psoSrc, pco, pxlo, prclDst, pptlSrc);
DISPDBG((6, "<< DrvCopyBits")); SYNCH_LEAVE();
return(u); }
BOOL DbgBitBlt( SURFOBJ* psoDst, SURFOBJ* psoSrc, SURFOBJ* psoMask, CLIPOBJ* pco, XLATEOBJ* pxlo, RECTL* prclDst, POINTL* pptlSrc, POINTL* pptlMask, BRUSHOBJ* pbo, POINTL* pptlBrush, ROP4 rop4) { BOOL u;
if (gbNull) return(TRUE);
SYNCH_ENTER(); DISPDBG((5, ">> DrvBitBlt"));
u = DrvBitBlt( psoDst, psoSrc, psoMask, pco, pxlo, prclDst, pptlSrc, pptlMask, pbo, pptlBrush, rop4);
DISPDBG((6, "<< DrvBitBlt")); SYNCH_LEAVE();
return(u); }
BOOL DbgTextOut( SURFOBJ* pso, STROBJ* pstro, FONTOBJ* pfo, CLIPOBJ* pco, RECTL* prclExtra, RECTL* prclOpaque, BRUSHOBJ* pboFore, BRUSHOBJ* pboOpaque, POINTL* pptlOrg, MIX mix) { BOOL u;
if (gbNull) return(TRUE);
SYNCH_ENTER(); DISPDBG((5, ">> DrvTextOut"));
u = DrvTextOut( pso, pstro, pfo, pco, prclExtra, prclOpaque, pboFore, pboOpaque, pptlOrg, mix);
DISPDBG((6, "<< DrvTextOut")); SYNCH_LEAVE();
return(u); }
BOOL DbgStrokePath( SURFOBJ* pso, PATHOBJ* ppo, CLIPOBJ* pco, XFORMOBJ* pxo, BRUSHOBJ* pbo, POINTL* pptlBrushOrg, LINEATTRS* plineattrs, MIX mix) { BOOL u;
if (gbNull) return(TRUE);
SYNCH_ENTER(); DISPDBG((5, ">> DrvStrokePath"));
u = DrvStrokePath( pso, ppo, pco, pxo, pbo, pptlBrushOrg, plineattrs, mix);
DISPDBG((6, "<< DrvStrokePath")); SYNCH_LEAVE();
return(u); }
BOOL DbgLineTo( SURFOBJ* pso, CLIPOBJ* pco, BRUSHOBJ* pbo, LONG x1, LONG y1, LONG x2, LONG y2, RECTL* prclBounds, MIX mix) { BOOL u;
if (gbNull) return(TRUE);
SYNCH_ENTER(); DISPDBG((5, ">> DrvLineTo"));
u = DrvLineTo( pso, pco, pbo, x1, y1, x2, y2, prclBounds, mix);
DISPDBG((6, "<< DrvLineTo done")); SYNCH_LEAVE();
return(u); }
BOOL DbgFillPath( SURFOBJ* pso, PATHOBJ* ppo, CLIPOBJ* pco, BRUSHOBJ* pbo, POINTL* pptlBrushOrg, MIX mix, FLONG flOptions) { BOOL u;
if (gbNull) return(TRUE);
SYNCH_ENTER(); DISPDBG((5, ">> DrvFillPath"));
u = DrvFillPath(pso, ppo, pco, pbo, pptlBrushOrg, mix, flOptions);
DISPDBG((6, "<< DrvFillPath")); SYNCH_LEAVE();
return(u); }
BOOL DbgPaint( SURFOBJ* pso, CLIPOBJ* pco, BRUSHOBJ* pbo, POINTL* pptlBrushOrg, MIX mix) { BOOL u;
if (gbNull) return(TRUE);
SYNCH_ENTER(); DISPDBG((5, ">> DrvPaint"));
u = DrvPaint( pso, pco, pbo, pptlBrushOrg, mix);
DISPDBG((6, "<< DrvPaint")); SYNCH_LEAVE();
return(u); }
BOOL DbgRealizeBrush( BRUSHOBJ* pbo, SURFOBJ* psoTarget, SURFOBJ* psoPattern, SURFOBJ* psoMask, XLATEOBJ* pxlo, ULONG iHatch) { BOOL u;
// Note: The only time DrvRealizeBrush is called by GDI is when we've
// called BRUSHOBJ_pvGetRbrush in the middle of a DrvBitBlt
// call, and GDI had to call us back. Since we're still in the
// middle of DrvBitBlt, synchronization has already taken care of.
// For the same reason, this will never be called when 'gbNull'
// is TRUE, so it doesn't even make sense to check gbNull...
DISPDBG((5, ">> DrvRealizeBrush"));
u = DrvRealizeBrush( pbo, psoTarget, psoPattern, psoMask, pxlo, iHatch);
DISPDBG((6, "<< DrvRealizeBrush"));
return(u); }
HBITMAP DbgCreateDeviceBitmap(DHPDEV dhpdev, SIZEL sizl, ULONG iFormat) { HBITMAP hbm;
SYNCH_ENTER(); DISPDBG((5, ">> DrvCreateDeviceBitmap"));
hbm = DrvCreateDeviceBitmap(dhpdev, sizl, iFormat);
DISPDBG((6, "<< DrvCreateDeviceBitmap")); SYNCH_LEAVE();
return(hbm); }
VOID DbgDeleteDeviceBitmap(DHSURF dhsurf) { SYNCH_ENTER(); DISPDBG((5, ">> DrvDeleteDeviceBitmap"));
DrvDeleteDeviceBitmap(dhsurf);
DISPDBG((6, "<< DrvDeleteDeviceBitmap")); SYNCH_LEAVE(); }
VOID DbgDestroyFont(FONTOBJ* pfo) { SYNCH_ENTER(); DISPDBG((5, ">> DrvDestroyFont"));
DrvDestroyFont(pfo);
DISPDBG((6, "<< DrvDestroyFont")); SYNCH_LEAVE(); }
BOOL DbgStretchBlt( SURFOBJ* psoDst, SURFOBJ* psoSrc, SURFOBJ* psoMask, CLIPOBJ* pco, XLATEOBJ* pxlo, COLORADJUSTMENT* pca, POINTL* pptlHTOrg, RECTL* prclDst, RECTL* prclSrc, POINTL* pptlMask, ULONG iMode) { BOOL u;
if (gbNull) return(TRUE);
SYNCH_ENTER(); DISPDBG((5, "DrvStretchBlt"));
#if SYNCHRONIZEACCESS_WORKS
{ // Our DrvStretchBlt routine calls back to EngStretchBlt, which
// calls back to our DrvCopyBits routine -- so we have to be
// re-entrant for synchronization...
SYNCH_LEAVE(); } #endif // SYNCHRONIZEACCESS_WORKS
u = DrvStretchBlt(psoDst, psoSrc, psoMask, pco, pxlo, pca, pptlHTOrg, prclDst, prclSrc, pptlMask, iMode);
#if SYNCHRONIZEACCESS_WORKS
{ SYNCH_ENTER(); } #endif // SYNCHRONIZEACCESS_WORKS
DISPDBG((6, "DrvStretchBlt done")); SYNCH_LEAVE();
return(u); }
ULONG DbgEscape( SURFOBJ* pso, ULONG iEsc, ULONG cjIn, VOID* pvIn, ULONG cjOut, VOID* pvOut) { ULONG u;
if (gbNull) return(TRUE);
// Most escapes are not synchronized by GDI...
DISPDBG((5, "DrvEscape"));
u = DrvEscape(pso, iEsc, cjIn, pvIn, cjOut, pvOut);
DISPDBG((6, "DrvEscape done"));
return(u); }
BOOL DbgResetPDEV( DHPDEV dhpdevOld, DHPDEV dhpdevNew) { BOOL bRet;
SYNCH_ENTER(); DISPDBG((5, ">> DrvResetPDEV"));
bRet = DrvResetPDEV(dhpdevOld, dhpdevNew);
DISPDBG((6, "<< DrvResetPDEV")); SYNCH_LEAVE();
return(bRet); }
BOOL DbgGetDirectDrawInfo( DHPDEV dhpdev, DD_HALINFO* pHalInfo, DWORD* lpdwNumHeaps, VIDEOMEMORY* pvmList, DWORD* lpdwNumFourCC, DWORD* lpdwFourCC) { BOOL b;
DISPDBG((5, ">> DbgQueryDirectDrawInfo"));
b = DrvGetDirectDrawInfo(dhpdev, pHalInfo, lpdwNumHeaps, pvmList, lpdwNumFourCC, lpdwFourCC);
DISPDBG((6, "<< DbgQueryDirectDrawInfo"));
return(b); }
BOOL DbgEnableDirectDraw( DHPDEV dhpdev, DD_CALLBACKS* pCallBacks, DD_SURFACECALLBACKS* pSurfaceCallBacks, DD_PALETTECALLBACKS* pPaletteCallBacks) { BOOL b;
SYNCH_ENTER(); DISPDBG((5, ">> DbgEnableDirectDraw"));
b = DrvEnableDirectDraw(dhpdev, pCallBacks, pSurfaceCallBacks, pPaletteCallBacks);
DISPDBG((6, "<< DbgEnableDirectDraw")); SYNCH_LEAVE();
return(b); }
VOID DbgDisableDirectDraw( DHPDEV dhpdev) { SYNCH_ENTER(); DISPDBG((5, ">> DbgDisableDirectDraw"));
DrvDisableDirectDraw(dhpdev);
DISPDBG((6, "<< DbgDisableDirectDraw")); SYNCH_LEAVE(); }
BOOL DbgIcmSetDeviceGammaRamp( DHPDEV dhpdev, ULONG iFormat, LPVOID lpRamp) { BOOL b;
SYNCH_ENTER(); DISPDBG((5, ">> DbgIcmSetDeviceGammaRamp"));
b = DrvIcmSetDeviceGammaRamp(dhpdev,iFormat,lpRamp);
DISPDBG((6, "<< DbgIcmSetDeviceGammaRamp")); SYNCH_LEAVE();
return (b); }
#endif // DBG
|