|
|
/*==========================================================================;
* * Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved. * * File: d3di.h * Content: Direct3D internal include file *@@BEGIN_MSINTERNAL * * $Id: d3di.h,v 1.26 1995/12/04 11:29:44 sjl Exp $ * * History: * Date By Reason * ==== == ====== * 05/11/95 stevela Initial rev with this header. * 11/11/95 stevela Light code changed. * 21/11/95 colinmc Made Direct3D aggregatable * (so it can be QI'd off DirectDraw). * 23/11/95 colinmc Made Direct3D textures and devices aggregatable * (QI'd off DirectDrawSurfaces). * 07/12/95 stevela Merged in Colin's changes. * 10/12/95 stevela Removed AGGREGATE_D3D. * Removed Validate macros from here. Now in d3dpr.h * 02/03/96 colinmc Minor build fix * 17/04/96 stevela Use ddraw.h externally and ddrawp.h internally *@@END_MSINTERNAL * ***************************************************************************/
#ifndef _D3DI_H
#define _D3DI_H
//@@BEGIN_MSINTERNAL
#include "ddrawp.h"
#if 0
//@@END_MSINTERNAL
#include "ddraw.h"
//@@BEGIN_MSINTERNAL
#endif
//@@END_MSINTERNAL
#include "d3d.h"
// @@BEGIN_MSINTERNAL
#if !defined(BUILD_RLAPI) && !defined(BUILD_DDDDK)
#include "ddrawi.h"
#include "rlreg.h"
#include "queue.h"
#include "object.h"
/*
typedef D3DCOLORMODEL D3DCOLORMODEL;
#define D3DCOLOR_RAMP D3DCOLOR_RAMP
#define D3DCOLOR_RGB D3DCOLOR_RGB
#define D3D_COLORMODEL D3D_COLORMODEL
*/ #endif /* !BUILD_RLAPI */
// @@END_MSINTERNAL
typedef DWORD D3DI_BUFFERHANDLE, *LPD3DI_BUFFERHANDLE;
/*
* Internal version of executedata */ typedef struct _D3DI_ExecuteData { DWORD dwSize; D3DI_BUFFERHANDLE dwHandle; /* Handle allocated by driver */ DWORD dwVertexOffset; DWORD dwVertexCount; DWORD dwInstructionOffset; DWORD dwInstructionLength; DWORD dwHVertexOffset; D3DSTATUS dsStatus; /* Status after execute */ } D3DI_EXECUTEDATA, *LPD3DI_EXECUTEDATA;
/*
* Internal version of lightdata */ typedef struct _D3DI_LIGHT { D3DLIGHTTYPE type; BOOL valid; D3DVALUE red, green, blue, shade; D3DVECTOR position; D3DVECTOR model_position; D3DVECTOR direction; D3DVECTOR model_direction; D3DVECTOR halfway; D3DVALUE range; D3DVALUE range_squared; D3DVALUE falloff; D3DVALUE attenuation0; D3DVALUE attenuation1; D3DVALUE attenuation2; D3DVALUE cos_theta_by_2; D3DVALUE cos_phi_by_2; } D3DI_LIGHT, *LPD3DI_LIGHT;
// @@BEGIN_MSINTERNAL
#if !defined(BUILD_RLAPI) && !defined(BUILD_DDDDK)
#ifndef BUILD_HEL
#ifdef BUILD_D3D_LAYER
#include "driver.h"
#endif
typedef struct ID3DObjectVtbl D3DOBJECTVTBL, *LPD3DOBJECTVTBL; typedef struct IDirect3DVtbl DIRECT3DCALLBACKS, *LPDIRECT3DCALLBACKS; typedef struct IDirect3DDeviceVtbl DIRECT3DDEVICECALLBACKS, *LPDIRECT3DDEVICECALLBACKS; typedef struct IDirect3DExecuteBufferVtbl DIRECT3DEXECUTEBUFFERCALLBACKS, *LPDIRECT3DEXECUTEBUFFERCALLBACKS; typedef struct IDirect3DLightVtbl DIRECT3DLIGHTCALLBACKS, *LPDIRECT3DLIGHTCALLBACKS; typedef struct IDirect3DMaterialVtbl DIRECT3DMATERIALCALLBACKS, *LPDIRECT3DMATERIALCALLBACKS; typedef struct IDirect3DTextureVtbl DIRECT3DTEXTURECALLBACKS, *LPDIRECT3DTEXTURECALLBACKS; typedef struct IDirect3DViewportVtbl DIRECT3DVIEWPORTCALLBACKS, *LPDIRECT3DVIEWPORTCALLBACKS;
#ifdef __cplusplus
extern "C" { #endif
typedef struct _DIRECT3DI *LPDIRECT3DI; typedef struct _DIRECT3DDEVICEI *LPDIRECT3DDEVICEI; typedef struct _DIRECT3DEXECUTEBUFFERI *LPDIRECT3DEXECUTEBUFFERI; typedef struct _DIRECT3DLIGHTI *LPDIRECT3DLIGHTI; typedef struct _DIRECT3DMATERIALI *LPDIRECT3DMATERIALI; typedef struct _DIRECT3DTEXTUREI *LPDIRECT3DTEXTUREI; typedef struct _DIRECT3DVIEWPORTI *LPDIRECT3DVIEWPORTI;
/*
* If we have an aggreate Direct3D we need a structure to * represent an interface distinct from the underlying * object. This is that structure. */ typedef struct _DIRECT3DUNKNOWNI { LPDIRECT3DCALLBACKS lpVtbl; LPDIRECT3DI lpObj; } DIRECT3DUNKNOWNI; typedef struct _DIRECT3DUNKNOWNI *LPDIRECT3DUNKNOWNI;
/*
* Internal version of Direct3D object; it has data after the vtable */ typedef struct _DIRECT3DI { /*** Object Interface ***/ LPDIRECT3DCALLBACKS lpVtbl; /* Pointer to callbacks */ int refCnt; /* Reference count object */
/*** Object Relations ***/ /* Devices */ int numDevs;/* Number of devices */ LIST_HEAD(_devices, _DIRECT3DDEVICEI) devices; /* Associated IDirect3DDevices */
/* Viewports */ int numViewports; /* Number of viewports */ LIST_HEAD(_viewports, _DIRECT3DVIEWPORTI) viewports; /* Created IDirect3DViewports */ /* Lights */ int numLights; /* Number of lights */ LIST_HEAD(_lights, _DIRECT3DLIGHTI) lights; /* Created IDirect3DLights */
/* Materials */ int numMaterials; /* Number of materials */ LIST_HEAD(_materials, _DIRECT3DMATERIALI) materials; /* Created IDirect3DMaterials */
/*** Object Data ***/ unsigned long v_next; /* id of next viewport to be created */ RLDDIRegistry* lpReg; /* Registry */
/*
* DirectDraw Interface */ LPDDRAWI_DIRECTDRAW_INT lpDDInt;
/*
* The special IUnknown interface for the aggregate that does * not punt to the parent object. */ LPUNKNOWN lpOwningIUnknown; /* The owning IUnknown */ DIRECT3DUNKNOWNI lpThisIUnknown; /* Our IUnknown interface */
} DIRECT3DI;
/*
* If we have an aggreate Direct3DDevice we need a structure to * represent an interface distinct from the underlying * object. This is that structure. */ typedef struct _DIRECT3DDEVICEUNKNOWNI { LPDIRECT3DDEVICECALLBACKS lpVtbl; LPDIRECT3DDEVICEI lpObj; } DIRECT3DDEVICEUNKNOWNI; typedef struct _DIRECT3DDEVICEUNKNOWNI *LPDIRECT3DDEVICEUNKNOWNI;
/*
* Internal version of Direct3DDevice object; it has data after the vtable */
#include "d3dhal.h"
typedef RLDDIDriver* (*RLDDIDDrawCreateDriverFn)( LPDDRAWI_DIRECTDRAW_INT lpDDInt, LPDIRECTDRAWSURFACE lpDDS, LPDIRECTDRAWSURFACE lpZ, LPDIRECTDRAWPALETTE lpPal, LPDIRECT3DDEVICEI);
typedef HRESULT (*RLDDIGetCapsFn)(LPD3DDEVICEDESC*, LPD3DDEVICEDESC*); typedef void (*RLDDIInitFn)(RLDDIMallocFn, RLDDIReallocFn, RLDDIFreeFn, RLDDIRaiseFn, RLDDIValue**, int, int); typedef void (*RLDDIPushDriverFn)(RLDDIDriverStack*, RLDDIDriver*); typedef void (*RLDDIPopDriverFn)(RLDDIDriverStack*);
typedef struct _D3DI_TEXTUREBLOCK { LIST_ENTRY(_D3DI_TEXTUREBLOCK) list; /* Next block in IDirect3DTexture */ LIST_ENTRY(_D3DI_TEXTUREBLOCK) devList; /* Next block in IDirect3DDevice */ LPDIRECT3DDEVICEI lpD3DDeviceI; LPDIRECT3DTEXTUREI lpD3DTextureI; D3DTEXTUREHANDLE hTex; /* texture handle */ } D3DI_TEXTUREBLOCK; typedef struct _D3DI_TEXTUREBLOCK *LPD3DI_TEXTUREBLOCK;
typedef struct _D3DI_MATERIALBLOCK { LIST_ENTRY(_D3DI_MATERIALBLOCK) list; /* Next block in IDirect3DMaterial */ LIST_ENTRY(_D3DI_MATERIALBLOCK) devList; /* Next block in IDirect3DDevice */ LPDIRECT3DDEVICEI lpD3DDeviceI; LPDIRECT3DMATERIALI lpD3DMaterialI; D3DMATERIALHANDLE hMat; /* material handle */ } D3DI_MATERIALBLOCK; typedef struct _D3DI_MATERIALBLOCK *LPD3DI_MATERIALBLOCK;
typedef struct _DIRECT3DDEVICEI { /*** Object Interface ***/ LPDIRECT3DDEVICECALLBACKS lpVtbl; /* Pointer to callbacks */ int refCnt; /* Reference count */
/*** Object Relations ***/ LPDIRECT3DI lpDirect3DI; /* parent */ LIST_ENTRY(_DIRECT3DDEVICEI)list; /* Next device IDirect3D */
/* Textures */ LIST_HEAD(_textures, _D3DI_TEXTUREBLOCK) texBlocks; /* Ref to created IDirect3DTextures */
/* Execute buffers */ LIST_HEAD(_buffers, _DIRECT3DEXECUTEBUFFERI) buffers; /* Created IDirect3DExecuteBuffers */
/* Viewports */ int numViewports; CIRCLEQ_HEAD(_dviewports, _DIRECT3DVIEWPORTI) viewports; /* Associated IDirect3DViewports */
/* Materials */ LIST_HEAD(_dmmaterials, _D3DI_MATERIALBLOCK) matBlocks; /* Ref to associated IDirect3DMaterials */
/*** Object Data ***/ /* Private interfaces */ LPD3DOBJECTVTBL lpClassVtbl; /* Private Vtbl */ LPD3DOBJECTVTBL lpObjVtbl; /* Private Vtbl */
LPD3DHAL_CALLBACKS lpD3DHALCallbacks; LPD3DHAL_GLOBALDRIVERDATA lpD3DHALGlobalDriverData;
/* Viewports */ unsigned long v_id; /* ID of last viewport rendered */
/* Lights */ int numLights; /* This indicates the maximum number
of lights that have been set in the device. */
/* Device characteristics */ int age; int width; int height; int depth; unsigned long red_mask, green_mask, blue_mask;
int dither; int ramp_size; D3DCOLORMODEL color_model; int wireframe_options; D3DTEXTUREFILTER texture_quality; D3DVALUE gamma; unsigned char gamma_table[256]; int aspectx, aspecty; D3DVALUE perspective_tolerance;
/* Library information */ #ifdef WIN32
HINSTANCE hDrvDll; char dllname[MAXPATH]; char base[256]; #endif
#ifdef SHLIB
void* so; #endif
/* Are we in a scene? */ BOOL bInScene;
/* Our Device type */ GUID guid;
/* GetCaps function from the library */ RLDDIGetCapsFn GetCapsFn;
/* Functions required to build driver */ RLDDIInitFn RLDDIInit; RLDDIPushDriverFn RLDDIPushDriver; RLDDIPopDriverFn RLDDIPopDriver; RLDDIDDrawCreateDriverFn RLDDIDDrawCreateDriver;
/* Device description */ D3DDEVICEDESC d3dHWDevDesc; D3DDEVICEDESC d3dHELDevDesc;
/* Driver stack */ RLDDIDriverStack* stack;
/*
* The special IUnknown interface for the aggregate that does * not punt to the parent object. */ LPUNKNOWN lpOwningIUnknown; /* The owning IUnknown */ DIRECT3DDEVICEUNKNOWNI lpThisIUnknown; /* Our IUnknown interface */
} DIRECT3DDEVICEI;
/*
* Internal version of Direct3DExecuteBuffer object; * it has data after the vtable */ typedef struct _DIRECT3DEXECUTEBUFFERI { /*** Object Interface ***/ LPDIRECT3DEXECUTEBUFFERCALLBACKS lpVtbl; /* Pointer to callbacks */ int refCnt; /* Reference count */
/*** Object Relations ***/ LPDIRECT3DDEVICEI lpD3DDeviceI; /* Parent */ LIST_ENTRY(_DIRECT3DEXECUTEBUFFERI)list; /* Next buffer in IDirect3D */
/*** Object Data ***/ DWORD pid; /* Process locking execute buffer */ D3DEXECUTEBUFFERDESC debDesc; /* Description of the buffer */ D3DEXECUTEDATA exData; /* Execute Data */ BOOL locked; /* Is the buffer locked */
D3DI_BUFFERHANDLE hBuf; /* Execute buffer handle */ } DIRECT3DEXECUTEBUFFERI;
/*
* Internal version of Direct3DLight object; * it has data after the vtable */ typedef struct _DIRECT3DLIGHTI { /*** Object Interface ***/ LPDIRECT3DLIGHTCALLBACKS lpVtbl; /* Pointer to callbacks */ int refCnt; /* Reference count */
/*** Object Relations ***/ LPDIRECT3DI lpDirect3DI; /* Parent */ LIST_ENTRY(_DIRECT3DLIGHTI)list; /* Next light in IDirect3D */
LPDIRECT3DVIEWPORTI lpD3DViewportI; /* Guardian */ CIRCLEQ_ENTRY(_DIRECT3DLIGHTI)light_list; /* Next light in IDirect3DViewport */
/*** Object Data ***/ D3DLIGHT dlLight;/* Data describing light */ D3DI_LIGHT diLightData; /* Internal representation of light */ } DIRECT3DLIGHTI;
/*
* Internal version of Direct3DMaterial object; * it has data after the vtable */ typedef struct _DIRECT3DMATERIALI { /*** Object Interface ***/ LPDIRECT3DMATERIALCALLBACKS lpVtbl; /* Pointer to callbacks */ int refCnt; /* Reference count */
/*** Object Relations ***/ LPDIRECT3DI lpDirect3DI; /* Parent */ LIST_ENTRY(_DIRECT3DMATERIALI)list; /* Next MATERIAL in IDirect3D */
LIST_HEAD(_mblocks, _D3DI_MATERIALBLOCK)blocks; /* devices we're associated with */
/*** Object Data ***/ D3DMATERIAL dmMaterial; /* Data describing material */ BOOL bRes; /* Is this material reserved in the driver */ } DIRECT3DMATERIALI;
/*
* If we have an aggreate Direct3DTexture we need a structure * to represent an unknown interface distinct from the underlying * object. This is that structure. */ typedef struct _DIRECT3DTEXTUREUNKNOWNI { LPDIRECT3DTEXTURECALLBACKS lpVtbl; LPDIRECT3DTEXTUREI lpObj; } DIRECT3DTEXTUREUNKNOWNI; typedef struct _DIRECT3DTEXTUREUNKNOWNI *LPDIRECT3DTEXTUREUNKNOWNI;
/*
* Internal version of Direct3DTexture object; it has data after the vtable */ typedef struct _DIRECT3DTEXTUREI { /*** Object Interface ***/ LPDIRECT3DTEXTURECALLBACKS lpVtbl; /* Pointer to callbacks */ int refCnt; /* Reference count */
/*** Object Relations ***/ LIST_HEAD(_blocks, _D3DI_TEXTUREBLOCK) blocks; /* Devices we're associated with */
/*** Object Data ***/ LPDIRECTDRAWSURFACE lpDDS;
/*
* The special IUnknown interface for the aggregate that does * not punt to the parent object. */ LPUNKNOWN lpOwningIUnknown; /* The owning IUnknown */ DIRECT3DTEXTUREUNKNOWNI lpThisIUnknown; /* Our IUnknown interface */ BOOL bIsPalettized;
} DIRECT3DTEXTUREI;
/*
* Internal version of Direct3DViewport object; it has data after the vtable */ typedef struct _DIRECT3DVIEWPORTI { /*** Object Interface ***/ LPDIRECT3DVIEWPORTCALLBACKS lpVtbl; /* Pointer to callbacks */ int refCnt; /* Reference count */
/*** Object Relations */ LPDIRECT3DI lpDirect3DI; /* Parent */ LIST_ENTRY(_DIRECT3DVIEWPORTI)list; /* Next viewport in IDirect3D */
LPDIRECT3DDEVICEI lpD3DDeviceI; /* Guardian */ CIRCLEQ_ENTRY(_DIRECT3DVIEWPORTI)vw_list; /* Next viewport in IDirect3DDevice */ /* Lights */ int numLights; CIRCLEQ_HEAD(_dlights, _DIRECT3DLIGHTI) lights; /* Associated IDirect3DLights */
/*** Object Data ***/ unsigned long v_id; /* Id for this viewport */ D3DVIEWPORT v_data;
BOOL have_background; D3DMATERIALHANDLE background; /* Background material */ BOOL have_depth; LPDIRECTDRAWSURFACE depth; /* Background depth */ BOOL bLightsChanged; /* Have the lights changed since they
were last collected? */ DWORD clrCount; /* Number of rects allocated */ LPD3DRECT clrRects; /* Rects used for clearing */ } DIRECT3DVIEWPORTI;
/*
* Picking stuff. */ typedef struct _D3DI_PICKDATA { D3DI_EXECUTEDATA* exe; D3DPICKRECORD* records; int pick_count; D3DRECT pick; } D3DI_PICKDATA, *LPD3DI_PICKDATA;
/*
* Direct3D memory allocation */
/*
* Register a set of functions to be used in place of malloc, realloc * and free for memory allocation. The functions D3DMalloc, D3DRealloc * and D3DFree will use these functions. The default is to use the * ANSI C library routines malloc, realloc and free. */ typedef LPVOID (*D3DMALLOCFUNCTION)(size_t); typedef LPVOID (*D3DREALLOCFUNCTION)(LPVOID, size_t); typedef VOID (*D3DFREEFUNCTION)(LPVOID);
/*
* Allocate size bytes of memory and return a pointer to it in *p_return. * Returns D3DERR_BADALLOC with *p_return unchanged if the allocation fails. */ HRESULT D3DAPI D3DMalloc(LPVOID* p_return, size_t size);
/*
* Change the size of an allocated block of memory. A pointer to the * block is passed in in *p_inout. If *p_inout is NULL then a new * block is allocated. If the reallocation is successful, *p_inout is * changed to point to the new block. If the allocation fails, * *p_inout is unchanged and D3DERR_BADALLOC is returned. */ HRESULT D3DAPI D3DRealloc(LPVOID* p_inout, size_t size);
/*
* Free a block of memory previously allocated with D3DMalloc or * D3DRealloc. */ VOID D3DAPI D3DFree(LPVOID p);
/*
* Used for raising errors from the driver. */ HRESULT D3DAPI D3DRaise(HRESULT);
/*
* Convert RLDDI error codes to D3D error codes */ #define RLDDITOD3DERR(_errcode) (RLDDIToD3DErrors[_errcode])
extern HRESULT RLDDIToD3DErrors[];
/*
* maths */ #if 1 /* defined(STACK_CALL) && defined(__WATCOMC__) */
D3DVALUE D3DIPow(D3DVALUE, D3DVALUE); #else
#define D3DIPow(v,p) DTOVAL(pow(VALTOD(v), VALTOD(p)))
#endif
/*
* Light utils */ void D3DI_DeviceMarkLightEnd(LPDIRECT3DDEVICEI, int); void D3DI_UpdateLightInternal(LPDIRECT3DLIGHTI); void D3DI_VectorNormalise12(LPD3DVECTOR v); D3DTEXTUREHANDLE D3DI_FindTextureHandle(LPDIRECT3DTEXTUREI, LPDIRECT3DDEVICEI); void D3DI_SetTextureHandle(LPDIRECT3DTEXTUREI, LPDIRECT3DDEVICEI, D3DTEXTUREHANDLE); void D3DI_RemoveTextureBlock(LPD3DI_TEXTUREBLOCK); void D3DI_RemoveMaterialBlock(LPD3DI_MATERIALBLOCK);
extern BOOL D3DI_isHALValid(LPD3DHAL_CALLBACKS);
#ifdef BUILD_D3D_LAYER
extern RLDDIValue* RLDDIFInvSqrtTable; #endif
#ifdef __cplusplus
}; #endif
#endif /* BUILD_HEL */
#endif /* !BUILD_RLAPI */
// @@END_MSINTERNAL
#endif /* _D3DI_H */
|