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
34 #include "ddraw_private.h"
35 #include "mesa_private.h"
37 #include "wine/debug.h"
39 WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
41 /*******************************************************************************
44 static HRESULT WINAPI MESA_IDirect3DImpl_QueryInterface(
45 LPDIRECT3D iface,REFIID refiid,LPVOID *obj
47 ICOM_THIS(IDirect3DImpl,iface);
48 /* FIXME: Not sure if this is correct */
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 ) )
56 IDirect3D_AddRef(iface);
57 TRACE(" Creating IDirectDrawX interface (%p)\n", *obj);
60 if (( IsEqualGUID( &IID_IDirect3D, refiid ) ) ||
61 ( IsEqualGUID( &IID_IUnknown, refiid ) ) ) {
63 IDirect3D_AddRef(iface);
64 TRACE(" Creating IDirect3D interface (%p)\n", *obj);
67 if ( IsEqualGUID( &IID_IDirect3D2, refiid ) ) {
70 d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
72 d3d->ddraw = This->ddraw;
73 IDirect3D_AddRef(iface);
74 ICOM_VTBL(d3d) = &mesa_d3d2vt;
76 TRACE(" Creating IDirect3D2 interface (%p)\n", *obj);
79 FIXME("(%p):interface for IID %s NOT found!\n",This,debugstr_guid(refiid));
80 return OLE_E_ENUM_NOMORE;
83 static ULONG WINAPI MESA_IDirect3DImpl_Release(LPDIRECT3D iface)
85 ICOM_THIS(IDirect3DImpl,iface);
86 TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
89 IDirectDraw2_Release((IDirectDraw2*)This->ddraw);
90 HeapFree(GetProcessHeap(),0,This);
96 static HRESULT WINAPI MESA_IDirect3DImpl_EnumDevices(
97 LPDIRECT3D iface, LPD3DENUMDEVICESCALLBACK cb, LPVOID context
99 ICOM_THIS(IDirect3DImpl,iface);
100 FIXME("(%p)->(%p,%p),stub!\n",This,cb,context);
102 /* Call functions defined in d3ddevices.c */
103 if (!d3d_OpenGL_dx3(cb, context))
109 static HRESULT WINAPI MESA_IDirect3DImpl_CreateLight(
110 LPDIRECT3D iface, LPDIRECT3DLIGHT *lplight, IUnknown *lpunk
112 ICOM_THIS(IDirect3DImpl,iface);
113 TRACE("(%p)->(%p,%p): stub\n", This, lplight, lpunk);
115 /* Call the creation function that is located in d3dlight.c */
116 *lplight = d3dlight_create_dx3(This);
121 static HRESULT WINAPI MESA_IDirect3DImpl_CreateMaterial(
122 LPDIRECT3D iface, LPDIRECT3DMATERIAL *lpmaterial, IUnknown *lpunk
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);
131 static HRESULT WINAPI MESA_IDirect3DImpl_CreateViewport(
132 LPDIRECT3D iface, LPDIRECT3DVIEWPORT *lpviewport, IUnknown *lpunk
134 ICOM_THIS(IDirect3DImpl,iface);
135 TRACE("(%p)->(%p,%p): stub\n", This, lpviewport, lpunk);
137 /* Call the creation function that is located in d3dviewport.c */
138 *lpviewport = d3dviewport_create(This);
143 static HRESULT WINAPI MESA_IDirect3DImpl_FindDevice(
144 LPDIRECT3D iface, LPD3DFINDDEVICESEARCH lpfinddevsrc,
145 LPD3DFINDDEVICERESULT lpfinddevrst)
147 ICOM_THIS(IDirect3DImpl,iface);
148 FIXME("(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst);
153 ICOM_VTABLE(IDirect3D) mesa_d3dvt =
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
167 /*******************************************************************************
170 static HRESULT WINAPI MESA_IDirect3D2Impl_QueryInterface(
171 LPDIRECT3D2 iface,REFIID refiid,LPVOID *obj) {
172 ICOM_THIS(IDirect3D2Impl,iface);
174 /* FIXME: Not sure if this is correct */
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 ) ) ) {
181 IDirect3D2_AddRef(iface);
183 TRACE(" Creating IDirectDrawX interface (%p)\n", *obj);
187 if ( ( IsEqualGUID( &IID_IDirect3D2, refiid ) ) ||
188 ( IsEqualGUID( &IID_IUnknown, refiid ) ) ) {
190 IDirect3D2_AddRef(iface);
192 TRACE(" Creating IDirect3D2 interface (%p)\n", *obj);
196 if ( IsEqualGUID( &IID_IDirect3D, refiid ) ) {
199 d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
201 d3d->ddraw = This->ddraw;
202 IDirect3D2_AddRef(iface);
203 ICOM_VTBL(d3d) = &mesa_d3dvt;
205 TRACE(" Creating IDirect3D interface (%p)\n", *obj);
208 FIXME("(%p):interface for IID %s NOT found!\n",This,debugstr_guid(refiid));
209 return OLE_E_ENUM_NOMORE;
212 static ULONG WINAPI MESA_IDirect3D2Impl_Release(LPDIRECT3D2 iface) {
213 ICOM_THIS(IDirect3D2Impl,iface);
214 TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
216 if (!--(This->ref)) {
217 IDirectDraw2_Release((IDirectDraw2*)This->ddraw);
218 HeapFree(GetProcessHeap(),0,This);
224 static HRESULT WINAPI MESA_IDirect3D2Impl_EnumDevices(
225 LPDIRECT3D2 iface,LPD3DENUMDEVICESCALLBACK cb, LPVOID context
227 ICOM_THIS(IDirect3D2Impl,iface);
228 FIXME("(%p)->(%p,%p),stub!\n",This,cb,context);
230 /* Call functions defined in d3ddevices.c */
231 if (!d3d_OpenGL(cb, context))
236 static HRESULT WINAPI MESA_IDirect3D2Impl_CreateLight(
237 LPDIRECT3D2 iface, LPDIRECT3DLIGHT *lplight, IUnknown *lpunk
239 ICOM_THIS(IDirect3D2Impl,iface);
240 TRACE("(%p)->(%p,%p): stub\n", This, lplight, lpunk);
242 /* Call the creation function that is located in d3dlight.c */
243 *lplight = d3dlight_create(This);
248 static HRESULT WINAPI MESA_IDirect3D2Impl_CreateMaterial(
249 LPDIRECT3D2 iface, LPDIRECT3DMATERIAL2 *lpmaterial, IUnknown *lpunk
251 ICOM_THIS(IDirect3D2Impl,iface);
252 TRACE("(%p)->(%p,%p): stub\n", This, lpmaterial, lpunk);
254 /* Call the creation function that is located in d3dviewport.c */
255 *lpmaterial = d3dmaterial2_create(This);
260 static HRESULT WINAPI MESA_IDirect3D2Impl_CreateViewport(
261 LPDIRECT3D2 iface, LPDIRECT3DVIEWPORT2 *lpviewport, IUnknown *lpunk
263 ICOM_THIS(IDirect3D2Impl,iface);
264 TRACE("(%p)->(%p,%p): stub\n", This, lpviewport, lpunk);
266 /* Call the creation function that is located in d3dviewport.c */
267 *lpviewport = d3dviewport2_create(This);
272 static HRESULT WINAPI MESA_IDirect3D2Impl_FindDevice(
273 LPDIRECT3D2 iface, LPD3DFINDDEVICESEARCH lpfinddevsrc,
274 LPD3DFINDDEVICERESULT lpfinddevrst)
276 ICOM_THIS(IDirect3D2Impl,iface);
277 FIXME("(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst);
281 static HRESULT WINAPI MESA_IDirect3D2Impl_CreateDevice(
282 LPDIRECT3D2 iface, REFCLSID rguid, LPDIRECTDRAWSURFACE surface,
283 LPDIRECT3DDEVICE2 *device)
285 ICOM_THIS(IDirect3D2Impl,iface);
287 FIXME("(%p)->(%s,%p,%p): stub\n",This,debugstr_guid(rguid),surface,device);
289 if (is_OpenGL(rguid, (IDirectDrawSurfaceImpl*)surface, (IDirect3DDevice2Impl**)device, This)) {
290 IDirect3D2_AddRef(iface);
294 return DDERR_INVALIDPARAMS;
297 ICOM_VTABLE(IDirect3D2) mesa_d3d2vt =
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
311 static HRESULT WINAPI MESA_IDirect3D3Impl_CreateVertexBuffer(
313 LPD3DVERTEXBUFFERDESC lpD3DVertBufDesc,
314 LPDIRECT3DVERTEXBUFFER* lplpD3DVertBuf,
322 static HRESULT WINAPI MESA_IDirect3D3Impl_EnumZBufferFormats(
325 LPD3DENUMPIXELFORMATSCALLBACK lpEnumCallback,
329 return DDERR_NOZBUFFERHW; /* Pretend we don't have valid HW */
332 static HRESULT WINAPI MESA_IDirect3D3Impl_EvictManagedTextures(
340 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
341 # define XCAST(fun) (typeof(mesa_d3d3vt.fun))
343 # define XCAST(fun) (void*)
346 ICOM_VTABLE(IDirect3D3) mesa_d3d3vt =
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
363 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
367 HRESULT create_direct3d(LPVOID *obj,IDirectDrawImpl* ddraw) {
370 d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
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);
382 HRESULT create_direct3d2(LPVOID *obj,IDirectDrawImpl* ddraw) {
385 d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
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);
397 HRESULT create_direct3d3(LPVOID *obj,IDirectDrawImpl* ddraw) {
400 d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
402 d3d->ddraw = (IDirectDrawImpl *) ddraw;
403 d3d->private = NULL; /* unused for now */
405 IDirectDraw_AddRef((LPDIRECTDRAW)ddraw);
406 ICOM_VTBL(d3d) = &mesa_d3d3vt;
407 *obj = (LPUNKNOWN)d3d;
409 TRACE(" Creating IDirect3D3 interface (%p)\n", *obj);