Added mappings for a few messages.
[wine] / dlls / ddraw / direct3d / mesa.c
1 #include "config.h"
2
3 #include <assert.h>
4 #include <unistd.h>
5 #include <fcntl.h>
6 #include <string.h>
7 #include <stdio.h>
8
9 #include "d3d.h"
10 #include "ddraw.h"
11 #include "winerror.h"
12
13 #include "ddraw_private.h"
14 #include "mesa_private.h"
15
16 #include "debugtools.h"
17
18 DEFAULT_DEBUG_CHANNEL(ddraw);
19
20 /*******************************************************************************
21  *                              IDirect3D
22  */
23 static HRESULT WINAPI MESA_IDirect3DImpl_QueryInterface(
24     LPDIRECT3D iface,REFIID refiid,LPVOID *obj
25 ) {
26     ICOM_THIS(IDirect3DImpl,iface);
27     /* FIXME: Not sure if this is correct */
28
29     TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj);
30     if (( IsEqualGUID( &IID_IDirectDraw,  refiid ) ) ||
31         ( IsEqualGUID (&IID_IDirectDraw2, refiid ) ) ||
32         ( IsEqualGUID( &IID_IDirectDraw4, refiid ) )
33     ) {
34         *obj = This->ddraw;
35         IDirect3D_AddRef(iface);
36         TRACE("  Creating IDirectDrawX interface (%p)\n", *obj);
37         return S_OK;
38     }
39     if (( IsEqualGUID( &IID_IDirect3D, refiid ) ) ||
40         ( IsEqualGUID( &IID_IUnknown,  refiid ) ) ) {
41         *obj = This;
42         IDirect3D_AddRef(iface);
43         TRACE("  Creating IDirect3D interface (%p)\n", *obj);
44         return S_OK;
45     }
46     if ( IsEqualGUID( &IID_IDirect3D2, refiid ) ) {
47         IDirect3D2Impl*  d3d;
48
49         d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
50         d3d->ref = 1;
51         d3d->ddraw = This->ddraw;
52         IDirect3D_AddRef(iface);
53         ICOM_VTBL(d3d) = &mesa_d3d2vt;
54         *obj = d3d;
55         TRACE("  Creating IDirect3D2 interface (%p)\n", *obj);
56         return S_OK;
57     }
58     FIXME("(%p):interface for IID %s NOT found!\n",This,debugstr_guid(refiid));
59     return OLE_E_ENUM_NOMORE;
60 }
61
62 static ULONG WINAPI MESA_IDirect3DImpl_Release(LPDIRECT3D iface)
63 {
64     ICOM_THIS(IDirect3DImpl,iface);
65     TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
66
67     if (!--(This->ref)) {
68         IDirectDraw2_Release((IDirectDraw2*)This->ddraw);
69         HeapFree(GetProcessHeap(),0,This);
70         return S_OK;
71     }
72     return This->ref;
73 }
74
75 static HRESULT WINAPI MESA_IDirect3DImpl_EnumDevices(
76     LPDIRECT3D iface, LPD3DENUMDEVICESCALLBACK cb, LPVOID context
77 ) {
78     ICOM_THIS(IDirect3DImpl,iface);
79     FIXME("(%p)->(%p,%p),stub!\n",This,cb,context);
80
81     /* Call functions defined in d3ddevices.c */
82     if (!d3d_OpenGL_dx3(cb, context))
83         return D3D_OK;
84
85     return D3D_OK;
86 }
87
88 static HRESULT WINAPI MESA_IDirect3DImpl_CreateLight(
89     LPDIRECT3D iface, LPDIRECT3DLIGHT *lplight, IUnknown *lpunk
90 ) {
91     ICOM_THIS(IDirect3DImpl,iface);
92     TRACE("(%p)->(%p,%p): stub\n", This, lplight, lpunk);
93
94     /* Call the creation function that is located in d3dlight.c */
95     *lplight = d3dlight_create_dx3(This);
96
97     return D3D_OK;
98 }
99
100 static HRESULT WINAPI MESA_IDirect3DImpl_CreateMaterial(
101     LPDIRECT3D iface, LPDIRECT3DMATERIAL *lpmaterial, IUnknown *lpunk
102 ) {
103     ICOM_THIS(IDirect3DImpl,iface);
104     TRACE("(%p)->(%p,%p): stub\n", This, lpmaterial, lpunk);
105     /* Call the creation function that is located in d3dviewport.c */
106     *lpmaterial = d3dmaterial_create(This);
107     return D3D_OK;
108 }
109
110 static HRESULT WINAPI MESA_IDirect3DImpl_CreateViewport(
111     LPDIRECT3D iface, LPDIRECT3DVIEWPORT *lpviewport, IUnknown *lpunk
112 ) {
113     ICOM_THIS(IDirect3DImpl,iface);
114     TRACE("(%p)->(%p,%p): stub\n", This, lpviewport, lpunk);
115
116     /* Call the creation function that is located in d3dviewport.c */
117     *lpviewport = d3dviewport_create(This);
118
119     return D3D_OK;
120 }
121
122 static HRESULT WINAPI MESA_IDirect3DImpl_FindDevice(
123     LPDIRECT3D iface, LPD3DFINDDEVICESEARCH lpfinddevsrc,
124     LPD3DFINDDEVICERESULT lpfinddevrst)
125 {
126     ICOM_THIS(IDirect3DImpl,iface);
127     FIXME("(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst);
128
129     return D3D_OK;
130 }
131
132 ICOM_VTABLE(IDirect3D) mesa_d3dvt = 
133 {
134     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
135     MESA_IDirect3DImpl_QueryInterface,
136     IDirect3DImpl_AddRef,
137     MESA_IDirect3DImpl_Release,
138     IDirect3DImpl_Initialize,
139     MESA_IDirect3DImpl_EnumDevices,
140     MESA_IDirect3DImpl_CreateLight,
141     MESA_IDirect3DImpl_CreateMaterial,
142     MESA_IDirect3DImpl_CreateViewport,
143     MESA_IDirect3DImpl_FindDevice
144 };
145
146 /*******************************************************************************
147  *                              IDirect3D2
148  */
149 static HRESULT WINAPI MESA_IDirect3D2Impl_QueryInterface(
150     LPDIRECT3D2 iface,REFIID refiid,LPVOID *obj) {  
151     ICOM_THIS(IDirect3D2Impl,iface);
152
153     /* FIXME: Not sure if this is correct */
154
155     TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj);
156     if ( ( IsEqualGUID( &IID_IDirectDraw,  refiid ) ) ||
157          ( IsEqualGUID( &IID_IDirectDraw2, refiid ) ) ||
158          ( IsEqualGUID( &IID_IDirectDraw4, refiid ) ) ) {
159         *obj = This->ddraw;
160         IDirect3D2_AddRef(iface);
161
162         TRACE("  Creating IDirectDrawX interface (%p)\n", *obj);
163         
164         return S_OK;
165     }
166     if ( ( IsEqualGUID( &IID_IDirect3D2, refiid ) ) ||
167          ( IsEqualGUID( &IID_IUnknown,   refiid ) ) ) {
168         *obj = This;
169         IDirect3D2_AddRef(iface);
170
171         TRACE("  Creating IDirect3D2 interface (%p)\n", *obj);
172
173         return S_OK;
174     }
175     if ( IsEqualGUID( &IID_IDirect3D, refiid ) ) {
176         IDirect3DImpl*  d3d;
177
178         d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
179         d3d->ref = 1;
180         d3d->ddraw = This->ddraw;
181         IDirect3D2_AddRef(iface);
182         ICOM_VTBL(d3d) = &mesa_d3dvt;
183         *obj = d3d;
184         TRACE("  Creating IDirect3D interface (%p)\n", *obj);
185         return S_OK;
186     }
187     FIXME("(%p):interface for IID %s NOT found!\n",This,debugstr_guid(refiid));
188     return OLE_E_ENUM_NOMORE;
189 }
190
191 static ULONG WINAPI MESA_IDirect3D2Impl_Release(LPDIRECT3D2 iface) {
192     ICOM_THIS(IDirect3D2Impl,iface);
193     TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
194
195     if (!--(This->ref)) {
196         IDirectDraw2_Release((IDirectDraw2*)This->ddraw);
197         HeapFree(GetProcessHeap(),0,This);
198         return S_OK;
199     }
200     return This->ref;
201 }
202
203 static HRESULT WINAPI MESA_IDirect3D2Impl_EnumDevices(
204     LPDIRECT3D2 iface,LPD3DENUMDEVICESCALLBACK cb, LPVOID context
205 ) {
206     ICOM_THIS(IDirect3D2Impl,iface);
207     FIXME("(%p)->(%p,%p),stub!\n",This,cb,context);
208
209     /* Call functions defined in d3ddevices.c */
210     if (!d3d_OpenGL(cb, context))
211         return D3D_OK;
212     return D3D_OK;
213 }
214
215 static HRESULT WINAPI MESA_IDirect3D2Impl_CreateLight(
216     LPDIRECT3D2 iface, LPDIRECT3DLIGHT *lplight, IUnknown *lpunk
217 ) {
218     ICOM_THIS(IDirect3D2Impl,iface);
219     TRACE("(%p)->(%p,%p): stub\n", This, lplight, lpunk);
220
221     /* Call the creation function that is located in d3dlight.c */
222     *lplight = d3dlight_create(This);
223
224     return D3D_OK;
225 }
226
227 static HRESULT WINAPI MESA_IDirect3D2Impl_CreateMaterial(
228     LPDIRECT3D2 iface, LPDIRECT3DMATERIAL2 *lpmaterial, IUnknown *lpunk
229 ) {
230     ICOM_THIS(IDirect3D2Impl,iface);
231     TRACE("(%p)->(%p,%p): stub\n", This, lpmaterial, lpunk);
232
233     /* Call the creation function that is located in d3dviewport.c */
234     *lpmaterial = d3dmaterial2_create(This);
235
236     return D3D_OK;
237 }
238
239 static HRESULT WINAPI MESA_IDirect3D2Impl_CreateViewport(
240     LPDIRECT3D2 iface, LPDIRECT3DVIEWPORT2 *lpviewport, IUnknown *lpunk
241 ) {
242     ICOM_THIS(IDirect3D2Impl,iface);
243     TRACE("(%p)->(%p,%p): stub\n", This, lpviewport, lpunk);
244
245     /* Call the creation function that is located in d3dviewport.c */
246     *lpviewport = d3dviewport2_create(This);
247
248     return D3D_OK;
249 }
250
251 static HRESULT WINAPI MESA_IDirect3D2Impl_FindDevice(
252     LPDIRECT3D2 iface, LPD3DFINDDEVICESEARCH lpfinddevsrc,
253     LPD3DFINDDEVICERESULT lpfinddevrst)
254 {
255     ICOM_THIS(IDirect3D2Impl,iface);
256     FIXME("(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst);
257     return D3D_OK;
258 }
259
260 static HRESULT WINAPI MESA_IDirect3D2Impl_CreateDevice(
261     LPDIRECT3D2 iface, REFCLSID rguid, LPDIRECTDRAWSURFACE surface,
262     LPDIRECT3DDEVICE2 *device)
263 {
264     ICOM_THIS(IDirect3D2Impl,iface);
265
266     FIXME("(%p)->(%s,%p,%p): stub\n",This,debugstr_guid(rguid),surface,device);
267
268     if (is_OpenGL(rguid, (IDirectDrawSurfaceImpl*)surface, (IDirect3DDevice2Impl**)device, This)) {
269         IDirect3D2_AddRef(iface);
270         return D3D_OK;
271     }
272
273     return DDERR_INVALIDPARAMS;
274 }
275
276 ICOM_VTABLE(IDirect3D2) mesa_d3d2vt = 
277 {
278     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
279     MESA_IDirect3D2Impl_QueryInterface,
280     IDirect3D2Impl_AddRef,
281     MESA_IDirect3D2Impl_Release,
282     MESA_IDirect3D2Impl_EnumDevices,
283     MESA_IDirect3D2Impl_CreateLight,
284     MESA_IDirect3D2Impl_CreateMaterial,
285     MESA_IDirect3D2Impl_CreateViewport,
286     MESA_IDirect3D2Impl_FindDevice,
287     MESA_IDirect3D2Impl_CreateDevice
288 };
289
290 static HRESULT WINAPI MESA_IDirect3D3Impl_CreateVertexBuffer(
291     LPDIRECT3D3 iface,
292     LPD3DVERTEXBUFFERDESC lpD3DVertBufDesc,
293     LPDIRECT3DVERTEXBUFFER* lplpD3DVertBuf,
294     DWORD dwFlags,
295     LPUNKNOWN lpUnk)
296 {
297   FIXME(":stub\n");
298   return D3D_OK;
299 }
300
301 static HRESULT WINAPI MESA_IDirect3D3Impl_EnumZBufferFormats(
302     LPDIRECT3D3 iface,
303     REFCLSID riidDevice,
304     LPD3DENUMPIXELFORMATSCALLBACK lpEnumCallback,
305     LPVOID lpContext)
306 {
307   FIXME(":stub\n");
308   return DDERR_NOZBUFFERHW; /* Pretend we don't have valid HW */
309 }
310
311 static HRESULT WINAPI MESA_IDirect3D3Impl_EvictManagedTextures(
312     LPDIRECT3D3 iface)
313 {
314   FIXME(":stub\n");
315   return D3D_OK;
316 }
317
318
319 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
320 # define XCAST(fun)     (typeof(mesa_d3d3vt.fun))
321 #else
322 # define XCAST(fun)     (void*)
323 #endif
324
325 ICOM_VTABLE(IDirect3D3) mesa_d3d3vt =
326 {
327     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
328     XCAST(QueryInterface)MESA_IDirect3D2Impl_QueryInterface,
329     XCAST(AddRef)IDirect3D2Impl_AddRef,
330     XCAST(Release)MESA_IDirect3D2Impl_Release,
331     XCAST(EnumDevices)MESA_IDirect3D2Impl_EnumDevices,
332     XCAST(CreateLight)MESA_IDirect3D2Impl_CreateLight,
333     XCAST(CreateMaterial)MESA_IDirect3D2Impl_CreateMaterial,
334     XCAST(CreateViewport)MESA_IDirect3D2Impl_CreateViewport,
335     XCAST(FindDevice)MESA_IDirect3D2Impl_FindDevice,
336     XCAST(CreateDevice)MESA_IDirect3D2Impl_CreateDevice,
337     XCAST(CreateVertexBuffer)MESA_IDirect3D3Impl_CreateVertexBuffer,
338     XCAST(EnumZBufferFormats)MESA_IDirect3D3Impl_EnumZBufferFormats,
339     XCAST(EvictManagedTextures)MESA_IDirect3D3Impl_EvictManagedTextures
340 };
341
342 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
343 #undef XCAST
344 #endif
345
346 HRESULT create_direct3d(LPVOID *obj,IDirectDrawImpl* ddraw) {
347     IDirect3DImpl* d3d;
348
349     d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
350     d3d->ref = 1;
351     d3d->ddraw = (IDirectDrawImpl *) ddraw;
352     d3d->private = NULL; /* unused for now */
353     IDirectDraw_AddRef((LPDIRECTDRAW)ddraw);
354     ICOM_VTBL(d3d) = &mesa_d3dvt;
355     *obj = (LPUNKNOWN)d3d;
356     TRACE("  Created IDirect3D interface (%p)\n", *obj);
357
358     return S_OK;
359 }
360
361 HRESULT create_direct3d2(LPVOID *obj,IDirectDrawImpl* ddraw) {
362     IDirect3D2Impl* d3d;
363
364     d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
365     d3d->ref = 1;
366     d3d->ddraw = (IDirectDrawImpl *) ddraw;
367     d3d->private = NULL; /* unused for now */
368     IDirectDraw_AddRef((LPDIRECTDRAW)ddraw);
369     ICOM_VTBL(d3d) = &mesa_d3d2vt;
370     *obj = (LPUNKNOWN)d3d;
371     TRACE("  Creating IDirect3D2 interface (%p)\n", *obj);
372
373     return S_OK;
374 }
375
376 HRESULT create_direct3d3(LPVOID *obj,IDirectDrawImpl* ddraw) {
377     IDirect3D3Impl* d3d;
378
379     d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
380     d3d->ref = 1;
381     d3d->ddraw = (IDirectDrawImpl *) ddraw;
382     d3d->private = NULL; /* unused for now */
383
384     IDirectDraw_AddRef((LPDIRECTDRAW)ddraw);
385     ICOM_VTBL(d3d) = &mesa_d3d3vt;
386     *obj = (LPUNKNOWN)d3d;
387
388     TRACE("  Creating IDirect3D3 interface (%p)\n", *obj);
389     
390     return S_OK;
391 }
392