2 * Copyright 2000 Marcus Meissner
3 * Copyright 2000 Peter Hunnisett
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.
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.
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
32 #include "ddraw_private.h"
33 #include "mesa_private.h"
35 #include "wine/debug.h"
37 WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
39 /*******************************************************************************
42 static HRESULT WINAPI MESA_IDirect3DImpl_QueryInterface(
43 LPDIRECT3D iface,REFIID refiid,LPVOID *obj
45 ICOM_THIS(IDirect3DImpl,iface);
46 /* FIXME: Not sure if this is correct */
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 ) )
54 IDirect3D_AddRef(iface);
55 TRACE(" Creating IDirectDrawX interface (%p)\n", *obj);
58 if (( IsEqualGUID( &IID_IDirect3D, refiid ) ) ||
59 ( IsEqualGUID( &IID_IUnknown, refiid ) ) ) {
61 IDirect3D_AddRef(iface);
62 TRACE(" Creating IDirect3D interface (%p)\n", *obj);
65 if ( IsEqualGUID( &IID_IDirect3D2, refiid ) ) {
68 d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
70 d3d->ddraw = This->ddraw;
71 IDirect3D_AddRef(iface);
72 ICOM_VTBL(d3d) = &mesa_d3d2vt;
74 TRACE(" Creating IDirect3D2 interface (%p)\n", *obj);
77 FIXME("(%p):interface for IID %s NOT found!\n",This,debugstr_guid(refiid));
78 return OLE_E_ENUM_NOMORE;
81 static ULONG WINAPI MESA_IDirect3DImpl_Release(LPDIRECT3D iface)
83 ICOM_THIS(IDirect3DImpl,iface);
84 TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
87 IDirectDraw2_Release((IDirectDraw2*)This->ddraw);
88 HeapFree(GetProcessHeap(),0,This);
94 static HRESULT WINAPI MESA_IDirect3DImpl_EnumDevices(
95 LPDIRECT3D iface, LPD3DENUMDEVICESCALLBACK cb, LPVOID context
97 ICOM_THIS(IDirect3DImpl,iface);
98 FIXME("(%p)->(%p,%p),stub!\n",This,cb,context);
100 /* Call functions defined in d3ddevices.c */
101 if (!d3d_OpenGL_dx3(cb, context))
107 static HRESULT WINAPI MESA_IDirect3DImpl_CreateLight(
108 LPDIRECT3D iface, LPDIRECT3DLIGHT *lplight, IUnknown *lpunk
110 ICOM_THIS(IDirect3DImpl,iface);
111 TRACE("(%p)->(%p,%p): stub\n", This, lplight, lpunk);
113 /* Call the creation function that is located in d3dlight.c */
114 *lplight = d3dlight_create_dx3(This);
119 static HRESULT WINAPI MESA_IDirect3DImpl_CreateMaterial(
120 LPDIRECT3D iface, LPDIRECT3DMATERIAL *lpmaterial, IUnknown *lpunk
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);
129 static HRESULT WINAPI MESA_IDirect3DImpl_CreateViewport(
130 LPDIRECT3D iface, LPDIRECT3DVIEWPORT *lpviewport, IUnknown *lpunk
132 ICOM_THIS(IDirect3DImpl,iface);
133 TRACE("(%p)->(%p,%p): stub\n", This, lpviewport, lpunk);
135 /* Call the creation function that is located in d3dviewport.c */
136 *lpviewport = d3dviewport_create(This);
141 static HRESULT WINAPI MESA_IDirect3DImpl_FindDevice(
142 LPDIRECT3D iface, LPD3DFINDDEVICESEARCH lpfinddevsrc,
143 LPD3DFINDDEVICERESULT lpfinddevrst)
145 ICOM_THIS(IDirect3DImpl,iface);
146 FIXME("(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst);
151 ICOM_VTABLE(IDirect3D) mesa_d3dvt =
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
165 /*******************************************************************************
168 static HRESULT WINAPI MESA_IDirect3D2Impl_QueryInterface(
169 LPDIRECT3D2 iface,REFIID refiid,LPVOID *obj) {
170 ICOM_THIS(IDirect3D2Impl,iface);
172 /* FIXME: Not sure if this is correct */
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 ) ) ) {
179 IDirect3D2_AddRef(iface);
181 TRACE(" Creating IDirectDrawX interface (%p)\n", *obj);
185 if ( ( IsEqualGUID( &IID_IDirect3D2, refiid ) ) ||
186 ( IsEqualGUID( &IID_IUnknown, refiid ) ) ) {
188 IDirect3D2_AddRef(iface);
190 TRACE(" Creating IDirect3D2 interface (%p)\n", *obj);
194 if ( IsEqualGUID( &IID_IDirect3D, refiid ) ) {
197 d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
199 d3d->ddraw = This->ddraw;
200 IDirect3D2_AddRef(iface);
201 ICOM_VTBL(d3d) = &mesa_d3dvt;
203 TRACE(" Creating IDirect3D interface (%p)\n", *obj);
206 FIXME("(%p):interface for IID %s NOT found!\n",This,debugstr_guid(refiid));
207 return OLE_E_ENUM_NOMORE;
210 static ULONG WINAPI MESA_IDirect3D2Impl_Release(LPDIRECT3D2 iface) {
211 ICOM_THIS(IDirect3D2Impl,iface);
212 TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
214 if (!--(This->ref)) {
215 IDirectDraw2_Release((IDirectDraw2*)This->ddraw);
216 HeapFree(GetProcessHeap(),0,This);
222 static HRESULT WINAPI MESA_IDirect3D2Impl_EnumDevices(
223 LPDIRECT3D2 iface,LPD3DENUMDEVICESCALLBACK cb, LPVOID context
225 ICOM_THIS(IDirect3D2Impl,iface);
226 FIXME("(%p)->(%p,%p),stub!\n",This,cb,context);
228 /* Call functions defined in d3ddevices.c */
229 if (!d3d_OpenGL(cb, context))
234 static HRESULT WINAPI MESA_IDirect3D2Impl_CreateLight(
235 LPDIRECT3D2 iface, LPDIRECT3DLIGHT *lplight, IUnknown *lpunk
237 ICOM_THIS(IDirect3D2Impl,iface);
238 TRACE("(%p)->(%p,%p): stub\n", This, lplight, lpunk);
240 /* Call the creation function that is located in d3dlight.c */
241 *lplight = d3dlight_create(This);
246 static HRESULT WINAPI MESA_IDirect3D2Impl_CreateMaterial(
247 LPDIRECT3D2 iface, LPDIRECT3DMATERIAL2 *lpmaterial, IUnknown *lpunk
249 ICOM_THIS(IDirect3D2Impl,iface);
250 TRACE("(%p)->(%p,%p): stub\n", This, lpmaterial, lpunk);
252 /* Call the creation function that is located in d3dviewport.c */
253 *lpmaterial = d3dmaterial2_create(This);
258 static HRESULT WINAPI MESA_IDirect3D2Impl_CreateViewport(
259 LPDIRECT3D2 iface, LPDIRECT3DVIEWPORT2 *lpviewport, IUnknown *lpunk
261 ICOM_THIS(IDirect3D2Impl,iface);
262 TRACE("(%p)->(%p,%p): stub\n", This, lpviewport, lpunk);
264 /* Call the creation function that is located in d3dviewport.c */
265 *lpviewport = d3dviewport2_create(This);
270 static HRESULT WINAPI MESA_IDirect3D2Impl_FindDevice(
271 LPDIRECT3D2 iface, LPD3DFINDDEVICESEARCH lpfinddevsrc,
272 LPD3DFINDDEVICERESULT lpfinddevrst)
274 ICOM_THIS(IDirect3D2Impl,iface);
275 FIXME("(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst);
279 static HRESULT WINAPI MESA_IDirect3D2Impl_CreateDevice(
280 LPDIRECT3D2 iface, REFCLSID rguid, LPDIRECTDRAWSURFACE surface,
281 LPDIRECT3DDEVICE2 *device)
283 ICOM_THIS(IDirect3D2Impl,iface);
285 FIXME("(%p)->(%s,%p,%p): stub\n",This,debugstr_guid(rguid),surface,device);
287 if (is_OpenGL(rguid, (IDirectDrawSurfaceImpl*)surface, (IDirect3DDevice2Impl**)device, This)) {
288 IDirect3D2_AddRef(iface);
292 return DDERR_INVALIDPARAMS;
295 ICOM_VTABLE(IDirect3D2) mesa_d3d2vt =
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
309 static HRESULT WINAPI MESA_IDirect3D3Impl_CreateVertexBuffer(
311 LPD3DVERTEXBUFFERDESC lpD3DVertBufDesc,
312 LPDIRECT3DVERTEXBUFFER* lplpD3DVertBuf,
320 static HRESULT WINAPI MESA_IDirect3D3Impl_EnumZBufferFormats(
323 LPD3DENUMPIXELFORMATSCALLBACK lpEnumCallback,
327 return DDERR_NOZBUFFERHW; /* Pretend we don't have valid HW */
330 static HRESULT WINAPI MESA_IDirect3D3Impl_EvictManagedTextures(
338 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
339 # define XCAST(fun) (typeof(mesa_d3d3vt.fun))
341 # define XCAST(fun) (void*)
344 ICOM_VTABLE(IDirect3D3) mesa_d3d3vt =
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
361 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
365 HRESULT create_direct3d(LPVOID *obj,IDirectDrawImpl* ddraw) {
368 d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
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);
380 HRESULT create_direct3d2(LPVOID *obj,IDirectDrawImpl* ddraw) {
383 d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
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);
395 HRESULT create_direct3d3(LPVOID *obj,IDirectDrawImpl* ddraw) {
398 d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
400 d3d->ddraw = (IDirectDrawImpl *) ddraw;
401 d3d->private = NULL; /* unused for now */
403 IDirectDraw_AddRef((LPDIRECTDRAW)ddraw);
404 ICOM_VTBL(d3d) = &mesa_d3d3vt;
405 *obj = (LPUNKNOWN)d3d;
407 TRACE(" Creating IDirect3D3 interface (%p)\n", *obj);