Added an unknown VxD error code.
[wine] / dlls / ddraw / direct3d / main.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 "options.h"
13 #include "debugtools.h"
14
15 #include "d3d_private.h"
16
17 DEFAULT_DEBUG_CHANNEL(ddraw);
18
19 static ICOM_VTABLE(IDirect3D) d3dvt;
20 static ICOM_VTABLE(IDirect3D2) d3d2vt;
21
22 /*******************************************************************************
23  *                              IDirect3D
24  */
25 HRESULT WINAPI IDirect3DImpl_QueryInterface(
26     LPDIRECT3D iface,REFIID refiid,LPVOID *obj
27 ) {
28     ICOM_THIS(IDirect3DImpl,iface);
29     /* FIXME: Not sure if this is correct */
30
31     TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj);
32     if (( IsEqualGUID( &IID_IDirectDraw,  refiid ) ) ||
33         ( IsEqualGUID (&IID_IDirectDraw2, refiid ) ) ||
34         ( IsEqualGUID( &IID_IDirectDraw4, refiid ) )
35     ) {
36         *obj = This->ddraw;
37         IDirect3D_AddRef(iface);
38         TRACE("  Creating IDirectDrawX interface (%p)\n", *obj);
39         return S_OK;
40     }
41     if (( IsEqualGUID( &IID_IDirect3D, refiid ) ) ||
42         ( IsEqualGUID( &IID_IUnknown,  refiid ) ) ) {
43         *obj = This;
44         IDirect3D_AddRef(iface);
45         TRACE("  Creating IDirect3D interface (%p)\n", *obj);
46         return S_OK;
47     }
48     if ( IsEqualGUID( &IID_IDirect3D2, refiid ) ) {
49         IDirect3D2Impl*  d3d;
50
51         d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
52         d3d->ref = 1;
53         d3d->ddraw = This->ddraw;
54         IDirect3D_AddRef(iface);
55         ICOM_VTBL(d3d) = &d3d2vt;
56         *obj = d3d;
57         TRACE("  Creating IDirect3D2 interface (%p)\n", *obj);
58         return S_OK;
59     }
60     FIXME("(%p):interface for IID %s NOT found!\n",This,debugstr_guid(refiid));
61     return OLE_E_ENUM_NOMORE;
62 }
63
64 ULONG WINAPI IDirect3DImpl_AddRef(LPDIRECT3D iface) {
65     ICOM_THIS(IDirect3DImpl,iface);
66     TRACE("(%p)->() incrementing from %lu.\n", This, This->ref );
67
68     return ++(This->ref);
69 }
70
71 ULONG WINAPI IDirect3DImpl_Release(LPDIRECT3D iface)
72 {
73     ICOM_THIS(IDirect3DImpl,iface);
74     TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
75
76     if (!--(This->ref)) {
77         IDirectDraw2_Release((IDirectDraw2*)This->ddraw);
78         HeapFree(GetProcessHeap(),0,This);
79         return S_OK;
80     }
81     return This->ref;
82 }
83
84 HRESULT WINAPI IDirect3DImpl_Initialize(LPDIRECT3D iface,REFIID refiid) {
85     ICOM_THIS(IDirect3DImpl,iface);
86     /* FIXME: Not sure if this is correct */
87     FIXME("(%p)->(%s):stub.\n",This,debugstr_guid(refiid));
88     return DDERR_ALREADYINITIALIZED;
89 }
90
91 HRESULT WINAPI IDirect3DImpl_EnumDevices(
92     LPDIRECT3D iface, LPD3DENUMDEVICESCALLBACK cb, LPVOID context
93 ) {
94     ICOM_THIS(IDirect3DImpl,iface);
95     FIXME("(%p)->(%p,%p),stub!\n",This,cb,context);
96     return DD_OK;
97 }
98
99 HRESULT WINAPI IDirect3DImpl_CreateLight(
100     LPDIRECT3D iface, LPDIRECT3DLIGHT *lplight, IUnknown *lpunk
101 ) {
102     ICOM_THIS(IDirect3DImpl,iface);
103     FIXME("(%p)->(%p,%p): stub\n", This, lplight, lpunk);
104     return E_FAIL;
105 }
106
107 HRESULT WINAPI IDirect3DImpl_CreateMaterial(
108     LPDIRECT3D iface, LPDIRECT3DMATERIAL *lpmaterial, IUnknown *lpunk
109 ) {
110     ICOM_THIS(IDirect3DImpl,iface);
111     FIXME("(%p)->(%p,%p): stub\n", This, lpmaterial, lpunk);
112     return E_FAIL;
113 }
114
115 HRESULT WINAPI IDirect3DImpl_CreateViewport(
116     LPDIRECT3D iface, LPDIRECT3DVIEWPORT *lpviewport, IUnknown *lpunk
117 ) {
118     ICOM_THIS(IDirect3DImpl,iface);
119     FIXME("(%p)->(%p,%p): stub\n", This, lpviewport, lpunk);
120
121     return E_FAIL;
122 }
123
124 HRESULT WINAPI IDirect3DImpl_FindDevice(
125     LPDIRECT3D iface, LPD3DFINDDEVICESEARCH lpfinddevsrc,
126     LPD3DFINDDEVICERESULT lpfinddevrst)
127 {
128     ICOM_THIS(IDirect3DImpl,iface);
129     FIXME("(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst);
130     return DD_OK;
131 }
132
133 /* This is for checking the correctness of the prototypes/functions.
134  * Do not remove.
135  */
136 static ICOM_VTABLE(IDirect3D) WINE_UNUSED d3dvt = {
137     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
138     IDirect3DImpl_QueryInterface,
139     IDirect3DImpl_AddRef,
140     IDirect3DImpl_Release,
141     IDirect3DImpl_Initialize,
142     IDirect3DImpl_EnumDevices,
143     IDirect3DImpl_CreateLight,
144     IDirect3DImpl_CreateMaterial,
145     IDirect3DImpl_CreateViewport,
146     IDirect3DImpl_FindDevice
147 };
148
149 /*******************************************************************************
150  *                              IDirect3D2
151  */
152 HRESULT WINAPI IDirect3D2Impl_QueryInterface(
153     LPDIRECT3D2 iface,REFIID refiid,LPVOID *obj) {  
154     ICOM_THIS(IDirect3D2Impl,iface);
155
156     /* FIXME: Not sure if this is correct */
157
158     TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj);
159     if ( ( IsEqualGUID( &IID_IDirectDraw,  refiid ) ) ||
160          ( IsEqualGUID( &IID_IDirectDraw2, refiid ) ) ||
161          ( IsEqualGUID( &IID_IDirectDraw4, refiid ) ) ) {
162         *obj = This->ddraw;
163         IDirect3D2_AddRef(iface);
164
165         TRACE("  Creating IDirectDrawX interface (%p)\n", *obj);
166         
167         return S_OK;
168     }
169     if ( ( IsEqualGUID( &IID_IDirect3D2, refiid ) ) ||
170          ( IsEqualGUID( &IID_IUnknown,   refiid ) ) ) {
171         *obj = This;
172         IDirect3D2_AddRef(iface);
173
174         TRACE("  Creating IDirect3D2 interface (%p)\n", *obj);
175
176         return S_OK;
177     }
178     if ( IsEqualGUID( &IID_IDirect3D, refiid ) ) {
179         IDirect3DImpl*  d3d;
180
181         d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
182         d3d->ref = 1;
183         d3d->ddraw = This->ddraw;
184         IDirect3D2_AddRef(iface);
185         ICOM_VTBL(d3d) = &d3dvt;
186         *obj = d3d;
187         TRACE("  Creating IDirect3D interface (%p)\n", *obj);
188         return S_OK;
189     }
190     FIXME("(%p):interface for IID %s NOT found!\n",This,debugstr_guid(refiid));
191     return OLE_E_ENUM_NOMORE;
192 }
193
194 ULONG WINAPI IDirect3D2Impl_AddRef(LPDIRECT3D2 iface) {
195     ICOM_THIS(IDirect3D2Impl,iface);
196     TRACE("(%p)->() incrementing from %lu.\n", This, This->ref );
197
198     return ++(This->ref);
199 }
200
201 ULONG WINAPI IDirect3D2Impl_Release(LPDIRECT3D2 iface) {
202     ICOM_THIS(IDirect3D2Impl,iface);
203     TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
204
205     if (!--(This->ref)) {
206         IDirectDraw2_Release((IDirectDraw2*)This->ddraw);
207         HeapFree(GetProcessHeap(),0,This);
208         return S_OK;
209     }
210     return This->ref;
211 }
212
213 HRESULT WINAPI IDirect3D2Impl_EnumDevices(
214     LPDIRECT3D2 iface,LPD3DENUMDEVICESCALLBACK cb, LPVOID context
215 ) {
216     ICOM_THIS(IDirect3D2Impl,iface);
217     FIXME("(%p)->(%p,%p),stub!\n",This,cb,context);
218     return DD_OK;
219 }
220
221 HRESULT WINAPI IDirect3D2Impl_CreateLight(
222     LPDIRECT3D2 iface, LPDIRECT3DLIGHT *lplight, IUnknown *lpunk
223 ) {
224     ICOM_THIS(IDirect3D2Impl,iface);
225     FIXME("(%p)->(%p,%p): stub\n", This, lplight, lpunk);
226     return E_FAIL;
227 }
228
229 HRESULT WINAPI IDirect3D2Impl_CreateMaterial(
230     LPDIRECT3D2 iface, LPDIRECT3DMATERIAL2 *lpmaterial, IUnknown *lpunk
231 ) {
232     ICOM_THIS(IDirect3D2Impl,iface);
233     FIXME("(%p)->(%p,%p): stub\n", This, lpmaterial, lpunk);
234     return E_FAIL;
235 }
236
237 HRESULT WINAPI IDirect3D2Impl_CreateViewport(
238     LPDIRECT3D2 iface, LPDIRECT3DVIEWPORT2 *lpviewport, IUnknown *lpunk
239 ) {
240     ICOM_THIS(IDirect3D2Impl,iface);
241     FIXME("(%p)->(%p,%p): stub\n", This, lpviewport, lpunk);
242     return E_FAIL;
243 }
244
245 HRESULT WINAPI IDirect3D2Impl_FindDevice(
246     LPDIRECT3D2 iface, LPD3DFINDDEVICESEARCH lpfinddevsrc,
247     LPD3DFINDDEVICERESULT lpfinddevrst)
248 {
249     ICOM_THIS(IDirect3D2Impl,iface);
250     FIXME("(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst);
251     return DD_OK;
252 }
253
254 HRESULT WINAPI IDirect3D2Impl_CreateDevice(
255     LPDIRECT3D2 iface, REFCLSID rguid, LPDIRECTDRAWSURFACE surface,
256     LPDIRECT3DDEVICE2 *device)
257 {
258     ICOM_THIS(IDirect3D2Impl,iface);
259     FIXME("(%p)->(%s,%p,%p): stub\n",This,debugstr_guid(rguid),surface,device);
260     return DDERR_INVALIDPARAMS;
261 }
262
263 /* This is for checking the correctness of the prototypes/functions.
264  * Do not remove.
265  */
266 static ICOM_VTABLE(IDirect3D2) WINE_UNUSED d3d2vt = 
267 {
268     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
269     IDirect3D2Impl_QueryInterface,
270     IDirect3D2Impl_AddRef,
271     IDirect3D2Impl_Release,
272     IDirect3D2Impl_EnumDevices,
273     IDirect3D2Impl_CreateLight,
274     IDirect3D2Impl_CreateMaterial,
275     IDirect3D2Impl_CreateViewport,
276     IDirect3D2Impl_FindDevice,
277     IDirect3D2Impl_CreateDevice
278 };