/**************************************************************************** * * Mesa 3-D graphics library * Direct3D Driver Interface * * ======================================================================== * * Copyright (C) 1991-2004 SciTech Software, Inc. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * SCITECH SOFTWARE INC BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * * ====================================================================== * * Language: ANSI C * Environment: Windows 9x (Win32) * * Description: OpenGL context handling. * ****************************************************************************/ #ifndef __DGLCONTEXT_H #define __DGLCONTEXT_H // Disable compiler complaints about DLL linkage #pragma warning (disable:4273) // Macros to control compilation #ifndef STRICT #define STRICT #endif // STRICT #define WIN32_LEAN_AND_MEAN #include #include #ifdef _USE_GLD3_WGL #include "dglmacros.h" #include "dglglobals.h" #include "pixpack.h" #include "ddlog.h" #include "dglpf.h" #include "context.h" // Mesa context #else #include #include #include "dglmacros.h" #include "dglglobals.h" #include "pixpack.h" #include "ddlog.h" #include "dglpf.h" #include "d3dvertex.h" #include "DirectGL.h" #include "context.h" // Mesa context #include "vb.h" // Mesa vertex buffer #endif // _USE_GLD3_WGL /*---------------------- Macros and type definitions ----------------------*/ // TODO: Use a list instead of this constant! #define DGL_MAX_CONTEXTS 32 // Structure for describing an OpenGL context #ifdef _USE_GLD3_WGL typedef struct { BOOL bHasBeenCurrent; DGL_pixelFormat *lpPF; // Pointer to private driver data (this also contains the drawable). void *glPriv; // Mesa vars: GLcontext *glCtx; // The core Mesa context GLvisual *glVis; // Describes the color buffer GLframebuffer *glBuffer; // Ancillary buffers GLuint ClearIndex; GLuint CurrentIndex; GLubyte ClearColor[4]; GLubyte CurrentColor[4]; BOOL EmulateSingle; // Emulate single-buffering BOOL bDoubleBuffer; BOOL bDepthBuffer; // Shared driver vars: BOOL bAllocated; BOOL bFullscreen; // Is this a fullscreen context? BOOL bSceneStarted; // Has a lpDev->BeginScene been issued? BOOL bCanRender; // Flag: states whether rendering is OK BOOL bFrameStarted; // Has frame update started at all? BOOL bStencil; // TRUE if this context has stencil BOOL bGDIEraseBkgnd; // GDI Erase Background command // Window information HWND hWnd; // Window handle HDC hDC; // Windows' Device Context of the window DWORD dwWidth; // Window width DWORD dwHeight; // Window height DWORD dwBPP; // Window bits-per-pixel; RECT rcScreenRect; // Screen rectangle DWORD dwModeWidth; // Display mode width DWORD dwModeHeight; // Display mode height float dvClipX; float dvClipY; LONG lpfnWndProc; // window message handler function } DGL_ctx; #define GLD_context DGL_ctx #define GLD_GET_CONTEXT(c) (GLD_context*)(c)->DriverCtx #else // _USE_GLD3_WGL typedef struct { BOOL bHasBeenCurrent; DGL_pixelFormat *lpPF; // // Mesa context vars: // GLcontext *glCtx; // The core Mesa context GLvisual *glVis; // Describes the color buffer GLframebuffer *glBuffer; // Ancillary buffers GLuint ClearIndex; GLuint CurrentIndex; GLubyte ClearColor[4]; GLubyte CurrentColor[4]; BOOL EmulateSingle; // Emulate single-buffering BOOL bDoubleBuffer; BOOL bDepthBuffer; int iZBufferPF; // Index of Zbuffer pixel format // Vertex buffer: one-to-one correlation with Mesa's vertex buffer. // This will be filled by our setup function (see d3dvsetup.c) DGL_TLvertex gWin[VB_SIZE]; // Transformed and lit vertices // DGL_Lvertex gObj[VB_SIZE]; // Lit vertices in object coordinates. // Indices for DrawIndexedPrimitive. // Clipped quads are drawn seperately, so use VB_SIZE. // 6 indices are needed to make 2 triangles for each possible quad // WORD wIndices[(VB_SIZE / 4) * 6]; WORD wIndices[32768]; // // Device driver vars: // BOOL bAllocated; BOOL bFullscreen; // Is this a fullscreen context? BOOL bSceneStarted; // Has a lpDev->BeginScene been issued? BOOL bCanRender; // Flag: states whether rendering is OK BOOL bFrameStarted; // Has frame update started at all? // DirectX COM interfaces, postfixed with the interface number IDirectDraw *lpDD1; IDirectDraw4 *lpDD4; IDirect3D3 *lpD3D3; IDirect3DDevice3 *lpDev3; IDirect3DViewport3 *lpViewport3; IDirectDrawSurface4 *lpFront4; IDirectDrawSurface4 *lpBack4; IDirectDrawSurface4 *lpDepth4; // Vertex buffers BOOL bD3DPipeline; // True if using D3D geometry pipeline IDirect3DVertexBuffer *m_vbuf; // Unprocessed vertices IDirect3DVertexBuffer *m_pvbuf; // Processed vertices ready to be rendered D3DTEXTUREOP ColorOp[MAX_TEXTURE_UNITS]; // Used for re-enabling texturing D3DTEXTUREOP AlphaOp[MAX_TEXTURE_UNITS]; // Used for re-enabling texturing struct gl_texture_object *tObj[MAX_TEXTURE_UNITS]; DDCAPS ddCaps; // DirectDraw caps D3DDEVICEDESC D3DDevDesc; // Direct3D Device description DDPIXELFORMAT ddpfRender; // Pixel format of the render buffer DDPIXELFORMAT ddpfDepth; // Pixel format of the depth buffer BOOL bStencil; // TRUE is this context has stencil PX_packFunc fnPackFunc; // Pixel packing function for SW PX_unpackFunc fnUnpackFunc; // Pixel unpacking function for SW PX_packSpanFunc fnPackSpanFunc; // Pixel span packer D3DVIEWPORT2 d3dViewport; // D3D Viewport object D3DCULL cullmode; // Direct3D cull mode D3DCOLOR curcolor; // Current color DWORD dwColorPF; // Current color, in format of target surface D3DCOLOR d3dClearColor; // Clear color D3DCOLOR ConstantColor; // For flat shading DWORD dwClearColorPF; // Clear color, in format of target surface BOOL bGDIEraseBkgnd; // GDI Erase Background command // Primitive caches // DGL_vertex LineCache[DGL_MAX_LINE_VERTS]; // DGL_vertex TriCache[DGL_MAX_TRI_VERTS]; // DWORD dwNextLineVert; // DWORD dwNextTriVert; // Window information HWND hWnd; // Window handle HDC hDC; // Windows' Device Context of the window DWORD dwWidth; // Window width DWORD dwHeight; // Window height DWORD dwBPP; // Window bits-per-pixel; RECT rcScreenRect; // Screen rectangle DWORD dwModeWidth; // Display mode width DWORD dwModeHeight; // Display mode height float dvClipX; float dvClipY; LONG lpfnWndProc; // window message handler function // Shared texture palette IDirectDrawPalette *lpGlobalPalette; // Usage counters. // One of these counters will be incremented when we choose // between hardware and software rendering functions. // DWORD dwHWUsageCount; // Hardware usage count // DWORD dwSWUsageCount; // Software usage count // Texture state flags. // BOOL m_texturing; // TRUE is texturing // BOOL m_mtex; // TRUE if multitexture // BOOL m_texHandleValid; // TRUE if tex state valid // Renderstate caches to ensure no redundant state changes DWORD dwRS[256]; // Renderstates DWORD dwTSS[2][24]; // Texture-stage states LPDIRECT3DTEXTURE2 lpTex[2]; // Texture (1 per stage) DWORD dwMaxTextureSize; // Max texture size: // clamped to 1024. } DGL_ctx; #endif // _USE_GLD3_WGL /*------------------------- Function Prototypes ---------------------------*/ #ifdef __cplusplus extern "C" { #endif HHOOK hKeyHook; LRESULT CALLBACK dglKeyProc(int code,WPARAM wParam,LPARAM lParam); void dglInitContextState(); void dglDeleteContextState(); BOOL dglIsValidContext(HGLRC a); DGL_ctx* dglGetContextAddress(const HGLRC a); HDC dglGetCurrentDC(void); HGLRC dglGetCurrentContext(void); HGLRC dglCreateContext(HDC a, const DGL_pixelFormat *lpPF); BOOL dglMakeCurrent(HDC a, HGLRC b); BOOL dglDeleteContext(HGLRC a); BOOL dglSwapBuffers(HDC hDC); #ifdef __cplusplus } #endif #endif