blob: 5c433b857eff062dfb06af7ff78cd8906fb6f73d [file] [log] [blame]
/****************************************************************************
*
* 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 <windows.h>
#include <GL\gl.h>
#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 <ddraw.h>
#include <d3d.h>
#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