Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

311 lines
10 KiB

/******************************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