Make access to the DCE list thread safe by ensuring we have acquired
[wine/wine-kai.git] / graphics / d3dviewport.c
blobb7f1d3c25cd51c3452594150b864eef6adc8d96d
1 /* Direct3D Viewport
2 (c) 1998 Lionel ULMER
4 This files contains the implementation of Direct3DViewport2. */
6 #include "config.h"
7 #include "windef.h"
8 #include "winerror.h"
9 #include "wine/obj_base.h"
10 #include "heap.h"
11 #include "ddraw.h"
12 #include "d3d.h"
13 #include "debug.h"
15 #include "d3d_private.h"
18 #ifdef HAVE_MESAGL
20 static ICOM_VTABLE(IDirect3DViewport2) viewport2_vtable;
22 /*******************************************************************************
23 * Viewport1/2 static functions
25 static void activate(IDirect3DViewport2Impl* This) {
26 IDirect3DLightImpl* l;
28 /* Activate all the lights associated with this context */
29 l = This->lights;
31 while (l != NULL) {
32 l->activate(l);
33 l = l->next;
37 /*******************************************************************************
38 * Viewport1/2 Creation functions
40 LPDIRECT3DVIEWPORT2 d3dviewport2_create(IDirect3D2Impl* d3d2)
42 IDirect3DViewport2Impl* vp;
44 vp = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DViewport2Impl));
45 vp->ref = 1;
46 vp->lpvtbl = &viewport2_vtable;
47 vp->d3d.d3d2 = d3d2;
48 vp->use_d3d2 = 1;
50 vp->device.active_device2 = NULL;
51 vp->activate = activate;
53 vp->lights = NULL;
55 vp->nextlight = GL_LIGHT0;
57 return (LPDIRECT3DVIEWPORT2)vp;
60 LPDIRECT3DVIEWPORT d3dviewport_create(IDirect3DImpl* d3d1)
62 IDirect3DViewport2Impl* vp;
64 vp = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DViewport2Impl));
65 vp->ref = 1;
66 vp->lpvtbl = &viewport2_vtable;
67 vp->d3d.d3d1 = d3d1;
68 vp->use_d3d2 = 0;
70 vp->device.active_device1 = NULL;
71 vp->activate = activate;
73 vp->lights = NULL;
75 vp->nextlight = GL_LIGHT0;
77 return (LPDIRECT3DVIEWPORT) vp;
80 /*******************************************************************************
81 * IDirect3DViewport2 methods
84 static HRESULT WINAPI IDirect3DViewport2Impl_QueryInterface(LPDIRECT3DVIEWPORT2 iface,
85 REFIID riid,
86 LPVOID* ppvObj)
88 ICOM_THIS(IDirect3DViewport2Impl,iface);
89 char xrefiid[50];
91 WINE_StringFromCLSID((LPCLSID)riid,xrefiid);
92 FIXME(ddraw, "(%p)->(%s,%p): stub\n", This, xrefiid,ppvObj);
94 return S_OK;
99 static ULONG WINAPI IDirect3DViewport2Impl_AddRef(LPDIRECT3DVIEWPORT2 iface)
101 ICOM_THIS(IDirect3DViewport2Impl,iface);
102 TRACE(ddraw, "(%p)->()incrementing from %lu.\n", This, This->ref );
104 return ++(This->ref);
109 static ULONG WINAPI IDirect3DViewport2Impl_Release(LPDIRECT3DVIEWPORT2 iface)
111 ICOM_THIS(IDirect3DViewport2Impl,iface);
112 FIXME( ddraw, "(%p)->() decrementing from %lu.\n", This, This->ref );
114 if (!--(This->ref)) {
115 HeapFree(GetProcessHeap(),0,This);
116 return 0;
119 return This->ref;
122 /*** IDirect3DViewport methods ***/
123 static HRESULT WINAPI IDirect3DViewport2Impl_Initialize(LPDIRECT3DVIEWPORT2 iface,
124 LPDIRECT3D d3d)
126 ICOM_THIS(IDirect3DViewport2Impl,iface);
127 FIXME(ddraw, "(%p)->(%p): stub\n", This, d3d);
129 return DD_OK;
132 static HRESULT WINAPI IDirect3DViewport2Impl_GetViewport(LPDIRECT3DVIEWPORT2 iface,
133 LPD3DVIEWPORT lpvp)
135 ICOM_THIS(IDirect3DViewport2Impl,iface);
136 FIXME(ddraw, "(%p)->(%p): stub\n", This, lpvp);
138 if (This->use_vp2 != 0)
139 return DDERR_INVALIDPARAMS;
141 *lpvp = This->viewport.vp1;
143 return DD_OK;
146 static HRESULT WINAPI IDirect3DViewport2Impl_SetViewport(LPDIRECT3DVIEWPORT2 iface,
147 LPD3DVIEWPORT lpvp)
149 ICOM_THIS(IDirect3DViewport2Impl,iface);
150 FIXME(ddraw, "(%p)->(%p): stub\n", This, lpvp);
152 This->use_vp2 = 0;
153 This->viewport.vp1 = *lpvp;
155 TRACE(ddraw, "dwSize = %ld dwX = %ld dwY = %ld\n",
156 lpvp->dwSize, lpvp->dwX, lpvp->dwY);
157 TRACE(ddraw, "dwWidth = %ld dwHeight = %ld\n",
158 lpvp->dwWidth, lpvp->dwHeight);
159 TRACE(ddraw, "dvScaleX = %f dvScaleY = %f\n",
160 lpvp->dvScaleX, lpvp->dvScaleY);
161 TRACE(ddraw, "dvMaxX = %f dvMaxY = %f\n",
162 lpvp->dvMaxX, lpvp->dvMaxY);
163 TRACE(ddraw, "dvMinZ = %f dvMaxZ = %f\n",
164 lpvp->dvMinZ, lpvp->dvMaxZ);
167 return DD_OK;
170 static HRESULT WINAPI IDirect3DViewport2Impl_TransformVertices(LPDIRECT3DVIEWPORT2 iface,
171 DWORD dwVertexCount,
172 LPD3DTRANSFORMDATA lpData,
173 DWORD dwFlags,
174 LPDWORD lpOffScreen)
176 ICOM_THIS(IDirect3DViewport2Impl,iface);
177 FIXME(ddraw, "(%p)->(%8ld,%p,%08lx,%p): stub\n",
178 This, dwVertexCount, lpData, dwFlags, lpOffScreen);
180 return DD_OK;
183 static HRESULT WINAPI IDirect3DViewport2Impl_LightElements(LPDIRECT3DVIEWPORT2 iface,
184 DWORD dwElementCount,
185 LPD3DLIGHTDATA lpData)
187 ICOM_THIS(IDirect3DViewport2Impl,iface);
188 FIXME(ddraw, "(%p)->(%8ld,%p): stub\n", This, dwElementCount, lpData);
190 return DD_OK;
193 static HRESULT WINAPI IDirect3DViewport2Impl_SetBackground(LPDIRECT3DVIEWPORT2 iface,
194 D3DMATERIALHANDLE hMat)
196 ICOM_THIS(IDirect3DViewport2Impl,iface);
197 FIXME(ddraw, "(%p)->(%08lx): stub\n", This, (DWORD) hMat);
199 return DD_OK;
202 static HRESULT WINAPI IDirect3DViewport2Impl_GetBackground(LPDIRECT3DVIEWPORT2 iface,
203 LPD3DMATERIALHANDLE lphMat,
204 LPBOOL lpValid)
206 ICOM_THIS(IDirect3DViewport2Impl,iface);
207 FIXME(ddraw, "(%p)->(%p,%p): stub\n", This, lphMat, lpValid);
209 return DD_OK;
212 static HRESULT WINAPI IDirect3DViewport2Impl_SetBackgroundDepth(LPDIRECT3DVIEWPORT2 iface,
213 LPDIRECTDRAWSURFACE lpDDSurface)
215 ICOM_THIS(IDirect3DViewport2Impl,iface);
216 FIXME(ddraw, "(%p)->(%p): stub\n", This, lpDDSurface);
218 return DD_OK;
221 static HRESULT WINAPI IDirect3DViewport2Impl_GetBackgroundDepth(LPDIRECT3DVIEWPORT2 iface,
222 LPDIRECTDRAWSURFACE* lplpDDSurface,
223 LPBOOL lpValid)
225 ICOM_THIS(IDirect3DViewport2Impl,iface);
226 FIXME(ddraw, "(%p)->(%p,%p): stub\n", This, lplpDDSurface, lpValid);
228 return DD_OK;
231 static HRESULT WINAPI IDirect3DViewport2Impl_Clear(LPDIRECT3DVIEWPORT2 iface,
232 DWORD dwCount,
233 LPD3DRECT lpRects,
234 DWORD dwFlags)
236 ICOM_THIS(IDirect3DViewport2Impl,iface);
237 GLboolean ztest;
238 FIXME(ddraw, "(%p)->(%8ld,%p,%08lx): stub\n", This, dwCount, lpRects, dwFlags);
240 /* For the moment, ignore the rectangles */
241 if (This->device.active_device1 != NULL) {
242 /* Get the rendering context */
243 if (This->use_d3d2)
244 This->device.active_device2->set_context(This->device.active_device2);
245 else
246 This->device.active_device1->set_context(This->device.active_device1);
249 /* Clears the screen */
250 glGetBooleanv(GL_DEPTH_TEST, &ztest);
251 glDepthMask(GL_TRUE); /* Enables Z writing to be sure to delete also the Z buffer */
252 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
253 glDepthMask(ztest);
255 return DD_OK;
258 static HRESULT WINAPI IDirect3DViewport2Impl_AddLight(LPDIRECT3DVIEWPORT2 iface,
259 LPDIRECT3DLIGHT lpLight)
261 ICOM_THIS(IDirect3DViewport2Impl,iface);
262 IDirect3DLightImpl* ilpLight=(IDirect3DLightImpl*)lpLight;
263 FIXME(ddraw, "(%p)->(%p): stub\n", This, ilpLight);
265 /* Add the light in the 'linked' chain */
266 ilpLight->next = This->lights;
267 This->lights = ilpLight;
269 /* If active, activate the light */
270 if (This->device.active_device1 != NULL) {
271 /* Get the rendering context */
272 if (This->use_d3d2)
273 This->device.active_device2->set_context(This->device.active_device2);
274 else
275 This->device.active_device1->set_context(This->device.active_device1);
277 /* Activate the light */
278 ilpLight->light_num = This->nextlight++;
279 ilpLight->activate(ilpLight);
282 return DD_OK;
285 static HRESULT WINAPI IDirect3DViewport2Impl_DeleteLight(LPDIRECT3DVIEWPORT2 iface,
286 LPDIRECT3DLIGHT lpLight)
288 ICOM_THIS(IDirect3DViewport2Impl,iface);
289 FIXME(ddraw, "(%p)->(%p): stub\n", This, lpLight);
291 return DD_OK;
294 static HRESULT WINAPI IDirect3DViewport2Impl_NextLight(LPDIRECT3DVIEWPORT2 iface,
295 LPDIRECT3DLIGHT lpLight,
296 LPDIRECT3DLIGHT* lplpLight,
297 DWORD dwFlags)
299 ICOM_THIS(IDirect3DViewport2Impl,iface);
300 FIXME(ddraw, "(%p)->(%p,%p,%08lx): stub\n", This, lpLight, lplpLight, dwFlags);
302 return DD_OK;
305 /*** IDirect3DViewport2 methods ***/
306 static HRESULT WINAPI IDirect3DViewport2Impl_GetViewport2(LPDIRECT3DVIEWPORT2 iface,
307 LPD3DVIEWPORT2 lpViewport2)
309 ICOM_THIS(IDirect3DViewport2Impl,iface);
310 TRACE(ddraw, "(%p)->(%p)\n", This, lpViewport2);
312 if (This->use_vp2 != 1)
313 return DDERR_INVALIDPARAMS;
315 *lpViewport2 = This->viewport.vp2;
317 return DD_OK;
320 static HRESULT WINAPI IDirect3DViewport2Impl_SetViewport2(LPDIRECT3DVIEWPORT2 iface,
321 LPD3DVIEWPORT2 lpViewport2)
323 ICOM_THIS(IDirect3DViewport2Impl,iface);
324 TRACE(ddraw, "(%p)->(%p)\n", This, lpViewport2);
326 TRACE(ddraw, "dwSize = %ld dwX = %ld dwY = %ld\n",
327 lpViewport2->dwSize, lpViewport2->dwX, lpViewport2->dwY);
328 TRACE(ddraw, "dwWidth = %ld dwHeight = %ld\n",
329 lpViewport2->dwWidth, lpViewport2->dwHeight);
330 TRACE(ddraw, "dvClipX = %f dvClipY = %f\n",
331 lpViewport2->dvClipX, lpViewport2->dvClipY);
332 TRACE(ddraw, "dvClipWidth = %f dvClipHeight = %f\n",
333 lpViewport2->dvClipWidth, lpViewport2->dvClipHeight);
334 TRACE(ddraw, "dvMinZ = %f dvMaxZ = %f\n",
335 lpViewport2->dvMinZ, lpViewport2->dvMaxZ);
337 This->viewport.vp2 = *lpViewport2;
338 This->use_vp2 = 1;
340 return DD_OK;
344 /*******************************************************************************
345 * IDirect3DViewport1/2 VTable
347 static ICOM_VTABLE(IDirect3DViewport2) viewport2_vtable = {
348 /*** IUnknown methods ***/
349 IDirect3DViewport2Impl_QueryInterface,
350 IDirect3DViewport2Impl_AddRef,
351 IDirect3DViewport2Impl_Release,
352 /*** IDirect3DViewport methods ***/
353 IDirect3DViewport2Impl_Initialize,
354 IDirect3DViewport2Impl_GetViewport,
355 IDirect3DViewport2Impl_SetViewport,
356 IDirect3DViewport2Impl_TransformVertices,
357 IDirect3DViewport2Impl_LightElements,
358 IDirect3DViewport2Impl_SetBackground,
359 IDirect3DViewport2Impl_GetBackground,
360 IDirect3DViewport2Impl_SetBackgroundDepth,
361 IDirect3DViewport2Impl_GetBackgroundDepth,
362 IDirect3DViewport2Impl_Clear,
363 IDirect3DViewport2Impl_AddLight,
364 IDirect3DViewport2Impl_DeleteLight,
365 IDirect3DViewport2Impl_NextLight,
366 /*** IDirect3DViewport2 methods ***/
367 IDirect3DViewport2Impl_GetViewport2,
368 IDirect3DViewport2Impl_SetViewport2
371 #else /* HAVE_MESAGL */
373 LPDIRECT3DVIEWPORT d3dviewport_create(IDirect3DImpl* d3d1) {
374 ERR(ddraw, "Should not be called...\n");
375 return NULL;
378 LPDIRECT3DVIEWPORT2 d3dviewport2_create(IDirect3D2Impl* d3d2) {
379 ERR(ddraw, "Should not be called...\n");
380 return NULL;
383 #endif /* HAVE_MESAGL */