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