Like the AUTORADIOBUTTON, the parent of a RADIOBUTTON style button
[wine] / dlls / ddraw / direct3d / mesa.c
1 #include "config.h"
2
3 #include <assert.h>
4 #include <unistd.h>
5 #include <fcntl.h>
6 #include <string.h>
7 #include <stdio.h>
8
9 #include "winerror.h"
10 #include "ddraw.h"
11 #include "d3d.h"
12 #include "message.h"
13 #include "options.h"
14 #include "monitor.h"
15 #include "debugtools.h"
16
17 #include "mesa_private.h"
18
19 DEFAULT_DEBUG_CHANNEL(ddraw);
20
21 /*******************************************************************************
22  *                              IDirect3D
23  */
24 static HRESULT WINAPI MESA_IDirect3DImpl_QueryInterface(
25     LPDIRECT3D iface,REFIID refiid,LPVOID *obj
26 ) {
27     ICOM_THIS(IDirect3DImpl,iface);
28     /* FIXME: Not sure if this is correct */
29
30     TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj);
31     if (( IsEqualGUID( &IID_IDirectDraw,  refiid ) ) ||
32         ( IsEqualGUID (&IID_IDirectDraw2, refiid ) ) ||
33         ( IsEqualGUID( &IID_IDirectDraw4, refiid ) )
34     ) {
35         *obj = This->ddraw;
36         IDirect3D_AddRef(iface);
37         TRACE("  Creating IDirectDrawX interface (%p)\n", *obj);
38         return S_OK;
39     }
40     if (( IsEqualGUID( &IID_IDirect3D, refiid ) ) ||
41         ( IsEqualGUID( &IID_IUnknown,  refiid ) ) ) {
42         *obj = This;
43         IDirect3D_AddRef(iface);
44         TRACE("  Creating IDirect3D interface (%p)\n", *obj);
45         return S_OK;
46     }
47     if ( IsEqualGUID( &IID_IDirect3D2, refiid ) ) {
48         IDirect3D2Impl*  d3d;
49
50         d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
51         d3d->ref = 1;
52         d3d->ddraw = This->ddraw;
53         IDirect3D_AddRef(iface);
54         ICOM_VTBL(d3d) = &mesa_d3d2vt;
55         *obj = d3d;
56         TRACE("  Creating IDirect3D2 interface (%p)\n", *obj);
57         return S_OK;
58     }
59     FIXME("(%p):interface for IID %s NOT found!\n",This,debugstr_guid(refiid));
60     return OLE_E_ENUM_NOMORE;
61 }
62
63 static ULONG WINAPI MESA_IDirect3DImpl_Release(LPDIRECT3D iface)
64 {
65     ICOM_THIS(IDirect3DImpl,iface);
66     TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
67
68     if (!--(This->ref)) {
69         IDirectDraw2_Release((IDirectDraw2*)This->ddraw);
70         HeapFree(GetProcessHeap(),0,This);
71         return S_OK;
72     }
73     return This->ref;
74 }
75
76 static HRESULT WINAPI MESA_IDirect3DImpl_EnumDevices(
77     LPDIRECT3D iface, LPD3DENUMDEVICESCALLBACK cb, LPVOID context
78 ) {
79     ICOM_THIS(IDirect3DImpl,iface);
80     FIXME("(%p)->(%p,%p),stub!\n",This,cb,context);
81
82     /* Call functions defined in d3ddevices.c */
83     if (!d3d_OpenGL_dx3(cb, context))
84         return DD_OK;
85
86     return DD_OK;
87 }
88
89 static HRESULT WINAPI MESA_IDirect3DImpl_CreateLight(
90     LPDIRECT3D iface, LPDIRECT3DLIGHT *lplight, IUnknown *lpunk
91 ) {
92     ICOM_THIS(IDirect3DImpl,iface);
93     TRACE("(%p)->(%p,%p): stub\n", This, lplight, lpunk);
94
95     /* Call the creation function that is located in d3dlight.c */
96     *lplight = d3dlight_create_dx3(This);
97
98     return DD_OK;
99 }
100
101 static HRESULT WINAPI MESA_IDirect3DImpl_CreateMaterial(
102     LPDIRECT3D iface, LPDIRECT3DMATERIAL *lpmaterial, IUnknown *lpunk
103 ) {
104     ICOM_THIS(IDirect3DImpl,iface);
105     TRACE("(%p)->(%p,%p): stub\n", This, lpmaterial, lpunk);
106     /* Call the creation function that is located in d3dviewport.c */
107     *lpmaterial = d3dmaterial_create(This);
108     return DD_OK;
109 }
110
111 static HRESULT WINAPI MESA_IDirect3DImpl_CreateViewport(
112     LPDIRECT3D iface, LPDIRECT3DVIEWPORT *lpviewport, IUnknown *lpunk
113 ) {
114     ICOM_THIS(IDirect3DImpl,iface);
115     TRACE("(%p)->(%p,%p): stub\n", This, lpviewport, lpunk);
116
117     /* Call the creation function that is located in d3dviewport.c */
118     *lpviewport = d3dviewport_create(This);
119
120     return DD_OK;
121 }
122
123 static HRESULT WINAPI MESA_IDirect3DImpl_FindDevice(
124     LPDIRECT3D iface, LPD3DFINDDEVICESEARCH lpfinddevsrc,
125     LPD3DFINDDEVICERESULT lpfinddevrst)
126 {
127     ICOM_THIS(IDirect3DImpl,iface);
128     FIXME("(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst);
129
130     return DD_OK;
131 }
132
133 ICOM_VTABLE(IDirect3D) mesa_d3dvt = 
134 {
135     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
136     MESA_IDirect3DImpl_QueryInterface,
137     IDirect3DImpl_AddRef,
138     MESA_IDirect3DImpl_Release,
139     IDirect3DImpl_Initialize,
140     MESA_IDirect3DImpl_EnumDevices,
141     MESA_IDirect3DImpl_CreateLight,
142     MESA_IDirect3DImpl_CreateMaterial,
143     MESA_IDirect3DImpl_CreateViewport,
144     MESA_IDirect3DImpl_FindDevice
145 };
146
147 /*******************************************************************************
148  *                              IDirect3D2
149  */
150 static HRESULT WINAPI MESA_IDirect3D2Impl_QueryInterface(
151     LPDIRECT3D2 iface,REFIID refiid,LPVOID *obj) {  
152     ICOM_THIS(IDirect3D2Impl,iface);
153
154     /* FIXME: Not sure if this is correct */
155
156     TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj);
157     if ( ( IsEqualGUID( &IID_IDirectDraw,  refiid ) ) ||
158          ( IsEqualGUID( &IID_IDirectDraw2, refiid ) ) ||
159          ( IsEqualGUID( &IID_IDirectDraw4, refiid ) ) ) {
160         *obj = This->ddraw;
161         IDirect3D2_AddRef(iface);
162
163         TRACE("  Creating IDirectDrawX interface (%p)\n", *obj);
164         
165         return S_OK;
166     }
167     if ( ( IsEqualGUID( &IID_IDirect3D2, refiid ) ) ||
168          ( IsEqualGUID( &IID_IUnknown,   refiid ) ) ) {
169         *obj = This;
170         IDirect3D2_AddRef(iface);
171
172         TRACE("  Creating IDirect3D2 interface (%p)\n", *obj);
173
174         return S_OK;
175     }
176     if ( IsEqualGUID( &IID_IDirect3D, refiid ) ) {
177         IDirect3DImpl*  d3d;
178
179         d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
180         d3d->ref = 1;
181         d3d->ddraw = This->ddraw;
182         IDirect3D2_AddRef(iface);
183         ICOM_VTBL(d3d) = &mesa_d3dvt;
184         *obj = d3d;
185         TRACE("  Creating IDirect3D interface (%p)\n", *obj);
186         return S_OK;
187     }
188     FIXME("(%p):interface for IID %s NOT found!\n",This,debugstr_guid(refiid));
189     return OLE_E_ENUM_NOMORE;
190 }
191
192 static ULONG WINAPI MESA_IDirect3D2Impl_Release(LPDIRECT3D2 iface) {
193     ICOM_THIS(IDirect3D2Impl,iface);
194     TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
195
196     if (!--(This->ref)) {
197         IDirectDraw2_Release((IDirectDraw2*)This->ddraw);
198         HeapFree(GetProcessHeap(),0,This);
199         return S_OK;
200     }
201     return This->ref;
202 }
203
204 static HRESULT WINAPI MESA_IDirect3D2Impl_EnumDevices(
205     LPDIRECT3D2 iface,LPD3DENUMDEVICESCALLBACK cb, LPVOID context
206 ) {
207     ICOM_THIS(IDirect3D2Impl,iface);
208     FIXME("(%p)->(%p,%p),stub!\n",This,cb,context);
209
210     /* Call functions defined in d3ddevices.c */
211     if (!d3d_OpenGL(cb, context))
212         return DD_OK;
213     return DD_OK;
214 }
215
216 static HRESULT WINAPI MESA_IDirect3D2Impl_CreateLight(
217     LPDIRECT3D2 iface, LPDIRECT3DLIGHT *lplight, IUnknown *lpunk
218 ) {
219     ICOM_THIS(IDirect3D2Impl,iface);
220     TRACE("(%p)->(%p,%p): stub\n", This, lplight, lpunk);
221
222     /* Call the creation function that is located in d3dlight.c */
223     *lplight = d3dlight_create(This);
224
225     return DD_OK;
226 }
227
228 static HRESULT WINAPI MESA_IDirect3D2Impl_CreateMaterial(
229     LPDIRECT3D2 iface, LPDIRECT3DMATERIAL2 *lpmaterial, IUnknown *lpunk
230 ) {
231     ICOM_THIS(IDirect3D2Impl,iface);
232     TRACE("(%p)->(%p,%p): stub\n", This, lpmaterial, lpunk);
233
234     /* Call the creation function that is located in d3dviewport.c */
235     *lpmaterial = d3dmaterial2_create(This);
236
237     return DD_OK;
238 }
239
240 static HRESULT WINAPI MESA_IDirect3D2Impl_CreateViewport(
241     LPDIRECT3D2 iface, LPDIRECT3DVIEWPORT2 *lpviewport, IUnknown *lpunk
242 ) {
243     ICOM_THIS(IDirect3D2Impl,iface);
244     TRACE("(%p)->(%p,%p): stub\n", This, lpviewport, lpunk);
245
246     /* Call the creation function that is located in d3dviewport.c */
247     *lpviewport = d3dviewport2_create(This);
248
249     return DD_OK;
250 }
251
252 static HRESULT WINAPI MESA_IDirect3D2Impl_FindDevice(
253     LPDIRECT3D2 iface, LPD3DFINDDEVICESEARCH lpfinddevsrc,
254     LPD3DFINDDEVICERESULT lpfinddevrst)
255 {
256     ICOM_THIS(IDirect3D2Impl,iface);
257     FIXME("(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst);
258     return DD_OK;
259 }
260
261 static HRESULT WINAPI MESA_IDirect3D2Impl_CreateDevice(
262     LPDIRECT3D2 iface, REFCLSID rguid, LPDIRECTDRAWSURFACE surface,
263     LPDIRECT3DDEVICE2 *device)
264 {
265     ICOM_THIS(IDirect3D2Impl,iface);
266
267     FIXME("(%p)->(%s,%p,%p): stub\n",This,debugstr_guid(rguid),surface,device);
268
269     if (is_OpenGL(rguid, (IDirectDrawSurfaceImpl*)surface, (IDirect3DDevice2Impl**)device, This)) {
270         IDirect3D2_AddRef(iface);
271         return DD_OK;
272     }
273
274     return DDERR_INVALIDPARAMS;
275 }
276
277 ICOM_VTABLE(IDirect3D2) mesa_d3d2vt = 
278 {
279     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
280     MESA_IDirect3D2Impl_QueryInterface,
281     IDirect3D2Impl_AddRef,
282     MESA_IDirect3D2Impl_Release,
283     MESA_IDirect3D2Impl_EnumDevices,
284     MESA_IDirect3D2Impl_CreateLight,
285     MESA_IDirect3D2Impl_CreateMaterial,
286     MESA_IDirect3D2Impl_CreateViewport,
287     MESA_IDirect3D2Impl_FindDevice,
288     MESA_IDirect3D2Impl_CreateDevice
289 };
290
291 HRESULT create_direct3d(LPVOID *obj,IDirectDraw2Impl* ddraw) {
292     IDirect3DImpl* d3d;
293
294     d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
295     d3d->ref = 1;
296     d3d->ddraw = ddraw;
297     d3d->private = NULL; /* unused for now */
298     IDirectDraw_AddRef((LPDIRECTDRAW)ddraw);
299     ICOM_VTBL(d3d) = &mesa_d3dvt;
300     *obj = (LPUNKNOWN)d3d;
301     TRACE("  Created IDirect3D interface (%p)\n", *obj);
302     return S_OK;
303 }
304
305 HRESULT create_direct3d2(LPVOID *obj,IDirectDraw2Impl* ddraw) {
306     IDirect3D2Impl* d3d;
307
308     d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
309     d3d->ref = 1;
310     d3d->ddraw = ddraw;
311     d3d->private = NULL; /* unused for now */
312     IDirectDraw_AddRef((LPDIRECTDRAW)ddraw);
313     ICOM_VTBL(d3d) = &mesa_d3d2vt;
314     *obj = (LPUNKNOWN)d3d;
315     TRACE("  Creating IDirect3D2 interface (%p)\n", *obj);
316     return S_OK;
317 }