Fixed OpenGL devices implementation.
[wine/wine64.git] / graphics / d3d_private.h
blobcc44b1fa4b18686669287cf6488c3bcd2bb9be1c
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"
12 #include "d3d.h"
14 #include "ddraw_private.h"
17 /*****************************************************************************
18 * Predeclare the interface implementation structures
20 typedef struct IDirect3DImpl IDirect3DImpl;
21 typedef struct IDirect3D2Impl IDirect3D2Impl;
22 typedef struct IDirect3DLightImpl IDirect3DLightImpl;
23 typedef struct IDirect3DMaterial2Impl IDirect3DMaterial2Impl;
24 typedef struct IDirect3DTexture2Impl IDirect3DTexture2Impl;
25 typedef struct IDirect3DViewport2Impl IDirect3DViewport2Impl;
26 typedef struct IDirect3DExecuteBufferImpl IDirect3DExecuteBufferImpl;
27 typedef struct IDirect3DDeviceImpl IDirect3DDeviceImpl;
28 typedef struct IDirect3DDevice2Impl IDirect3DDevice2Impl;
31 /*****************************************************************************
32 * IDirect3D implementation structure
34 struct IDirect3DImpl
36 /* IUnknown fields */
37 ICOM_VTABLE(IDirect3D)* lpvtbl;
38 DWORD ref;
39 /* IDirect3D fields */
40 IDirectDrawImpl* ddraw;
43 /*****************************************************************************
44 * IDirect3D2 implementation structure
46 struct IDirect3D2Impl
48 /* IUnknown fields */
49 ICOM_VTABLE(IDirect3D2)* lpvtbl;
50 DWORD ref;
51 /* IDirect3D2 fields */
52 IDirectDrawImpl* ddraw;
55 /*****************************************************************************
56 * IDirect3DLight implementation structure
58 struct IDirect3DLightImpl
60 /* IUnknown fields */
61 ICOM_VTABLE(IDirect3DLight)* lpvtbl;
62 DWORD ref;
63 /* IDirect3DLight fields */
64 union {
65 IDirect3DImpl* d3d1;
66 IDirect3D2Impl* d3d2;
67 } d3d;
68 int type;
70 D3DLIGHT2 light;
72 /* Chained list used for adding / removing from viewports */
73 IDirect3DLightImpl *next, *prev;
75 /* Activation function */
76 void (*activate)(IDirect3DLightImpl*);
77 int is_active;
79 /* Awful OpenGL code !!! */
80 #ifdef HAVE_MESAGL
81 GLenum light_num;
82 #endif
85 /*****************************************************************************
86 * IDirect3DMaterial2 implementation structure
88 struct IDirect3DMaterial2Impl
90 /* IUnknown fields */
91 ICOM_VTABLE(IDirect3DMaterial2)* lpvtbl;
92 DWORD ref;
93 /* IDirect3DMaterial2 fields */
94 union {
95 IDirect3DImpl* d3d1;
96 IDirect3D2Impl* d3d2;
97 } d3d;
98 union {
99 IDirect3DDeviceImpl* active_device1;
100 IDirect3DDevice2Impl* active_device2;
101 } device;
102 int use_d3d2;
104 D3DMATERIAL mat;
106 void (*activate)(IDirect3DMaterial2Impl* this);
109 /*****************************************************************************
110 * IDirect3DTexture2 implementation structure
112 struct IDirect3DTexture2Impl
114 /* IUnknown fields */
115 ICOM_VTABLE(IDirect3DTexture2)* lpvtbl;
116 DWORD ref;
117 /* IDirect3DTexture2 fields */
118 void* D3Ddevice; /* I put (void *) to use the same pointer for both
119 Direct3D and Direct3D2 */
120 #ifdef HAVE_MESAGL
121 GLuint tex_name;
122 #endif
123 IDirectDrawSurface4Impl* surface;
126 /*****************************************************************************
127 * IDirect3DViewport2 implementation structure
129 struct IDirect3DViewport2Impl
131 /* IUnknown fields */
132 ICOM_VTABLE(IDirect3DViewport2)* lpvtbl;
133 DWORD ref;
134 /* IDirect3DViewport2 fields */
135 union {
136 IDirect3DImpl* d3d1;
137 IDirect3D2Impl* d3d2;
138 } d3d;
139 /* If this viewport is active for one device, put the device here */
140 union {
141 IDirect3DDeviceImpl* active_device1;
142 IDirect3DDevice2Impl* active_device2;
143 } device;
144 int use_d3d2;
146 union {
147 D3DVIEWPORT vp1;
148 D3DVIEWPORT2 vp2;
149 } viewport;
150 int use_vp2;
152 /* Activation function */
153 void (*activate)(IDirect3DViewport2Impl*);
155 /* Field used to chain viewports together */
156 IDirect3DViewport2Impl* next;
158 /* Lights list */
159 IDirect3DLightImpl* lights;
161 /* OpenGL code */
162 #ifdef HAVE_MESAGL
163 GLenum nextlight;
164 #endif
167 /*****************************************************************************
168 * IDirect3DExecuteBuffer implementation structure
170 struct IDirect3DExecuteBufferImpl
172 /* IUnknown fields */
173 ICOM_VTABLE(IDirect3DExecuteBuffer)* lpvtbl;
174 DWORD ref;
175 /* IDirect3DExecuteBuffer fields */
176 IDirect3DDeviceImpl* d3ddev;
178 D3DEXECUTEBUFFERDESC desc;
179 D3DEXECUTEDATA data;
181 /* This buffer will store the transformed vertices */
182 void* vertex_data;
183 D3DVERTEXTYPE vertex_type;
185 /* This flags is set to TRUE if we allocated ourselves the
186 data buffer */
187 BOOL need_free;
189 void (*execute)(IDirect3DExecuteBuffer* this,
190 IDirect3DDevice* dev,
191 IDirect3DViewport2* vp);
194 /*****************************************************************************
195 * IDirect3DDevice implementation structure
197 struct IDirect3DDeviceImpl
199 /* IUnknown fields */
200 ICOM_VTABLE(IDirect3DDevice)* lpvtbl;
201 DWORD ref;
202 /* IDirect3DDevice fields */
203 IDirect3DImpl* d3d;
204 IDirectDrawSurfaceImpl* surface;
206 IDirect3DViewport2Impl* viewport_list;
207 IDirect3DViewport2Impl* current_viewport;
209 void (*set_context)(IDirect3DDeviceImpl*);
212 /*****************************************************************************
213 * IDirect3DDevice2 implementation structure
215 struct IDirect3DDevice2Impl
217 /* IUnknown fields */
218 ICOM_VTABLE(IDirect3DDevice2)* lpvtbl;
219 DWORD ref;
220 /* IDirect3DDevice fields */
221 IDirect3D2Impl* d3d;
222 IDirectDrawSurfaceImpl* surface;
224 IDirect3DViewport2Impl* viewport_list;
225 IDirect3DViewport2Impl* current_viewport;
227 void (*set_context)(IDirect3DDevice2Impl*);
232 #ifdef HAVE_MESAGL
235 /* Matrix copy WITH transposition */
236 #define conv_mat2(mat,gl_mat) \
238 TRACE(ddraw, "%f %f %f %f\n", (mat)->_11, (mat)->_12, (mat)->_13, (mat)->_14); \
239 TRACE(ddraw, "%f %f %f %f\n", (mat)->_21, (mat)->_22, (mat)->_23, (mat)->_24); \
240 TRACE(ddraw, "%f %f %f %f\n", (mat)->_31, (mat)->_32, (mat)->_33, (mat)->_34); \
241 TRACE(ddraw, "%f %f %f %f\n", (mat)->_41, (mat)->_42, (mat)->_43, (mat)->_44); \
242 (gl_mat)[ 0] = (mat)->_11; \
243 (gl_mat)[ 1] = (mat)->_21; \
244 (gl_mat)[ 2] = (mat)->_31; \
245 (gl_mat)[ 3] = (mat)->_41; \
246 (gl_mat)[ 4] = (mat)->_12; \
247 (gl_mat)[ 5] = (mat)->_22; \
248 (gl_mat)[ 6] = (mat)->_32; \
249 (gl_mat)[ 7] = (mat)->_42; \
250 (gl_mat)[ 8] = (mat)->_13; \
251 (gl_mat)[ 9] = (mat)->_23; \
252 (gl_mat)[10] = (mat)->_33; \
253 (gl_mat)[11] = (mat)->_43; \
254 (gl_mat)[12] = (mat)->_14; \
255 (gl_mat)[13] = (mat)->_24; \
256 (gl_mat)[14] = (mat)->_34; \
257 (gl_mat)[15] = (mat)->_44; \
260 /* Matrix copy WITHOUT transposition */
261 #define conv_mat(mat,gl_mat) \
263 TRACE(ddraw, "%f %f %f %f\n", (mat)->_11, (mat)->_12, (mat)->_13, (mat)->_14); \
264 TRACE(ddraw, "%f %f %f %f\n", (mat)->_21, (mat)->_22, (mat)->_23, (mat)->_24); \
265 TRACE(ddraw, "%f %f %f %f\n", (mat)->_31, (mat)->_32, (mat)->_33, (mat)->_34); \
266 TRACE(ddraw, "%f %f %f %f\n", (mat)->_41, (mat)->_42, (mat)->_43, (mat)->_44); \
267 memcpy(gl_mat, (mat), 16 * sizeof(float)); \
270 #define dump_mat(mat) \
271 TRACE(ddraw, "%f %f %f %f\n", (mat)->_11, (mat)->_12, (mat)->_13, (mat)->_14); \
272 TRACE(ddraw, "%f %f %f %f\n", (mat)->_21, (mat)->_22, (mat)->_23, (mat)->_24); \
273 TRACE(ddraw, "%f %f %f %f\n", (mat)->_31, (mat)->_32, (mat)->_33, (mat)->_34); \
274 TRACE(ddraw, "%f %f %f %f\n", (mat)->_41, (mat)->_42, (mat)->_43, (mat)->_44);
276 typedef struct render_state {
277 /* This is used for the device mode */
278 GLenum src, dst;
279 /* This is used for textures */
280 GLenum mag, min;
281 } RenderState;
283 typedef struct OpenGL_IDirect3DDevice2 {
284 IDirect3DDevice2Impl common;
286 /* These are the OpenGL-specific variables */
287 OSMesaContext ctx;
288 unsigned char *buffer;
290 /* The current render state */
291 RenderState rs;
293 /* The last type of vertex drawn */
294 D3DVERTEXTYPE vt;
296 float world_mat[16];
297 float view_mat[16];
298 float proj_mat[16];
299 } OpenGL_IDirect3DDevice2;
301 typedef struct OpenGL_IDirect3DDevice {
302 IDirect3DDeviceImpl common;
304 /* These are the OpenGL-specific variables */
305 OSMesaContext ctx;
306 unsigned char *buffer;
308 /* The current render state */
309 RenderState rs;
311 D3DMATRIX *world_mat;
312 D3DMATRIX *view_mat;
313 D3DMATRIX *proj_mat;
314 } OpenGL_IDirect3DDevice;
316 #define _dump_colorvalue(s,v) \
317 TRACE(ddraw, " " s " : %f %f %f %f\n", \
318 (v).r.r, (v).g.g, (v).b.b, (v).a.a);
320 /* Common functions defined in d3dcommon.c */
321 void set_render_state(D3DRENDERSTATETYPE dwRenderStateType,
322 DWORD dwRenderState, RenderState *rs) ;
324 #endif /* HAVE_MESAGL */
326 /* All non-static functions 'exported' by various sub-objects */
327 extern LPDIRECT3DTEXTURE2 d3dtexture2_create(IDirectDrawSurface4Impl* surf);
328 extern LPDIRECT3DTEXTURE d3dtexture_create(IDirectDrawSurface4Impl* surf);
330 extern LPDIRECT3DLIGHT d3dlight_create_dx3(IDirect3DImpl* d3d1);
331 extern LPDIRECT3DLIGHT d3dlight_create(IDirect3D2Impl* d3d2);
333 extern LPDIRECT3DEXECUTEBUFFER d3dexecutebuffer_create(IDirect3DDeviceImpl* d3ddev, LPD3DEXECUTEBUFFERDESC lpDesc);
335 extern LPDIRECT3DMATERIAL d3dmaterial_create(IDirect3DImpl* d3d1);
336 extern LPDIRECT3DMATERIAL2 d3dmaterial2_create(IDirect3D2Impl* d3d2);
338 extern LPDIRECT3DVIEWPORT d3dviewport_create(IDirect3DImpl* d3d1);
339 extern LPDIRECT3DVIEWPORT2 d3dviewport2_create(IDirect3D2Impl* d3d2);
341 extern int is_OpenGL_dx3(REFCLSID rguid, IDirectDrawSurfaceImpl* surface, IDirect3DDeviceImpl** device);
342 extern int d3d_OpenGL_dx3(LPD3DENUMDEVICESCALLBACK cb, LPVOID context) ;
343 extern int d3d_OpenGL(LPD3DENUMDEVICESCALLBACK cb, LPVOID context) ;
344 extern int is_OpenGL(REFCLSID rguid, IDirectDrawSurfaceImpl* surface, IDirect3DDevice2Impl** device, IDirect3D2Impl* d3d);
347 #endif /* __GRAPHICS_WINE_D3D_PRIVATE_H */