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