2 * Copyright 2002-2005 Jason Edmeades
3 * Copyright 2002-2005 Raphael Junqueira
4 * Copyright 2005 Oliver Stieber
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.
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.
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
22 #include "d3d9_private.h"
24 WINE_DEFAULT_DEBUG_CHANNEL(d3d9
);
26 static inline struct d3d9_texture
*impl_from_IDirect3DTexture9(IDirect3DTexture9
*iface
)
28 return CONTAINING_RECORD(iface
, struct d3d9_texture
, IDirect3DBaseTexture9_iface
);
31 static inline struct d3d9_texture
*impl_from_IDirect3DCubeTexture9(IDirect3DCubeTexture9
*iface
)
33 return CONTAINING_RECORD(iface
, struct d3d9_texture
, IDirect3DBaseTexture9_iface
);
36 static inline struct d3d9_texture
*impl_from_IDirect3DVolumeTexture9(IDirect3DVolumeTexture9
*iface
)
38 return CONTAINING_RECORD(iface
, struct d3d9_texture
, IDirect3DBaseTexture9_iface
);
41 static HRESULT WINAPI
d3d9_texture_2d_QueryInterface(IDirect3DTexture9
*iface
, REFIID riid
, void **out
)
43 TRACE("iface %p, riid %s, out %p.\n", iface
, debugstr_guid(riid
), out
);
45 if (IsEqualGUID(riid
, &IID_IDirect3DTexture9
)
46 || IsEqualGUID(riid
, &IID_IDirect3DBaseTexture9
)
47 || IsEqualGUID(riid
, &IID_IDirect3DResource9
)
48 || IsEqualGUID(riid
, &IID_IUnknown
))
50 IDirect3DTexture9_AddRef(iface
);
55 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
61 static ULONG WINAPI
d3d9_texture_2d_AddRef(IDirect3DTexture9
*iface
)
63 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
64 ULONG ref
= InterlockedIncrement(&texture
->resource
.refcount
);
66 TRACE("%p increasing refcount to %u.\n", iface
, ref
);
70 IDirect3DDevice9Ex_AddRef(texture
->parent_device
);
72 wined3d_texture_incref(texture
->wined3d_texture
);
73 wined3d_mutex_unlock();
79 static ULONG WINAPI
d3d9_texture_2d_Release(IDirect3DTexture9
*iface
)
81 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
82 ULONG ref
= InterlockedDecrement(&texture
->resource
.refcount
);
84 TRACE("%p decreasing refcount to %u.\n", iface
, ref
);
88 IDirect3DDevice9Ex
*parent_device
= texture
->parent_device
;
91 wined3d_texture_decref(texture
->wined3d_texture
);
92 wined3d_mutex_unlock();
94 /* Release the device last, as it may cause the device to be destroyed. */
95 IDirect3DDevice9Ex_Release(parent_device
);
100 static HRESULT WINAPI
d3d9_texture_2d_GetDevice(IDirect3DTexture9
*iface
, IDirect3DDevice9
**device
)
102 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
104 TRACE("iface %p, device %p.\n", iface
, device
);
106 *device
= (IDirect3DDevice9
*)texture
->parent_device
;
107 IDirect3DDevice9_AddRef(*device
);
109 TRACE("Returning device %p.\n", *device
);
114 static HRESULT WINAPI
d3d9_texture_2d_SetPrivateData(IDirect3DTexture9
*iface
,
115 REFGUID guid
, const void *data
, DWORD data_size
, DWORD flags
)
117 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
118 TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
119 iface
, debugstr_guid(guid
), data
, data_size
, flags
);
121 return d3d9_resource_set_private_data(&texture
->resource
, guid
, data
, data_size
, flags
);
124 static HRESULT WINAPI
d3d9_texture_2d_GetPrivateData(IDirect3DTexture9
*iface
,
125 REFGUID guid
, void *data
, DWORD
*data_size
)
127 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
128 TRACE("iface %p, guid %s, data %p, data_size %p.\n",
129 iface
, debugstr_guid(guid
), data
, data_size
);
131 return d3d9_resource_get_private_data(&texture
->resource
, guid
, data
, data_size
);
134 static HRESULT WINAPI
d3d9_texture_2d_FreePrivateData(IDirect3DTexture9
*iface
, REFGUID guid
)
136 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
137 TRACE("iface %p, guid %s.\n", iface
, debugstr_guid(guid
));
139 return d3d9_resource_free_private_data(&texture
->resource
, guid
);
142 static DWORD WINAPI
d3d9_texture_2d_SetPriority(IDirect3DTexture9
*iface
, DWORD priority
)
144 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
147 TRACE("iface %p, priority %u.\n", iface
, priority
);
149 wined3d_mutex_lock();
150 ret
= wined3d_texture_set_priority(texture
->wined3d_texture
, priority
);
151 wined3d_mutex_unlock();
156 static DWORD WINAPI
d3d9_texture_2d_GetPriority(IDirect3DTexture9
*iface
)
158 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
161 TRACE("iface %p.\n", iface
);
163 wined3d_mutex_lock();
164 ret
= wined3d_texture_get_priority(texture
->wined3d_texture
);
165 wined3d_mutex_unlock();
170 static void WINAPI
d3d9_texture_2d_PreLoad(IDirect3DTexture9
*iface
)
172 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
174 TRACE("iface %p.\n", iface
);
176 wined3d_mutex_lock();
177 wined3d_texture_preload(texture
->wined3d_texture
);
178 wined3d_mutex_unlock();
181 static D3DRESOURCETYPE WINAPI
d3d9_texture_2d_GetType(IDirect3DTexture9
*iface
)
183 TRACE("iface %p.\n", iface
);
185 return D3DRTYPE_TEXTURE
;
188 static DWORD WINAPI
d3d9_texture_2d_SetLOD(IDirect3DTexture9
*iface
, DWORD lod
)
190 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
193 TRACE("iface %p, lod %u.\n", iface
, lod
);
195 wined3d_mutex_lock();
196 ret
= wined3d_texture_set_lod(texture
->wined3d_texture
, lod
);
197 wined3d_mutex_unlock();
202 static DWORD WINAPI
d3d9_texture_2d_GetLOD(IDirect3DTexture9
*iface
)
204 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
207 TRACE("iface %p.\n", iface
);
209 wined3d_mutex_lock();
210 ret
= wined3d_texture_get_lod(texture
->wined3d_texture
);
211 wined3d_mutex_unlock();
216 static DWORD WINAPI
d3d9_texture_2d_GetLevelCount(IDirect3DTexture9
*iface
)
218 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
221 TRACE("iface %p.\n", iface
);
223 wined3d_mutex_lock();
224 ret
= wined3d_texture_get_level_count(texture
->wined3d_texture
);
225 wined3d_mutex_unlock();
230 static HRESULT WINAPI
d3d9_texture_2d_SetAutoGenFilterType(IDirect3DTexture9
*iface
, D3DTEXTUREFILTERTYPE filter_type
)
232 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
235 TRACE("iface %p, filter_type %#x.\n", iface
, filter_type
);
237 wined3d_mutex_lock();
238 hr
= wined3d_texture_set_autogen_filter_type(texture
->wined3d_texture
,
239 (enum wined3d_texture_filter_type
)filter_type
);
240 wined3d_mutex_unlock();
245 static D3DTEXTUREFILTERTYPE WINAPI
d3d9_texture_2d_GetAutoGenFilterType(IDirect3DTexture9
*iface
)
247 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
248 D3DTEXTUREFILTERTYPE ret
;
250 TRACE("iface %p.\n", iface
);
252 wined3d_mutex_lock();
253 ret
= (D3DTEXTUREFILTERTYPE
)wined3d_texture_get_autogen_filter_type(texture
->wined3d_texture
);
254 wined3d_mutex_unlock();
259 static void WINAPI
d3d9_texture_2d_GenerateMipSubLevels(IDirect3DTexture9
*iface
)
261 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
263 TRACE("iface %p.\n", iface
);
265 wined3d_mutex_lock();
266 wined3d_texture_generate_mipmaps(texture
->wined3d_texture
);
267 wined3d_mutex_unlock();
270 static HRESULT WINAPI
d3d9_texture_2d_GetLevelDesc(IDirect3DTexture9
*iface
, UINT level
, D3DSURFACE_DESC
*desc
)
272 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
273 struct wined3d_resource
*sub_resource
;
276 TRACE("iface %p, level %u, desc %p.\n", iface
, level
, desc
);
278 wined3d_mutex_lock();
279 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, level
)))
280 hr
= D3DERR_INVALIDCALL
;
283 struct wined3d_resource_desc wined3d_desc
;
285 wined3d_resource_get_desc(sub_resource
, &wined3d_desc
);
286 desc
->Format
= d3dformat_from_wined3dformat(wined3d_desc
.format
);
287 desc
->Type
= wined3d_desc
.resource_type
;
288 desc
->Usage
= wined3d_desc
.usage
& WINED3DUSAGE_MASK
;
289 desc
->Pool
= wined3d_desc
.pool
;
290 desc
->MultiSampleType
= wined3d_desc
.multisample_type
;
291 desc
->MultiSampleQuality
= wined3d_desc
.multisample_quality
;
292 desc
->Width
= wined3d_desc
.width
;
293 desc
->Height
= wined3d_desc
.height
;
295 wined3d_mutex_unlock();
300 static HRESULT WINAPI
d3d9_texture_2d_GetSurfaceLevel(IDirect3DTexture9
*iface
,
301 UINT level
, IDirect3DSurface9
**surface
)
303 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
304 struct wined3d_resource
*sub_resource
;
305 struct d3d9_surface
*surface_impl
;
307 TRACE("iface %p, level %u, surface %p.\n", iface
, level
, surface
);
309 wined3d_mutex_lock();
310 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, level
)))
312 wined3d_mutex_unlock();
313 return D3DERR_INVALIDCALL
;
316 surface_impl
= wined3d_resource_get_parent(sub_resource
);
317 *surface
= &surface_impl
->IDirect3DSurface9_iface
;
318 IDirect3DSurface9_AddRef(*surface
);
319 wined3d_mutex_unlock();
324 static HRESULT WINAPI
d3d9_texture_2d_LockRect(IDirect3DTexture9
*iface
,
325 UINT level
, D3DLOCKED_RECT
*locked_rect
, const RECT
*rect
, DWORD flags
)
327 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
328 struct wined3d_resource
*sub_resource
;
329 struct d3d9_surface
*surface_impl
;
332 TRACE("iface %p, level %u, locked_rect %p, rect %p, flags %#x.\n",
333 iface
, level
, locked_rect
, rect
, flags
);
335 wined3d_mutex_lock();
336 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, level
)))
337 hr
= D3DERR_INVALIDCALL
;
340 surface_impl
= wined3d_resource_get_parent(sub_resource
);
341 hr
= IDirect3DSurface9_LockRect(&surface_impl
->IDirect3DSurface9_iface
, locked_rect
, rect
, flags
);
343 wined3d_mutex_unlock();
348 static HRESULT WINAPI
d3d9_texture_2d_UnlockRect(IDirect3DTexture9
*iface
, UINT level
)
350 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
351 struct wined3d_resource
*sub_resource
;
352 struct d3d9_surface
*surface_impl
;
355 TRACE("iface %p, level %u.\n", iface
, level
);
357 wined3d_mutex_lock();
358 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, level
)))
359 hr
= D3DERR_INVALIDCALL
;
362 surface_impl
= wined3d_resource_get_parent(sub_resource
);
363 hr
= IDirect3DSurface9_UnlockRect(&surface_impl
->IDirect3DSurface9_iface
);
365 wined3d_mutex_unlock();
370 static HRESULT WINAPI
d3d9_texture_2d_AddDirtyRect(IDirect3DTexture9
*iface
, const RECT
*dirty_rect
)
372 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
375 TRACE("iface %p, dirty_rect %s.\n",
376 iface
, wine_dbgstr_rect(dirty_rect
));
378 wined3d_mutex_lock();
380 hr
= wined3d_texture_add_dirty_region(texture
->wined3d_texture
, 0, NULL
);
383 struct wined3d_box dirty_region
;
385 dirty_region
.left
= dirty_rect
->left
;
386 dirty_region
.top
= dirty_rect
->top
;
387 dirty_region
.right
= dirty_rect
->right
;
388 dirty_region
.bottom
= dirty_rect
->bottom
;
389 dirty_region
.front
= 0;
390 dirty_region
.back
= 1;
391 hr
= wined3d_texture_add_dirty_region(texture
->wined3d_texture
, 0, &dirty_region
);
393 wined3d_mutex_unlock();
398 static const IDirect3DTexture9Vtbl d3d9_texture_2d_vtbl
=
401 d3d9_texture_2d_QueryInterface
,
402 d3d9_texture_2d_AddRef
,
403 d3d9_texture_2d_Release
,
404 /* IDirect3DResource9 */
405 d3d9_texture_2d_GetDevice
,
406 d3d9_texture_2d_SetPrivateData
,
407 d3d9_texture_2d_GetPrivateData
,
408 d3d9_texture_2d_FreePrivateData
,
409 d3d9_texture_2d_SetPriority
,
410 d3d9_texture_2d_GetPriority
,
411 d3d9_texture_2d_PreLoad
,
412 d3d9_texture_2d_GetType
,
413 /* IDirect3dBaseTexture9 */
414 d3d9_texture_2d_SetLOD
,
415 d3d9_texture_2d_GetLOD
,
416 d3d9_texture_2d_GetLevelCount
,
417 d3d9_texture_2d_SetAutoGenFilterType
,
418 d3d9_texture_2d_GetAutoGenFilterType
,
419 d3d9_texture_2d_GenerateMipSubLevels
,
420 /* IDirect3DTexture9 */
421 d3d9_texture_2d_GetLevelDesc
,
422 d3d9_texture_2d_GetSurfaceLevel
,
423 d3d9_texture_2d_LockRect
,
424 d3d9_texture_2d_UnlockRect
,
425 d3d9_texture_2d_AddDirtyRect
,
428 static HRESULT WINAPI
d3d9_texture_cube_QueryInterface(IDirect3DCubeTexture9
*iface
, REFIID riid
, void **out
)
430 TRACE("iface %p, riid %s, out %p.\n", iface
, debugstr_guid(riid
), out
);
432 if (IsEqualGUID(riid
, &IID_IDirect3DCubeTexture9
)
433 || IsEqualGUID(riid
, &IID_IDirect3DBaseTexture9
)
434 || IsEqualGUID(riid
, &IID_IDirect3DResource9
)
435 || IsEqualGUID(riid
, &IID_IUnknown
))
437 IDirect3DCubeTexture9_AddRef(iface
);
442 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
445 return E_NOINTERFACE
;
448 static ULONG WINAPI
d3d9_texture_cube_AddRef(IDirect3DCubeTexture9
*iface
)
450 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
451 ULONG ref
= InterlockedIncrement(&texture
->resource
.refcount
);
453 TRACE("%p increasing refcount to %u.\n", iface
, ref
);
457 IDirect3DDevice9Ex_AddRef(texture
->parent_device
);
458 wined3d_mutex_lock();
459 wined3d_texture_incref(texture
->wined3d_texture
);
460 wined3d_mutex_unlock();
466 static ULONG WINAPI
d3d9_texture_cube_Release(IDirect3DCubeTexture9
*iface
)
468 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
469 ULONG ref
= InterlockedDecrement(&texture
->resource
.refcount
);
471 TRACE("%p decreasing refcount to %u.\n", iface
, ref
);
475 IDirect3DDevice9Ex
*parent_device
= texture
->parent_device
;
477 TRACE("Releasing child %p.\n", texture
->wined3d_texture
);
479 wined3d_mutex_lock();
480 wined3d_texture_decref(texture
->wined3d_texture
);
481 wined3d_mutex_unlock();
483 /* Release the device last, as it may cause the device to be destroyed. */
484 IDirect3DDevice9Ex_Release(parent_device
);
489 static HRESULT WINAPI
d3d9_texture_cube_GetDevice(IDirect3DCubeTexture9
*iface
, IDirect3DDevice9
**device
)
491 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
493 TRACE("iface %p, device %p.\n", iface
, device
);
495 *device
= (IDirect3DDevice9
*)texture
->parent_device
;
496 IDirect3DDevice9_AddRef(*device
);
498 TRACE("Returning device %p.\n", *device
);
503 static HRESULT WINAPI
d3d9_texture_cube_SetPrivateData(IDirect3DCubeTexture9
*iface
,
504 REFGUID guid
, const void *data
, DWORD data_size
, DWORD flags
)
506 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
507 TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
508 iface
, debugstr_guid(guid
), data
, data_size
, flags
);
510 return d3d9_resource_set_private_data(&texture
->resource
, guid
, data
, data_size
, flags
);
513 static HRESULT WINAPI
d3d9_texture_cube_GetPrivateData(IDirect3DCubeTexture9
*iface
,
514 REFGUID guid
, void *data
, DWORD
*data_size
)
516 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
517 TRACE("iface %p, guid %s, data %p, data_size %p.\n",
518 iface
, debugstr_guid(guid
), data
, data_size
);
520 return d3d9_resource_get_private_data(&texture
->resource
, guid
, data
, data_size
);
523 static HRESULT WINAPI
d3d9_texture_cube_FreePrivateData(IDirect3DCubeTexture9
*iface
, REFGUID guid
)
525 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
526 TRACE("iface %p, guid %s.\n", iface
, debugstr_guid(guid
));
528 return d3d9_resource_free_private_data(&texture
->resource
, guid
);
531 static DWORD WINAPI
d3d9_texture_cube_SetPriority(IDirect3DCubeTexture9
*iface
, DWORD priority
)
533 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
536 TRACE("iface %p, priority %u.\n", iface
, priority
);
538 wined3d_mutex_lock();
539 ret
= wined3d_texture_set_priority(texture
->wined3d_texture
, priority
);
540 wined3d_mutex_unlock();
545 static DWORD WINAPI
d3d9_texture_cube_GetPriority(IDirect3DCubeTexture9
*iface
)
547 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
550 TRACE("iface %p.\n", iface
);
552 wined3d_mutex_lock();
553 ret
= wined3d_texture_get_priority(texture
->wined3d_texture
);
554 wined3d_mutex_unlock();
559 static void WINAPI
d3d9_texture_cube_PreLoad(IDirect3DCubeTexture9
*iface
)
561 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
563 TRACE("iface %p.\n", iface
);
565 wined3d_mutex_lock();
566 wined3d_texture_preload(texture
->wined3d_texture
);
567 wined3d_mutex_unlock();
570 static D3DRESOURCETYPE WINAPI
d3d9_texture_cube_GetType(IDirect3DCubeTexture9
*iface
)
572 TRACE("iface %p.\n", iface
);
574 return D3DRTYPE_CUBETEXTURE
;
577 static DWORD WINAPI
d3d9_texture_cube_SetLOD(IDirect3DCubeTexture9
*iface
, DWORD lod
)
579 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
582 TRACE("iface %p, lod %u.\n", iface
, lod
);
584 wined3d_mutex_lock();
585 ret
= wined3d_texture_set_lod(texture
->wined3d_texture
, lod
);
586 wined3d_mutex_unlock();
591 static DWORD WINAPI
d3d9_texture_cube_GetLOD(IDirect3DCubeTexture9
*iface
)
593 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
596 TRACE("iface %p.\n", iface
);
598 wined3d_mutex_lock();
599 ret
= wined3d_texture_get_lod(texture
->wined3d_texture
);
600 wined3d_mutex_unlock();
605 static DWORD WINAPI
d3d9_texture_cube_GetLevelCount(IDirect3DCubeTexture9
*iface
)
607 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
610 TRACE("iface %p.\n", iface
);
612 wined3d_mutex_lock();
613 ret
= wined3d_texture_get_level_count(texture
->wined3d_texture
);
614 wined3d_mutex_unlock();
619 static HRESULT WINAPI
d3d9_texture_cube_SetAutoGenFilterType(IDirect3DCubeTexture9
*iface
,
620 D3DTEXTUREFILTERTYPE filter_type
)
622 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
625 TRACE("iface %p, filter_type %#x.\n", iface
, filter_type
);
627 wined3d_mutex_lock();
628 hr
= wined3d_texture_set_autogen_filter_type(texture
->wined3d_texture
,
629 (enum wined3d_texture_filter_type
)filter_type
);
630 wined3d_mutex_unlock();
635 static D3DTEXTUREFILTERTYPE WINAPI
d3d9_texture_cube_GetAutoGenFilterType(IDirect3DCubeTexture9
*iface
)
637 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
638 D3DTEXTUREFILTERTYPE ret
;
640 TRACE("iface %p.\n", iface
);
642 wined3d_mutex_lock();
643 ret
= (D3DTEXTUREFILTERTYPE
)wined3d_texture_get_autogen_filter_type(texture
->wined3d_texture
);
644 wined3d_mutex_unlock();
649 static void WINAPI
d3d9_texture_cube_GenerateMipSubLevels(IDirect3DCubeTexture9
*iface
)
651 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
653 TRACE("iface %p.\n", iface
);
655 wined3d_mutex_lock();
656 wined3d_texture_generate_mipmaps(texture
->wined3d_texture
);
657 wined3d_mutex_unlock();
660 static HRESULT WINAPI
d3d9_texture_cube_GetLevelDesc(IDirect3DCubeTexture9
*iface
, UINT level
, D3DSURFACE_DESC
*desc
)
662 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
663 struct wined3d_resource
*sub_resource
;
667 TRACE("iface %p, level %u, desc %p.\n", iface
, level
, desc
);
669 wined3d_mutex_lock();
670 level_count
= wined3d_texture_get_level_count(texture
->wined3d_texture
);
671 if (level
>= level_count
)
673 wined3d_mutex_unlock();
674 return D3DERR_INVALIDCALL
;
677 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, level
)))
678 hr
= D3DERR_INVALIDCALL
;
681 struct wined3d_resource_desc wined3d_desc
;
683 wined3d_resource_get_desc(sub_resource
, &wined3d_desc
);
684 desc
->Format
= d3dformat_from_wined3dformat(wined3d_desc
.format
);
685 desc
->Type
= wined3d_desc
.resource_type
;
686 desc
->Usage
= wined3d_desc
.usage
& WINED3DUSAGE_MASK
;
687 desc
->Pool
= wined3d_desc
.pool
;
688 desc
->MultiSampleType
= wined3d_desc
.multisample_type
;
689 desc
->MultiSampleQuality
= wined3d_desc
.multisample_quality
;
690 desc
->Width
= wined3d_desc
.width
;
691 desc
->Height
= wined3d_desc
.height
;
693 wined3d_mutex_unlock();
698 static HRESULT WINAPI
d3d9_texture_cube_GetCubeMapSurface(IDirect3DCubeTexture9
*iface
,
699 D3DCUBEMAP_FACES face
, UINT level
, IDirect3DSurface9
**surface
)
701 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
702 struct wined3d_resource
*sub_resource
;
703 struct d3d9_surface
*surface_impl
;
704 UINT sub_resource_idx
;
707 TRACE("iface %p, face %#x, level %u, surface %p.\n", iface
, face
, level
, surface
);
709 wined3d_mutex_lock();
710 level_count
= wined3d_texture_get_level_count(texture
->wined3d_texture
);
711 if (level
>= level_count
)
713 wined3d_mutex_unlock();
714 return D3DERR_INVALIDCALL
;
717 sub_resource_idx
= level_count
* face
+ level
;
718 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, sub_resource_idx
)))
720 wined3d_mutex_unlock();
721 return D3DERR_INVALIDCALL
;
724 surface_impl
= wined3d_resource_get_parent(sub_resource
);
725 *surface
= &surface_impl
->IDirect3DSurface9_iface
;
726 IDirect3DSurface9_AddRef(*surface
);
727 wined3d_mutex_unlock();
732 static HRESULT WINAPI
d3d9_texture_cube_LockRect(IDirect3DCubeTexture9
*iface
,
733 D3DCUBEMAP_FACES face
, UINT level
, D3DLOCKED_RECT
*locked_rect
, const RECT
*rect
,
736 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
737 struct wined3d_resource
*sub_resource
;
738 struct d3d9_surface
*surface_impl
;
739 UINT sub_resource_idx
;
742 TRACE("iface %p, face %#x, level %u, locked_rect %p, rect %p, flags %#x.\n",
743 iface
, face
, level
, locked_rect
, rect
, flags
);
745 wined3d_mutex_lock();
746 sub_resource_idx
= wined3d_texture_get_level_count(texture
->wined3d_texture
) * face
+ level
;
747 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, sub_resource_idx
)))
748 hr
= D3DERR_INVALIDCALL
;
751 surface_impl
= wined3d_resource_get_parent(sub_resource
);
752 hr
= IDirect3DSurface9_LockRect(&surface_impl
->IDirect3DSurface9_iface
, locked_rect
, rect
, flags
);
754 wined3d_mutex_unlock();
759 static HRESULT WINAPI
d3d9_texture_cube_UnlockRect(IDirect3DCubeTexture9
*iface
,
760 D3DCUBEMAP_FACES face
, UINT level
)
762 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
763 struct wined3d_resource
*sub_resource
;
764 struct d3d9_surface
*surface_impl
;
765 UINT sub_resource_idx
;
768 TRACE("iface %p, face %#x, level %u.\n", iface
, face
, level
);
770 wined3d_mutex_lock();
771 sub_resource_idx
= wined3d_texture_get_level_count(texture
->wined3d_texture
) * face
+ level
;
772 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, sub_resource_idx
)))
773 hr
= D3DERR_INVALIDCALL
;
776 surface_impl
= wined3d_resource_get_parent(sub_resource
);
777 hr
= IDirect3DSurface9_UnlockRect(&surface_impl
->IDirect3DSurface9_iface
);
779 wined3d_mutex_unlock();
784 static HRESULT WINAPI
d3d9_texture_cube_AddDirtyRect(IDirect3DCubeTexture9
*iface
,
785 D3DCUBEMAP_FACES face
, const RECT
*dirty_rect
)
787 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
790 TRACE("iface %p, face %#x, dirty_rect %s.\n",
791 iface
, face
, wine_dbgstr_rect(dirty_rect
));
793 wined3d_mutex_lock();
795 hr
= wined3d_texture_add_dirty_region(texture
->wined3d_texture
, face
, NULL
);
798 struct wined3d_box dirty_region
;
800 dirty_region
.left
= dirty_rect
->left
;
801 dirty_region
.top
= dirty_rect
->top
;
802 dirty_region
.right
= dirty_rect
->right
;
803 dirty_region
.bottom
= dirty_rect
->bottom
;
804 dirty_region
.front
= 0;
805 dirty_region
.back
= 1;
806 hr
= wined3d_texture_add_dirty_region(texture
->wined3d_texture
, face
, &dirty_region
);
808 wined3d_mutex_unlock();
813 static const IDirect3DCubeTexture9Vtbl d3d9_texture_cube_vtbl
=
816 d3d9_texture_cube_QueryInterface
,
817 d3d9_texture_cube_AddRef
,
818 d3d9_texture_cube_Release
,
819 /* IDirect3DResource9 */
820 d3d9_texture_cube_GetDevice
,
821 d3d9_texture_cube_SetPrivateData
,
822 d3d9_texture_cube_GetPrivateData
,
823 d3d9_texture_cube_FreePrivateData
,
824 d3d9_texture_cube_SetPriority
,
825 d3d9_texture_cube_GetPriority
,
826 d3d9_texture_cube_PreLoad
,
827 d3d9_texture_cube_GetType
,
828 /* IDirect3DBaseTexture9 */
829 d3d9_texture_cube_SetLOD
,
830 d3d9_texture_cube_GetLOD
,
831 d3d9_texture_cube_GetLevelCount
,
832 d3d9_texture_cube_SetAutoGenFilterType
,
833 d3d9_texture_cube_GetAutoGenFilterType
,
834 d3d9_texture_cube_GenerateMipSubLevels
,
835 /* IDirect3DCubeTexture9 */
836 d3d9_texture_cube_GetLevelDesc
,
837 d3d9_texture_cube_GetCubeMapSurface
,
838 d3d9_texture_cube_LockRect
,
839 d3d9_texture_cube_UnlockRect
,
840 d3d9_texture_cube_AddDirtyRect
,
843 static HRESULT WINAPI
d3d9_texture_3d_QueryInterface(IDirect3DVolumeTexture9
*iface
, REFIID riid
, void **out
)
845 TRACE("iface %p, riid %s, out %p.\n", iface
, debugstr_guid(riid
), out
);
847 if (IsEqualGUID(riid
, &IID_IDirect3DVolumeTexture9
)
848 || IsEqualGUID(riid
, &IID_IDirect3DBaseTexture9
)
849 || IsEqualGUID(riid
, &IID_IDirect3DResource9
)
850 || IsEqualGUID(riid
, &IID_IUnknown
))
852 IDirect3DVolumeTexture9_AddRef(iface
);
857 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
860 return E_NOINTERFACE
;
863 static ULONG WINAPI
d3d9_texture_3d_AddRef(IDirect3DVolumeTexture9
*iface
)
865 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
866 ULONG ref
= InterlockedIncrement(&texture
->resource
.refcount
);
868 TRACE("%p increasing refcount to %u.\n", iface
, ref
);
872 IDirect3DDevice9Ex_AddRef(texture
->parent_device
);
873 wined3d_mutex_lock();
874 wined3d_texture_incref(texture
->wined3d_texture
);
875 wined3d_mutex_unlock();
881 static ULONG WINAPI
d3d9_texture_3d_Release(IDirect3DVolumeTexture9
*iface
)
883 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
884 ULONG ref
= InterlockedDecrement(&texture
->resource
.refcount
);
886 TRACE("%p decreasing refcount to %u.\n", iface
, ref
);
890 IDirect3DDevice9Ex
*parent_device
= texture
->parent_device
;
892 wined3d_mutex_lock();
893 wined3d_texture_decref(texture
->wined3d_texture
);
894 wined3d_mutex_unlock();
896 /* Release the device last, as it may cause the device to be destroyed. */
897 IDirect3DDevice9Ex_Release(parent_device
);
902 static HRESULT WINAPI
d3d9_texture_3d_GetDevice(IDirect3DVolumeTexture9
*iface
, IDirect3DDevice9
**device
)
904 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
906 TRACE("iface %p, device %p.\n", iface
, device
);
908 *device
= (IDirect3DDevice9
*)texture
->parent_device
;
909 IDirect3DDevice9_AddRef(*device
);
911 TRACE("Returning device %p.\n", *device
);
916 static HRESULT WINAPI
d3d9_texture_3d_SetPrivateData(IDirect3DVolumeTexture9
*iface
,
917 REFGUID guid
, const void *data
, DWORD data_size
, DWORD flags
)
919 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
920 TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
921 iface
, debugstr_guid(guid
), data
, data_size
, flags
);
923 return d3d9_resource_set_private_data(&texture
->resource
, guid
, data
, data_size
, flags
);
926 static HRESULT WINAPI
d3d9_texture_3d_GetPrivateData(IDirect3DVolumeTexture9
*iface
,
927 REFGUID guid
, void *data
, DWORD
*data_size
)
929 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
930 TRACE("iface %p, guid %s, data %p, data_size %p.\n",
931 iface
, debugstr_guid(guid
), data
, data_size
);
933 return d3d9_resource_get_private_data(&texture
->resource
, guid
, data
, data_size
);
936 static HRESULT WINAPI
d3d9_texture_3d_FreePrivateData(IDirect3DVolumeTexture9
*iface
, REFGUID guid
)
938 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
939 TRACE("iface %p, guid %s.\n", iface
, debugstr_guid(guid
));
941 return d3d9_resource_free_private_data(&texture
->resource
, guid
);
944 static DWORD WINAPI
d3d9_texture_3d_SetPriority(IDirect3DVolumeTexture9
*iface
, DWORD priority
)
946 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
949 TRACE("iface %p, priority %u.\n", iface
, priority
);
951 wined3d_mutex_lock();
952 ret
= wined3d_texture_set_priority(texture
->wined3d_texture
, priority
);
953 wined3d_mutex_unlock();
958 static DWORD WINAPI
d3d9_texture_3d_GetPriority(IDirect3DVolumeTexture9
*iface
)
960 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
963 TRACE("iface %p.\n", iface
);
965 wined3d_mutex_lock();
966 ret
= wined3d_texture_get_priority(texture
->wined3d_texture
);
967 wined3d_mutex_unlock();
972 static void WINAPI
d3d9_texture_3d_PreLoad(IDirect3DVolumeTexture9
*iface
)
974 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
976 TRACE("iface %p.\n", iface
);
978 wined3d_mutex_lock();
979 wined3d_texture_preload(texture
->wined3d_texture
);
980 wined3d_mutex_unlock();
983 static D3DRESOURCETYPE WINAPI
d3d9_texture_3d_GetType(IDirect3DVolumeTexture9
*iface
)
985 TRACE("iface %p.\n", iface
);
987 return D3DRTYPE_VOLUMETEXTURE
;
990 static DWORD WINAPI
d3d9_texture_3d_SetLOD(IDirect3DVolumeTexture9
*iface
, DWORD lod
)
992 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
995 TRACE("iface %p, lod %u.\n", iface
, lod
);
997 wined3d_mutex_lock();
998 ret
= wined3d_texture_set_lod(texture
->wined3d_texture
, lod
);
999 wined3d_mutex_unlock();
1004 static DWORD WINAPI
d3d9_texture_3d_GetLOD(IDirect3DVolumeTexture9
*iface
)
1006 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
1009 TRACE("iface %p.\n", iface
);
1011 wined3d_mutex_lock();
1012 ret
= wined3d_texture_get_lod(texture
->wined3d_texture
);
1013 wined3d_mutex_unlock();
1018 static DWORD WINAPI
d3d9_texture_3d_GetLevelCount(IDirect3DVolumeTexture9
*iface
)
1020 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
1023 TRACE("iface %p.\n", iface
);
1025 wined3d_mutex_lock();
1026 ret
= wined3d_texture_get_level_count(texture
->wined3d_texture
);
1027 wined3d_mutex_unlock();
1032 static HRESULT WINAPI
d3d9_texture_3d_SetAutoGenFilterType(IDirect3DVolumeTexture9
*iface
,
1033 D3DTEXTUREFILTERTYPE filter_type
)
1035 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
1038 TRACE("iface %p, filter_type %#x.\n", iface
, filter_type
);
1040 wined3d_mutex_lock();
1041 hr
= wined3d_texture_set_autogen_filter_type(texture
->wined3d_texture
,
1042 (enum wined3d_texture_filter_type
)filter_type
);
1043 wined3d_mutex_unlock();
1048 static D3DTEXTUREFILTERTYPE WINAPI
d3d9_texture_3d_GetAutoGenFilterType(IDirect3DVolumeTexture9
*iface
)
1050 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
1051 D3DTEXTUREFILTERTYPE filter_type
;
1053 TRACE("iface %p.\n", iface
);
1055 wined3d_mutex_lock();
1056 filter_type
= (D3DTEXTUREFILTERTYPE
)wined3d_texture_get_autogen_filter_type(texture
->wined3d_texture
);
1057 wined3d_mutex_unlock();
1062 static void WINAPI
d3d9_texture_3d_GenerateMipSubLevels(IDirect3DVolumeTexture9
*iface
)
1064 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
1066 TRACE("iface %p.\n", iface
);
1068 wined3d_mutex_lock();
1069 wined3d_texture_generate_mipmaps(texture
->wined3d_texture
);
1070 wined3d_mutex_unlock();
1073 static HRESULT WINAPI
d3d9_texture_3d_GetLevelDesc(IDirect3DVolumeTexture9
*iface
, UINT level
, D3DVOLUME_DESC
*desc
)
1075 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
1076 struct wined3d_resource
*sub_resource
;
1077 HRESULT hr
= D3D_OK
;
1079 TRACE("iface %p, level %u, desc %p.\n", iface
, level
, desc
);
1081 wined3d_mutex_lock();
1082 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, level
)))
1083 hr
= D3DERR_INVALIDCALL
;
1086 struct wined3d_resource_desc wined3d_desc
;
1088 wined3d_resource_get_desc(sub_resource
, &wined3d_desc
);
1089 desc
->Format
= d3dformat_from_wined3dformat(wined3d_desc
.format
);
1090 desc
->Type
= wined3d_desc
.resource_type
;
1091 desc
->Usage
= wined3d_desc
.usage
& WINED3DUSAGE_MASK
;
1092 desc
->Pool
= wined3d_desc
.pool
;
1093 desc
->Width
= wined3d_desc
.width
;
1094 desc
->Height
= wined3d_desc
.height
;
1095 desc
->Depth
= wined3d_desc
.depth
;
1097 wined3d_mutex_unlock();
1102 static HRESULT WINAPI
d3d9_texture_3d_GetVolumeLevel(IDirect3DVolumeTexture9
*iface
,
1103 UINT level
, IDirect3DVolume9
**volume
)
1105 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
1106 struct wined3d_resource
*sub_resource
;
1107 struct d3d9_volume
*volume_impl
;
1109 TRACE("iface %p, level %u, volume %p.\n", iface
, level
, volume
);
1111 wined3d_mutex_lock();
1112 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, level
)))
1114 wined3d_mutex_unlock();
1115 return D3DERR_INVALIDCALL
;
1118 volume_impl
= wined3d_resource_get_parent(sub_resource
);
1119 *volume
= &volume_impl
->IDirect3DVolume9_iface
;
1120 IDirect3DVolume9_AddRef(*volume
);
1121 wined3d_mutex_unlock();
1126 static HRESULT WINAPI
d3d9_texture_3d_LockBox(IDirect3DVolumeTexture9
*iface
,
1127 UINT level
, D3DLOCKED_BOX
*locked_box
, const D3DBOX
*box
, DWORD flags
)
1129 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
1130 struct wined3d_resource
*sub_resource
;
1131 struct d3d9_volume
*volume_impl
;
1134 TRACE("iface %p, level %u, locked_box %p, box %p, flags %#x.\n",
1135 iface
, level
, locked_box
, box
, flags
);
1137 wined3d_mutex_lock();
1138 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, level
)))
1139 hr
= D3DERR_INVALIDCALL
;
1142 volume_impl
= wined3d_resource_get_parent(sub_resource
);
1143 hr
= IDirect3DVolume9_LockBox(&volume_impl
->IDirect3DVolume9_iface
, locked_box
, box
, flags
);
1145 wined3d_mutex_unlock();
1150 static HRESULT WINAPI
d3d9_texture_3d_UnlockBox(IDirect3DVolumeTexture9
*iface
, UINT level
)
1152 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
1153 struct wined3d_resource
*sub_resource
;
1154 struct d3d9_volume
*volume_impl
;
1157 TRACE("iface %p, level %u.\n", iface
, level
);
1159 wined3d_mutex_lock();
1160 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, level
)))
1161 hr
= D3DERR_INVALIDCALL
;
1164 volume_impl
= wined3d_resource_get_parent(sub_resource
);
1165 hr
= IDirect3DVolume9_UnlockBox(&volume_impl
->IDirect3DVolume9_iface
);
1167 wined3d_mutex_unlock();
1172 static HRESULT WINAPI
d3d9_texture_3d_AddDirtyBox(IDirect3DVolumeTexture9
*iface
, const D3DBOX
*dirty_box
)
1174 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
1177 TRACE("iface %p, dirty_box %p.\n", iface
, dirty_box
);
1179 wined3d_mutex_lock();
1180 hr
= wined3d_texture_add_dirty_region(texture
->wined3d_texture
, 0, (const struct wined3d_box
*)dirty_box
);
1181 wined3d_mutex_unlock();
1187 static const IDirect3DVolumeTexture9Vtbl d3d9_texture_3d_vtbl
=
1190 d3d9_texture_3d_QueryInterface
,
1191 d3d9_texture_3d_AddRef
,
1192 d3d9_texture_3d_Release
,
1193 /* IDirect3DResource9 */
1194 d3d9_texture_3d_GetDevice
,
1195 d3d9_texture_3d_SetPrivateData
,
1196 d3d9_texture_3d_GetPrivateData
,
1197 d3d9_texture_3d_FreePrivateData
,
1198 d3d9_texture_3d_SetPriority
,
1199 d3d9_texture_3d_GetPriority
,
1200 d3d9_texture_3d_PreLoad
,
1201 d3d9_texture_3d_GetType
,
1202 /* IDirect3DBaseTexture9 */
1203 d3d9_texture_3d_SetLOD
,
1204 d3d9_texture_3d_GetLOD
,
1205 d3d9_texture_3d_GetLevelCount
,
1206 d3d9_texture_3d_SetAutoGenFilterType
,
1207 d3d9_texture_3d_GetAutoGenFilterType
,
1208 d3d9_texture_3d_GenerateMipSubLevels
,
1209 /* IDirect3DVolumeTexture9 */
1210 d3d9_texture_3d_GetLevelDesc
,
1211 d3d9_texture_3d_GetVolumeLevel
,
1212 d3d9_texture_3d_LockBox
,
1213 d3d9_texture_3d_UnlockBox
,
1214 d3d9_texture_3d_AddDirtyBox
,
1217 struct d3d9_texture
*unsafe_impl_from_IDirect3DBaseTexture9(IDirect3DBaseTexture9
*iface
)
1221 assert(iface
->lpVtbl
== (const IDirect3DBaseTexture9Vtbl
*)&d3d9_texture_2d_vtbl
1222 || iface
->lpVtbl
== (const IDirect3DBaseTexture9Vtbl
*)&d3d9_texture_cube_vtbl
1223 || iface
->lpVtbl
== (const IDirect3DBaseTexture9Vtbl
*)&d3d9_texture_3d_vtbl
);
1224 return CONTAINING_RECORD(iface
, struct d3d9_texture
, IDirect3DBaseTexture9_iface
);
1227 static void STDMETHODCALLTYPE
d3d9_texture_wined3d_object_destroyed(void *parent
)
1229 struct d3d9_texture
*texture
= parent
;
1230 d3d9_resource_cleanup(&texture
->resource
);
1231 HeapFree(GetProcessHeap(), 0, texture
);
1234 static const struct wined3d_parent_ops d3d9_texture_wined3d_parent_ops
=
1236 d3d9_texture_wined3d_object_destroyed
,
1239 HRESULT
texture_init(struct d3d9_texture
*texture
, struct d3d9_device
*device
,
1240 UINT width
, UINT height
, UINT levels
, DWORD usage
, D3DFORMAT format
, D3DPOOL pool
)
1242 struct wined3d_resource_desc desc
;
1243 DWORD surface_flags
= 0;
1246 texture
->IDirect3DBaseTexture9_iface
.lpVtbl
= (const IDirect3DBaseTexture9Vtbl
*)&d3d9_texture_2d_vtbl
;
1247 d3d9_resource_init(&texture
->resource
);
1249 desc
.resource_type
= WINED3D_RTYPE_TEXTURE
;
1250 desc
.format
= wined3dformat_from_d3dformat(format
);
1251 desc
.multisample_type
= WINED3D_MULTISAMPLE_NONE
;
1252 desc
.multisample_quality
= 0;
1253 desc
.usage
= usage
& WINED3DUSAGE_MASK
;
1254 desc
.usage
|= WINED3DUSAGE_TEXTURE
;
1257 desc
.height
= height
;
1261 if (pool
!= D3DPOOL_DEFAULT
|| (usage
& D3DUSAGE_DYNAMIC
))
1262 surface_flags
|= WINED3D_SURFACE_MAPPABLE
;
1264 wined3d_mutex_lock();
1265 hr
= wined3d_texture_create(device
->wined3d_device
, &desc
, levels
, surface_flags
,
1266 texture
, &d3d9_texture_wined3d_parent_ops
, &texture
->wined3d_texture
);
1267 wined3d_mutex_unlock();
1270 WARN("Failed to create wined3d texture, hr %#x.\n", hr
);
1274 texture
->parent_device
= &device
->IDirect3DDevice9Ex_iface
;
1275 IDirect3DDevice9Ex_AddRef(texture
->parent_device
);
1280 HRESULT
cubetexture_init(struct d3d9_texture
*texture
, struct d3d9_device
*device
,
1281 UINT edge_length
, UINT levels
, DWORD usage
, D3DFORMAT format
, D3DPOOL pool
)
1283 struct wined3d_resource_desc desc
;
1284 DWORD surface_flags
= 0;
1287 texture
->IDirect3DBaseTexture9_iface
.lpVtbl
= (const IDirect3DBaseTexture9Vtbl
*)&d3d9_texture_cube_vtbl
;
1288 d3d9_resource_init(&texture
->resource
);
1290 desc
.resource_type
= WINED3D_RTYPE_CUBE_TEXTURE
;
1291 desc
.format
= wined3dformat_from_d3dformat(format
);
1292 desc
.multisample_type
= WINED3D_MULTISAMPLE_NONE
;
1293 desc
.multisample_quality
= 0;
1294 desc
.usage
= usage
& WINED3DUSAGE_MASK
;
1295 desc
.usage
|= WINED3DUSAGE_TEXTURE
;
1297 desc
.width
= edge_length
;
1298 desc
.height
= edge_length
;
1302 if (pool
!= D3DPOOL_DEFAULT
|| (usage
& D3DUSAGE_DYNAMIC
))
1303 surface_flags
|= WINED3D_SURFACE_MAPPABLE
;
1305 wined3d_mutex_lock();
1306 hr
= wined3d_texture_create(device
->wined3d_device
, &desc
, levels
, surface_flags
,
1307 texture
, &d3d9_texture_wined3d_parent_ops
, &texture
->wined3d_texture
);
1308 wined3d_mutex_unlock();
1311 WARN("Failed to create wined3d cube texture, hr %#x.\n", hr
);
1315 texture
->parent_device
= &device
->IDirect3DDevice9Ex_iface
;
1316 IDirect3DDevice9Ex_AddRef(texture
->parent_device
);
1321 HRESULT
volumetexture_init(struct d3d9_texture
*texture
, struct d3d9_device
*device
,
1322 UINT width
, UINT height
, UINT depth
, UINT levels
, DWORD usage
, D3DFORMAT format
, D3DPOOL pool
)
1324 struct wined3d_resource_desc desc
;
1327 texture
->IDirect3DBaseTexture9_iface
.lpVtbl
= (const IDirect3DBaseTexture9Vtbl
*)&d3d9_texture_3d_vtbl
;
1328 d3d9_resource_init(&texture
->resource
);
1330 desc
.resource_type
= WINED3D_RTYPE_VOLUME_TEXTURE
;
1331 desc
.format
= wined3dformat_from_d3dformat(format
);
1332 desc
.multisample_type
= WINED3D_MULTISAMPLE_NONE
;
1333 desc
.multisample_quality
= 0;
1334 desc
.usage
= usage
& WINED3DUSAGE_MASK
;
1335 desc
.usage
|= WINED3DUSAGE_TEXTURE
;
1338 desc
.height
= height
;
1342 wined3d_mutex_lock();
1343 hr
= wined3d_texture_create(device
->wined3d_device
, &desc
, levels
, 0,
1344 texture
, &d3d9_texture_wined3d_parent_ops
, &texture
->wined3d_texture
);
1345 wined3d_mutex_unlock();
1348 WARN("Failed to create wined3d volume texture, hr %#x.\n", hr
);
1352 texture
->parent_device
= &device
->IDirect3DDevice9Ex_iface
;
1353 IDirect3DDevice9Ex_AddRef(texture
->parent_device
);