New debug scheme with explicit debug channels declaration.
[wine/testsucceed.git] / graphics / d3d_private.h
blob519688ea5553a948450af1c7017a080e715c7a28
1 /* Direct3D private include file
2 (c) 1998 Lionel ULMER
4 This files contains all the structure that are not exported
5 through d3d.h and all common macros. */
7 #ifndef __GRAPHICS_WINE_D3D_PRIVATE_H
8 #define __GRAPHICS_WINE_D3D_PRIVATE_H
10 #include "wine_gl.h"
11 #include "d3d.h"
13 /*****************************************************************************
14 * Predeclare the interface implementation structures
16 typedef struct IDirect3DImpl IDirect3DImpl;
17 typedef struct IDirect3D2Impl IDirect3D2Impl;
18 typedef struct IDirect3DLightImpl IDirect3DLightImpl;
19 typedef struct IDirect3DMaterial2Impl IDirect3DMaterial2Impl;
20 typedef struct IDirect3DTexture2Impl IDirect3DTexture2Impl;
21 typedef struct IDirect3DViewport2Impl IDirect3DViewport2Impl;
22 typedef struct IDirect3DExecuteBufferImpl IDirect3DExecuteBufferImpl;
23 typedef struct IDirect3DDeviceImpl IDirect3DDeviceImpl;
24 typedef struct IDirect3DDevice2Impl IDirect3DDevice2Impl;
26 #include "ddraw_private.h"
28 /*****************************************************************************
29 * IDirect3D implementation structure
31 struct IDirect3DImpl
33 /* IUnknown fields */
34 ICOM_VTABLE(IDirect3D)* lpvtbl;
35 DWORD ref;
36 /* IDirect3D fields */
37 IDirectDrawImpl* ddraw;
40 /*****************************************************************************
41 * IDirect3D2 implementation structure
43 struct IDirect3D2Impl
45 /* IUnknown fields */
46 ICOM_VTABLE(IDirect3D2)* lpvtbl;
47 DWORD ref;
48 /* IDirect3D2 fields */
49 IDirectDrawImpl* ddraw;
52 /*****************************************************************************
53 * IDirect3DLight implementation structure
55 struct IDirect3DLightImpl
57 /* IUnknown fields */
58 ICOM_VTABLE(IDirect3DLight)* lpvtbl;
59 DWORD ref;
60 /* IDirect3DLight fields */
61 union {
62 IDirect3DImpl* d3d1;
63 IDirect3D2Impl* d3d2;
64 } d3d;
65 int type;
67 D3DLIGHT2 light;
69 /* Chained list used for adding / removing from viewports */
70 IDirect3DLightImpl *next, *prev;
72 /* Activation function */
73 void (*activate)(IDirect3DLightImpl*);
74 int is_active;
76 /* Awful OpenGL code !!! */
77 #ifdef HAVE_MESAGL
78 GLenum light_num;
79 #endif
82 /*****************************************************************************
83 * IDirect3DMaterial2 implementation structure
85 struct IDirect3DMaterial2Impl
87 /* IUnknown fields */
88 ICOM_VTABLE(IDirect3DMaterial2)* lpvtbl;
89 DWORD ref;
90 /* IDirect3DMaterial2 fields */
91 union {
92 IDirect3DImpl* d3d1;
93 IDirect3D2Impl* d3d2;
94 } d3d;
95 union {
96 IDirect3DDeviceImpl* active_device1;
97 IDirect3DDevice2Impl* active_device2;
98 } device;
99 int use_d3d2;
101 D3DMATERIAL mat;
103 void (*activate)(IDirect3DMaterial2Impl* this);
106 /*****************************************************************************
107 * IDirect3DTexture2 implementation structure
109 struct IDirect3DTexture2Impl
111 /* IUnknown fields */
112 ICOM_VTABLE(IDirect3DTexture2)* lpvtbl;
113 DWORD ref;
114 /* IDirect3DTexture2 fields */
115 void* D3Ddevice; /* I put (void *) to use the same pointer for both
116 Direct3D and Direct3D2 */
117 #ifdef HAVE_MESAGL
118 GLuint tex_name;
119 #endif
120 IDirectDrawSurface4Impl* surface;
123 /*****************************************************************************
124 * IDirect3DViewport2 implementation structure
126 struct IDirect3DViewport2Impl
128 /* IUnknown fields */
129 ICOM_VTABLE(IDirect3DViewport2)* lpvtbl;
130 DWORD ref;
131 /* IDirect3DViewport2 fields */
132 union {
133 IDirect3DImpl* d3d1;
134 IDirect3D2Impl* d3d2;
135 } d3d;
136 /* If this viewport is active for one device, put the device here */
137 union {
138 IDirect3DDeviceImpl* active_device1;
139 IDirect3DDevice2Impl* active_device2;
140 } device;
141 int use_d3d2;
143 union {
144 D3DVIEWPORT vp1;
145 D3DVIEWPORT2 vp2;
146 } viewport;
147 int use_vp2;
149 /* Activation function */
150 void (*activate)(IDirect3DViewport2Impl*);
152 /* Field used to chain viewports together */
153 IDirect3DViewport2Impl* next;
155 /* Lights list */
156 IDirect3DLightImpl* lights;
158 /* OpenGL code */
159 #ifdef HAVE_MESAGL
160 GLenum nextlight;
161 #endif
164 /*****************************************************************************
165 * IDirect3DExecuteBuffer implementation structure
167 struct IDirect3DExecuteBufferImpl
169 /* IUnknown fields */
170 ICOM_VTABLE(IDirect3DExecuteBuffer)* lpvtbl;
171 DWORD ref;
172 /* IDirect3DExecuteBuffer fields */
173 IDirect3DDeviceImpl* d3ddev;
175 D3DEXECUTEBUFFERDESC desc;
176 D3DEXECUTEDATA data;
178 /* This buffer will store the transformed vertices */
179 void* vertex_data;
180 D3DVERTEXTYPE vertex_type;
182 /* This flags is set to TRUE if we allocated ourselves the
183 data buffer */
184 BOOL need_free;
186 void (*execute)(IDirect3DExecuteBuffer* this,
187 IDirect3DDevice* dev,
188 IDirect3DViewport2* vp);
191 /*****************************************************************************
192 * IDirect3DDevice implementation structure
194 struct IDirect3DDeviceImpl
196 /* IUnknown fields */
197 ICOM_VTABLE(IDirect3DDevice)* lpvtbl;
198 DWORD ref;
199 /* IDirect3DDevice fields */
200 IDirect3DImpl* d3d;
201 IDirectDrawSurfaceImpl* surface;
203 IDirect3DViewport2Impl* viewport_list;
204 IDirect3DViewport2Impl* current_viewport;
206 void (*set_context)(IDirect3DDeviceImpl*);
209 /*****************************************************************************
210 * IDirect3DDevice2 implementation structure
212 struct IDirect3DDevice2Impl
214 /* IUnknown fields */
215 ICOM_VTABLE(IDirect3DDevice2)* lpvtbl;
216 DWORD ref;
217 /* IDirect3DDevice fields */
218 IDirect3D2Impl* d3d;
219 IDirectDrawSurfaceImpl* surface;
221 IDirect3DViewport2Impl* viewport_list;
222 IDirect3DViewport2Impl* current_viewport;
224 void (*set_context)(IDirect3DDevice2Impl*);
229 #ifdef HAVE_MESAGL
232 /* Matrix copy WITH transposition */
233 #define conv_mat2(mat,gl_mat) \
235 TRACE(ddraw, "%f %f %f %f\n", (mat)->_11, (mat)->_12, (mat)->_13, (mat)->_14); \
236 TRACE(ddraw, "%f %f %f %f\n", (mat)->_21, (mat)->_22, (mat)->_23, (mat)->_24); \
237 TRACE(ddraw, "%f %f %f %f\n", (mat)->_31, (mat)->_32, (mat)->_33, (mat)->_34); \
238 TRACE(ddraw, "%f %f %f %f\n", (mat)->_41, (mat)->_42, (mat)->_43, (mat)->_44); \
239 (gl_mat)[ 0] = (mat)->_11; \
240 (gl_mat)[ 1] = (mat)->_21; \
241 (gl_mat)[ 2] = (mat)->_31; \
242 (gl_mat)[ 3] = (mat)->_41; \
243 (gl_mat)[ 4] = (mat)->_12; \
244 (gl_mat)[ 5] = (mat)->_22; \
245 (gl_mat)[ 6] = (mat)->_32; \
246 (gl_mat)[ 7] = (mat)->_42; \
247 (gl_mat)[ 8] = (mat)->_13; \
248 (gl_mat)[ 9] = (mat)->_23; \
249 (gl_mat)[10] = (mat)->_33; \
250 (gl_mat)[11] = (mat)->_43; \
251 (gl_mat)[12] = (mat)->_14; \
252 (gl_mat)[13] = (mat)->_24; \
253 (gl_mat)[14] = (mat)->_34; \
254 (gl_mat)[15] = (mat)->_44; \
257 /* Matrix copy WITHOUT transposition */
258 #define conv_mat(mat,gl_mat) \
260 TRACE(ddraw, "%f %f %f %f\n", (mat)->_11, (mat)->_12, (mat)->_13, (mat)->_14); \
261 TRACE(ddraw, "%f %f %f %f\n", (mat)->_21, (mat)->_22, (mat)->_23, (mat)->_24); \
262 TRACE(ddraw, "%f %f %f %f\n", (mat)->_31, (mat)->_32, (mat)->_33, (mat)->_34); \
263 TRACE(ddraw, "%f %f %f %f\n", (mat)->_41, (mat)->_42, (mat)->_43, (mat)->_44); \
264 memcpy(gl_mat, (mat), 16 * sizeof(float)); \
267 #define dump_mat(mat) \
268 TRACE(ddraw, "%f %f %f %f\n", (mat)->_11, (mat)->_12, (mat)->_13, (mat)->_14); \
269 TRACE(ddraw, "%f %f %f %f\n", (mat)->_21, (mat)->_22, (mat)->_23, (mat)->_24); \
270 TRACE(ddraw, "%f %f %f %f\n", (mat)->_31, (mat)->_32, (mat)->_33, (mat)->_34); \
271 TRACE(ddraw, "%f %f %f %f\n", (mat)->_41, (mat)->_42, (mat)->_43, (mat)->_44);
273 typedef struct render_state {
274 /* This is used for the device mode */
275 GLenum src, dst;
276 /* This is used for textures */
277 GLenum mag, min;
278 } RenderState;
280 typedef struct OpenGL_IDirect3DDevice2 {
281 IDirect3DDevice2Impl common;
283 /* These are the OpenGL-specific variables */
284 OSMesaContext ctx;
285 unsigned char *buffer;
287 /* The current render state */
288 RenderState rs;
290 /* The last type of vertex drawn */
291 D3DVERTEXTYPE vt;
293 float world_mat[16];
294 float view_mat[16];
295 float proj_mat[16];
296 } OpenGL_IDirect3DDevice2;
298 typedef struct OpenGL_IDirect3DDevice {
299 IDirect3DDeviceImpl common;
301 /* These are the OpenGL-specific variables */
302 OSMesaContext ctx;
303 unsigned char *buffer;
305 /* The current render state */
306 RenderState rs;
308 D3DMATRIX *world_mat;
309 D3DMATRIX *view_mat;
310 D3DMATRIX *proj_mat;
311 } OpenGL_IDirect3DDevice;
313 #define _dump_colorvalue(s,v) \
314 TRACE(ddraw, " " s " : %f %f %f %f\n", \
315 (v).r.r, (v).g.g, (v).b.b, (v).a.a);
317 /* Common functions defined in d3dcommon.c */
318 void set_render_state(D3DRENDERSTATETYPE dwRenderStateType,
319 DWORD dwRenderState, RenderState *rs) ;
321 #endif /* HAVE_MESAGL */
323 /* All non-static functions 'exported' by various sub-objects */
324 extern LPDIRECT3DTEXTURE2 d3dtexture2_create(IDirectDrawSurface4Impl* surf);
325 extern LPDIRECT3DTEXTURE d3dtexture_create(IDirectDrawSurface4Impl* surf);
327 extern LPDIRECT3DLIGHT d3dlight_create_dx3(IDirect3DImpl* d3d1);
328 extern LPDIRECT3DLIGHT d3dlight_create(IDirect3D2Impl* d3d2);
330 extern LPDIRECT3DEXECUTEBUFFER d3dexecutebuffer_create(IDirect3DDeviceImpl* d3ddev, LPD3DEXECUTEBUFFERDESC lpDesc);
332 extern LPDIRECT3DMATERIAL d3dmaterial_create(IDirect3DImpl* d3d1);
333 extern LPDIRECT3DMATERIAL2 d3dmaterial2_create(IDirect3D2Impl* d3d2);
335 extern LPDIRECT3DVIEWPORT d3dviewport_create(IDirect3DImpl* d3d1);
336 extern LPDIRECT3DVIEWPORT2 d3dviewport2_create(IDirect3D2Impl* d3d2);
338 extern int is_OpenGL_dx3(REFCLSID rguid, IDirectDrawSurfaceImpl* surface, IDirect3DDeviceImpl** device);
339 extern int d3d_OpenGL_dx3(LPD3DENUMDEVICESCALLBACK cb, LPVOID context) ;
340 extern int d3d_OpenGL(LPD3DENUMDEVICESCALLBACK cb, LPVOID context) ;
341 extern int is_OpenGL(REFCLSID rguid, IDirectDrawSurfaceImpl* surface, IDirect3DDevice2Impl** device, IDirect3D2Impl* d3d);
344 #endif /* __GRAPHICS_WINE_D3D_PRIVATE_H */