/******************************Module*Header*******************************\ * Module Name: mcdrvint.h * * Internal server-side data structure for MCD driver interface. The driver * never sees these... * * Copyright (c) 1996 Microsoft Corporation * \**************************************************************************/ #ifndef _MCDRVINT_H #define _MCDRVINT_H #define MCD_ALLOC_TAG 'xDCM' #define MCD_MAX_ALLOC 0x40000 #if DBG #define PRIVATE VOID MCDDebugPrint(char *, ...); #define MCDBG_PRINT MCDDebugPrint VOID MCDAssertFailed(char *, char *, int); #define MCDASSERT(expr, msg) \ if (!(expr)) MCDAssertFailed(msg, __FILE__, __LINE__); else 0 #else #define MCDBG_PRINT #define MCDASSERT(expr, msg) #define PRIVATE static #endif // Inline function to find the intersection of two rectangles: _inline void MCDIntersectRect(RECTL *pRectInter, RECTL *pRectA, RECTL *pRectB) { // Get intersection of left, right, top, and bottom edges of the // two source rectangles: pRectInter->left = max(pRectA->left, pRectB->left); pRectInter->right = min(pRectA->right, pRectB->right); pRectInter->top = max(pRectA->top, pRectB->top); pRectInter->bottom = min(pRectA->bottom, pRectB->bottom); } #define CHECK_MEM_RANGE_RETVAL(ptr, pMin, pMax, retval)\ {\ if (((char *)(ptr) > (char *)(pMax)) ||\ ((char *)(ptr) < (char *)(pMin)))\ {\ MCDBG_PRINT("%s(%d): Buffer pointer out of range (%x [%x] %x).",__FILE__,__LINE__,pMin, ptr, pMax);\ return retval;\ }\ } #define CHECK_SIZE_IN(pExec, structure)\ {\ if (sizeof(structure) > ((char *)pExec->pCmdEnd - (char *)pExec->pCmd)) {\ MCDBG_PRINT("%s(%d): Input buffer too small",__FILE__,__LINE__);\ return FALSE;\ }\ } #define CHECK_SIZE_OUT(pExec, structure)\ {\ if ((sizeof(structure) > pExec->cjOut) || (!pExec->pvOut)) {\ MCDBG_PRINT("%s(%d): Output buffer too small: ptr[%x], size %d",__FILE__,__LINE__, pExec->pvOut, pExec->cjOut);\ return FALSE;\ }\ } #define CHECK_FOR_RC(pExec)\ if (!pExec->pRcPriv){ \ MCDBG_PRINT("%s(%d): Invalid (null) RC",__FILE__,__LINE__);\ return FALSE;\ } #define CHECK_FOR_MEM(pExec)\ if (!pExec->pMemObj){ \ MCDBG_PRINT("%s(%d): Invalid or null shared memory",__FILE__,__LINE__);\ return FALSE;\ } #define CHECK_FOR_WND(pExec)\ if (!pExec->pWndPriv){ \ MCDBG_PRINT("%s(%d): Invalid window region", __FILE__, __LINE__);\ return FALSE;\ } #define GET_MEMOBJ_RETVAL(pMemObj, hMemObj, retval) \ (pMemObj) = (MCDMEMOBJ *)MCDEngGetPtrFromHandle((MCDHANDLE)(hMemObj), \ MCDHANDLE_MEM); \ if (!(pMemObj)) \ { \ MCDBG_PRINT("%s(%d): Invalid handle for shared memory.", \ __FILE__, __LINE__); \ return retval; \ } \ if ((pMemObj)->lockCount) \ { \ MCDBG_PRINT("%s(%d): memory is locked by driver.", \ __FILE__, __LINE__); \ return retval; \ } #define ENTER_MCD_LOCK() #define LEAVE_MCD_LOCK() // Number of list rectangles we can keep in our default buffer: #define NUM_DEFAULT_CLIP_BUFFER_RECTS 20 // Size in bytes of default buffer size for storing our list of // current clip rectangles: #define SIZE_DEFAULT_CLIP_BUFFER \ 2 * ((NUM_DEFAULT_CLIP_BUFFER_RECTS * sizeof(RECTL)) + sizeof(ULONG)) // // // // Structures. // // // // typedef struct _MCDLOCKINFO { BOOL bLocked; struct _MCDWINDOWPRIV *pWndPrivOwner; } MCDLOCKINFO; typedef struct _MCDGLOBALINFO { SURFOBJ *pso; MCDLOCKINFO lockInfo; ULONG verMajor; ULONG verMinor; MCDDRIVER mcdDriver; MCDGLOBALDRIVERFUNCS mcdGlobalFuncs; } MCDGLOBALINFO; typedef struct _MCDRCOBJ MCDRCOBJ; typedef struct _MCDWINDOWPRIV { MCDWINDOW MCDWindow; // Put this first since we'll be deriving // MCDWINDOWPRIV from MCDWINDOW MCDHANDLE handle; // Driver handle for this window HWND hWnd; // Window with which this is associated MCDRCOBJ *objectList; // List of objects associated with this // window BOOL bRegionValid; // Do we have a valid region? MCDGLOBALINFO *pGlobal; // Driver global information MCDENUMRECTS *pClipUnscissored; // List of rectangles describing the // entire current clip region MCDENUMRECTS *pClipScissored; // List of rectangles describing the // entire current clip region + scissors char defaultClipBuffer[SIZE_DEFAULT_CLIP_BUFFER]; // Used for storing above rectangle lists // when they can fit char *pAllocatedClipBuffer; // Points to allocated storage for storing // rectangle lists when they don't fit // in 'defaultClipBuffer'. NULL if // not allocated. ULONG sizeClipBuffer; // Size of clip storage pointed to by // 'pClipScissored' taking both // lists into account. BOOL bBuffersValid; // Validity of buffer cache. MCDRECTBUFFERS mbufCache; // Cached buffer information. WNDOBJ *pwo; // WNDOBJ for this window. } MCDWINDOWPRIV; typedef struct _MCDRCPRIV { MCDRC MCDRc; BOOL bValid; BOOL bDrvValid; HWND hWnd; HDEV hDev; RECTL scissorsRect; BOOL scissorsEnabled; LONG reserved[4]; ULONG surfaceFlags; // surface flags with which RC was created MCDGLOBALINFO *pGlobal; } MCDRCPRIV; typedef enum { MCDHANDLE_RC, MCDHANDLE_MEM, MCDHANDLE_TEXTURE, MCDHANDLE_WINDOW } MCDHANDLETYPE; typedef struct _MCDTEXOBJ { MCDHANDLETYPE type; // Object type MCDTEXTURE MCDTexture; ULONG_PTR pid; // creator process ID ULONG size; // size of this structure MCDGLOBALINFO *pGlobal; } MCDTEXOBJ; typedef struct _MCDMEMOBJ { MCDHANDLETYPE type; // Object type MCDMEM MCDMem; // meat of the object ULONG_PTR pid; // creator process ID ULONG size; // size of this structure ULONG lockCount; // number of locks on the memory UCHAR *pMemBaseInternal; // internal pointer to memory MCDGLOBALINFO *pGlobal; } MCDMEMOBJ; typedef struct _MCDRCOBJ { MCDHANDLETYPE type; MCDRCPRIV *pRcPriv; // need this for driver free function ULONG_PTR pid; // creator process ID ULONG size; // size of the RC-bound object MCDHANDLE handle; MCDRCOBJ *next; } MCDRCOBJ; typedef struct _MCDWINDOWOBJ { MCDHANDLETYPE type; MCDWINDOWPRIV MCDWindowPriv; } MCDWINDOWOBJ; typedef struct _MCDEXEC { MCDESC_HEADER *pmeh; // MCDESC_HEADER for command buffer MCDHANDLE hMCDMem; // handle to command memory MCDCMDI *pCmd; // start of current command MCDCMDI *pCmdEnd; // end of command buffer PVOID pvOut; // output buffer LONG cjOut; // output buffer size LONG inBufferSize; // input buffer size struct _MCDRCPRIV *pRcPriv; // current rendering context struct _MCDWINDOWPRIV *pWndPriv; // window info struct _MCDGLOBALINFO *pGlobal; // global info MCDMEMOBJ *pMemObj; // shared-memory cache for commands/data MCDSURFACE MCDSurface; // device surface WNDOBJ **ppwoMulti; // Array of WNDOBJs for multi-swap HDEV hDev; // Engine handle (NT only) } MCDEXEC; ULONG_PTR MCDSrvProcess(MCDEXEC *pMCDExec); MCDHANDLE MCDSrvCreateContext(MCDSURFACE *pMCDSurface, MCDRCINFOPRIV *pMcdRcInfo, MCDGLOBALINFO *pGlobal, LONG iPixelFormat, LONG iLayer, HWND hWnd, ULONG surfaceFlags, ULONG contextFlags); MCDHANDLE MCDSrvCreateTexture(MCDEXEC *pMCDExec, MCDTEXTUREDATA *pTexData, VOID *pSurface, ULONG flags); UCHAR * MCDSrvAllocMem(MCDEXEC *pMCDExec, ULONG numBytes, ULONG flags, MCDHANDLE *phMem); ULONG MCDSrvQueryMemStatus(MCDEXEC *pMCDExec, MCDHANDLE hMCDMem); BOOL MCDSrvSetScissor(MCDEXEC *pMCDExec, RECTL *pRect, BOOL bEnabled); MCDWINDOW *MCDSrvNewMCDWindow(MCDSURFACE *pMCDSurface, HWND hWnd, MCDGLOBALINFO *pGlobal, HDEV hdev); BOOL CALLBACK FreeMemObj(DRIVEROBJ *pDrvObj); BOOL CALLBACK FreeTexObj(DRIVEROBJ *pDrvObj); BOOL CALLBACK FreeRCObj(DRIVEROBJ *pDrvObj); BOOL DestroyMCDObj(MCDHANDLE handle, MCDHANDLETYPE handleType); VOID GetScissorClip(MCDWINDOWPRIV *pWndPriv, MCDRCPRIV *pRcPriv); // Internal engine functions: WNDOBJ *MCDEngGetWndObj(MCDSURFACE *pMCDSurface); VOID MCDEngUpdateClipList(WNDOBJ *pwo); DRIVEROBJ *MCDEngLockObject(MCDHANDLE hObj); VOID MCDEngUnlockObject(MCDHANDLE hObj); WNDOBJ *MCDEngCreateWndObj(MCDSURFACE *pMCDSurface, HWND hWnd, WNDOBJCHANGEPROC pChangeProc); MCDHANDLE MCDEngCreateObject(VOID *pOject, FREEOBJPROC pFreeObjFunc, HDEV hDevEng); BOOL MCDEngDeleteObject(MCDHANDLE hObj); UCHAR *MCDEngAllocSharedMem(ULONG numBytes); VOID MCDEngFreeSharedMem(UCHAR *pMem); VOID *MCDEngGetPtrFromHandle(HANDLE handle, MCDHANDLETYPE type); ULONG_PTR MCDEngGetProcessID(); // Debugging stuff: #if DBG UCHAR *MCDSrvDbgLocalAlloc(UINT, UINT); VOID MCDSrvDbgLocalFree(UCHAR *); #define MCDSrvLocalAlloc MCDSrvDbgLocalAlloc #define MCDSrvLocalFree MCDSrvDbgLocalFree VOID MCDebugPrint(char *, ...); #define MCDBG_PRINT MCDDebugPrint #else UCHAR *MCDSrvLocalAlloc(UINT, UINT); VOID MCDSrvLocalFree(UCHAR *); #define MCDBG_PRINT #endif #endif