Leaked source code of windows server 2003
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.
 
 
 
 
 
 

325 lines
11 KiB

/*==========================================================================;
*
* Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
*
* File: d3dpr.h
* Content: Direct3D private include file
*@@BEGIN_MSINTERNAL
*
* History:
* Date By Reason
* ==== == ======
* 05/11/95 stevela Initial rev with this header.
* 23/11/95 colinmc Made various Direct3D interfaces queryable off
* DirectDraw.
* 07/12/95 stevela Merged Colin's changes.
* 10/12/95 stevela Removed AGGREGATE_D3D.
* 17/04/96 colinmc Bug 17008: DirectDraw/Direct3D deadlock
*@@END_MSINTERNAL
*
***************************************************************************/
#ifndef _D3DPR_H_
#define _D3DPR_H_
#include "d3di.hpp"
#include "texman.hpp"
#include "dpf.h"
/*
* Texture Manipulation Utils
*/
extern void D3DI_RemoveTextureHandle(LPD3DI_TEXTUREBLOCK);
extern "C" void WINAPI D3DTextureUpdate(IUnknown FAR * pD3DIUnknown);
extern DWORD BitDepthToDDBD(int bpp);
extern BOOL D3DI_isHALValid(LPD3DHAL_CALLBACKS pCallbacks);
extern void FreeDeviceI(LPDIRECT3DDEVICEI pDevI);
#define D3DBUCKETBUFFERSIZE 32 //make buffer byte size 2*D3DBUCKETBUFFERSIZE*4
extern HRESULT D3DMallocBucket(LPDIRECT3DI, LPD3DBUCKET *);
extern void D3DFreeBucket(LPDIRECT3DI, LPD3DBUCKET);
extern LPD3DI_TEXTUREBLOCK D3DI_FindTextureBlock(LPDIRECT3DTEXTUREI,LPDIRECT3DDEVICEI);
inline bool MatchDDPIXELFORMAT( DDPIXELFORMAT* pddpfA, DDPIXELFORMAT* pddpfB )
{
return ( pddpfA->dwFlags == pddpfB->dwFlags ) &&
( pddpfA->dwRGBBitCount == pddpfB->dwRGBBitCount ) &&
( pddpfA->dwRBitMask == pddpfB->dwRBitMask ) &&
( pddpfA->dwGBitMask == pddpfB->dwGBitMask ) &&
( pddpfA->dwBBitMask == pddpfB->dwBBitMask ) &&
( pddpfA->dwRGBAlphaBitMask == pddpfB->dwRGBAlphaBitMask ) &&
( pddpfA->dwFourCC == pddpfB->dwFourCC );
}
inline DDPIXELFORMAT& PixelFormat(LPDDRAWI_DDRAWSURFACE_LCL lpLcl)
{
return (lpLcl->dwFlags & DDRAWISURF_HASPIXELFORMAT) ? lpLcl->lpGbl->ddpfSurface : lpLcl->lpGbl->lpDD->vmiData.ddpfDisplay;
}
#if _D3D_FORCEDOUBLE
class CD3DForceFPUDouble
{
private:
WORD wFPUCW;
WORD wSaved;
public:
__inline
CD3DForceFPUDouble(CDirect3DDeviceIHW * lpDevI)
{
wSaved=FALSE;
if (lpDevI->dwDebugFlags & D3DDEBUG_FORCEDOUBLE)
{
WORD wTemp;
__asm fstcw wTemp
if (!(wTemp & 0x0200))
{
wSaved=TRUE;
wFPUCW=wTemp;
wTemp=wFPUCW | 0x0200; //Enforce Double Precision bit
__asm fldcw wTemp
}
}
}
__inline
~CD3DForceFPUDouble()
{
if (wSaved)
{
WORD wTemp = wFPUCW;
__asm fldcw wTemp
}
}
};
#endif //_D3D_FORCEDOUBLE
/*
* Critical section code.
* Coarse locking. All actions require this section.
* Defined in d3dcreat.c
*/
/*
* On WINNT critical sections can't be used because synchronization must
* occur cross process. DDraw and D3D must share this synchronization so
* DDraw exports private functions for synchronization that NT D3D must use.
*/
#ifdef WIN95
extern LPCRITICAL_SECTION lpD3DCSect;
#endif
extern "C" {
#define this _this
#include "ddrawpr.h"
#undef this
};
#if DBG
extern int iD3DCSCnt;
#define INCD3DCSCNT() iD3DCSCnt++;
#define INITD3DCSCNT() iD3DCSCnt = 0;
#define DECD3DCSCNT() iD3DCSCnt--;
#else
#define INCD3DCSCNT()
#define INITD3DCSCNT()
#define DECD3DCSCNT()
#endif
#ifdef WIN95
#define ENTER_D3D() \
EnterCriticalSection( lpD3DCSect ); \
INCD3DCSCNT(); \
#define LEAVE_D3D() \
DECD3DCSCNT() \
LeaveCriticalSection( lpD3DCSect );
#else
#define ENTER_D3D() \
AcquireDDThreadLock(); \
INCD3DCSCNT(); \
#define LEAVE_D3D() \
DECD3DCSCNT() \
ReleaseDDThreadLock();
#endif
// This class is designed to simplify ENTER_D3D() LEAVE_D3D() logic
// If object of this class is instantiated, then internal lock will be taken.
// As soon as object is destroyed lock will be released
//
class CLockD3D
{
public:
CLockD3D(char *moduleName, char *fileName)
{
ENTER_D3D();
#if DBG // Required to eliminate use of moduleName and fileName in retail builds
D3D_INFO( 6, "*** LOCK_D3D: CNT = %ld %s %s", iD3DCSCnt, moduleName, fileName );
#endif
}
~CLockD3D()
{
LEAVE_D3D();
D3D_INFO( 6, "*** UNLOCK_D3D: CNT = %ld", iD3DCSCnt);
}
};
class CLockD3DST
{
private:
bool bEnter;
public:
CLockD3DST(LPDIRECT3DDEVICEI lpDevI, char *moduleName, char *fileName)
{
if (! IS_MT_DEVICE(lpDevI) )
{
ENTER_D3D();
#if DBG // Required to eliminate use of moduleName and fileName in retail builds
D3D_INFO( 6, "*** LOCK_D3D: CNT = %ld %s %s", iD3DCSCnt, moduleName, fileName );
#endif
bEnter = true;
}
else
bEnter = false;
}
~CLockD3DST()
{
if (bEnter)
{
LEAVE_D3D();
D3D_INFO( 6, "*** UNLOCK_D3D: CNT = %ld", iD3DCSCnt);
}
}
};
class CLockD3DMT
{
private:
bool bEnter;
public:
CLockD3DMT(LPDIRECT3DDEVICEI lpDevI, char *moduleName, char *fileName)
{
if ( IS_MT_DEVICE(lpDevI) )
{
ENTER_D3D();
#if DBG // Required to eliminate use of moduleName and fileName in retail builds
D3D_INFO( 6, "*** LOCK_D3D: CNT = %ld %s %s", iD3DCSCnt, moduleName, fileName );
#endif
bEnter = true;
}
else
bEnter = false;
}
~CLockD3DMT()
{
if (bEnter)
{
LEAVE_D3D();
D3D_INFO( 6, "*** UNLOCK_D3D: CNT = %ld", iD3DCSCnt);
}
}
};
#define ENTER_CBCSECT(device) EnterCriticalSection(&(device)->CommandBufferCSect)
#define LEAVE_CBCSECT(device) LeaveCriticalSection(&(device)->CommandBufferCSect)
// Macro used to access DDRAW GBL from a given LPDIRECT3DI
#define DDGBL(lpD3DI) ((LPDDRAWI_DIRECTDRAW_INT)lpD3DI->lpDD)->lpLcl->lpGbl
// Macro used to access DDRAW SURF LCL from a given surface
#define DDSLCL(lpDDS) (((LPDDRAWI_DDRAWSURFACE_INT)lpDDS)->lpLcl)
// Macro used to access DDRAW SURF GBL from a given surface
#define DDSGBL(lpDDS) (((LPDDRAWI_DDRAWSURFACE_INT)lpDDS)->lpLcl->lpGbl)
/*
* Macros for validating parameters.
* Only implement those not available in ddrawpr.h.
*/
#define VALID_OUTPTR(x) ((x) && VALID_PTR_PTR(x))
// FAST_CHECKING macro is defined in ddrawpr.h
// so in make sure that ddrawpr.h is always included
// before this header.
#ifndef FAST_CHECKING
#define VALID_DIRECT3D_PTR( ptr ) \
(!IsBadWritePtr( ptr, sizeof( DIRECT3DI )))
#define VALID_DIRECT3DTEXTUREM_PTR( ptr ) \
(!IsBadWritePtr( ptr, sizeof( DIRECT3DTEXTUREM )))
#define VALID_DIRECT3DTEXTURED3DM_PTR( ptr ) \
(!IsBadWritePtr( ptr, sizeof( DIRECT3DTEXTURED3DM )))
#define VALID_DIRECT3DDEVICE_PTR( ptr ) \
(!IsBadWritePtr( ptr, sizeof( DIRECT3DDEVICEI )))
#define VALID_DDSURF_PTR( ptr ) \
(!IsBadWritePtr( ptr, sizeof( DDRAWI_DDRAWSURFACE_INT )))
#define VALID_DIRECT3DVERTEXBUFFER_PTR( ptr ) \
(!IsBadWritePtr( ptr, sizeof( CDirect3DVertexBuffer )))
#define VALID_D3DVERTEXBUFFERDESC_PTR( ptr ) \
(!IsBadWritePtr( ptr, sizeof( D3DVERTEXBUFFERDESC ) ) && \
(ptr->dwSize == sizeof( D3DVERTEXBUFFERDESC )) )
#define VALID_D3DDEVICEDESC7_PTR( ptr ) \
(! IsBadWritePtr(ptr, sizeof( D3DDEVICEDESC7 )) )
#define VALID_D3DRECT_PTR( ptr ) \
(!IsBadWritePtr( ptr, sizeof( D3DRECT ) ))
#define VALID_GDIRECT_PTR( ptr ) \
(!IsBadWritePtr( ptr, sizeof( RECT ) ))
#define VALID_GDIPOINT_PTR( ptr ) \
(!IsBadWritePtr( ptr, sizeof( POINT ) ))
#define VALID_D3DVIEWPORT_PTR( ptr ) (!IsBadWritePtr(ptr, sizeof(D3DVIEWPORT7)))
#define VALID_D3DMATRIX_PTR( ptr ) (!IsBadWritePtr(ptr, sizeof(D3DMATRIX)))
#define VALID_D3DLIGHT_PTR( ptr ) (!IsBadWritePtr(ptr, sizeof(D3DLIGHT7)))
#define VALID_D3DMATERIAL_PTR( ptr ) (!IsBadWritePtr( ptr, sizeof(D3DMATERIAL7)))
#define VALID_D3DTEXTUREHANDLE_PTR( ptr ) \
(!IsBadWritePtr( ptr, sizeof( D3DTEXTUREHANDLE ) ) )
#define VALID_D3DLIGHTDATA_PTR( ptr ) \
(!IsBadWritePtr( ptr, sizeof( D3DLIGHTDATA ) ) && \
(ptr->dwSize == sizeof( D3DLIGHTDATA )) )
#define VALID_D3DFINDDEVICESEARCH_PTR( ptr ) \
(!IsBadWritePtr( ptr, sizeof( D3DFINDDEVICESEARCH ) ) && \
(ptr->dwSize == sizeof( D3DFINDDEVICESEARCH ) ) )
#define VALID_D3DFINDDEVICERESULT7_PTR( ptr ) \
( (! IsBadWritePtr( ptr, 4)) && \
(ptr->dwSize == sizeof(D3DFINDDEVICERESULT7)) && \
(! IsBadWritePtr( ptr, ptr->dwSize) ) )
#define VALID_D3DDEVINFOSTRUCT_PTR( ptr, size ) \
(!IsBadWritePtr( ptr, size ) )
// Note: these macros are replacements for the VALID_DIRECTDRAWSURFACE_PTR ddraw macros
// because those macros need access to the ddCallbacks ddraw globals.
// At some point these could be replaced with a ddraw exported fn that actually
// verifies the callback table type
#define VALID_D3D_DIRECTDRAWSURFACE_PTR(ptr) (!IsBadWritePtr(ptr, sizeof(DDRAWI_DDRAWSURFACE_INT)))
#define VALID_D3D_DIRECTDRAWSURFACE7_PTR(ptr) (!IsBadWritePtr(ptr, sizeof(DDRAWI_DDRAWSURFACE_INT)))
#else /* !FAST_CHECKING */
#define VALID_DIRECT3D_PTR( ptr ) (ptr)
#define VALID_DIRECT3DTEXTUREM_PTR( ptr ) (ptr)
#define VALID_DIRECT3DTEXTURED3DM_PTR( ptr ) (ptr)
#define VALID_DIRECT3DDEVICE_PTR( ptr ) (ptr)
#define VALID_DDSURF_PTR( ptr ) (ptr)
#define VALID_DIRECT3DVERTEXBUFFER_PTR( ptr ) (ptr)
#define VALID_D3DVERTEXBUFFERDESC_PTR( ptr ) ((ptr) && ptr->dwSize == sizeof( D3DVERTEXBUFFERDESC ))
#define VALID_D3DDEVICEDESC7_PTR( ptr ) (ptr)
#define VALID_D3DVIEWPORT_PTR( ptr ) (ptr)
#define VALID_D3DRECT_PTR( ptr ) (ptr)
#define VALID_GDIRECT_PTR( ptr ) (ptr)
#define VALID_GDIPOINT_PTR( ptr ) (ptr)
#define VALID_D3DMATRIX_PTR( ptr ) (ptr)
#define VALID_D3DLIGHT_PTR( ptr ) (ptr)
#define VALID_D3DMATERIAL_PTR( ptr ) (ptr)
#define VALID_D3DTEXTUREHANDLE_PTR( ptr ) (ptr)
#define VALID_D3DLIGHTDATA_PTR( ptr ) ((ptr) && ptr->dwSize == sizeof( D3DLIGHTDATA ))
#define VALID_D3DFINDDEVICESEARCH_PTR( ptr ) ((ptr) && ptr->dwSize == sizeof( D3DFINDDEVICESEARCH ))
#define VALID_D3DFINDDEVICERESULT7_PTR( ptr ) \
((ptr) && (ptr->dwSize == sizeof( D3DFINDDEVICERESULT7 )) )
#define VALID_D3D_DIRECTDRAWSURFACE_PTR(ptr) (ptr) // see comment above
#define VALID_D3D_DIRECTDRAWSURFACE7_PTR(ptr) (ptr)
#define VALID_D3DDEVINFOSTRUCT_PTR( ptr, size ) (ptr)
#endif /* !FAST_CHECKING */
#endif /* _D3DPR_H_ */