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
21 #include "d3d9_private.h"
23 static inline struct d3d9_texture
*impl_from_IDirect3DTexture9(IDirect3DTexture9
*iface
)
25 return CONTAINING_RECORD(iface
, struct d3d9_texture
, IDirect3DBaseTexture9_iface
);
28 static inline struct d3d9_texture
*impl_from_IDirect3DCubeTexture9(IDirect3DCubeTexture9
*iface
)
30 return CONTAINING_RECORD(iface
, struct d3d9_texture
, IDirect3DBaseTexture9_iface
);
33 static inline struct d3d9_texture
*impl_from_IDirect3DVolumeTexture9(IDirect3DVolumeTexture9
*iface
)
35 return CONTAINING_RECORD(iface
, struct d3d9_texture
, IDirect3DBaseTexture9_iface
);
38 static HRESULT WINAPI
d3d9_texture_2d_QueryInterface(IDirect3DTexture9
*iface
, REFIID riid
, void **out
)
40 TRACE("iface %p, riid %s, out %p.\n", iface
, debugstr_guid(riid
), out
);
42 if (IsEqualGUID(riid
, &IID_IDirect3DTexture9
)
43 || IsEqualGUID(riid
, &IID_IDirect3DBaseTexture9
)
44 || IsEqualGUID(riid
, &IID_IDirect3DResource9
)
45 || IsEqualGUID(riid
, &IID_IUnknown
))
47 IDirect3DTexture9_AddRef(iface
);
52 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
58 static ULONG WINAPI
d3d9_texture_2d_AddRef(IDirect3DTexture9
*iface
)
60 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
61 ULONG ref
= InterlockedIncrement(&texture
->refcount
);
63 TRACE("%p increasing refcount to %u.\n", iface
, ref
);
67 IDirect3DDevice9Ex_AddRef(texture
->parent_device
);
69 wined3d_texture_incref(texture
->wined3d_texture
);
70 wined3d_mutex_unlock();
76 static ULONG WINAPI
d3d9_texture_2d_Release(IDirect3DTexture9
*iface
)
78 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
79 ULONG ref
= InterlockedDecrement(&texture
->refcount
);
81 TRACE("%p decreasing refcount to %u.\n", iface
, ref
);
85 IDirect3DDevice9Ex
*parent_device
= texture
->parent_device
;
88 wined3d_texture_decref(texture
->wined3d_texture
);
89 wined3d_mutex_unlock();
91 /* Release the device last, as it may cause the device to be destroyed. */
92 IDirect3DDevice9Ex_Release(parent_device
);
97 static HRESULT WINAPI
d3d9_texture_2d_GetDevice(IDirect3DTexture9
*iface
, IDirect3DDevice9
**device
)
99 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
101 TRACE("iface %p, device %p.\n", iface
, device
);
103 *device
= (IDirect3DDevice9
*)texture
->parent_device
;
104 IDirect3DDevice9_AddRef(*device
);
106 TRACE("Returning device %p.\n", *device
);
111 static HRESULT WINAPI
d3d9_texture_2d_SetPrivateData(IDirect3DTexture9
*iface
,
112 REFGUID guid
, const void *data
, DWORD data_size
, DWORD flags
)
114 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
115 struct wined3d_resource
*resource
;
118 TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
119 iface
, debugstr_guid(guid
), data
, data_size
, flags
);
121 wined3d_mutex_lock();
122 resource
= wined3d_texture_get_resource(texture
->wined3d_texture
);
123 hr
= wined3d_resource_set_private_data(resource
, guid
, data
, data_size
, flags
);
124 wined3d_mutex_unlock();
129 static HRESULT WINAPI
d3d9_texture_2d_GetPrivateData(IDirect3DTexture9
*iface
,
130 REFGUID guid
, void *data
, DWORD
*data_size
)
132 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
133 struct wined3d_resource
*resource
;
136 TRACE("iface %p, guid %s, data %p, data_size %p.\n",
137 iface
, debugstr_guid(guid
), data
, data_size
);
139 wined3d_mutex_lock();
140 resource
= wined3d_texture_get_resource(texture
->wined3d_texture
);
141 hr
= wined3d_resource_get_private_data(resource
, guid
, data
, data_size
);
142 wined3d_mutex_unlock();
147 static HRESULT WINAPI
d3d9_texture_2d_FreePrivateData(IDirect3DTexture9
*iface
, REFGUID guid
)
149 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
150 struct wined3d_resource
*resource
;
153 TRACE("iface %p, guid %s.\n", iface
, debugstr_guid(guid
));
155 wined3d_mutex_lock();
156 resource
= wined3d_texture_get_resource(texture
->wined3d_texture
);
157 hr
= wined3d_resource_free_private_data(resource
, guid
);
158 wined3d_mutex_unlock();
163 static DWORD WINAPI
d3d9_texture_2d_SetPriority(IDirect3DTexture9
*iface
, DWORD priority
)
165 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
168 TRACE("iface %p, priority %u.\n", iface
, priority
);
170 wined3d_mutex_lock();
171 ret
= wined3d_texture_set_priority(texture
->wined3d_texture
, priority
);
172 wined3d_mutex_unlock();
177 static DWORD WINAPI
d3d9_texture_2d_GetPriority(IDirect3DTexture9
*iface
)
179 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
182 TRACE("iface %p.\n", iface
);
184 wined3d_mutex_lock();
185 ret
= wined3d_texture_get_priority(texture
->wined3d_texture
);
186 wined3d_mutex_unlock();
191 static void WINAPI
d3d9_texture_2d_PreLoad(IDirect3DTexture9
*iface
)
193 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
195 TRACE("iface %p.\n", iface
);
197 wined3d_mutex_lock();
198 wined3d_texture_preload(texture
->wined3d_texture
);
199 wined3d_mutex_unlock();
202 static D3DRESOURCETYPE WINAPI
d3d9_texture_2d_GetType(IDirect3DTexture9
*iface
)
204 TRACE("iface %p.\n", iface
);
206 return D3DRTYPE_TEXTURE
;
209 static DWORD WINAPI
d3d9_texture_2d_SetLOD(IDirect3DTexture9
*iface
, DWORD lod
)
211 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
214 TRACE("iface %p, lod %u.\n", iface
, lod
);
216 wined3d_mutex_lock();
217 ret
= wined3d_texture_set_lod(texture
->wined3d_texture
, lod
);
218 wined3d_mutex_unlock();
223 static DWORD WINAPI
d3d9_texture_2d_GetLOD(IDirect3DTexture9
*iface
)
225 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
228 TRACE("iface %p.\n", iface
);
230 wined3d_mutex_lock();
231 ret
= wined3d_texture_get_lod(texture
->wined3d_texture
);
232 wined3d_mutex_unlock();
237 static DWORD WINAPI
d3d9_texture_2d_GetLevelCount(IDirect3DTexture9
*iface
)
239 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
242 TRACE("iface %p.\n", iface
);
244 wined3d_mutex_lock();
245 ret
= wined3d_texture_get_level_count(texture
->wined3d_texture
);
246 wined3d_mutex_unlock();
251 static HRESULT WINAPI
d3d9_texture_2d_SetAutoGenFilterType(IDirect3DTexture9
*iface
, D3DTEXTUREFILTERTYPE filter_type
)
253 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
256 TRACE("iface %p, filter_type %#x.\n", iface
, filter_type
);
258 wined3d_mutex_lock();
259 hr
= wined3d_texture_set_autogen_filter_type(texture
->wined3d_texture
,
260 (enum wined3d_texture_filter_type
)filter_type
);
261 wined3d_mutex_unlock();
266 static D3DTEXTUREFILTERTYPE WINAPI
d3d9_texture_2d_GetAutoGenFilterType(IDirect3DTexture9
*iface
)
268 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
269 D3DTEXTUREFILTERTYPE ret
;
271 TRACE("iface %p.\n", iface
);
273 wined3d_mutex_lock();
274 ret
= (D3DTEXTUREFILTERTYPE
)wined3d_texture_get_autogen_filter_type(texture
->wined3d_texture
);
275 wined3d_mutex_unlock();
280 static void WINAPI
d3d9_texture_2d_GenerateMipSubLevels(IDirect3DTexture9
*iface
)
282 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
284 TRACE("iface %p.\n", iface
);
286 wined3d_mutex_lock();
287 wined3d_texture_generate_mipmaps(texture
->wined3d_texture
);
288 wined3d_mutex_unlock();
291 static HRESULT WINAPI
d3d9_texture_2d_GetLevelDesc(IDirect3DTexture9
*iface
, UINT level
, D3DSURFACE_DESC
*desc
)
293 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
294 struct wined3d_resource
*sub_resource
;
297 TRACE("iface %p, level %u, desc %p.\n", iface
, level
, desc
);
299 wined3d_mutex_lock();
300 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, level
)))
301 hr
= D3DERR_INVALIDCALL
;
304 struct wined3d_resource_desc wined3d_desc
;
306 wined3d_resource_get_desc(sub_resource
, &wined3d_desc
);
307 desc
->Format
= d3dformat_from_wined3dformat(wined3d_desc
.format
);
308 desc
->Type
= wined3d_desc
.resource_type
;
309 desc
->Usage
= wined3d_desc
.usage
& WINED3DUSAGE_MASK
;
310 desc
->Pool
= wined3d_desc
.pool
;
311 desc
->MultiSampleType
= wined3d_desc
.multisample_type
;
312 desc
->MultiSampleQuality
= wined3d_desc
.multisample_quality
;
313 desc
->Width
= wined3d_desc
.width
;
314 desc
->Height
= wined3d_desc
.height
;
316 wined3d_mutex_unlock();
321 static HRESULT WINAPI
d3d9_texture_2d_GetSurfaceLevel(IDirect3DTexture9
*iface
,
322 UINT level
, IDirect3DSurface9
**surface
)
324 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
325 struct wined3d_resource
*sub_resource
;
326 struct d3d9_surface
*surface_impl
;
328 TRACE("iface %p, level %u, surface %p.\n", iface
, level
, surface
);
330 wined3d_mutex_lock();
331 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, level
)))
333 wined3d_mutex_unlock();
334 return D3DERR_INVALIDCALL
;
337 surface_impl
= wined3d_resource_get_parent(sub_resource
);
338 *surface
= &surface_impl
->IDirect3DSurface9_iface
;
339 IDirect3DSurface9_AddRef(*surface
);
340 wined3d_mutex_unlock();
345 static HRESULT WINAPI
d3d9_texture_2d_LockRect(IDirect3DTexture9
*iface
,
346 UINT level
, D3DLOCKED_RECT
*locked_rect
, const RECT
*rect
, DWORD flags
)
348 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
349 struct wined3d_resource
*sub_resource
;
350 struct d3d9_surface
*surface_impl
;
353 TRACE("iface %p, level %u, locked_rect %p, rect %p, flags %#x.\n",
354 iface
, level
, locked_rect
, rect
, flags
);
356 wined3d_mutex_lock();
357 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, level
)))
358 hr
= D3DERR_INVALIDCALL
;
361 surface_impl
= wined3d_resource_get_parent(sub_resource
);
362 hr
= IDirect3DSurface9_LockRect(&surface_impl
->IDirect3DSurface9_iface
, locked_rect
, rect
, flags
);
364 wined3d_mutex_unlock();
369 static HRESULT WINAPI
d3d9_texture_2d_UnlockRect(IDirect3DTexture9
*iface
, UINT level
)
371 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
372 struct wined3d_resource
*sub_resource
;
373 struct d3d9_surface
*surface_impl
;
376 TRACE("iface %p, level %u.\n", iface
, level
);
378 wined3d_mutex_lock();
379 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, level
)))
380 hr
= D3DERR_INVALIDCALL
;
383 surface_impl
= wined3d_resource_get_parent(sub_resource
);
384 hr
= IDirect3DSurface9_UnlockRect(&surface_impl
->IDirect3DSurface9_iface
);
386 wined3d_mutex_unlock();
391 static HRESULT WINAPI
d3d9_texture_2d_AddDirtyRect(IDirect3DTexture9
*iface
, const RECT
*dirty_rect
)
393 struct d3d9_texture
*texture
= impl_from_IDirect3DTexture9(iface
);
396 TRACE("iface %p, dirty_rect %s.\n",
397 iface
, wine_dbgstr_rect(dirty_rect
));
399 wined3d_mutex_lock();
401 hr
= wined3d_texture_add_dirty_region(texture
->wined3d_texture
, 0, NULL
);
404 struct wined3d_box dirty_region
;
406 dirty_region
.left
= dirty_rect
->left
;
407 dirty_region
.top
= dirty_rect
->top
;
408 dirty_region
.right
= dirty_rect
->right
;
409 dirty_region
.bottom
= dirty_rect
->bottom
;
410 dirty_region
.front
= 0;
411 dirty_region
.back
= 1;
412 hr
= wined3d_texture_add_dirty_region(texture
->wined3d_texture
, 0, &dirty_region
);
414 wined3d_mutex_unlock();
419 static const IDirect3DTexture9Vtbl d3d9_texture_2d_vtbl
=
422 d3d9_texture_2d_QueryInterface
,
423 d3d9_texture_2d_AddRef
,
424 d3d9_texture_2d_Release
,
425 /* IDirect3DResource9 */
426 d3d9_texture_2d_GetDevice
,
427 d3d9_texture_2d_SetPrivateData
,
428 d3d9_texture_2d_GetPrivateData
,
429 d3d9_texture_2d_FreePrivateData
,
430 d3d9_texture_2d_SetPriority
,
431 d3d9_texture_2d_GetPriority
,
432 d3d9_texture_2d_PreLoad
,
433 d3d9_texture_2d_GetType
,
434 /* IDirect3dBaseTexture9 */
435 d3d9_texture_2d_SetLOD
,
436 d3d9_texture_2d_GetLOD
,
437 d3d9_texture_2d_GetLevelCount
,
438 d3d9_texture_2d_SetAutoGenFilterType
,
439 d3d9_texture_2d_GetAutoGenFilterType
,
440 d3d9_texture_2d_GenerateMipSubLevels
,
441 /* IDirect3DTexture9 */
442 d3d9_texture_2d_GetLevelDesc
,
443 d3d9_texture_2d_GetSurfaceLevel
,
444 d3d9_texture_2d_LockRect
,
445 d3d9_texture_2d_UnlockRect
,
446 d3d9_texture_2d_AddDirtyRect
,
449 static HRESULT WINAPI
d3d9_texture_cube_QueryInterface(IDirect3DCubeTexture9
*iface
, REFIID riid
, void **out
)
451 TRACE("iface %p, riid %s, out %p.\n", iface
, debugstr_guid(riid
), out
);
453 if (IsEqualGUID(riid
, &IID_IDirect3DCubeTexture9
)
454 || IsEqualGUID(riid
, &IID_IDirect3DBaseTexture9
)
455 || IsEqualGUID(riid
, &IID_IDirect3DResource9
)
456 || IsEqualGUID(riid
, &IID_IUnknown
))
458 IDirect3DCubeTexture9_AddRef(iface
);
463 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
466 return E_NOINTERFACE
;
469 static ULONG WINAPI
d3d9_texture_cube_AddRef(IDirect3DCubeTexture9
*iface
)
471 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
472 ULONG ref
= InterlockedIncrement(&texture
->refcount
);
474 TRACE("%p increasing refcount to %u.\n", iface
, ref
);
478 IDirect3DDevice9Ex_AddRef(texture
->parent_device
);
479 wined3d_mutex_lock();
480 wined3d_texture_incref(texture
->wined3d_texture
);
481 wined3d_mutex_unlock();
487 static ULONG WINAPI
d3d9_texture_cube_Release(IDirect3DCubeTexture9
*iface
)
489 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
490 ULONG ref
= InterlockedDecrement(&texture
->refcount
);
492 TRACE("%p decreasing refcount to %u.\n", iface
, ref
);
496 IDirect3DDevice9Ex
*parent_device
= texture
->parent_device
;
498 TRACE("Releasing child %p.\n", texture
->wined3d_texture
);
500 wined3d_mutex_lock();
501 wined3d_texture_decref(texture
->wined3d_texture
);
502 wined3d_mutex_unlock();
504 /* Release the device last, as it may cause the device to be destroyed. */
505 IDirect3DDevice9Ex_Release(parent_device
);
510 static HRESULT WINAPI
d3d9_texture_cube_GetDevice(IDirect3DCubeTexture9
*iface
, IDirect3DDevice9
**device
)
512 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
514 TRACE("iface %p, device %p.\n", iface
, device
);
516 *device
= (IDirect3DDevice9
*)texture
->parent_device
;
517 IDirect3DDevice9_AddRef(*device
);
519 TRACE("Returning device %p.\n", *device
);
524 static HRESULT WINAPI
d3d9_texture_cube_SetPrivateData(IDirect3DCubeTexture9
*iface
,
525 REFGUID guid
, const void *data
, DWORD data_size
, DWORD flags
)
527 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
528 struct wined3d_resource
*resource
;
531 TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
532 iface
, debugstr_guid(guid
), data
, data_size
, flags
);
534 wined3d_mutex_lock();
535 resource
= wined3d_texture_get_resource(texture
->wined3d_texture
);
536 hr
= wined3d_resource_set_private_data(resource
, guid
, data
, data_size
, flags
);
537 wined3d_mutex_unlock();
542 static HRESULT WINAPI
d3d9_texture_cube_GetPrivateData(IDirect3DCubeTexture9
*iface
,
543 REFGUID guid
, void *data
, DWORD
*data_size
)
545 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
546 struct wined3d_resource
*resource
;
549 TRACE("iface %p, guid %s, data %p, data_size %p.\n",
550 iface
, debugstr_guid(guid
), data
, data_size
);
552 wined3d_mutex_lock();
553 resource
= wined3d_texture_get_resource(texture
->wined3d_texture
);
554 hr
= wined3d_resource_get_private_data(resource
, guid
, data
, data_size
);
555 wined3d_mutex_unlock();
560 static HRESULT WINAPI
d3d9_texture_cube_FreePrivateData(IDirect3DCubeTexture9
*iface
, REFGUID guid
)
562 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
563 struct wined3d_resource
*resource
;
566 TRACE("iface %p, guid %s.\n", iface
, debugstr_guid(guid
));
568 wined3d_mutex_lock();
569 resource
= wined3d_texture_get_resource(texture
->wined3d_texture
);
570 hr
= wined3d_resource_free_private_data(resource
, guid
);
571 wined3d_mutex_unlock();
576 static DWORD WINAPI
d3d9_texture_cube_SetPriority(IDirect3DCubeTexture9
*iface
, DWORD priority
)
578 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
581 TRACE("iface %p, priority %u.\n", iface
, priority
);
583 wined3d_mutex_lock();
584 ret
= wined3d_texture_set_priority(texture
->wined3d_texture
, priority
);
585 wined3d_mutex_unlock();
590 static DWORD WINAPI
d3d9_texture_cube_GetPriority(IDirect3DCubeTexture9
*iface
)
592 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
595 TRACE("iface %p.\n", iface
);
597 wined3d_mutex_lock();
598 ret
= wined3d_texture_get_priority(texture
->wined3d_texture
);
599 wined3d_mutex_unlock();
604 static void WINAPI
d3d9_texture_cube_PreLoad(IDirect3DCubeTexture9
*iface
)
606 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
608 TRACE("iface %p.\n", iface
);
610 wined3d_mutex_lock();
611 wined3d_texture_preload(texture
->wined3d_texture
);
612 wined3d_mutex_unlock();
615 static D3DRESOURCETYPE WINAPI
d3d9_texture_cube_GetType(IDirect3DCubeTexture9
*iface
)
617 TRACE("iface %p.\n", iface
);
619 return D3DRTYPE_CUBETEXTURE
;
622 static DWORD WINAPI
d3d9_texture_cube_SetLOD(IDirect3DCubeTexture9
*iface
, DWORD lod
)
624 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
627 TRACE("iface %p, lod %u.\n", iface
, lod
);
629 wined3d_mutex_lock();
630 ret
= wined3d_texture_set_lod(texture
->wined3d_texture
, lod
);
631 wined3d_mutex_unlock();
636 static DWORD WINAPI
d3d9_texture_cube_GetLOD(IDirect3DCubeTexture9
*iface
)
638 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
641 TRACE("iface %p.\n", iface
);
643 wined3d_mutex_lock();
644 ret
= wined3d_texture_get_lod(texture
->wined3d_texture
);
645 wined3d_mutex_unlock();
650 static DWORD WINAPI
d3d9_texture_cube_GetLevelCount(IDirect3DCubeTexture9
*iface
)
652 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
655 TRACE("iface %p.\n", iface
);
657 wined3d_mutex_lock();
658 ret
= wined3d_texture_get_level_count(texture
->wined3d_texture
);
659 wined3d_mutex_unlock();
664 static HRESULT WINAPI
d3d9_texture_cube_SetAutoGenFilterType(IDirect3DCubeTexture9
*iface
,
665 D3DTEXTUREFILTERTYPE filter_type
)
667 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
670 TRACE("iface %p, filter_type %#x.\n", iface
, filter_type
);
672 wined3d_mutex_lock();
673 hr
= wined3d_texture_set_autogen_filter_type(texture
->wined3d_texture
,
674 (enum wined3d_texture_filter_type
)filter_type
);
675 wined3d_mutex_unlock();
680 static D3DTEXTUREFILTERTYPE WINAPI
d3d9_texture_cube_GetAutoGenFilterType(IDirect3DCubeTexture9
*iface
)
682 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
683 D3DTEXTUREFILTERTYPE ret
;
685 TRACE("iface %p.\n", iface
);
687 wined3d_mutex_lock();
688 ret
= (D3DTEXTUREFILTERTYPE
)wined3d_texture_get_autogen_filter_type(texture
->wined3d_texture
);
689 wined3d_mutex_unlock();
694 static void WINAPI
d3d9_texture_cube_GenerateMipSubLevels(IDirect3DCubeTexture9
*iface
)
696 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
698 TRACE("iface %p.\n", iface
);
700 wined3d_mutex_lock();
701 wined3d_texture_generate_mipmaps(texture
->wined3d_texture
);
702 wined3d_mutex_unlock();
705 static HRESULT WINAPI
d3d9_texture_cube_GetLevelDesc(IDirect3DCubeTexture9
*iface
, UINT level
, D3DSURFACE_DESC
*desc
)
707 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
708 struct wined3d_resource
*sub_resource
;
712 TRACE("iface %p, level %u, desc %p.\n", iface
, level
, desc
);
714 wined3d_mutex_lock();
715 level_count
= wined3d_texture_get_level_count(texture
->wined3d_texture
);
716 if (level
>= level_count
)
718 wined3d_mutex_unlock();
719 return D3DERR_INVALIDCALL
;
722 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, level
)))
723 hr
= D3DERR_INVALIDCALL
;
726 struct wined3d_resource_desc wined3d_desc
;
728 wined3d_resource_get_desc(sub_resource
, &wined3d_desc
);
729 desc
->Format
= d3dformat_from_wined3dformat(wined3d_desc
.format
);
730 desc
->Type
= wined3d_desc
.resource_type
;
731 desc
->Usage
= wined3d_desc
.usage
& WINED3DUSAGE_MASK
;
732 desc
->Pool
= wined3d_desc
.pool
;
733 desc
->MultiSampleType
= wined3d_desc
.multisample_type
;
734 desc
->MultiSampleQuality
= wined3d_desc
.multisample_quality
;
735 desc
->Width
= wined3d_desc
.width
;
736 desc
->Height
= wined3d_desc
.height
;
738 wined3d_mutex_unlock();
743 static HRESULT WINAPI
d3d9_texture_cube_GetCubeMapSurface(IDirect3DCubeTexture9
*iface
,
744 D3DCUBEMAP_FACES face
, UINT level
, IDirect3DSurface9
**surface
)
746 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
747 struct wined3d_resource
*sub_resource
;
748 struct d3d9_surface
*surface_impl
;
749 UINT sub_resource_idx
;
752 TRACE("iface %p, face %#x, level %u, surface %p.\n", iface
, face
, level
, surface
);
754 wined3d_mutex_lock();
755 level_count
= wined3d_texture_get_level_count(texture
->wined3d_texture
);
756 if (level
>= level_count
)
758 wined3d_mutex_unlock();
759 return D3DERR_INVALIDCALL
;
762 sub_resource_idx
= level_count
* face
+ level
;
763 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, sub_resource_idx
)))
765 wined3d_mutex_unlock();
766 return D3DERR_INVALIDCALL
;
769 surface_impl
= wined3d_resource_get_parent(sub_resource
);
770 *surface
= &surface_impl
->IDirect3DSurface9_iface
;
771 IDirect3DSurface9_AddRef(*surface
);
772 wined3d_mutex_unlock();
777 static HRESULT WINAPI
d3d9_texture_cube_LockRect(IDirect3DCubeTexture9
*iface
,
778 D3DCUBEMAP_FACES face
, UINT level
, D3DLOCKED_RECT
*locked_rect
, const RECT
*rect
,
781 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
782 struct wined3d_resource
*sub_resource
;
783 struct d3d9_surface
*surface_impl
;
784 UINT sub_resource_idx
;
787 TRACE("iface %p, face %#x, level %u, locked_rect %p, rect %p, flags %#x.\n",
788 iface
, face
, level
, locked_rect
, rect
, flags
);
790 wined3d_mutex_lock();
791 sub_resource_idx
= wined3d_texture_get_level_count(texture
->wined3d_texture
) * face
+ level
;
792 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, sub_resource_idx
)))
793 hr
= D3DERR_INVALIDCALL
;
796 surface_impl
= wined3d_resource_get_parent(sub_resource
);
797 hr
= IDirect3DSurface9_LockRect(&surface_impl
->IDirect3DSurface9_iface
, locked_rect
, rect
, flags
);
799 wined3d_mutex_unlock();
804 static HRESULT WINAPI
d3d9_texture_cube_UnlockRect(IDirect3DCubeTexture9
*iface
,
805 D3DCUBEMAP_FACES face
, UINT level
)
807 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
808 struct wined3d_resource
*sub_resource
;
809 struct d3d9_surface
*surface_impl
;
810 UINT sub_resource_idx
;
813 TRACE("iface %p, face %#x, level %u.\n", iface
, face
, level
);
815 wined3d_mutex_lock();
816 sub_resource_idx
= wined3d_texture_get_level_count(texture
->wined3d_texture
) * face
+ level
;
817 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, sub_resource_idx
)))
818 hr
= D3DERR_INVALIDCALL
;
821 surface_impl
= wined3d_resource_get_parent(sub_resource
);
822 hr
= IDirect3DSurface9_UnlockRect(&surface_impl
->IDirect3DSurface9_iface
);
824 wined3d_mutex_unlock();
829 static HRESULT WINAPI
d3d9_texture_cube_AddDirtyRect(IDirect3DCubeTexture9
*iface
,
830 D3DCUBEMAP_FACES face
, const RECT
*dirty_rect
)
832 struct d3d9_texture
*texture
= impl_from_IDirect3DCubeTexture9(iface
);
835 TRACE("iface %p, face %#x, dirty_rect %s.\n",
836 iface
, face
, wine_dbgstr_rect(dirty_rect
));
838 wined3d_mutex_lock();
840 hr
= wined3d_texture_add_dirty_region(texture
->wined3d_texture
, face
, NULL
);
843 struct wined3d_box dirty_region
;
845 dirty_region
.left
= dirty_rect
->left
;
846 dirty_region
.top
= dirty_rect
->top
;
847 dirty_region
.right
= dirty_rect
->right
;
848 dirty_region
.bottom
= dirty_rect
->bottom
;
849 dirty_region
.front
= 0;
850 dirty_region
.back
= 1;
851 hr
= wined3d_texture_add_dirty_region(texture
->wined3d_texture
, face
, &dirty_region
);
853 wined3d_mutex_unlock();
858 static const IDirect3DCubeTexture9Vtbl d3d9_texture_cube_vtbl
=
861 d3d9_texture_cube_QueryInterface
,
862 d3d9_texture_cube_AddRef
,
863 d3d9_texture_cube_Release
,
864 /* IDirect3DResource9 */
865 d3d9_texture_cube_GetDevice
,
866 d3d9_texture_cube_SetPrivateData
,
867 d3d9_texture_cube_GetPrivateData
,
868 d3d9_texture_cube_FreePrivateData
,
869 d3d9_texture_cube_SetPriority
,
870 d3d9_texture_cube_GetPriority
,
871 d3d9_texture_cube_PreLoad
,
872 d3d9_texture_cube_GetType
,
873 /* IDirect3DBaseTexture9 */
874 d3d9_texture_cube_SetLOD
,
875 d3d9_texture_cube_GetLOD
,
876 d3d9_texture_cube_GetLevelCount
,
877 d3d9_texture_cube_SetAutoGenFilterType
,
878 d3d9_texture_cube_GetAutoGenFilterType
,
879 d3d9_texture_cube_GenerateMipSubLevels
,
880 /* IDirect3DCubeTexture9 */
881 d3d9_texture_cube_GetLevelDesc
,
882 d3d9_texture_cube_GetCubeMapSurface
,
883 d3d9_texture_cube_LockRect
,
884 d3d9_texture_cube_UnlockRect
,
885 d3d9_texture_cube_AddDirtyRect
,
888 static HRESULT WINAPI
d3d9_texture_3d_QueryInterface(IDirect3DVolumeTexture9
*iface
, REFIID riid
, void **out
)
890 TRACE("iface %p, riid %s, out %p.\n", iface
, debugstr_guid(riid
), out
);
892 if (IsEqualGUID(riid
, &IID_IDirect3DVolumeTexture9
)
893 || IsEqualGUID(riid
, &IID_IDirect3DBaseTexture9
)
894 || IsEqualGUID(riid
, &IID_IDirect3DResource9
)
895 || IsEqualGUID(riid
, &IID_IUnknown
))
897 IDirect3DVolumeTexture9_AddRef(iface
);
902 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
905 return E_NOINTERFACE
;
908 static ULONG WINAPI
d3d9_texture_3d_AddRef(IDirect3DVolumeTexture9
*iface
)
910 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
911 ULONG ref
= InterlockedIncrement(&texture
->refcount
);
913 TRACE("%p increasing refcount to %u.\n", iface
, ref
);
917 IDirect3DDevice9Ex_AddRef(texture
->parent_device
);
918 wined3d_mutex_lock();
919 wined3d_texture_incref(texture
->wined3d_texture
);
920 wined3d_mutex_unlock();
926 static ULONG WINAPI
d3d9_texture_3d_Release(IDirect3DVolumeTexture9
*iface
)
928 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
929 ULONG ref
= InterlockedDecrement(&texture
->refcount
);
931 TRACE("%p decreasing refcount to %u.\n", iface
, ref
);
935 IDirect3DDevice9Ex
*parent_device
= texture
->parent_device
;
937 wined3d_mutex_lock();
938 wined3d_texture_decref(texture
->wined3d_texture
);
939 wined3d_mutex_unlock();
941 /* Release the device last, as it may cause the device to be destroyed. */
942 IDirect3DDevice9Ex_Release(parent_device
);
947 static HRESULT WINAPI
d3d9_texture_3d_GetDevice(IDirect3DVolumeTexture9
*iface
, IDirect3DDevice9
**device
)
949 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
951 TRACE("iface %p, device %p.\n", iface
, device
);
953 *device
= (IDirect3DDevice9
*)texture
->parent_device
;
954 IDirect3DDevice9_AddRef(*device
);
956 TRACE("Returning device %p.\n", *device
);
961 static HRESULT WINAPI
d3d9_texture_3d_SetPrivateData(IDirect3DVolumeTexture9
*iface
,
962 REFGUID guid
, const void *data
, DWORD data_size
, DWORD flags
)
964 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
965 struct wined3d_resource
*resource
;
968 TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
969 iface
, debugstr_guid(guid
), data
, data_size
, flags
);
971 wined3d_mutex_lock();
972 resource
= wined3d_texture_get_resource(texture
->wined3d_texture
);
973 hr
= wined3d_resource_set_private_data(resource
, guid
, data
, data_size
, flags
);
974 wined3d_mutex_unlock();
979 static HRESULT WINAPI
d3d9_texture_3d_GetPrivateData(IDirect3DVolumeTexture9
*iface
,
980 REFGUID guid
, void *data
, DWORD
*data_size
)
982 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
983 struct wined3d_resource
*resource
;
986 TRACE("iface %p, guid %s, data %p, data_size %p.\n",
987 iface
, debugstr_guid(guid
), data
, data_size
);
989 wined3d_mutex_lock();
990 resource
= wined3d_texture_get_resource(texture
->wined3d_texture
);
991 hr
= wined3d_resource_get_private_data(resource
, guid
, data
, data_size
);
992 wined3d_mutex_unlock();
997 static HRESULT WINAPI
d3d9_texture_3d_FreePrivateData(IDirect3DVolumeTexture9
*iface
, REFGUID guid
)
999 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
1000 struct wined3d_resource
*resource
;
1003 TRACE("iface %p, guid %s.\n", iface
, debugstr_guid(guid
));
1005 wined3d_mutex_lock();
1006 resource
= wined3d_texture_get_resource(texture
->wined3d_texture
);
1007 hr
= wined3d_resource_free_private_data(resource
, guid
);
1008 wined3d_mutex_unlock();
1013 static DWORD WINAPI
d3d9_texture_3d_SetPriority(IDirect3DVolumeTexture9
*iface
, DWORD priority
)
1015 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
1018 TRACE("iface %p, priority %u.\n", iface
, priority
);
1020 wined3d_mutex_lock();
1021 ret
= wined3d_texture_set_priority(texture
->wined3d_texture
, priority
);
1022 wined3d_mutex_unlock();
1027 static DWORD WINAPI
d3d9_texture_3d_GetPriority(IDirect3DVolumeTexture9
*iface
)
1029 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
1032 TRACE("iface %p.\n", iface
);
1034 wined3d_mutex_lock();
1035 ret
= wined3d_texture_get_priority(texture
->wined3d_texture
);
1036 wined3d_mutex_unlock();
1041 static void WINAPI
d3d9_texture_3d_PreLoad(IDirect3DVolumeTexture9
*iface
)
1043 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
1045 TRACE("iface %p.\n", iface
);
1047 wined3d_mutex_lock();
1048 wined3d_texture_preload(texture
->wined3d_texture
);
1049 wined3d_mutex_unlock();
1052 static D3DRESOURCETYPE WINAPI
d3d9_texture_3d_GetType(IDirect3DVolumeTexture9
*iface
)
1054 TRACE("iface %p.\n", iface
);
1056 return D3DRTYPE_VOLUMETEXTURE
;
1059 static DWORD WINAPI
d3d9_texture_3d_SetLOD(IDirect3DVolumeTexture9
*iface
, DWORD lod
)
1061 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
1064 TRACE("iface %p, lod %u.\n", iface
, lod
);
1066 wined3d_mutex_lock();
1067 ret
= wined3d_texture_set_lod(texture
->wined3d_texture
, lod
);
1068 wined3d_mutex_unlock();
1073 static DWORD WINAPI
d3d9_texture_3d_GetLOD(IDirect3DVolumeTexture9
*iface
)
1075 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
1078 TRACE("iface %p.\n", iface
);
1080 wined3d_mutex_lock();
1081 ret
= wined3d_texture_get_lod(texture
->wined3d_texture
);
1082 wined3d_mutex_unlock();
1087 static DWORD WINAPI
d3d9_texture_3d_GetLevelCount(IDirect3DVolumeTexture9
*iface
)
1089 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
1092 TRACE("iface %p.\n", iface
);
1094 wined3d_mutex_lock();
1095 ret
= wined3d_texture_get_level_count(texture
->wined3d_texture
);
1096 wined3d_mutex_unlock();
1101 static HRESULT WINAPI
d3d9_texture_3d_SetAutoGenFilterType(IDirect3DVolumeTexture9
*iface
,
1102 D3DTEXTUREFILTERTYPE filter_type
)
1104 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
1107 TRACE("iface %p, filter_type %#x.\n", iface
, filter_type
);
1109 wined3d_mutex_lock();
1110 hr
= wined3d_texture_set_autogen_filter_type(texture
->wined3d_texture
,
1111 (enum wined3d_texture_filter_type
)filter_type
);
1112 wined3d_mutex_unlock();
1117 static D3DTEXTUREFILTERTYPE WINAPI
d3d9_texture_3d_GetAutoGenFilterType(IDirect3DVolumeTexture9
*iface
)
1119 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
1120 D3DTEXTUREFILTERTYPE filter_type
;
1122 TRACE("iface %p.\n", iface
);
1124 wined3d_mutex_lock();
1125 filter_type
= (D3DTEXTUREFILTERTYPE
)wined3d_texture_get_autogen_filter_type(texture
->wined3d_texture
);
1126 wined3d_mutex_unlock();
1131 static void WINAPI
d3d9_texture_3d_GenerateMipSubLevels(IDirect3DVolumeTexture9
*iface
)
1133 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
1135 TRACE("iface %p.\n", iface
);
1137 wined3d_mutex_lock();
1138 wined3d_texture_generate_mipmaps(texture
->wined3d_texture
);
1139 wined3d_mutex_unlock();
1142 static HRESULT WINAPI
d3d9_texture_3d_GetLevelDesc(IDirect3DVolumeTexture9
*iface
, UINT level
, D3DVOLUME_DESC
*desc
)
1144 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
1145 struct wined3d_resource
*sub_resource
;
1146 HRESULT hr
= D3D_OK
;
1148 TRACE("iface %p, level %u, desc %p.\n", iface
, level
, desc
);
1150 wined3d_mutex_lock();
1151 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, level
)))
1152 hr
= D3DERR_INVALIDCALL
;
1155 struct wined3d_resource_desc wined3d_desc
;
1157 wined3d_resource_get_desc(sub_resource
, &wined3d_desc
);
1158 desc
->Format
= d3dformat_from_wined3dformat(wined3d_desc
.format
);
1159 desc
->Type
= wined3d_desc
.resource_type
;
1160 desc
->Usage
= wined3d_desc
.usage
& WINED3DUSAGE_MASK
;
1161 desc
->Pool
= wined3d_desc
.pool
;
1162 desc
->Width
= wined3d_desc
.width
;
1163 desc
->Height
= wined3d_desc
.height
;
1164 desc
->Depth
= wined3d_desc
.depth
;
1166 wined3d_mutex_unlock();
1171 static HRESULT WINAPI
d3d9_texture_3d_GetVolumeLevel(IDirect3DVolumeTexture9
*iface
,
1172 UINT level
, IDirect3DVolume9
**volume
)
1174 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
1175 struct wined3d_resource
*sub_resource
;
1176 struct d3d9_volume
*volume_impl
;
1178 TRACE("iface %p, level %u, volume %p.\n", iface
, level
, volume
);
1180 wined3d_mutex_lock();
1181 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, level
)))
1183 wined3d_mutex_unlock();
1184 return D3DERR_INVALIDCALL
;
1187 volume_impl
= wined3d_resource_get_parent(sub_resource
);
1188 *volume
= &volume_impl
->IDirect3DVolume9_iface
;
1189 IDirect3DVolume9_AddRef(*volume
);
1190 wined3d_mutex_unlock();
1195 static HRESULT WINAPI
d3d9_texture_3d_LockBox(IDirect3DVolumeTexture9
*iface
,
1196 UINT level
, D3DLOCKED_BOX
*locked_box
, const D3DBOX
*box
, DWORD flags
)
1198 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
1199 struct wined3d_resource
*sub_resource
;
1200 struct d3d9_volume
*volume_impl
;
1203 TRACE("iface %p, level %u, locked_box %p, box %p, flags %#x.\n",
1204 iface
, level
, locked_box
, box
, flags
);
1206 wined3d_mutex_lock();
1207 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, level
)))
1208 hr
= D3DERR_INVALIDCALL
;
1211 volume_impl
= wined3d_resource_get_parent(sub_resource
);
1212 hr
= IDirect3DVolume9_LockBox(&volume_impl
->IDirect3DVolume9_iface
, locked_box
, box
, flags
);
1214 wined3d_mutex_unlock();
1219 static HRESULT WINAPI
d3d9_texture_3d_UnlockBox(IDirect3DVolumeTexture9
*iface
, UINT level
)
1221 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
1222 struct wined3d_resource
*sub_resource
;
1223 struct d3d9_volume
*volume_impl
;
1226 TRACE("iface %p, level %u.\n", iface
, level
);
1228 wined3d_mutex_lock();
1229 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, level
)))
1230 hr
= D3DERR_INVALIDCALL
;
1233 volume_impl
= wined3d_resource_get_parent(sub_resource
);
1234 hr
= IDirect3DVolume9_UnlockBox(&volume_impl
->IDirect3DVolume9_iface
);
1236 wined3d_mutex_unlock();
1241 static HRESULT WINAPI
d3d9_texture_3d_AddDirtyBox(IDirect3DVolumeTexture9
*iface
, const D3DBOX
*dirty_box
)
1243 struct d3d9_texture
*texture
= impl_from_IDirect3DVolumeTexture9(iface
);
1246 TRACE("iface %p, dirty_box %p.\n", iface
, dirty_box
);
1248 wined3d_mutex_lock();
1249 hr
= wined3d_texture_add_dirty_region(texture
->wined3d_texture
, 0, (const struct wined3d_box
*)dirty_box
);
1250 wined3d_mutex_unlock();
1256 static const IDirect3DVolumeTexture9Vtbl d3d9_texture_3d_vtbl
=
1259 d3d9_texture_3d_QueryInterface
,
1260 d3d9_texture_3d_AddRef
,
1261 d3d9_texture_3d_Release
,
1262 /* IDirect3DResource9 */
1263 d3d9_texture_3d_GetDevice
,
1264 d3d9_texture_3d_SetPrivateData
,
1265 d3d9_texture_3d_GetPrivateData
,
1266 d3d9_texture_3d_FreePrivateData
,
1267 d3d9_texture_3d_SetPriority
,
1268 d3d9_texture_3d_GetPriority
,
1269 d3d9_texture_3d_PreLoad
,
1270 d3d9_texture_3d_GetType
,
1271 /* IDirect3DBaseTexture9 */
1272 d3d9_texture_3d_SetLOD
,
1273 d3d9_texture_3d_GetLOD
,
1274 d3d9_texture_3d_GetLevelCount
,
1275 d3d9_texture_3d_SetAutoGenFilterType
,
1276 d3d9_texture_3d_GetAutoGenFilterType
,
1277 d3d9_texture_3d_GenerateMipSubLevels
,
1278 /* IDirect3DVolumeTexture9 */
1279 d3d9_texture_3d_GetLevelDesc
,
1280 d3d9_texture_3d_GetVolumeLevel
,
1281 d3d9_texture_3d_LockBox
,
1282 d3d9_texture_3d_UnlockBox
,
1283 d3d9_texture_3d_AddDirtyBox
,
1286 struct d3d9_texture
*unsafe_impl_from_IDirect3DBaseTexture9(IDirect3DBaseTexture9
*iface
)
1290 assert(iface
->lpVtbl
== (const IDirect3DBaseTexture9Vtbl
*)&d3d9_texture_2d_vtbl
1291 || iface
->lpVtbl
== (const IDirect3DBaseTexture9Vtbl
*)&d3d9_texture_cube_vtbl
1292 || iface
->lpVtbl
== (const IDirect3DBaseTexture9Vtbl
*)&d3d9_texture_3d_vtbl
);
1293 return CONTAINING_RECORD(iface
, struct d3d9_texture
, IDirect3DBaseTexture9_iface
);
1296 static void STDMETHODCALLTYPE
d3d9_texture_wined3d_object_destroyed(void *parent
)
1298 HeapFree(GetProcessHeap(), 0, parent
);
1301 static const struct wined3d_parent_ops d3d9_texture_wined3d_parent_ops
=
1303 d3d9_texture_wined3d_object_destroyed
,
1306 HRESULT
texture_init(struct d3d9_texture
*texture
, struct d3d9_device
*device
,
1307 UINT width
, UINT height
, UINT levels
, DWORD usage
, D3DFORMAT format
, D3DPOOL pool
)
1309 struct wined3d_resource_desc desc
;
1310 DWORD surface_flags
= 0;
1313 texture
->IDirect3DBaseTexture9_iface
.lpVtbl
= (const IDirect3DBaseTexture9Vtbl
*)&d3d9_texture_2d_vtbl
;
1314 texture
->refcount
= 1;
1316 desc
.resource_type
= WINED3D_RTYPE_TEXTURE
;
1317 desc
.format
= wined3dformat_from_d3dformat(format
);
1318 desc
.multisample_type
= WINED3D_MULTISAMPLE_NONE
;
1319 desc
.multisample_quality
= 0;
1320 desc
.usage
= usage
& WINED3DUSAGE_MASK
;
1321 desc
.usage
|= WINED3DUSAGE_TEXTURE
;
1324 desc
.height
= height
;
1328 if (pool
!= D3DPOOL_DEFAULT
|| (usage
& D3DUSAGE_DYNAMIC
))
1329 surface_flags
|= WINED3D_SURFACE_MAPPABLE
;
1331 wined3d_mutex_lock();
1332 hr
= wined3d_texture_create(device
->wined3d_device
, &desc
, levels
, surface_flags
,
1333 texture
, &d3d9_texture_wined3d_parent_ops
, &texture
->wined3d_texture
);
1334 wined3d_mutex_unlock();
1337 WARN("Failed to create wined3d texture, hr %#x.\n", hr
);
1341 texture
->parent_device
= &device
->IDirect3DDevice9Ex_iface
;
1342 IDirect3DDevice9Ex_AddRef(texture
->parent_device
);
1347 HRESULT
cubetexture_init(struct d3d9_texture
*texture
, struct d3d9_device
*device
,
1348 UINT edge_length
, UINT levels
, DWORD usage
, D3DFORMAT format
, D3DPOOL pool
)
1350 struct wined3d_resource_desc desc
;
1351 DWORD surface_flags
= 0;
1354 texture
->IDirect3DBaseTexture9_iface
.lpVtbl
= (const IDirect3DBaseTexture9Vtbl
*)&d3d9_texture_cube_vtbl
;
1355 texture
->refcount
= 1;
1357 desc
.resource_type
= WINED3D_RTYPE_CUBE_TEXTURE
;
1358 desc
.format
= wined3dformat_from_d3dformat(format
);
1359 desc
.multisample_type
= WINED3D_MULTISAMPLE_NONE
;
1360 desc
.multisample_quality
= 0;
1361 desc
.usage
= usage
& WINED3DUSAGE_MASK
;
1362 desc
.usage
|= WINED3DUSAGE_TEXTURE
;
1364 desc
.width
= edge_length
;
1365 desc
.height
= edge_length
;
1369 if (pool
!= D3DPOOL_DEFAULT
|| (usage
& D3DUSAGE_DYNAMIC
))
1370 surface_flags
|= WINED3D_SURFACE_MAPPABLE
;
1372 wined3d_mutex_lock();
1373 hr
= wined3d_texture_create(device
->wined3d_device
, &desc
, levels
, surface_flags
,
1374 texture
, &d3d9_texture_wined3d_parent_ops
, &texture
->wined3d_texture
);
1375 wined3d_mutex_unlock();
1378 WARN("Failed to create wined3d cube texture, hr %#x.\n", hr
);
1382 texture
->parent_device
= &device
->IDirect3DDevice9Ex_iface
;
1383 IDirect3DDevice9Ex_AddRef(texture
->parent_device
);
1388 HRESULT
volumetexture_init(struct d3d9_texture
*texture
, struct d3d9_device
*device
,
1389 UINT width
, UINT height
, UINT depth
, UINT levels
, DWORD usage
, D3DFORMAT format
, D3DPOOL pool
)
1391 struct wined3d_resource_desc desc
;
1394 texture
->IDirect3DBaseTexture9_iface
.lpVtbl
= (const IDirect3DBaseTexture9Vtbl
*)&d3d9_texture_3d_vtbl
;
1395 texture
->refcount
= 1;
1397 desc
.resource_type
= WINED3D_RTYPE_VOLUME_TEXTURE
;
1398 desc
.format
= wined3dformat_from_d3dformat(format
);
1399 desc
.multisample_type
= WINED3D_MULTISAMPLE_NONE
;
1400 desc
.multisample_quality
= 0;
1401 desc
.usage
= usage
& WINED3DUSAGE_MASK
;
1402 desc
.usage
|= WINED3DUSAGE_TEXTURE
;
1405 desc
.height
= height
;
1409 wined3d_mutex_lock();
1410 hr
= wined3d_texture_create(device
->wined3d_device
, &desc
, levels
, 0,
1411 texture
, &d3d9_texture_wined3d_parent_ops
, &texture
->wined3d_texture
);
1412 wined3d_mutex_unlock();
1415 WARN("Failed to create wined3d volume texture, hr %#x.\n", hr
);
1419 texture
->parent_device
= &device
->IDirect3DDevice9Ex_iface
;
1420 IDirect3DDevice9Ex_AddRef(texture
->parent_device
);