2 * Copyright 2005 Oliver Stieber
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 #include "d3d8_private.h"
22 WINE_DEFAULT_DEBUG_CHANNEL(d3d8
);
24 static inline struct d3d8_texture
*impl_from_IDirect3DTexture8(IDirect3DTexture8
*iface
)
26 return CONTAINING_RECORD(iface
, struct d3d8_texture
, IDirect3DBaseTexture8_iface
);
29 static inline struct d3d8_texture
*impl_from_IDirect3DCubeTexture8(IDirect3DCubeTexture8
*iface
)
31 return CONTAINING_RECORD(iface
, struct d3d8_texture
, IDirect3DBaseTexture8_iface
);
34 static inline struct d3d8_texture
*impl_from_IDirect3DVolumeTexture8(IDirect3DVolumeTexture8
*iface
)
36 return CONTAINING_RECORD(iface
, struct d3d8_texture
, IDirect3DBaseTexture8_iface
);
39 static HRESULT WINAPI
d3d8_texture_2d_QueryInterface(IDirect3DTexture8
*iface
, REFIID riid
, void **out
)
41 TRACE("iface %p, riid %s, out %p.\n", iface
, debugstr_guid(riid
), out
);
43 if (IsEqualGUID(riid
, &IID_IDirect3DTexture8
)
44 || IsEqualGUID(riid
, &IID_IDirect3DBaseTexture8
)
45 || IsEqualGUID(riid
, &IID_IDirect3DResource8
)
46 || IsEqualGUID(riid
, &IID_IUnknown
))
48 IDirect3DTexture8_AddRef(iface
);
53 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
59 static ULONG WINAPI
d3d8_texture_2d_AddRef(IDirect3DTexture8
*iface
)
61 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
62 ULONG ref
= InterlockedIncrement(&texture
->resource
.refcount
);
64 TRACE("%p increasing refcount to %u.\n", iface
, ref
);
68 IDirect3DDevice8_AddRef(texture
->parent_device
);
70 wined3d_texture_incref(texture
->wined3d_texture
);
71 wined3d_mutex_unlock();
77 static ULONG WINAPI
d3d8_texture_2d_Release(IDirect3DTexture8
*iface
)
79 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
80 ULONG ref
= InterlockedDecrement(&texture
->resource
.refcount
);
82 TRACE("%p decreasing refcount to %u.\n", iface
, ref
);
86 IDirect3DDevice8
*parent_device
= texture
->parent_device
;
89 wined3d_texture_decref(texture
->wined3d_texture
);
90 wined3d_mutex_unlock();
92 /* Release the device last, as it may cause the device to be destroyed. */
93 IDirect3DDevice8_Release(parent_device
);
98 static HRESULT WINAPI
d3d8_texture_2d_GetDevice(IDirect3DTexture8
*iface
, IDirect3DDevice8
**device
)
100 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
102 TRACE("iface %p, device %p.\n", iface
, device
);
104 *device
= texture
->parent_device
;
105 IDirect3DDevice8_AddRef(*device
);
107 TRACE("Returning device %p.\n", *device
);
112 static HRESULT WINAPI
d3d8_texture_2d_SetPrivateData(IDirect3DTexture8
*iface
,
113 REFGUID guid
, const void *data
, DWORD data_size
, DWORD flags
)
115 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
116 TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
117 iface
, debugstr_guid(guid
), data
, data_size
, flags
);
119 return d3d8_resource_set_private_data(&texture
->resource
, guid
, data
, data_size
, flags
);
122 static HRESULT WINAPI
d3d8_texture_2d_GetPrivateData(IDirect3DTexture8
*iface
,
123 REFGUID guid
, void *data
, DWORD
*data_size
)
125 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
126 TRACE("iface %p, guid %s, data %p, data_size %p.\n",
127 iface
, debugstr_guid(guid
), data
, data_size
);
129 return d3d8_resource_get_private_data(&texture
->resource
, guid
, data
, data_size
);
132 static HRESULT WINAPI
d3d8_texture_2d_FreePrivateData(IDirect3DTexture8
*iface
, REFGUID guid
)
134 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
135 TRACE("iface %p, guid %s.\n", iface
, debugstr_guid(guid
));
137 return d3d8_resource_free_private_data(&texture
->resource
, guid
);
140 static DWORD WINAPI
d3d8_texture_2d_SetPriority(IDirect3DTexture8
*iface
, DWORD priority
)
142 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
143 struct wined3d_resource
*resource
;
146 TRACE("iface %p, priority %u.\n", iface
, priority
);
148 wined3d_mutex_lock();
149 resource
= wined3d_texture_get_resource(texture
->wined3d_texture
);
150 ret
= wined3d_resource_set_priority(resource
, priority
);
151 wined3d_mutex_unlock();
156 static DWORD WINAPI
d3d8_texture_2d_GetPriority(IDirect3DTexture8
*iface
)
158 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
159 const struct wined3d_resource
*resource
;
162 TRACE("iface %p.\n", iface
);
164 wined3d_mutex_lock();
165 resource
= wined3d_texture_get_resource(texture
->wined3d_texture
);
166 ret
= wined3d_resource_get_priority(resource
);
167 wined3d_mutex_unlock();
172 static void WINAPI
d3d8_texture_2d_PreLoad(IDirect3DTexture8
*iface
)
174 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
176 TRACE("iface %p.\n", iface
);
178 wined3d_mutex_lock();
179 wined3d_texture_preload(texture
->wined3d_texture
);
180 wined3d_mutex_unlock();
183 static D3DRESOURCETYPE WINAPI
d3d8_texture_2d_GetType(IDirect3DTexture8
*iface
)
185 TRACE("iface %p.\n", iface
);
187 return D3DRTYPE_TEXTURE
;
190 static DWORD WINAPI
d3d8_texture_2d_SetLOD(IDirect3DTexture8
*iface
, DWORD lod
)
192 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
195 TRACE("iface %p, lod %u.\n", iface
, lod
);
197 wined3d_mutex_lock();
198 ret
= wined3d_texture_set_lod(texture
->wined3d_texture
, lod
);
199 wined3d_mutex_unlock();
204 static DWORD WINAPI
d3d8_texture_2d_GetLOD(IDirect3DTexture8
*iface
)
206 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
209 TRACE("iface %p.\n", iface
);
211 wined3d_mutex_lock();
212 ret
= wined3d_texture_get_lod(texture
->wined3d_texture
);
213 wined3d_mutex_unlock();
218 static DWORD WINAPI
d3d8_texture_2d_GetLevelCount(IDirect3DTexture8
*iface
)
220 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
223 TRACE("iface %p.\n", iface
);
225 wined3d_mutex_lock();
226 ret
= wined3d_texture_get_level_count(texture
->wined3d_texture
);
227 wined3d_mutex_unlock();
232 static HRESULT WINAPI
d3d8_texture_2d_GetLevelDesc(IDirect3DTexture8
*iface
, UINT level
, D3DSURFACE_DESC
*desc
)
234 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
235 struct wined3d_resource
*sub_resource
;
238 TRACE("iface %p, level %u, desc %p.\n", iface
, level
, desc
);
240 wined3d_mutex_lock();
241 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, level
)))
242 hr
= D3DERR_INVALIDCALL
;
245 struct wined3d_resource_desc wined3d_desc
;
247 wined3d_resource_get_desc(sub_resource
, &wined3d_desc
);
248 desc
->Format
= d3dformat_from_wined3dformat(wined3d_desc
.format
);
249 desc
->Type
= wined3d_desc
.resource_type
;
250 desc
->Usage
= wined3d_desc
.usage
& WINED3DUSAGE_MASK
;
251 desc
->Pool
= wined3d_desc
.pool
;
252 desc
->Size
= wined3d_desc
.size
;
253 desc
->MultiSampleType
= wined3d_desc
.multisample_type
;
254 desc
->Width
= wined3d_desc
.width
;
255 desc
->Height
= wined3d_desc
.height
;
257 wined3d_mutex_unlock();
262 static HRESULT WINAPI
d3d8_texture_2d_GetSurfaceLevel(IDirect3DTexture8
*iface
,
263 UINT level
, IDirect3DSurface8
**surface
)
265 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
266 struct wined3d_resource
*sub_resource
;
267 struct d3d8_surface
*surface_impl
;
269 TRACE("iface %p, level %u, surface %p.\n", iface
, level
, surface
);
271 wined3d_mutex_lock();
272 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, level
)))
274 wined3d_mutex_unlock();
275 return D3DERR_INVALIDCALL
;
278 surface_impl
= wined3d_resource_get_parent(sub_resource
);
279 *surface
= &surface_impl
->IDirect3DSurface8_iface
;
280 IDirect3DSurface8_AddRef(*surface
);
281 wined3d_mutex_unlock();
286 static HRESULT WINAPI
d3d8_texture_2d_LockRect(IDirect3DTexture8
*iface
, UINT level
,
287 D3DLOCKED_RECT
*locked_rect
, const RECT
*rect
, DWORD flags
)
289 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
290 struct wined3d_resource
*sub_resource
;
291 struct d3d8_surface
*surface_impl
;
294 TRACE("iface %p, level %u, locked_rect %p, rect %p, flags %#x.\n",
295 iface
, level
, locked_rect
, rect
, flags
);
297 wined3d_mutex_lock();
298 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, level
)))
299 hr
= D3DERR_INVALIDCALL
;
302 surface_impl
= wined3d_resource_get_parent(sub_resource
);
303 hr
= IDirect3DSurface8_LockRect(&surface_impl
->IDirect3DSurface8_iface
, locked_rect
, rect
, flags
);
305 wined3d_mutex_unlock();
310 static HRESULT WINAPI
d3d8_texture_2d_UnlockRect(IDirect3DTexture8
*iface
, UINT level
)
312 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
313 struct wined3d_resource
*sub_resource
;
314 struct d3d8_surface
*surface_impl
;
317 TRACE("iface %p, level %u.\n", iface
, level
);
319 wined3d_mutex_lock();
320 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, level
)))
321 hr
= D3DERR_INVALIDCALL
;
324 surface_impl
= wined3d_resource_get_parent(sub_resource
);
325 hr
= IDirect3DSurface8_UnlockRect(&surface_impl
->IDirect3DSurface8_iface
);
327 wined3d_mutex_unlock();
332 static HRESULT WINAPI
d3d8_texture_2d_AddDirtyRect(IDirect3DTexture8
*iface
, const RECT
*dirty_rect
)
334 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
337 TRACE("iface %p, dirty_rect %s.\n",
338 iface
, wine_dbgstr_rect(dirty_rect
));
340 wined3d_mutex_lock();
342 hr
= wined3d_texture_add_dirty_region(texture
->wined3d_texture
, 0, NULL
);
345 struct wined3d_box dirty_region
;
347 dirty_region
.left
= dirty_rect
->left
;
348 dirty_region
.top
= dirty_rect
->top
;
349 dirty_region
.right
= dirty_rect
->right
;
350 dirty_region
.bottom
= dirty_rect
->bottom
;
351 dirty_region
.front
= 0;
352 dirty_region
.back
= 1;
353 hr
= wined3d_texture_add_dirty_region(texture
->wined3d_texture
, 0, &dirty_region
);
355 wined3d_mutex_unlock();
360 static const IDirect3DTexture8Vtbl Direct3DTexture8_Vtbl
=
363 d3d8_texture_2d_QueryInterface
,
364 d3d8_texture_2d_AddRef
,
365 d3d8_texture_2d_Release
,
366 /* IDirect3DResource8 */
367 d3d8_texture_2d_GetDevice
,
368 d3d8_texture_2d_SetPrivateData
,
369 d3d8_texture_2d_GetPrivateData
,
370 d3d8_texture_2d_FreePrivateData
,
371 d3d8_texture_2d_SetPriority
,
372 d3d8_texture_2d_GetPriority
,
373 d3d8_texture_2d_PreLoad
,
374 d3d8_texture_2d_GetType
,
375 /* IDirect3dBaseTexture8 */
376 d3d8_texture_2d_SetLOD
,
377 d3d8_texture_2d_GetLOD
,
378 d3d8_texture_2d_GetLevelCount
,
379 /* IDirect3DTexture8 */
380 d3d8_texture_2d_GetLevelDesc
,
381 d3d8_texture_2d_GetSurfaceLevel
,
382 d3d8_texture_2d_LockRect
,
383 d3d8_texture_2d_UnlockRect
,
384 d3d8_texture_2d_AddDirtyRect
,
387 static HRESULT WINAPI
d3d8_texture_cube_QueryInterface(IDirect3DCubeTexture8
*iface
, REFIID riid
, void **out
)
389 TRACE("iface %p, riid %s, out %p.\n", iface
, debugstr_guid(riid
), out
);
391 if (IsEqualGUID(riid
, &IID_IDirect3DCubeTexture8
)
392 || IsEqualGUID(riid
, &IID_IDirect3DBaseTexture8
)
393 || IsEqualGUID(riid
, &IID_IDirect3DResource8
)
394 || IsEqualGUID(riid
, &IID_IUnknown
))
396 IDirect3DCubeTexture8_AddRef(iface
);
401 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
404 return E_NOINTERFACE
;
407 static ULONG WINAPI
d3d8_texture_cube_AddRef(IDirect3DCubeTexture8
*iface
)
409 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
410 ULONG ref
= InterlockedIncrement(&texture
->resource
.refcount
);
412 TRACE("%p increasing refcount to %u.\n", iface
, ref
);
416 IDirect3DDevice8_AddRef(texture
->parent_device
);
417 wined3d_mutex_lock();
418 wined3d_texture_incref(texture
->wined3d_texture
);
419 wined3d_mutex_unlock();
425 static ULONG WINAPI
d3d8_texture_cube_Release(IDirect3DCubeTexture8
*iface
)
427 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
428 ULONG ref
= InterlockedDecrement(&texture
->resource
.refcount
);
430 TRACE("%p decreasing refcount to %u.\n", iface
, ref
);
434 IDirect3DDevice8
*parent_device
= texture
->parent_device
;
436 TRACE("Releasing child %p.\n", texture
->wined3d_texture
);
438 wined3d_mutex_lock();
439 wined3d_texture_decref(texture
->wined3d_texture
);
440 wined3d_mutex_unlock();
442 /* Release the device last, as it may cause the device to be destroyed. */
443 IDirect3DDevice8_Release(parent_device
);
448 static HRESULT WINAPI
d3d8_texture_cube_GetDevice(IDirect3DCubeTexture8
*iface
, IDirect3DDevice8
**device
)
450 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
452 TRACE("iface %p, device %p.\n", iface
, device
);
454 *device
= texture
->parent_device
;
455 IDirect3DDevice8_AddRef(*device
);
457 TRACE("Returning device %p.\n", *device
);
462 static HRESULT WINAPI
d3d8_texture_cube_SetPrivateData(IDirect3DCubeTexture8
*iface
,
463 REFGUID guid
, const void *data
, DWORD data_size
, DWORD flags
)
465 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
466 TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
467 iface
, debugstr_guid(guid
), data
, data_size
, flags
);
469 return d3d8_resource_set_private_data(&texture
->resource
, guid
, data
, data_size
, flags
);
472 static HRESULT WINAPI
d3d8_texture_cube_GetPrivateData(IDirect3DCubeTexture8
*iface
,
473 REFGUID guid
, void *data
, DWORD
*data_size
)
475 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
476 TRACE("iface %p, guid %s, data %p, data_size %p.\n",
477 iface
, debugstr_guid(guid
), data
, data_size
);
479 return d3d8_resource_get_private_data(&texture
->resource
, guid
, data
, data_size
);
482 static HRESULT WINAPI
d3d8_texture_cube_FreePrivateData(IDirect3DCubeTexture8
*iface
, REFGUID guid
)
484 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
485 TRACE("iface %p, guid %s.\n", iface
, debugstr_guid(guid
));
487 return d3d8_resource_free_private_data(&texture
->resource
, guid
);
490 static DWORD WINAPI
d3d8_texture_cube_SetPriority(IDirect3DCubeTexture8
*iface
, DWORD priority
)
492 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
493 struct wined3d_resource
*resource
;
496 TRACE("iface %p, priority %u.\n", iface
, priority
);
498 wined3d_mutex_lock();
499 resource
= wined3d_texture_get_resource(texture
->wined3d_texture
);
500 ret
= wined3d_resource_set_priority(resource
, priority
);
501 wined3d_mutex_unlock();
506 static DWORD WINAPI
d3d8_texture_cube_GetPriority(IDirect3DCubeTexture8
*iface
)
508 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
509 const struct wined3d_resource
*resource
;
512 TRACE("iface %p.\n", iface
);
514 wined3d_mutex_lock();
515 resource
= wined3d_texture_get_resource(texture
->wined3d_texture
);
516 ret
= wined3d_resource_get_priority(resource
);
517 wined3d_mutex_unlock();
522 static void WINAPI
d3d8_texture_cube_PreLoad(IDirect3DCubeTexture8
*iface
)
524 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
526 TRACE("iface %p.\n", iface
);
528 wined3d_mutex_lock();
529 wined3d_texture_preload(texture
->wined3d_texture
);
530 wined3d_mutex_unlock();
533 static D3DRESOURCETYPE WINAPI
d3d8_texture_cube_GetType(IDirect3DCubeTexture8
*iface
)
535 TRACE("iface %p.\n", iface
);
537 return D3DRTYPE_CUBETEXTURE
;
540 static DWORD WINAPI
d3d8_texture_cube_SetLOD(IDirect3DCubeTexture8
*iface
, DWORD lod
)
542 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
545 TRACE("iface %p, lod %u.\n", iface
, lod
);
547 wined3d_mutex_lock();
548 ret
= wined3d_texture_set_lod(texture
->wined3d_texture
, lod
);
549 wined3d_mutex_unlock();
554 static DWORD WINAPI
d3d8_texture_cube_GetLOD(IDirect3DCubeTexture8
*iface
)
556 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
559 TRACE("iface %p.\n", iface
);
561 wined3d_mutex_lock();
562 ret
= wined3d_texture_get_lod(texture
->wined3d_texture
);
563 wined3d_mutex_unlock();
568 static DWORD WINAPI
d3d8_texture_cube_GetLevelCount(IDirect3DCubeTexture8
*iface
)
570 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
573 TRACE("iface %p.\n", iface
);
575 wined3d_mutex_lock();
576 ret
= wined3d_texture_get_level_count(texture
->wined3d_texture
);
577 wined3d_mutex_unlock();
582 static HRESULT WINAPI
d3d8_texture_cube_GetLevelDesc(IDirect3DCubeTexture8
*iface
, UINT level
, D3DSURFACE_DESC
*desc
)
584 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
585 struct wined3d_resource
*sub_resource
;
588 TRACE("iface %p, level %u, desc %p.\n", iface
, level
, desc
);
590 wined3d_mutex_lock();
591 if (level
>= wined3d_texture_get_level_count(texture
->wined3d_texture
))
593 wined3d_mutex_unlock();
594 return D3DERR_INVALIDCALL
;
597 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, level
)))
598 hr
= D3DERR_INVALIDCALL
;
601 struct wined3d_resource_desc wined3d_desc
;
603 wined3d_resource_get_desc(sub_resource
, &wined3d_desc
);
604 desc
->Format
= d3dformat_from_wined3dformat(wined3d_desc
.format
);
605 desc
->Type
= wined3d_desc
.resource_type
;
606 desc
->Usage
= wined3d_desc
.usage
& WINED3DUSAGE_MASK
;
607 desc
->Pool
= wined3d_desc
.pool
;
608 desc
->Size
= wined3d_desc
.size
;
609 desc
->MultiSampleType
= wined3d_desc
.multisample_type
;
610 desc
->Width
= wined3d_desc
.width
;
611 desc
->Height
= wined3d_desc
.height
;
613 wined3d_mutex_unlock();
618 static HRESULT WINAPI
d3d8_texture_cube_GetCubeMapSurface(IDirect3DCubeTexture8
*iface
,
619 D3DCUBEMAP_FACES face
, UINT level
, IDirect3DSurface8
**surface
)
621 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
622 struct wined3d_resource
*sub_resource
;
623 struct d3d8_surface
*surface_impl
;
624 UINT sub_resource_idx
;
627 TRACE("iface %p, face %#x, level %u, surface %p.\n", iface
, face
, level
, surface
);
629 wined3d_mutex_lock();
630 level_count
= wined3d_texture_get_level_count(texture
->wined3d_texture
);
631 if (level
>= level_count
)
633 wined3d_mutex_unlock();
634 return D3DERR_INVALIDCALL
;
637 sub_resource_idx
= level_count
* face
+ level
;
638 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, sub_resource_idx
)))
640 wined3d_mutex_unlock();
641 return D3DERR_INVALIDCALL
;
644 surface_impl
= wined3d_resource_get_parent(sub_resource
);
645 *surface
= &surface_impl
->IDirect3DSurface8_iface
;
646 IDirect3DSurface8_AddRef(*surface
);
647 wined3d_mutex_unlock();
652 static HRESULT WINAPI
d3d8_texture_cube_LockRect(IDirect3DCubeTexture8
*iface
,
653 D3DCUBEMAP_FACES face
, UINT level
, D3DLOCKED_RECT
*locked_rect
, const RECT
*rect
,
656 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
657 struct wined3d_resource
*sub_resource
;
658 struct d3d8_surface
*surface_impl
;
659 UINT sub_resource_idx
;
662 TRACE("iface %p, face %#x, level %u, locked_rect %p, rect %p, flags %#x.\n",
663 iface
, face
, level
, locked_rect
, rect
, flags
);
665 wined3d_mutex_lock();
666 sub_resource_idx
= wined3d_texture_get_level_count(texture
->wined3d_texture
) * face
+ level
;
667 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, sub_resource_idx
)))
668 hr
= D3DERR_INVALIDCALL
;
671 surface_impl
= wined3d_resource_get_parent(sub_resource
);
672 hr
= IDirect3DSurface8_LockRect(&surface_impl
->IDirect3DSurface8_iface
, locked_rect
, rect
, flags
);
674 wined3d_mutex_unlock();
679 static HRESULT WINAPI
d3d8_texture_cube_UnlockRect(IDirect3DCubeTexture8
*iface
,
680 D3DCUBEMAP_FACES face
, UINT level
)
682 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
683 struct wined3d_resource
*sub_resource
;
684 struct d3d8_surface
*surface_impl
;
685 UINT sub_resource_idx
;
688 TRACE("iface %p, face %#x, level %u.\n", iface
, face
, level
);
690 wined3d_mutex_lock();
691 sub_resource_idx
= wined3d_texture_get_level_count(texture
->wined3d_texture
) * face
+ level
;
692 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, sub_resource_idx
)))
693 hr
= D3DERR_INVALIDCALL
;
696 surface_impl
= wined3d_resource_get_parent(sub_resource
);
697 hr
= IDirect3DSurface8_UnlockRect(&surface_impl
->IDirect3DSurface8_iface
);
699 wined3d_mutex_unlock();
704 static HRESULT WINAPI
d3d8_texture_cube_AddDirtyRect(IDirect3DCubeTexture8
*iface
,
705 D3DCUBEMAP_FACES face
, const RECT
*dirty_rect
)
707 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
710 TRACE("iface %p, face %#x, dirty_rect %s.\n",
711 iface
, face
, wine_dbgstr_rect(dirty_rect
));
713 wined3d_mutex_lock();
715 hr
= wined3d_texture_add_dirty_region(texture
->wined3d_texture
, face
, NULL
);
718 struct wined3d_box dirty_region
;
720 dirty_region
.left
= dirty_rect
->left
;
721 dirty_region
.top
= dirty_rect
->top
;
722 dirty_region
.right
= dirty_rect
->right
;
723 dirty_region
.bottom
= dirty_rect
->bottom
;
724 dirty_region
.front
= 0;
725 dirty_region
.back
= 1;
726 hr
= wined3d_texture_add_dirty_region(texture
->wined3d_texture
, face
, &dirty_region
);
728 wined3d_mutex_unlock();
733 static const IDirect3DCubeTexture8Vtbl Direct3DCubeTexture8_Vtbl
=
736 d3d8_texture_cube_QueryInterface
,
737 d3d8_texture_cube_AddRef
,
738 d3d8_texture_cube_Release
,
739 /* IDirect3DResource8 */
740 d3d8_texture_cube_GetDevice
,
741 d3d8_texture_cube_SetPrivateData
,
742 d3d8_texture_cube_GetPrivateData
,
743 d3d8_texture_cube_FreePrivateData
,
744 d3d8_texture_cube_SetPriority
,
745 d3d8_texture_cube_GetPriority
,
746 d3d8_texture_cube_PreLoad
,
747 d3d8_texture_cube_GetType
,
748 /* IDirect3DBaseTexture8 */
749 d3d8_texture_cube_SetLOD
,
750 d3d8_texture_cube_GetLOD
,
751 d3d8_texture_cube_GetLevelCount
,
752 /* IDirect3DCubeTexture8 */
753 d3d8_texture_cube_GetLevelDesc
,
754 d3d8_texture_cube_GetCubeMapSurface
,
755 d3d8_texture_cube_LockRect
,
756 d3d8_texture_cube_UnlockRect
,
757 d3d8_texture_cube_AddDirtyRect
,
760 static HRESULT WINAPI
d3d8_texture_3d_QueryInterface(IDirect3DVolumeTexture8
*iface
, REFIID riid
, void **out
)
762 TRACE("iface %p, riid %s, out %p.\n", iface
, debugstr_guid(riid
), out
);
764 if (IsEqualGUID(riid
, &IID_IDirect3DVolumeTexture8
)
765 || IsEqualGUID(riid
, &IID_IDirect3DBaseTexture8
)
766 || IsEqualGUID(riid
, &IID_IDirect3DResource8
)
767 || IsEqualGUID(riid
, &IID_IUnknown
))
769 IDirect3DVolumeTexture8_AddRef(iface
);
774 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
777 return E_NOINTERFACE
;
780 static ULONG WINAPI
d3d8_texture_3d_AddRef(IDirect3DVolumeTexture8
*iface
)
782 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
783 ULONG ref
= InterlockedIncrement(&texture
->resource
.refcount
);
785 TRACE("%p increasing refcount to %u.\n", iface
, ref
);
789 IDirect3DDevice8_AddRef(texture
->parent_device
);
790 wined3d_mutex_lock();
791 wined3d_texture_incref(texture
->wined3d_texture
);
792 wined3d_mutex_unlock();
798 static ULONG WINAPI
d3d8_texture_3d_Release(IDirect3DVolumeTexture8
*iface
)
800 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
801 ULONG ref
= InterlockedDecrement(&texture
->resource
.refcount
);
803 TRACE("%p decreasing refcount to %u.\n", iface
, ref
);
807 IDirect3DDevice8
*parent_device
= texture
->parent_device
;
809 wined3d_mutex_lock();
810 wined3d_texture_decref(texture
->wined3d_texture
);
811 wined3d_mutex_unlock();
813 /* Release the device last, as it may cause the device to be destroyed. */
814 IDirect3DDevice8_Release(parent_device
);
819 static HRESULT WINAPI
d3d8_texture_3d_GetDevice(IDirect3DVolumeTexture8
*iface
, IDirect3DDevice8
**device
)
821 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
823 TRACE("iface %p, device %p.\n", iface
, device
);
825 *device
= texture
->parent_device
;
826 IDirect3DDevice8_AddRef(*device
);
828 TRACE("Returning device %p.\n", *device
);
833 static HRESULT WINAPI
d3d8_texture_3d_SetPrivateData(IDirect3DVolumeTexture8
*iface
,
834 REFGUID guid
, const void *data
, DWORD data_size
, DWORD flags
)
836 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
837 TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
838 iface
, debugstr_guid(guid
), data
, data_size
, flags
);
840 return d3d8_resource_set_private_data(&texture
->resource
, guid
, data
, data_size
, flags
);
843 static HRESULT WINAPI
d3d8_texture_3d_GetPrivateData(IDirect3DVolumeTexture8
*iface
,
844 REFGUID guid
, void *data
, DWORD
*data_size
)
846 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
847 TRACE("iface %p, guid %s, data %p, data_size %p.\n",
848 iface
, debugstr_guid(guid
), data
, data_size
);
850 return d3d8_resource_get_private_data(&texture
->resource
, guid
, data
, data_size
);
853 static HRESULT WINAPI
d3d8_texture_3d_FreePrivateData(IDirect3DVolumeTexture8
*iface
, REFGUID guid
)
855 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
856 TRACE("iface %p, guid %s.\n", iface
, debugstr_guid(guid
));
858 return d3d8_resource_free_private_data(&texture
->resource
, guid
);
861 static DWORD WINAPI
d3d8_texture_3d_SetPriority(IDirect3DVolumeTexture8
*iface
, DWORD priority
)
863 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
864 struct wined3d_resource
*resource
;
867 TRACE("iface %p, priority %u.\n", iface
, priority
);
869 wined3d_mutex_lock();
870 resource
= wined3d_texture_get_resource(texture
->wined3d_texture
);
871 ret
= wined3d_resource_set_priority(resource
, priority
);
872 wined3d_mutex_unlock();
877 static DWORD WINAPI
d3d8_texture_3d_GetPriority(IDirect3DVolumeTexture8
*iface
)
879 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
880 const struct wined3d_resource
*resource
;
883 TRACE("iface %p.\n", iface
);
885 wined3d_mutex_lock();
886 resource
= wined3d_texture_get_resource(texture
->wined3d_texture
);
887 ret
= wined3d_resource_get_priority(resource
);
888 wined3d_mutex_unlock();
893 static void WINAPI
d3d8_texture_3d_PreLoad(IDirect3DVolumeTexture8
*iface
)
895 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
897 TRACE("iface %p.\n", iface
);
899 wined3d_mutex_lock();
900 wined3d_texture_preload(texture
->wined3d_texture
);
901 wined3d_mutex_unlock();
904 static D3DRESOURCETYPE WINAPI
d3d8_texture_3d_GetType(IDirect3DVolumeTexture8
*iface
)
906 TRACE("iface %p.\n", iface
);
908 return D3DRTYPE_VOLUMETEXTURE
;
911 static DWORD WINAPI
d3d8_texture_3d_SetLOD(IDirect3DVolumeTexture8
*iface
, DWORD lod
)
913 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
916 TRACE("iface %p, lod %u.\n", iface
, lod
);
918 wined3d_mutex_lock();
919 ret
= wined3d_texture_set_lod(texture
->wined3d_texture
, lod
);
920 wined3d_mutex_unlock();
925 static DWORD WINAPI
d3d8_texture_3d_GetLOD(IDirect3DVolumeTexture8
*iface
)
927 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
930 TRACE("iface %p.\n", iface
);
932 wined3d_mutex_lock();
933 ret
= wined3d_texture_get_lod(texture
->wined3d_texture
);
934 wined3d_mutex_unlock();
939 static DWORD WINAPI
d3d8_texture_3d_GetLevelCount(IDirect3DVolumeTexture8
*iface
)
941 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
944 TRACE("iface %p.\n", iface
);
946 wined3d_mutex_lock();
947 ret
= wined3d_texture_get_level_count(texture
->wined3d_texture
);
948 wined3d_mutex_unlock();
953 static HRESULT WINAPI
d3d8_texture_3d_GetLevelDesc(IDirect3DVolumeTexture8
*iface
, UINT level
, D3DVOLUME_DESC
*desc
)
955 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
956 struct wined3d_resource
*sub_resource
;
959 TRACE("iface %p, level %u, desc %p.\n", iface
, level
, desc
);
961 wined3d_mutex_lock();
962 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, level
)))
963 hr
= D3DERR_INVALIDCALL
;
966 struct wined3d_resource_desc wined3d_desc
;
968 wined3d_resource_get_desc(sub_resource
, &wined3d_desc
);
969 desc
->Format
= d3dformat_from_wined3dformat(wined3d_desc
.format
);
970 desc
->Type
= wined3d_desc
.resource_type
;
971 desc
->Usage
= wined3d_desc
.usage
& WINED3DUSAGE_MASK
;
972 desc
->Pool
= wined3d_desc
.pool
;
973 desc
->Size
= wined3d_desc
.size
;
974 desc
->Width
= wined3d_desc
.width
;
975 desc
->Height
= wined3d_desc
.height
;
976 desc
->Depth
= wined3d_desc
.depth
;
978 wined3d_mutex_unlock();
983 static HRESULT WINAPI
d3d8_texture_3d_GetVolumeLevel(IDirect3DVolumeTexture8
*iface
,
984 UINT level
, IDirect3DVolume8
**volume
)
986 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
987 struct wined3d_resource
*sub_resource
;
988 struct d3d8_volume
*volume_impl
;
990 TRACE("iface %p, level %u, volume %p.\n", iface
, level
, volume
);
992 wined3d_mutex_lock();
993 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, level
)))
995 wined3d_mutex_unlock();
996 return D3DERR_INVALIDCALL
;
999 volume_impl
= wined3d_resource_get_parent(sub_resource
);
1000 *volume
= &volume_impl
->IDirect3DVolume8_iface
;
1001 IDirect3DVolume8_AddRef(*volume
);
1002 wined3d_mutex_unlock();
1007 static HRESULT WINAPI
d3d8_texture_3d_LockBox(IDirect3DVolumeTexture8
*iface
,
1008 UINT level
, D3DLOCKED_BOX
*locked_box
, const D3DBOX
*box
, DWORD flags
)
1010 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
1011 struct wined3d_resource
*sub_resource
;
1012 struct d3d8_volume
*volume_impl
;
1015 TRACE("iface %p, level %u, locked_box %p, box %p, flags %#x.\n",
1016 iface
, level
, locked_box
, box
, flags
);
1018 wined3d_mutex_lock();
1019 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, level
)))
1020 hr
= D3DERR_INVALIDCALL
;
1023 volume_impl
= wined3d_resource_get_parent(sub_resource
);
1024 hr
= IDirect3DVolume8_LockBox(&volume_impl
->IDirect3DVolume8_iface
, locked_box
, box
, flags
);
1026 wined3d_mutex_unlock();
1031 static HRESULT WINAPI
d3d8_texture_3d_UnlockBox(IDirect3DVolumeTexture8
*iface
, UINT level
)
1033 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
1034 struct wined3d_resource
*sub_resource
;
1035 struct d3d8_volume
*volume_impl
;
1038 TRACE("iface %p, level %u.\n", iface
, level
);
1040 wined3d_mutex_lock();
1041 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, level
)))
1042 hr
= D3DERR_INVALIDCALL
;
1045 volume_impl
= wined3d_resource_get_parent(sub_resource
);
1046 hr
= IDirect3DVolume8_UnlockBox(&volume_impl
->IDirect3DVolume8_iface
);
1048 wined3d_mutex_unlock();
1053 static HRESULT WINAPI
d3d8_texture_3d_AddDirtyBox(IDirect3DVolumeTexture8
*iface
, const D3DBOX
*dirty_box
)
1055 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
1058 TRACE("iface %p, dirty_box %p.\n", iface
, dirty_box
);
1060 wined3d_mutex_lock();
1061 hr
= wined3d_texture_add_dirty_region(texture
->wined3d_texture
, 0, (const struct wined3d_box
*)dirty_box
);
1062 wined3d_mutex_unlock();
1067 static const IDirect3DVolumeTexture8Vtbl Direct3DVolumeTexture8_Vtbl
=
1070 d3d8_texture_3d_QueryInterface
,
1071 d3d8_texture_3d_AddRef
,
1072 d3d8_texture_3d_Release
,
1073 /* IDirect3DResource8 */
1074 d3d8_texture_3d_GetDevice
,
1075 d3d8_texture_3d_SetPrivateData
,
1076 d3d8_texture_3d_GetPrivateData
,
1077 d3d8_texture_3d_FreePrivateData
,
1078 d3d8_texture_3d_SetPriority
,
1079 d3d8_texture_3d_GetPriority
,
1080 d3d8_texture_3d_PreLoad
,
1081 d3d8_texture_3d_GetType
,
1082 /* IDirect3DBaseTexture8 */
1083 d3d8_texture_3d_SetLOD
,
1084 d3d8_texture_3d_GetLOD
,
1085 d3d8_texture_3d_GetLevelCount
,
1086 /* IDirect3DVolumeTexture8 */
1087 d3d8_texture_3d_GetLevelDesc
,
1088 d3d8_texture_3d_GetVolumeLevel
,
1089 d3d8_texture_3d_LockBox
,
1090 d3d8_texture_3d_UnlockBox
,
1091 d3d8_texture_3d_AddDirtyBox
1094 struct d3d8_texture
*unsafe_impl_from_IDirect3DBaseTexture8(IDirect3DBaseTexture8
*iface
)
1099 /* SetTexture() in particular doesn't do a lot of validation on the pointer
1100 * that gets passed in, and passing an invalid pointer works as long as the
1101 * application doesn't try to actually render anything with it, so we print
1102 * a WARN and return NULL instead of having the usual assert() here.
1103 * One application affected by this is Fishdom 2. */
1104 if (iface
->lpVtbl
!= (const IDirect3DBaseTexture8Vtbl
*)&Direct3DTexture8_Vtbl
1105 && iface
->lpVtbl
!= (const IDirect3DBaseTexture8Vtbl
*)&Direct3DCubeTexture8_Vtbl
1106 && iface
->lpVtbl
!= (const IDirect3DBaseTexture8Vtbl
*)&Direct3DVolumeTexture8_Vtbl
)
1108 WARN("%p is not a valid IDirect3DBaseTexture8 interface.\n", iface
);
1112 return CONTAINING_RECORD(iface
, struct d3d8_texture
, IDirect3DBaseTexture8_iface
);
1115 static void STDMETHODCALLTYPE
d3d8_texture_wined3d_object_destroyed(void *parent
)
1117 struct d3d8_texture
*texture
= parent
;
1118 d3d8_resource_cleanup(&texture
->resource
);
1119 HeapFree(GetProcessHeap(), 0, texture
);
1122 static const struct wined3d_parent_ops d3d8_texture_wined3d_parent_ops
=
1124 d3d8_texture_wined3d_object_destroyed
,
1127 HRESULT
texture_init(struct d3d8_texture
*texture
, struct d3d8_device
*device
,
1128 UINT width
, UINT height
, UINT levels
, DWORD usage
, D3DFORMAT format
, D3DPOOL pool
)
1130 struct wined3d_resource_desc desc
;
1131 DWORD surface_flags
= 0;
1134 texture
->IDirect3DBaseTexture8_iface
.lpVtbl
= (const IDirect3DBaseTexture8Vtbl
*)&Direct3DTexture8_Vtbl
;
1135 d3d8_resource_init(&texture
->resource
);
1137 desc
.resource_type
= WINED3D_RTYPE_TEXTURE
;
1138 desc
.format
= wined3dformat_from_d3dformat(format
);
1139 desc
.multisample_type
= WINED3D_MULTISAMPLE_NONE
;
1140 desc
.multisample_quality
= 0;
1141 desc
.usage
= usage
& WINED3DUSAGE_MASK
;
1142 desc
.usage
|= WINED3DUSAGE_TEXTURE
;
1145 desc
.height
= height
;
1149 if (pool
!= D3DPOOL_DEFAULT
|| (usage
& D3DUSAGE_DYNAMIC
))
1150 surface_flags
|= WINED3D_SURFACE_MAPPABLE
;
1152 wined3d_mutex_lock();
1153 hr
= wined3d_texture_create(device
->wined3d_device
, &desc
, levels
, surface_flags
,
1154 texture
, &d3d8_texture_wined3d_parent_ops
, &texture
->wined3d_texture
);
1155 wined3d_mutex_unlock();
1158 WARN("Failed to create wined3d texture, hr %#x.\n", hr
);
1162 texture
->parent_device
= &device
->IDirect3DDevice8_iface
;
1163 IDirect3DDevice8_AddRef(texture
->parent_device
);
1168 HRESULT
cubetexture_init(struct d3d8_texture
*texture
, struct d3d8_device
*device
,
1169 UINT edge_length
, UINT levels
, DWORD usage
, D3DFORMAT format
, D3DPOOL pool
)
1171 struct wined3d_resource_desc desc
;
1172 DWORD surface_flags
= 0;
1175 texture
->IDirect3DBaseTexture8_iface
.lpVtbl
= (const IDirect3DBaseTexture8Vtbl
*)&Direct3DCubeTexture8_Vtbl
;
1176 d3d8_resource_init(&texture
->resource
);
1178 desc
.resource_type
= WINED3D_RTYPE_CUBE_TEXTURE
;
1179 desc
.format
= wined3dformat_from_d3dformat(format
);
1180 desc
.multisample_type
= WINED3D_MULTISAMPLE_NONE
;
1181 desc
.multisample_quality
= 0;
1182 desc
.usage
= usage
& WINED3DUSAGE_MASK
;
1183 desc
.usage
|= WINED3DUSAGE_TEXTURE
;
1185 desc
.width
= edge_length
;
1186 desc
.height
= edge_length
;
1190 if (pool
!= D3DPOOL_DEFAULT
|| (usage
& D3DUSAGE_DYNAMIC
))
1191 surface_flags
|= WINED3D_SURFACE_MAPPABLE
;
1193 wined3d_mutex_lock();
1194 hr
= wined3d_texture_create(device
->wined3d_device
, &desc
, levels
, surface_flags
,
1195 texture
, &d3d8_texture_wined3d_parent_ops
, &texture
->wined3d_texture
);
1196 wined3d_mutex_unlock();
1199 WARN("Failed to create wined3d cube texture, hr %#x.\n", hr
);
1203 texture
->parent_device
= &device
->IDirect3DDevice8_iface
;
1204 IDirect3DDevice8_AddRef(texture
->parent_device
);
1209 HRESULT
volumetexture_init(struct d3d8_texture
*texture
, struct d3d8_device
*device
,
1210 UINT width
, UINT height
, UINT depth
, UINT levels
, DWORD usage
, D3DFORMAT format
, D3DPOOL pool
)
1212 struct wined3d_resource_desc desc
;
1215 texture
->IDirect3DBaseTexture8_iface
.lpVtbl
= (const IDirect3DBaseTexture8Vtbl
*)&Direct3DVolumeTexture8_Vtbl
;
1216 d3d8_resource_init(&texture
->resource
);
1218 desc
.resource_type
= WINED3D_RTYPE_VOLUME_TEXTURE
;
1219 desc
.format
= wined3dformat_from_d3dformat(format
);
1220 desc
.multisample_type
= WINED3D_MULTISAMPLE_NONE
;
1221 desc
.multisample_quality
= 0;
1222 desc
.usage
= usage
& WINED3DUSAGE_MASK
;
1223 desc
.usage
|= WINED3DUSAGE_TEXTURE
;
1226 desc
.height
= height
;
1230 wined3d_mutex_lock();
1231 hr
= wined3d_texture_create(device
->wined3d_device
, &desc
, levels
, 0,
1232 texture
, &d3d8_texture_wined3d_parent_ops
, &texture
->wined3d_texture
);
1233 wined3d_mutex_unlock();
1236 WARN("Failed to create wined3d volume texture, hr %#x.\n", hr
);
1240 texture
->parent_device
= &device
->IDirect3DDevice8_iface
;
1241 IDirect3DDevice8_AddRef(texture
->parent_device
);