13 #include "ddraw_private.h"
14 #include "mesa_private.h"
16 #include "debugtools.h"
18 DEFAULT_DEBUG_CHANNEL(ddraw);
20 /*******************************************************************************
23 static HRESULT WINAPI MESA_IDirect3DImpl_QueryInterface(
24 LPDIRECT3D iface,REFIID refiid,LPVOID *obj
26 ICOM_THIS(IDirect3DImpl,iface);
27 /* FIXME: Not sure if this is correct */
29 TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj);
30 if (( IsEqualGUID( &IID_IDirectDraw, refiid ) ) ||
31 ( IsEqualGUID (&IID_IDirectDraw2, refiid ) ) ||
32 ( IsEqualGUID( &IID_IDirectDraw4, refiid ) )
35 IDirect3D_AddRef(iface);
36 TRACE(" Creating IDirectDrawX interface (%p)\n", *obj);
39 if (( IsEqualGUID( &IID_IDirect3D, refiid ) ) ||
40 ( IsEqualGUID( &IID_IUnknown, refiid ) ) ) {
42 IDirect3D_AddRef(iface);
43 TRACE(" Creating IDirect3D interface (%p)\n", *obj);
46 if ( IsEqualGUID( &IID_IDirect3D2, refiid ) ) {
49 d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
51 d3d->ddraw = This->ddraw;
52 IDirect3D_AddRef(iface);
53 ICOM_VTBL(d3d) = &mesa_d3d2vt;
55 TRACE(" Creating IDirect3D2 interface (%p)\n", *obj);
58 FIXME("(%p):interface for IID %s NOT found!\n",This,debugstr_guid(refiid));
59 return OLE_E_ENUM_NOMORE;
62 static ULONG WINAPI MESA_IDirect3DImpl_Release(LPDIRECT3D iface)
64 ICOM_THIS(IDirect3DImpl,iface);
65 TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
68 IDirectDraw2_Release((IDirectDraw2*)This->ddraw);
69 HeapFree(GetProcessHeap(),0,This);
75 static HRESULT WINAPI MESA_IDirect3DImpl_EnumDevices(
76 LPDIRECT3D iface, LPD3DENUMDEVICESCALLBACK cb, LPVOID context
78 ICOM_THIS(IDirect3DImpl,iface);
79 FIXME("(%p)->(%p,%p),stub!\n",This,cb,context);
81 /* Call functions defined in d3ddevices.c */
82 if (!d3d_OpenGL_dx3(cb, context))
88 static HRESULT WINAPI MESA_IDirect3DImpl_CreateLight(
89 LPDIRECT3D iface, LPDIRECT3DLIGHT *lplight, IUnknown *lpunk
91 ICOM_THIS(IDirect3DImpl,iface);
92 TRACE("(%p)->(%p,%p): stub\n", This, lplight, lpunk);
94 /* Call the creation function that is located in d3dlight.c */
95 *lplight = d3dlight_create_dx3(This);
100 static HRESULT WINAPI MESA_IDirect3DImpl_CreateMaterial(
101 LPDIRECT3D iface, LPDIRECT3DMATERIAL *lpmaterial, IUnknown *lpunk
103 ICOM_THIS(IDirect3DImpl,iface);
104 TRACE("(%p)->(%p,%p): stub\n", This, lpmaterial, lpunk);
105 /* Call the creation function that is located in d3dviewport.c */
106 *lpmaterial = d3dmaterial_create(This);
110 static HRESULT WINAPI MESA_IDirect3DImpl_CreateViewport(
111 LPDIRECT3D iface, LPDIRECT3DVIEWPORT *lpviewport, IUnknown *lpunk
113 ICOM_THIS(IDirect3DImpl,iface);
114 TRACE("(%p)->(%p,%p): stub\n", This, lpviewport, lpunk);
116 /* Call the creation function that is located in d3dviewport.c */
117 *lpviewport = d3dviewport_create(This);
122 static HRESULT WINAPI MESA_IDirect3DImpl_FindDevice(
123 LPDIRECT3D iface, LPD3DFINDDEVICESEARCH lpfinddevsrc,
124 LPD3DFINDDEVICERESULT lpfinddevrst)
126 ICOM_THIS(IDirect3DImpl,iface);
127 FIXME("(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst);
132 ICOM_VTABLE(IDirect3D) mesa_d3dvt =
134 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
135 MESA_IDirect3DImpl_QueryInterface,
136 IDirect3DImpl_AddRef,
137 MESA_IDirect3DImpl_Release,
138 IDirect3DImpl_Initialize,
139 MESA_IDirect3DImpl_EnumDevices,
140 MESA_IDirect3DImpl_CreateLight,
141 MESA_IDirect3DImpl_CreateMaterial,
142 MESA_IDirect3DImpl_CreateViewport,
143 MESA_IDirect3DImpl_FindDevice
146 /*******************************************************************************
149 static HRESULT WINAPI MESA_IDirect3D2Impl_QueryInterface(
150 LPDIRECT3D2 iface,REFIID refiid,LPVOID *obj) {
151 ICOM_THIS(IDirect3D2Impl,iface);
153 /* FIXME: Not sure if this is correct */
155 TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj);
156 if ( ( IsEqualGUID( &IID_IDirectDraw, refiid ) ) ||
157 ( IsEqualGUID( &IID_IDirectDraw2, refiid ) ) ||
158 ( IsEqualGUID( &IID_IDirectDraw4, refiid ) ) ) {
160 IDirect3D2_AddRef(iface);
162 TRACE(" Creating IDirectDrawX interface (%p)\n", *obj);
166 if ( ( IsEqualGUID( &IID_IDirect3D2, refiid ) ) ||
167 ( IsEqualGUID( &IID_IUnknown, refiid ) ) ) {
169 IDirect3D2_AddRef(iface);
171 TRACE(" Creating IDirect3D2 interface (%p)\n", *obj);
175 if ( IsEqualGUID( &IID_IDirect3D, refiid ) ) {
178 d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
180 d3d->ddraw = This->ddraw;
181 IDirect3D2_AddRef(iface);
182 ICOM_VTBL(d3d) = &mesa_d3dvt;
184 TRACE(" Creating IDirect3D interface (%p)\n", *obj);
187 FIXME("(%p):interface for IID %s NOT found!\n",This,debugstr_guid(refiid));
188 return OLE_E_ENUM_NOMORE;
191 static ULONG WINAPI MESA_IDirect3D2Impl_Release(LPDIRECT3D2 iface) {
192 ICOM_THIS(IDirect3D2Impl,iface);
193 TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
195 if (!--(This->ref)) {
196 IDirectDraw2_Release((IDirectDraw2*)This->ddraw);
197 HeapFree(GetProcessHeap(),0,This);
203 static HRESULT WINAPI MESA_IDirect3D2Impl_EnumDevices(
204 LPDIRECT3D2 iface,LPD3DENUMDEVICESCALLBACK cb, LPVOID context
206 ICOM_THIS(IDirect3D2Impl,iface);
207 FIXME("(%p)->(%p,%p),stub!\n",This,cb,context);
209 /* Call functions defined in d3ddevices.c */
210 if (!d3d_OpenGL(cb, context))
215 static HRESULT WINAPI MESA_IDirect3D2Impl_CreateLight(
216 LPDIRECT3D2 iface, LPDIRECT3DLIGHT *lplight, IUnknown *lpunk
218 ICOM_THIS(IDirect3D2Impl,iface);
219 TRACE("(%p)->(%p,%p): stub\n", This, lplight, lpunk);
221 /* Call the creation function that is located in d3dlight.c */
222 *lplight = d3dlight_create(This);
227 static HRESULT WINAPI MESA_IDirect3D2Impl_CreateMaterial(
228 LPDIRECT3D2 iface, LPDIRECT3DMATERIAL2 *lpmaterial, IUnknown *lpunk
230 ICOM_THIS(IDirect3D2Impl,iface);
231 TRACE("(%p)->(%p,%p): stub\n", This, lpmaterial, lpunk);
233 /* Call the creation function that is located in d3dviewport.c */
234 *lpmaterial = d3dmaterial2_create(This);
239 static HRESULT WINAPI MESA_IDirect3D2Impl_CreateViewport(
240 LPDIRECT3D2 iface, LPDIRECT3DVIEWPORT2 *lpviewport, IUnknown *lpunk
242 ICOM_THIS(IDirect3D2Impl,iface);
243 TRACE("(%p)->(%p,%p): stub\n", This, lpviewport, lpunk);
245 /* Call the creation function that is located in d3dviewport.c */
246 *lpviewport = d3dviewport2_create(This);
251 static HRESULT WINAPI MESA_IDirect3D2Impl_FindDevice(
252 LPDIRECT3D2 iface, LPD3DFINDDEVICESEARCH lpfinddevsrc,
253 LPD3DFINDDEVICERESULT lpfinddevrst)
255 ICOM_THIS(IDirect3D2Impl,iface);
256 FIXME("(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst);
260 static HRESULT WINAPI MESA_IDirect3D2Impl_CreateDevice(
261 LPDIRECT3D2 iface, REFCLSID rguid, LPDIRECTDRAWSURFACE surface,
262 LPDIRECT3DDEVICE2 *device)
264 ICOM_THIS(IDirect3D2Impl,iface);
266 FIXME("(%p)->(%s,%p,%p): stub\n",This,debugstr_guid(rguid),surface,device);
268 if (is_OpenGL(rguid, (IDirectDrawSurfaceImpl*)surface, (IDirect3DDevice2Impl**)device, This)) {
269 IDirect3D2_AddRef(iface);
273 return DDERR_INVALIDPARAMS;
276 ICOM_VTABLE(IDirect3D2) mesa_d3d2vt =
278 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
279 MESA_IDirect3D2Impl_QueryInterface,
280 IDirect3D2Impl_AddRef,
281 MESA_IDirect3D2Impl_Release,
282 MESA_IDirect3D2Impl_EnumDevices,
283 MESA_IDirect3D2Impl_CreateLight,
284 MESA_IDirect3D2Impl_CreateMaterial,
285 MESA_IDirect3D2Impl_CreateViewport,
286 MESA_IDirect3D2Impl_FindDevice,
287 MESA_IDirect3D2Impl_CreateDevice
290 static HRESULT WINAPI MESA_IDirect3D3Impl_CreateVertexBuffer(
292 LPD3DVERTEXBUFFERDESC lpD3DVertBufDesc,
293 LPDIRECT3DVERTEXBUFFER* lplpD3DVertBuf,
301 static HRESULT WINAPI MESA_IDirect3D3Impl_EnumZBufferFormats(
304 LPD3DENUMPIXELFORMATSCALLBACK lpEnumCallback,
308 return DDERR_NOZBUFFERHW; /* Pretend we don't have valid HW */
311 static HRESULT WINAPI MESA_IDirect3D3Impl_EvictManagedTextures(
319 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
320 # define XCAST(fun) (typeof(mesa_d3d3vt.fun))
322 # define XCAST(fun) (void*)
325 ICOM_VTABLE(IDirect3D3) mesa_d3d3vt =
327 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
328 XCAST(QueryInterface)MESA_IDirect3D2Impl_QueryInterface,
329 XCAST(AddRef)IDirect3D2Impl_AddRef,
330 XCAST(Release)MESA_IDirect3D2Impl_Release,
331 XCAST(EnumDevices)MESA_IDirect3D2Impl_EnumDevices,
332 XCAST(CreateLight)MESA_IDirect3D2Impl_CreateLight,
333 XCAST(CreateMaterial)MESA_IDirect3D2Impl_CreateMaterial,
334 XCAST(CreateViewport)MESA_IDirect3D2Impl_CreateViewport,
335 XCAST(FindDevice)MESA_IDirect3D2Impl_FindDevice,
336 XCAST(CreateDevice)MESA_IDirect3D2Impl_CreateDevice,
337 XCAST(CreateVertexBuffer)MESA_IDirect3D3Impl_CreateVertexBuffer,
338 XCAST(EnumZBufferFormats)MESA_IDirect3D3Impl_EnumZBufferFormats,
339 XCAST(EvictManagedTextures)MESA_IDirect3D3Impl_EvictManagedTextures
342 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
346 HRESULT create_direct3d(LPVOID *obj,IDirectDrawImpl* ddraw) {
349 d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
351 d3d->ddraw = (IDirectDrawImpl *) ddraw;
352 d3d->private = NULL; /* unused for now */
353 IDirectDraw_AddRef((LPDIRECTDRAW)ddraw);
354 ICOM_VTBL(d3d) = &mesa_d3dvt;
355 *obj = (LPUNKNOWN)d3d;
356 TRACE(" Created IDirect3D interface (%p)\n", *obj);
361 HRESULT create_direct3d2(LPVOID *obj,IDirectDrawImpl* ddraw) {
364 d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
366 d3d->ddraw = (IDirectDrawImpl *) ddraw;
367 d3d->private = NULL; /* unused for now */
368 IDirectDraw_AddRef((LPDIRECTDRAW)ddraw);
369 ICOM_VTBL(d3d) = &mesa_d3d2vt;
370 *obj = (LPUNKNOWN)d3d;
371 TRACE(" Creating IDirect3D2 interface (%p)\n", *obj);
376 HRESULT create_direct3d3(LPVOID *obj,IDirectDrawImpl* ddraw) {
379 d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
381 d3d->ddraw = (IDirectDrawImpl *) ddraw;
382 d3d->private = NULL; /* unused for now */
384 IDirectDraw_AddRef((LPDIRECTDRAW)ddraw);
385 ICOM_VTBL(d3d) = &mesa_d3d3vt;
386 *obj = (LPUNKNOWN)d3d;
388 TRACE(" Creating IDirect3D3 interface (%p)\n", *obj);