~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Wine Cross Reference
wine/dlls/d3d8/volumetexture.c

Version: ~ [ wine-1.5.30 ] ~ [ wine-1.5.29 ] ~ [ wine-1.5.28 ] ~ [ wine-1.5.27 ] ~ [ wine-1.5.26 ] ~ [ wine-1.5.25 ] ~ [ wine-1.5.24 ] ~ [ wine-1.5.23 ] ~ [ wine-1.5.22 ] ~ [ wine-1.5.21 ] ~ [ wine-1.5.20 ] ~ [ wine-1.5.19 ] ~ [ wine-1.5.18 ] ~ [ wine-1.5.17 ] ~ [ wine-1.5.16 ] ~ [ wine-1.5.15 ] ~ [ wine-1.5.14 ] ~ [ wine-1.5.13 ] ~ [ wine-1.5.12 ] ~ [ wine-1.5.11 ] ~ [ wine-1.5.10 ] ~ [ wine-1.5.9 ] ~ [ wine-1.5.8 ] ~ [ wine-1.5.7 ] ~ [ wine-1.4.1 ] ~ [ wine-1.5.6 ] ~ [ wine-1.5.5 ] ~ [ wine-1.5.4 ] ~ [ wine-1.5.3 ] ~ [ wine-1.5.2 ] ~ [ wine-1.5.1 ] ~ [ wine-1.5.0 ] ~ [ wine-1.4 ] ~ [ wine-1.4-rc6 ] ~ [ wine-1.4-rc5 ] ~ [ wine-1.4-rc4 ] ~ [ wine-1.4-rc3 ] ~ [ wine-1.4-rc2 ] ~ [ wine-1.4-rc1 ] ~ [ wine-1.3.37 ] ~ [ wine-1.3.36 ] ~ [ wine-1.3.35 ] ~ [ wine-1.3.34 ] ~ [ wine-1.3.33 ] ~ [ wine-1.3.32 ] ~ [ wine-1.3.31 ] ~ [ wine-1.3.30 ] ~ [ wine-1.3.29 ] ~ [ wine-1.3.28 ] ~ [ wine-1.3.27 ] ~ [ wine-1.3.26 ] ~ [ wine-1.3.25 ] ~ [ wine-1.3.24 ] ~ [ wine-1.3.23 ] ~ [ wine-1.3.22 ] ~ [ wine-1.3.21 ] ~ [ wine-1.3.20 ] ~ [ wine-1.3.19 ] ~ [ wine-1.3.18 ] ~ [ wine-1.2.3 ] ~ [ wine-1.3.17 ] ~ [ wine-1.3.16 ] ~ [ wine-1.3.15 ] ~ [ wine-1.3.14 ] ~ [ wine-1.3.13 ] ~ [ wine-1.3.12 ] ~ [ wine-1.3.11 ] ~ [ wine-1.3.10 ] ~ [ wine-1.3.9 ] ~ [ wine-1.2.2 ] ~ [ wine-1.3.8 ] ~ [ wine-1.3.7 ] ~ [ wine-1.3.6 ] ~ [ wine-1.3.5 ] ~ [ wine-1.2.1 ] ~ [ wine-1.3.4 ] ~ [ wine-1.3.3 ] ~ [ wine-1.3.2 ] ~ [ wine-1.3.1 ] ~ [ wine-1.3.0 ] ~ [ wine-1.2 ] ~ [ wine-1.2-rc7 ] ~ [ wine-1.2-rc6 ] ~ [ wine-1.2-rc5 ] ~ [ wine-1.2-rc4 ] ~ [ wine-1.2-rc3 ] ~ [ wine-1.2-rc2 ] ~ [ wine-1.2-rc1 ] ~ [ wine-1.1.44 ] ~ [ wine-1.1.43 ] ~ [ wine-1.1.42 ] ~ [ wine-1.1.41 ] ~ [ wine-1.1.40 ] ~ [ wine-1.1.39 ] ~ [ wine-1.1.38 ] ~ [ wine-1.1.37 ] ~ [ wine-1.1.36 ] ~ [ wine-1.1.35 ] ~ [ wine-1.1.34 ] ~ [ wine-1.1.33 ] ~ [ wine-1.1.32 ] ~ [ wine-1.1.31 ] ~ [ wine-1.1.30 ] ~ [ wine-1.1.29 ] ~ [ wine-1.1.28 ] ~ [ wine-1.1.27 ] ~ [ wine-1.1.26 ] ~ [ wine-1.1.25 ] ~ [ wine-1.1.24 ] ~ [ wine-1.1.23 ] ~ [ wine-1.1.22 ] ~ [ wine-1.1.21 ] ~ [ wine-1.1.20 ] ~ [ wine-1.1.19 ] ~ [ wine-1.1.18 ] ~ [ wine-1.1.17 ] ~ [ wine-1.1.16 ] ~ [ wine-1.1.15 ] ~ [ wine-1.1.14 ] ~ [ wine-1.1.13 ] ~ [ wine-1.1.12 ] ~ [ wine-1.1.11 ] ~ [ wine-1.1.10 ] ~ [ wine-1.1.9 ] ~ [ wine-1.1.8 ] ~ [ wine-1.1.7 ] ~ [ wine-1.0.1 ] ~ [ wine-1.1.6 ] ~ [ wine-1.1.5 ] ~ [ wine-1.1.4 ] ~ [ wine-1.1.3 ] ~ [ wine-1.1.2 ] ~ [ wine-1.1.1 ] ~ [ wine-1.1.0 ] ~ [ wine-1.0 ] ~

  1 /*
  2  * IDirect3DVolumeTexture8 implementation
  3  *
  4  * Copyright 2005 Oliver Stieber
  5  *
  6  * This library is free software; you can redistribute it and/or
  7  * modify it under the terms of the GNU Lesser General Public
  8  * License as published by the Free Software Foundation; either
  9  * version 2.1 of the License, or (at your option) any later version.
 10  *
 11  * This library is distributed in the hope that it will be useful,
 12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 14  * Lesser General Public License for more details.
 15  *
 16  * You should have received a copy of the GNU Lesser General Public
 17  * License along with this library; if not, write to the Free Software
 18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 19  */
 20 
 21 #include "config.h"
 22 #include "d3d8_private.h"
 23 
 24 WINE_DEFAULT_DEBUG_CHANNEL(d3d8);
 25 
 26 static inline IDirect3DVolumeTexture8Impl *impl_from_IDirect3DVolumeTexture8(IDirect3DVolumeTexture8 *iface)
 27 {
 28     return CONTAINING_RECORD(iface, IDirect3DVolumeTexture8Impl, IDirect3DVolumeTexture8_iface);
 29 }
 30 
 31 static HRESULT WINAPI IDirect3DVolumeTexture8Impl_QueryInterface(IDirect3DVolumeTexture8 *iface,
 32         REFIID riid, void **ppobj)
 33 {
 34     IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(iface);
 35 
 36     TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), ppobj);
 37 
 38     if (IsEqualGUID(riid, &IID_IUnknown)
 39     || IsEqualGUID(riid, &IID_IDirect3DResource8)
 40     || IsEqualGUID(riid, &IID_IDirect3DBaseTexture8)
 41     || IsEqualGUID(riid, &IID_IDirect3DVolumeTexture8)) {
 42         IUnknown_AddRef(iface);
 43         *ppobj = This;
 44         return S_OK;
 45     }
 46 
 47     WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);
 48     *ppobj = NULL;
 49     return E_NOINTERFACE;
 50 }
 51 
 52 static ULONG WINAPI IDirect3DVolumeTexture8Impl_AddRef(IDirect3DVolumeTexture8 *iface)
 53 {
 54     IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(iface);
 55     ULONG ref = InterlockedIncrement(&This->ref);
 56 
 57     TRACE("%p increasing refcount to %u.\n", iface, ref);
 58 
 59     if (ref == 1)
 60     {
 61         IDirect3DDevice8_AddRef(This->parentDevice);
 62         wined3d_mutex_lock();
 63         wined3d_texture_incref(This->wined3d_texture);
 64         wined3d_mutex_unlock();
 65     }
 66 
 67     return ref;
 68 }
 69 
 70 static ULONG WINAPI IDirect3DVolumeTexture8Impl_Release(IDirect3DVolumeTexture8 *iface)
 71 {
 72     IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(iface);
 73     ULONG ref = InterlockedDecrement(&This->ref);
 74 
 75     TRACE("%p decreasing refcount to %u.\n", iface, ref);
 76 
 77     if (ref == 0) {
 78         IDirect3DDevice8 *parentDevice = This->parentDevice;
 79 
 80         wined3d_mutex_lock();
 81         wined3d_texture_decref(This->wined3d_texture);
 82         wined3d_mutex_unlock();
 83 
 84         /* Release the device last, as it may cause the device to be destroyed. */
 85         IDirect3DDevice8_Release(parentDevice);
 86     }
 87     return ref;
 88 }
 89 
 90 /* IDirect3DVolumeTexture8 IDirect3DResource8 Interface follow: */
 91 static HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetDevice(IDirect3DVolumeTexture8 *iface,
 92         IDirect3DDevice8 **device)
 93 {
 94     IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(iface);
 95 
 96     TRACE("iface %p, device %p.\n", iface, device);
 97 
 98     *device = (IDirect3DDevice8 *)This->parentDevice;
 99     IDirect3DDevice8_AddRef(*device);
100 
101     TRACE("Returning device %p.\n", *device);
102 
103     return D3D_OK;
104 }
105 
106 static HRESULT WINAPI IDirect3DVolumeTexture8Impl_SetPrivateData(IDirect3DVolumeTexture8 *iface,
107         REFGUID refguid, const void *pData, DWORD SizeOfData, DWORD Flags)
108 {
109     IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(iface);
110     HRESULT hr;
111 
112     TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
113             iface, debugstr_guid(refguid), pData, SizeOfData, Flags);
114 
115     wined3d_mutex_lock();
116     hr = wined3d_texture_set_private_data(This->wined3d_texture, refguid, pData, SizeOfData, Flags);
117     wined3d_mutex_unlock();
118 
119     return hr;
120 }
121 
122 static HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetPrivateData(IDirect3DVolumeTexture8 *iface,
123         REFGUID refguid, void *pData, DWORD *pSizeOfData)
124 {
125     IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(iface);
126     HRESULT hr;
127 
128     TRACE("iface %p, guid %s, data %p, data_size %p.\n",
129             iface, debugstr_guid(refguid), pData, pSizeOfData);
130 
131     wined3d_mutex_lock();
132     hr = wined3d_texture_get_private_data(This->wined3d_texture, refguid, pData, pSizeOfData);
133     wined3d_mutex_unlock();
134 
135     return hr;
136 }
137 
138 static HRESULT WINAPI IDirect3DVolumeTexture8Impl_FreePrivateData(IDirect3DVolumeTexture8 *iface,
139         REFGUID refguid)
140 {
141     IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(iface);
142     HRESULT hr;
143 
144     TRACE("iface %p, guid %s.\n", iface, debugstr_guid(refguid));
145 
146     wined3d_mutex_lock();
147     hr = wined3d_texture_free_private_data(This->wined3d_texture, refguid);
148     wined3d_mutex_unlock();
149 
150     return hr;
151 }
152 
153 static DWORD WINAPI IDirect3DVolumeTexture8Impl_SetPriority(IDirect3DVolumeTexture8 *iface,
154         DWORD PriorityNew)
155 {
156     IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(iface);
157     DWORD ret;
158 
159     TRACE("iface %p, priority %u.\n", iface, PriorityNew);
160 
161     wined3d_mutex_lock();
162     ret = wined3d_texture_set_priority(This->wined3d_texture, PriorityNew);
163     wined3d_mutex_unlock();
164 
165     return ret;
166 }
167 
168 static DWORD WINAPI IDirect3DVolumeTexture8Impl_GetPriority(IDirect3DVolumeTexture8 *iface)
169 {
170     IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(iface);
171     DWORD ret;
172 
173     TRACE("iface %p.\n", iface);
174 
175     wined3d_mutex_lock();
176     ret = wined3d_texture_get_priority(This->wined3d_texture);
177     wined3d_mutex_unlock();
178 
179     return ret;
180 }
181 
182 static void WINAPI IDirect3DVolumeTexture8Impl_PreLoad(IDirect3DVolumeTexture8 *iface)
183 {
184     IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(iface);
185 
186     TRACE("iface %p.\n", iface);
187 
188     wined3d_mutex_lock();
189     wined3d_texture_preload(This->wined3d_texture);
190     wined3d_mutex_unlock();
191 }
192 
193 static D3DRESOURCETYPE WINAPI IDirect3DVolumeTexture8Impl_GetType(IDirect3DVolumeTexture8 *iface)
194 {
195     IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(iface);
196     D3DRESOURCETYPE type;
197 
198     TRACE("iface %p.\n", iface);
199 
200     wined3d_mutex_lock();
201     type = wined3d_texture_get_type(This->wined3d_texture);
202     wined3d_mutex_unlock();
203 
204     return type;
205 }
206 
207 /* IDirect3DVolumeTexture8 IDirect3DBaseTexture8 Interface follow: */
208 static DWORD WINAPI IDirect3DVolumeTexture8Impl_SetLOD(IDirect3DVolumeTexture8 *iface, DWORD LODNew)
209 {
210     IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(iface);
211     DWORD ret;
212 
213     TRACE("iface %p, lod %u.\n", iface, LODNew);
214 
215     wined3d_mutex_lock();
216     ret = wined3d_texture_set_lod(This->wined3d_texture, LODNew);
217     wined3d_mutex_unlock();
218 
219     return ret;
220 }
221 
222 static DWORD WINAPI IDirect3DVolumeTexture8Impl_GetLOD(IDirect3DVolumeTexture8 *iface)
223 {
224     IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(iface);
225     DWORD ret;
226 
227     TRACE("iface %p.\n", iface);
228 
229     wined3d_mutex_lock();
230     ret = wined3d_texture_get_lod(This->wined3d_texture);
231     wined3d_mutex_unlock();
232 
233     return ret;
234 }
235 
236 static DWORD WINAPI IDirect3DVolumeTexture8Impl_GetLevelCount(IDirect3DVolumeTexture8 *iface)
237 {
238     IDirect3DVolumeTexture8Impl *This = impl_from_IDirect3DVolumeTexture8(iface);
239     DWORD ret;
240 
241     TRACE("iface %p.\n", iface);
242 
243     wined3d_mutex_lock();
244     ret = wined3d_texture_get_level_count(This->wined3d_texture);
245     wined3d_mutex_unlock();
246 
247     return ret;
248 }
249 
250 static HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetLevelDesc(IDirect3DVolumeTexture8 *iface,
251         UINT level, D3DVOLUME_DESC *desc)
252 {
253     IDirect3DVolumeTexture8Impl *texture = impl_from_IDirect3DVolumeTexture8(iface);
254     struct wined3d_resource *sub_resource;
255     HRESULT hr = D3D_OK;
256 
257     TRACE("iface %p, level %u, desc %p.\n", iface, level, desc);
258 
259     wined3d_mutex_lock();
260     if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level)))
261         hr = D3DERR_INVALIDCALL;
262     else
263     {
264         struct wined3d_resource_desc wined3d_desc;
265 
266         wined3d_resource_get_desc(sub_resource, &wined3d_desc);
267         desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format);
268         desc->Type = wined3d_desc.resource_type;
269         desc->Usage = wined3d_desc.usage;
270         desc->Pool = wined3d_desc.pool;
271         desc->Size = wined3d_desc.size;
272         desc->Width = wined3d_desc.width;
273         desc->Height = wined3d_desc.height;
274         desc->Depth = wined3d_desc.depth;
275     }
276     wined3d_mutex_unlock();
277 
278     return hr;
279 }
280 
281 static HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetVolumeLevel(IDirect3DVolumeTexture8 *iface,
282         UINT level, IDirect3DVolume8 **volume)
283 {
284     IDirect3DVolumeTexture8Impl *texture = impl_from_IDirect3DVolumeTexture8(iface);
285     struct wined3d_resource *sub_resource;
286 
287     TRACE("iface %p, level %u, volume %p.\n", iface, level, volume);
288 
289     wined3d_mutex_lock();
290     if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level)))
291     {
292         wined3d_mutex_unlock();
293         return D3DERR_INVALIDCALL;
294     }
295 
296     *volume = wined3d_resource_get_parent(sub_resource);
297     IDirect3DVolume8_AddRef(*volume);
298     wined3d_mutex_unlock();
299 
300     return D3D_OK;
301 }
302 
303 static HRESULT WINAPI IDirect3DVolumeTexture8Impl_LockBox(IDirect3DVolumeTexture8 *iface,
304         UINT level, D3DLOCKED_BOX *locked_box, const D3DBOX *box, DWORD flags)
305 {
306     IDirect3DVolumeTexture8Impl *texture = impl_from_IDirect3DVolumeTexture8(iface);
307     struct wined3d_resource *sub_resource;
308     HRESULT hr;
309 
310     TRACE("iface %p, level %u, locked_box %p, box %p, flags %#x.\n",
311             iface, level, locked_box, box, flags);
312 
313     wined3d_mutex_lock();
314     if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level)))
315         hr = D3DERR_INVALIDCALL;
316     else
317         hr = IDirect3DVolume8_LockBox((IDirect3DVolume8 *)wined3d_resource_get_parent(sub_resource),
318                 locked_box, box, flags);
319     wined3d_mutex_unlock();
320 
321     return hr;
322 }
323 
324 static HRESULT WINAPI IDirect3DVolumeTexture8Impl_UnlockBox(IDirect3DVolumeTexture8 *iface,
325         UINT level)
326 {
327     IDirect3DVolumeTexture8Impl *texture = impl_from_IDirect3DVolumeTexture8(iface);
328     struct wined3d_resource *sub_resource;
329     HRESULT hr;
330 
331     TRACE("iface %p, level %u.\n", iface, level);
332 
333     wined3d_mutex_lock();
334     if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level)))
335         hr = D3DERR_INVALIDCALL;
336     else
337         hr = IDirect3DVolume8_UnlockBox((IDirect3DVolume8 *)wined3d_resource_get_parent(sub_resource));
338     wined3d_mutex_unlock();
339 
340     return hr;
341 }
342 
343 static HRESULT WINAPI IDirect3DVolumeTexture8Impl_AddDirtyBox(IDirect3DVolumeTexture8 *iface,
344         const D3DBOX *dirty_box)
345 {
346     IDirect3DVolumeTexture8Impl *texture = impl_from_IDirect3DVolumeTexture8(iface);
347     HRESULT hr;
348 
349     TRACE("iface %p, dirty_box %p.\n", iface, dirty_box);
350 
351     wined3d_mutex_lock();
352     hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, 0, (const WINED3DBOX *)dirty_box);
353     wined3d_mutex_unlock();
354 
355     return hr;
356 }
357 
358 static const IDirect3DVolumeTexture8Vtbl Direct3DVolumeTexture8_Vtbl =
359 {
360     /* IUnknown */
361     IDirect3DVolumeTexture8Impl_QueryInterface,
362     IDirect3DVolumeTexture8Impl_AddRef,
363     IDirect3DVolumeTexture8Impl_Release,
364     /* IDirect3DResource8 */
365     IDirect3DVolumeTexture8Impl_GetDevice,
366     IDirect3DVolumeTexture8Impl_SetPrivateData,
367     IDirect3DVolumeTexture8Impl_GetPrivateData,
368     IDirect3DVolumeTexture8Impl_FreePrivateData,
369     IDirect3DVolumeTexture8Impl_SetPriority,
370     IDirect3DVolumeTexture8Impl_GetPriority,
371     IDirect3DVolumeTexture8Impl_PreLoad,
372     IDirect3DVolumeTexture8Impl_GetType,
373     /* IDirect3DBaseTexture8 */
374     IDirect3DVolumeTexture8Impl_SetLOD,
375     IDirect3DVolumeTexture8Impl_GetLOD,
376     IDirect3DVolumeTexture8Impl_GetLevelCount,
377     /* IDirect3DVolumeTexture8 */
378     IDirect3DVolumeTexture8Impl_GetLevelDesc,
379     IDirect3DVolumeTexture8Impl_GetVolumeLevel,
380     IDirect3DVolumeTexture8Impl_LockBox,
381     IDirect3DVolumeTexture8Impl_UnlockBox,
382     IDirect3DVolumeTexture8Impl_AddDirtyBox
383 };
384 
385 static void STDMETHODCALLTYPE volumetexture_wined3d_object_destroyed(void *parent)
386 {
387     HeapFree(GetProcessHeap(), 0, parent);
388 }
389 
390 static const struct wined3d_parent_ops d3d8_volumetexture_wined3d_parent_ops =
391 {
392     volumetexture_wined3d_object_destroyed,
393 };
394 
395 HRESULT volumetexture_init(IDirect3DVolumeTexture8Impl *texture, IDirect3DDevice8Impl *device,
396         UINT width, UINT height, UINT depth, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool)
397 {
398     HRESULT hr;
399 
400     texture->IDirect3DVolumeTexture8_iface.lpVtbl = &Direct3DVolumeTexture8_Vtbl;
401     texture->ref = 1;
402 
403     wined3d_mutex_lock();
404     hr = wined3d_texture_create_3d(device->wined3d_device, width, height, depth, levels,
405             usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), pool, texture,
406             &d3d8_volumetexture_wined3d_parent_ops, &texture->wined3d_texture);
407     wined3d_mutex_unlock();
408     if (FAILED(hr))
409     {
410         WARN("Failed to create wined3d volume texture, hr %#x.\n", hr);
411         return hr;
412     }
413 
414     texture->parentDevice = &device->IDirect3DDevice8_iface;
415     IDirect3DDevice8_AddRef(texture->parentDevice);
416 
417     return D3D_OK;
418 }
419 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.