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