mshtml: Store document node in window.
[wine] / dlls / d3d9 / volumetexture.c
1 /*
2  * IDirect3DVolumeTexture9 implementation
3  *
4  * Copyright 2002-2005 Jason Edmeades
5  *                     Raphael Junqueira
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20  */
21
22 #include "config.h"
23 #include "d3d9_private.h"
24
25 WINE_DEFAULT_DEBUG_CHANNEL(d3d9);
26
27 /* IDirect3DVolumeTexture9 IUnknown parts follow: */
28 static HRESULT WINAPI IDirect3DVolumeTexture9Impl_QueryInterface(LPDIRECT3DVOLUMETEXTURE9 iface, REFIID riid, LPVOID* ppobj) {
29     IDirect3DVolumeTexture9Impl *This = (IDirect3DVolumeTexture9Impl *)iface;
30
31     if (IsEqualGUID(riid, &IID_IUnknown)
32     || IsEqualGUID(riid, &IID_IDirect3DResource9)
33     || IsEqualGUID(riid, &IID_IDirect3DBaseTexture9)
34     || IsEqualGUID(riid, &IID_IDirect3DVolumeTexture9)) {
35         IDirect3DVolumeTexture9_AddRef(iface);
36         *ppobj = This;
37         return S_OK;
38     }
39
40     WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);
41     *ppobj = NULL;
42     return E_NOINTERFACE;
43 }
44
45 static ULONG WINAPI IDirect3DVolumeTexture9Impl_AddRef(LPDIRECT3DVOLUMETEXTURE9 iface) {
46     IDirect3DVolumeTexture9Impl *This = (IDirect3DVolumeTexture9Impl *)iface;
47     ULONG ref = InterlockedIncrement(&This->ref);
48
49     TRACE("(%p) : AddRef from %d\n", This, ref - 1);
50
51     if (ref == 1)
52     {
53         IDirect3DDevice9Ex_AddRef(This->parentDevice);
54         wined3d_mutex_lock();
55         IWineD3DVolumeTexture_AddRef(This->wineD3DVolumeTexture);
56         wined3d_mutex_unlock();
57     }
58
59     return ref;
60 }
61
62 static ULONG WINAPI IDirect3DVolumeTexture9Impl_Release(LPDIRECT3DVOLUMETEXTURE9 iface) {
63     IDirect3DVolumeTexture9Impl *This = (IDirect3DVolumeTexture9Impl *)iface;
64     ULONG ref = InterlockedDecrement(&This->ref);
65
66     TRACE("(%p) : ReleaseRef to %d\n", This, ref);
67
68     if (ref == 0) {
69         IDirect3DDevice9Ex_Release(This->parentDevice);
70         wined3d_mutex_lock();
71         IWineD3DVolumeTexture_Release(This->wineD3DVolumeTexture);
72         wined3d_mutex_unlock();
73     }
74     return ref;
75 }
76
77 /* IDirect3DVolumeTexture9 IDirect3DResource9 Interface follow: */
78 static HRESULT WINAPI IDirect3DVolumeTexture9Impl_GetDevice(LPDIRECT3DVOLUMETEXTURE9 iface, IDirect3DDevice9** ppDevice) {
79     IDirect3DVolumeTexture9Impl *This = (IDirect3DVolumeTexture9Impl *)iface;
80     IWineD3DDevice *wined3d_device;
81     HRESULT hr;
82
83     TRACE("(%p) Relay\n", This);
84
85     wined3d_mutex_lock();
86     hr = IWineD3DStateBlock_GetDevice(This->wineD3DVolumeTexture, &wined3d_device);
87     if (SUCCEEDED(hr))
88     {
89         IWineD3DDevice_GetParent(wined3d_device, (IUnknown **)ppDevice);
90         IWineD3DDevice_Release(wined3d_device);
91     }
92     wined3d_mutex_unlock();
93
94     return hr;
95 }
96
97 static HRESULT WINAPI IDirect3DVolumeTexture9Impl_SetPrivateData(LPDIRECT3DVOLUMETEXTURE9 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) {
98     IDirect3DVolumeTexture9Impl *This = (IDirect3DVolumeTexture9Impl *)iface;
99     HRESULT hr;
100
101     TRACE("(%p) Relay\n", This);
102
103     wined3d_mutex_lock();
104
105     hr = IWineD3DVolumeTexture_SetPrivateData(This->wineD3DVolumeTexture, refguid, pData, SizeOfData, Flags);
106
107     wined3d_mutex_unlock();
108
109     return hr;
110 }
111
112 static HRESULT WINAPI IDirect3DVolumeTexture9Impl_GetPrivateData(LPDIRECT3DVOLUMETEXTURE9 iface, REFGUID refguid, void* pData, DWORD* pSizeOfData) {
113     IDirect3DVolumeTexture9Impl *This = (IDirect3DVolumeTexture9Impl *)iface;
114     HRESULT hr;
115
116     TRACE("(%p) Relay\n", This);
117
118     wined3d_mutex_lock();
119
120     hr = IWineD3DVolumeTexture_GetPrivateData(This->wineD3DVolumeTexture, refguid, pData, pSizeOfData);
121
122     wined3d_mutex_unlock();
123
124     return hr;
125 }
126
127 static HRESULT WINAPI IDirect3DVolumeTexture9Impl_FreePrivateData(LPDIRECT3DVOLUMETEXTURE9 iface, REFGUID refguid) {
128     IDirect3DVolumeTexture9Impl *This = (IDirect3DVolumeTexture9Impl *)iface;
129     HRESULT hr;
130
131     TRACE("(%p) Relay\n", This);
132
133     wined3d_mutex_lock();
134
135     hr = IWineD3DVolumeTexture_FreePrivateData(This->wineD3DVolumeTexture, refguid);
136
137     wined3d_mutex_unlock();
138
139     return hr;
140 }
141
142 static DWORD WINAPI IDirect3DVolumeTexture9Impl_SetPriority(LPDIRECT3DVOLUMETEXTURE9 iface, DWORD PriorityNew) {
143     IDirect3DVolumeTexture9Impl *This = (IDirect3DVolumeTexture9Impl *)iface;
144     DWORD priority;
145
146     TRACE("(%p) Relay\n", This);
147
148     wined3d_mutex_lock();
149
150     priority = IWineD3DVolumeTexture_SetPriority(This->wineD3DVolumeTexture, PriorityNew);
151
152     wined3d_mutex_unlock();
153
154     return priority;
155 }
156
157 static DWORD WINAPI IDirect3DVolumeTexture9Impl_GetPriority(LPDIRECT3DVOLUMETEXTURE9 iface) {
158     IDirect3DVolumeTexture9Impl *This = (IDirect3DVolumeTexture9Impl *)iface;
159     DWORD priority;
160
161     TRACE("(%p) Relay\n", This);
162
163     wined3d_mutex_lock();
164
165     priority = IWineD3DVolumeTexture_GetPriority(This->wineD3DVolumeTexture);
166
167     wined3d_mutex_unlock();
168
169     return priority;
170 }
171
172 static void WINAPI IDirect3DVolumeTexture9Impl_PreLoad(LPDIRECT3DVOLUMETEXTURE9 iface) {
173     IDirect3DVolumeTexture9Impl *This = (IDirect3DVolumeTexture9Impl *)iface;
174
175     TRACE("(%p) Relay\n", This);
176
177     wined3d_mutex_lock();
178
179     IWineD3DVolumeTexture_PreLoad(This->wineD3DVolumeTexture);
180
181     wined3d_mutex_unlock();
182 }
183
184 static D3DRESOURCETYPE WINAPI IDirect3DVolumeTexture9Impl_GetType(LPDIRECT3DVOLUMETEXTURE9 iface) {
185     IDirect3DVolumeTexture9Impl *This = (IDirect3DVolumeTexture9Impl *)iface;
186     D3DRESOURCETYPE type;
187
188     TRACE("(%p) Relay\n", This);
189
190     wined3d_mutex_lock();
191
192     type = IWineD3DVolumeTexture_GetType(This->wineD3DVolumeTexture);
193
194     wined3d_mutex_unlock();
195
196     return type;
197 }
198
199 /* IDirect3DVolumeTexture9 IDirect3DBaseTexture9 Interface follow: */
200 static DWORD WINAPI IDirect3DVolumeTexture9Impl_SetLOD(LPDIRECT3DVOLUMETEXTURE9 iface, DWORD LODNew) {
201     IDirect3DVolumeTexture9Impl *This = (IDirect3DVolumeTexture9Impl *)iface;
202     DWORD lod;
203
204     TRACE("(%p) Relay\n", This);
205
206     wined3d_mutex_lock();
207
208     lod = IWineD3DVolumeTexture_SetLOD(This->wineD3DVolumeTexture, LODNew);
209
210     wined3d_mutex_unlock();
211
212     return lod;
213 }
214
215 static DWORD WINAPI IDirect3DVolumeTexture9Impl_GetLOD(LPDIRECT3DVOLUMETEXTURE9 iface) {
216     IDirect3DVolumeTexture9Impl *This = (IDirect3DVolumeTexture9Impl *)iface;
217     DWORD lod;
218
219     TRACE("(%p) Relay\n", This);
220
221     wined3d_mutex_lock();
222
223     lod = IWineD3DVolumeTexture_GetLOD(This->wineD3DVolumeTexture);
224
225     wined3d_mutex_unlock();
226
227     return lod;
228 }
229
230 static DWORD WINAPI IDirect3DVolumeTexture9Impl_GetLevelCount(LPDIRECT3DVOLUMETEXTURE9 iface) {
231     IDirect3DVolumeTexture9Impl *This = (IDirect3DVolumeTexture9Impl *)iface;
232     DWORD level_count;
233
234     TRACE("(%p) Relay\n", This);
235
236     wined3d_mutex_lock();
237
238     level_count = IWineD3DVolumeTexture_GetLevelCount(This->wineD3DVolumeTexture);
239
240     wined3d_mutex_unlock();
241
242     return level_count;
243 }
244
245 static HRESULT WINAPI IDirect3DVolumeTexture9Impl_SetAutoGenFilterType(LPDIRECT3DVOLUMETEXTURE9 iface, D3DTEXTUREFILTERTYPE FilterType) {
246     IDirect3DVolumeTexture9Impl *This = (IDirect3DVolumeTexture9Impl *)iface;
247     HRESULT hr;
248
249     TRACE("(%p) Relay\n", This);
250
251     wined3d_mutex_lock();
252
253     hr = IWineD3DVolumeTexture_SetAutoGenFilterType(This->wineD3DVolumeTexture, (WINED3DTEXTUREFILTERTYPE) FilterType);
254
255     wined3d_mutex_unlock();
256
257     return hr;
258 }
259
260 static D3DTEXTUREFILTERTYPE WINAPI IDirect3DVolumeTexture9Impl_GetAutoGenFilterType(LPDIRECT3DVOLUMETEXTURE9 iface) {
261     IDirect3DVolumeTexture9Impl *This = (IDirect3DVolumeTexture9Impl *)iface;
262     D3DTEXTUREFILTERTYPE filter_type;
263
264     TRACE("(%p) Relay\n", This);
265
266     wined3d_mutex_lock();
267
268     filter_type = (D3DTEXTUREFILTERTYPE)IWineD3DVolumeTexture_GetAutoGenFilterType(This->wineD3DVolumeTexture);
269
270     wined3d_mutex_unlock();
271
272     return filter_type;
273 }
274
275 static void WINAPI IDirect3DVolumeTexture9Impl_GenerateMipSubLevels(LPDIRECT3DVOLUMETEXTURE9 iface) {
276     IDirect3DVolumeTexture9Impl *This = (IDirect3DVolumeTexture9Impl *)iface;
277
278     TRACE("(%p) Relay\n", This);
279
280     wined3d_mutex_lock();
281
282     IWineD3DVolumeTexture_GenerateMipSubLevels(This->wineD3DVolumeTexture);
283
284     wined3d_mutex_unlock();
285 }
286
287 /* IDirect3DVolumeTexture9 Interface follow: */
288 static HRESULT WINAPI IDirect3DVolumeTexture9Impl_GetLevelDesc(LPDIRECT3DVOLUMETEXTURE9 iface, UINT Level, D3DVOLUME_DESC* pDesc) {
289     IDirect3DVolumeTexture9Impl *This = (IDirect3DVolumeTexture9Impl *)iface;
290     WINED3DVOLUME_DESC     wined3ddesc;
291     HRESULT hr;
292
293     TRACE("(%p) Relay\n", This);
294
295     wined3d_mutex_lock();
296
297     hr = IWineD3DVolumeTexture_GetLevelDesc(This->wineD3DVolumeTexture, Level, &wined3ddesc);
298
299     wined3d_mutex_unlock();
300
301     if (SUCCEEDED(hr))
302     {
303         pDesc->Format = d3dformat_from_wined3dformat(wined3ddesc.Format);
304         pDesc->Type = wined3ddesc.Type;
305         pDesc->Usage = wined3ddesc.Usage;
306         pDesc->Pool = wined3ddesc.Pool;
307         pDesc->Width = wined3ddesc.Width;
308         pDesc->Height = wined3ddesc.Height;
309         pDesc->Depth = wined3ddesc.Depth;
310     }
311
312     return hr;
313 }
314
315 static HRESULT WINAPI IDirect3DVolumeTexture9Impl_GetVolumeLevel(LPDIRECT3DVOLUMETEXTURE9 iface, UINT Level, IDirect3DVolume9** ppVolumeLevel) {
316     IDirect3DVolumeTexture9Impl *This = (IDirect3DVolumeTexture9Impl *)iface;
317     HRESULT hrc = D3D_OK;
318     IWineD3DVolume *myVolume = NULL;
319
320     TRACE("(%p) Relay\n", This);
321
322     wined3d_mutex_lock();
323
324     hrc = IWineD3DVolumeTexture_GetVolumeLevel(This->wineD3DVolumeTexture, Level, &myVolume);
325     if (hrc == D3D_OK && NULL != ppVolumeLevel) {
326        IWineD3DVolumeTexture_GetParent(myVolume, (IUnknown **)ppVolumeLevel);
327        IWineD3DVolumeTexture_Release(myVolume);
328     }
329
330     wined3d_mutex_unlock();
331
332     return hrc;
333 }
334
335 static HRESULT WINAPI IDirect3DVolumeTexture9Impl_LockBox(LPDIRECT3DVOLUMETEXTURE9 iface, UINT Level, D3DLOCKED_BOX* pLockedVolume, CONST D3DBOX* pBox, DWORD Flags) {
336     IDirect3DVolumeTexture9Impl *This = (IDirect3DVolumeTexture9Impl *)iface;
337     HRESULT hr;
338
339     TRACE("(%p) Relay %p %p %p %d\n", This, This->wineD3DVolumeTexture, pLockedVolume, pBox,Flags);
340
341     wined3d_mutex_lock();
342
343     hr = IWineD3DVolumeTexture_LockBox(This->wineD3DVolumeTexture, Level, (WINED3DLOCKED_BOX *)pLockedVolume,
344             (const WINED3DBOX *)pBox, Flags);
345
346     wined3d_mutex_unlock();
347
348     return hr;
349 }
350
351 static HRESULT WINAPI IDirect3DVolumeTexture9Impl_UnlockBox(LPDIRECT3DVOLUMETEXTURE9 iface, UINT Level) {
352     IDirect3DVolumeTexture9Impl *This = (IDirect3DVolumeTexture9Impl *)iface;
353     HRESULT hr;
354
355     TRACE("(%p) Relay %p %d\n", This, This->wineD3DVolumeTexture, Level);
356
357     wined3d_mutex_lock();
358
359     hr = IWineD3DVolumeTexture_UnlockBox(This->wineD3DVolumeTexture, Level);
360
361     wined3d_mutex_unlock();
362
363     return hr;
364 }
365
366 static HRESULT WINAPI IDirect3DVolumeTexture9Impl_AddDirtyBox(LPDIRECT3DVOLUMETEXTURE9 iface, CONST D3DBOX* pDirtyBox) {
367     IDirect3DVolumeTexture9Impl *This = (IDirect3DVolumeTexture9Impl *)iface;
368     HRESULT hr;
369
370     TRACE("(%p) Relay\n", This);
371
372     wined3d_mutex_lock();
373
374     hr = IWineD3DVolumeTexture_AddDirtyBox(This->wineD3DVolumeTexture, (CONST WINED3DBOX *)pDirtyBox);
375
376     wined3d_mutex_unlock();
377
378     return hr;
379 }
380
381
382 static const IDirect3DVolumeTexture9Vtbl Direct3DVolumeTexture9_Vtbl =
383 {
384     /* IUnknown */
385     IDirect3DVolumeTexture9Impl_QueryInterface,
386     IDirect3DVolumeTexture9Impl_AddRef,
387     IDirect3DVolumeTexture9Impl_Release,
388     /* IDirect3DResource9 */
389     IDirect3DVolumeTexture9Impl_GetDevice,
390     IDirect3DVolumeTexture9Impl_SetPrivateData,
391     IDirect3DVolumeTexture9Impl_GetPrivateData,
392     IDirect3DVolumeTexture9Impl_FreePrivateData,
393     IDirect3DVolumeTexture9Impl_SetPriority,
394     IDirect3DVolumeTexture9Impl_GetPriority,
395     IDirect3DVolumeTexture9Impl_PreLoad,
396     IDirect3DVolumeTexture9Impl_GetType,
397     /* IDirect3DBaseTexture9 */
398     IDirect3DVolumeTexture9Impl_SetLOD,
399     IDirect3DVolumeTexture9Impl_GetLOD,
400     IDirect3DVolumeTexture9Impl_GetLevelCount,
401     IDirect3DVolumeTexture9Impl_SetAutoGenFilterType,
402     IDirect3DVolumeTexture9Impl_GetAutoGenFilterType,
403     IDirect3DVolumeTexture9Impl_GenerateMipSubLevels,
404     /* IDirect3DVolumeTexture9 */
405     IDirect3DVolumeTexture9Impl_GetLevelDesc,
406     IDirect3DVolumeTexture9Impl_GetVolumeLevel,
407     IDirect3DVolumeTexture9Impl_LockBox,
408     IDirect3DVolumeTexture9Impl_UnlockBox,
409     IDirect3DVolumeTexture9Impl_AddDirtyBox
410 };
411
412 static void STDMETHODCALLTYPE volumetexture_wined3d_object_destroyed(void *parent)
413 {
414     HeapFree(GetProcessHeap(), 0, parent);
415 }
416
417 static const struct wined3d_parent_ops d3d9_volumetexture_wined3d_parent_ops =
418 {
419     volumetexture_wined3d_object_destroyed,
420 };
421
422 HRESULT volumetexture_init(IDirect3DVolumeTexture9Impl *texture, IDirect3DDevice9Impl *device,
423         UINT width, UINT height, UINT depth, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool)
424 {
425     HRESULT hr;
426
427     texture->lpVtbl = &Direct3DVolumeTexture9_Vtbl;
428     texture->ref = 1;
429
430     wined3d_mutex_lock();
431     hr = IWineD3DDevice_CreateVolumeTexture(device->WineD3DDevice, width, height, depth, levels,
432             usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), pool,
433             &texture->wineD3DVolumeTexture, (IUnknown *)texture, &d3d9_volumetexture_wined3d_parent_ops);
434     wined3d_mutex_unlock();
435     if (FAILED(hr))
436     {
437         WARN("Failed to create wined3d volume texture, hr %#x.\n", hr);
438         return hr;
439     }
440
441     texture->parentDevice = (IDirect3DDevice9Ex *)device;
442     IDirect3DDevice9Ex_AddRef(texture->parentDevice);
443
444     return D3D_OK;
445 }