13 #include "debugtools.h"
15 #include "mesa_private.h"
17 DEFAULT_DEBUG_CHANNEL(ddraw);
19 /*******************************************************************************
22 static HRESULT WINAPI MESA_IDirect3DImpl_QueryInterface(
23 LPDIRECT3D iface,REFIID refiid,LPVOID *obj
25 ICOM_THIS(IDirect3DImpl,iface);
26 /* FIXME: Not sure if this is correct */
28 TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj);
29 if (( IsEqualGUID( &IID_IDirectDraw, refiid ) ) ||
30 ( IsEqualGUID (&IID_IDirectDraw2, refiid ) ) ||
31 ( IsEqualGUID( &IID_IDirectDraw4, refiid ) )
34 IDirect3D_AddRef(iface);
35 TRACE(" Creating IDirectDrawX interface (%p)\n", *obj);
38 if (( IsEqualGUID( &IID_IDirect3D, refiid ) ) ||
39 ( IsEqualGUID( &IID_IUnknown, refiid ) ) ) {
41 IDirect3D_AddRef(iface);
42 TRACE(" Creating IDirect3D interface (%p)\n", *obj);
45 if ( IsEqualGUID( &IID_IDirect3D2, refiid ) ) {
48 d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
50 d3d->ddraw = This->ddraw;
51 IDirect3D_AddRef(iface);
52 ICOM_VTBL(d3d) = &mesa_d3d2vt;
54 TRACE(" Creating IDirect3D2 interface (%p)\n", *obj);
57 FIXME("(%p):interface for IID %s NOT found!\n",This,debugstr_guid(refiid));
58 return OLE_E_ENUM_NOMORE;
61 static ULONG WINAPI MESA_IDirect3DImpl_Release(LPDIRECT3D iface)
63 ICOM_THIS(IDirect3DImpl,iface);
64 TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
67 IDirectDraw2_Release((IDirectDraw2*)This->ddraw);
68 HeapFree(GetProcessHeap(),0,This);
74 static HRESULT WINAPI MESA_IDirect3DImpl_EnumDevices(
75 LPDIRECT3D iface, LPD3DENUMDEVICESCALLBACK cb, LPVOID context
77 ICOM_THIS(IDirect3DImpl,iface);
78 FIXME("(%p)->(%p,%p),stub!\n",This,cb,context);
80 /* Call functions defined in d3ddevices.c */
81 if (!d3d_OpenGL_dx3(cb, context))
87 static HRESULT WINAPI MESA_IDirect3DImpl_CreateLight(
88 LPDIRECT3D iface, LPDIRECT3DLIGHT *lplight, IUnknown *lpunk
90 ICOM_THIS(IDirect3DImpl,iface);
91 TRACE("(%p)->(%p,%p): stub\n", This, lplight, lpunk);
93 /* Call the creation function that is located in d3dlight.c */
94 *lplight = d3dlight_create_dx3(This);
99 static HRESULT WINAPI MESA_IDirect3DImpl_CreateMaterial(
100 LPDIRECT3D iface, LPDIRECT3DMATERIAL *lpmaterial, IUnknown *lpunk
102 ICOM_THIS(IDirect3DImpl,iface);
103 TRACE("(%p)->(%p,%p): stub\n", This, lpmaterial, lpunk);
104 /* Call the creation function that is located in d3dviewport.c */
105 *lpmaterial = d3dmaterial_create(This);
109 static HRESULT WINAPI MESA_IDirect3DImpl_CreateViewport(
110 LPDIRECT3D iface, LPDIRECT3DVIEWPORT *lpviewport, IUnknown *lpunk
112 ICOM_THIS(IDirect3DImpl,iface);
113 TRACE("(%p)->(%p,%p): stub\n", This, lpviewport, lpunk);
115 /* Call the creation function that is located in d3dviewport.c */
116 *lpviewport = d3dviewport_create(This);
121 static HRESULT WINAPI MESA_IDirect3DImpl_FindDevice(
122 LPDIRECT3D iface, LPD3DFINDDEVICESEARCH lpfinddevsrc,
123 LPD3DFINDDEVICERESULT lpfinddevrst)
125 ICOM_THIS(IDirect3DImpl,iface);
126 FIXME("(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst);
131 ICOM_VTABLE(IDirect3D) mesa_d3dvt =
133 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
134 MESA_IDirect3DImpl_QueryInterface,
135 IDirect3DImpl_AddRef,
136 MESA_IDirect3DImpl_Release,
137 IDirect3DImpl_Initialize,
138 MESA_IDirect3DImpl_EnumDevices,
139 MESA_IDirect3DImpl_CreateLight,
140 MESA_IDirect3DImpl_CreateMaterial,
141 MESA_IDirect3DImpl_CreateViewport,
142 MESA_IDirect3DImpl_FindDevice
145 /*******************************************************************************
148 static HRESULT WINAPI MESA_IDirect3D2Impl_QueryInterface(
149 LPDIRECT3D2 iface,REFIID refiid,LPVOID *obj) {
150 ICOM_THIS(IDirect3D2Impl,iface);
152 /* FIXME: Not sure if this is correct */
154 TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj);
155 if ( ( IsEqualGUID( &IID_IDirectDraw, refiid ) ) ||
156 ( IsEqualGUID( &IID_IDirectDraw2, refiid ) ) ||
157 ( IsEqualGUID( &IID_IDirectDraw4, refiid ) ) ) {
159 IDirect3D2_AddRef(iface);
161 TRACE(" Creating IDirectDrawX interface (%p)\n", *obj);
165 if ( ( IsEqualGUID( &IID_IDirect3D2, refiid ) ) ||
166 ( IsEqualGUID( &IID_IUnknown, refiid ) ) ) {
168 IDirect3D2_AddRef(iface);
170 TRACE(" Creating IDirect3D2 interface (%p)\n", *obj);
174 if ( IsEqualGUID( &IID_IDirect3D, refiid ) ) {
177 d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
179 d3d->ddraw = This->ddraw;
180 IDirect3D2_AddRef(iface);
181 ICOM_VTBL(d3d) = &mesa_d3dvt;
183 TRACE(" Creating IDirect3D interface (%p)\n", *obj);
186 FIXME("(%p):interface for IID %s NOT found!\n",This,debugstr_guid(refiid));
187 return OLE_E_ENUM_NOMORE;
190 static ULONG WINAPI MESA_IDirect3D2Impl_Release(LPDIRECT3D2 iface) {
191 ICOM_THIS(IDirect3D2Impl,iface);
192 TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
194 if (!--(This->ref)) {
195 IDirectDraw2_Release((IDirectDraw2*)This->ddraw);
196 HeapFree(GetProcessHeap(),0,This);
202 static HRESULT WINAPI MESA_IDirect3D2Impl_EnumDevices(
203 LPDIRECT3D2 iface,LPD3DENUMDEVICESCALLBACK cb, LPVOID context
205 ICOM_THIS(IDirect3D2Impl,iface);
206 FIXME("(%p)->(%p,%p),stub!\n",This,cb,context);
208 /* Call functions defined in d3ddevices.c */
209 if (!d3d_OpenGL(cb, context))
214 static HRESULT WINAPI MESA_IDirect3D2Impl_CreateLight(
215 LPDIRECT3D2 iface, LPDIRECT3DLIGHT *lplight, IUnknown *lpunk
217 ICOM_THIS(IDirect3D2Impl,iface);
218 TRACE("(%p)->(%p,%p): stub\n", This, lplight, lpunk);
220 /* Call the creation function that is located in d3dlight.c */
221 *lplight = d3dlight_create(This);
226 static HRESULT WINAPI MESA_IDirect3D2Impl_CreateMaterial(
227 LPDIRECT3D2 iface, LPDIRECT3DMATERIAL2 *lpmaterial, IUnknown *lpunk
229 ICOM_THIS(IDirect3D2Impl,iface);
230 TRACE("(%p)->(%p,%p): stub\n", This, lpmaterial, lpunk);
232 /* Call the creation function that is located in d3dviewport.c */
233 *lpmaterial = d3dmaterial2_create(This);
238 static HRESULT WINAPI MESA_IDirect3D2Impl_CreateViewport(
239 LPDIRECT3D2 iface, LPDIRECT3DVIEWPORT2 *lpviewport, IUnknown *lpunk
241 ICOM_THIS(IDirect3D2Impl,iface);
242 TRACE("(%p)->(%p,%p): stub\n", This, lpviewport, lpunk);
244 /* Call the creation function that is located in d3dviewport.c */
245 *lpviewport = d3dviewport2_create(This);
250 static HRESULT WINAPI MESA_IDirect3D2Impl_FindDevice(
251 LPDIRECT3D2 iface, LPD3DFINDDEVICESEARCH lpfinddevsrc,
252 LPD3DFINDDEVICERESULT lpfinddevrst)
254 ICOM_THIS(IDirect3D2Impl,iface);
255 FIXME("(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst);
259 static HRESULT WINAPI MESA_IDirect3D2Impl_CreateDevice(
260 LPDIRECT3D2 iface, REFCLSID rguid, LPDIRECTDRAWSURFACE surface,
261 LPDIRECT3DDEVICE2 *device)
263 ICOM_THIS(IDirect3D2Impl,iface);
265 FIXME("(%p)->(%s,%p,%p): stub\n",This,debugstr_guid(rguid),surface,device);
267 if (is_OpenGL(rguid, (IDirectDrawSurfaceImpl*)surface, (IDirect3DDevice2Impl**)device, This)) {
268 IDirect3D2_AddRef(iface);
272 return DDERR_INVALIDPARAMS;
275 ICOM_VTABLE(IDirect3D2) mesa_d3d2vt =
277 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
278 MESA_IDirect3D2Impl_QueryInterface,
279 IDirect3D2Impl_AddRef,
280 MESA_IDirect3D2Impl_Release,
281 MESA_IDirect3D2Impl_EnumDevices,
282 MESA_IDirect3D2Impl_CreateLight,
283 MESA_IDirect3D2Impl_CreateMaterial,
284 MESA_IDirect3D2Impl_CreateViewport,
285 MESA_IDirect3D2Impl_FindDevice,
286 MESA_IDirect3D2Impl_CreateDevice
289 static HRESULT WINAPI MESA_IDirect3D3Impl_CreateVertexBuffer(
291 LPD3DVERTEXBUFFERDESC lpD3DVertBufDesc,
292 LPDIRECT3DVERTEXBUFFER* lplpD3DVertBuf,
300 static HRESULT WINAPI MESA_IDirect3D3Impl_EnumZBufferFormats(
303 LPD3DENUMPIXELFORMATSCALLBACK lpEnumCallback,
307 return DDERR_NOZBUFFERHW; /* Pretend we don't have valid HW */
310 static HRESULT WINAPI MESA_IDirect3D3Impl_EvictManagedTextures(
318 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
319 # define XCAST(fun) (typeof(mesa_d3d3vt.fun))
321 # define XCAST(fun) (void*)
324 ICOM_VTABLE(IDirect3D3) mesa_d3d3vt =
326 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
327 XCAST(QueryInterface)MESA_IDirect3D2Impl_QueryInterface,
328 XCAST(AddRef)IDirect3D2Impl_AddRef,
329 XCAST(Release)MESA_IDirect3D2Impl_Release,
330 XCAST(EnumDevices)MESA_IDirect3D2Impl_EnumDevices,
331 XCAST(CreateLight)MESA_IDirect3D2Impl_CreateLight,
332 XCAST(CreateMaterial)MESA_IDirect3D2Impl_CreateMaterial,
333 XCAST(CreateViewport)MESA_IDirect3D2Impl_CreateViewport,
334 XCAST(FindDevice)MESA_IDirect3D2Impl_FindDevice,
335 XCAST(CreateDevice)MESA_IDirect3D2Impl_CreateDevice,
336 XCAST(CreateVertexBuffer)MESA_IDirect3D3Impl_CreateVertexBuffer,
337 XCAST(EnumZBufferFormats)MESA_IDirect3D3Impl_EnumZBufferFormats,
338 XCAST(EvictManagedTextures)MESA_IDirect3D3Impl_EvictManagedTextures
341 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
345 HRESULT create_direct3d(LPVOID *obj,IDirectDrawImpl* ddraw) {
348 d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
350 d3d->ddraw = (IDirectDrawImpl *) ddraw;
351 d3d->private = NULL; /* unused for now */
352 IDirectDraw_AddRef((LPDIRECTDRAW)ddraw);
353 ICOM_VTBL(d3d) = &mesa_d3dvt;
354 *obj = (LPUNKNOWN)d3d;
355 TRACE(" Created IDirect3D interface (%p)\n", *obj);
360 HRESULT create_direct3d2(LPVOID *obj,IDirectDrawImpl* ddraw) {
363 d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
365 d3d->ddraw = (IDirectDrawImpl *) ddraw;
366 d3d->private = NULL; /* unused for now */
367 IDirectDraw_AddRef((LPDIRECTDRAW)ddraw);
368 ICOM_VTBL(d3d) = &mesa_d3d2vt;
369 *obj = (LPUNKNOWN)d3d;
370 TRACE(" Creating IDirect3D2 interface (%p)\n", *obj);
375 HRESULT create_direct3d3(LPVOID *obj,IDirectDrawImpl* ddraw) {
378 d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
380 d3d->ddraw = (IDirectDrawImpl *) ddraw;
381 d3d->private = NULL; /* unused for now */
383 IDirectDraw_AddRef((LPDIRECTDRAW)ddraw);
384 ICOM_VTBL(d3d) = &mesa_d3d3vt;
385 *obj = (LPUNKNOWN)d3d;
387 TRACE(" Creating IDirect3D3 interface (%p)\n", *obj);