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 HRESULT WINAPI d3d9_texture_2d_QueryInterface(IDirect3DTexture9 *iface, REFIID riid, void **out)
38 TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
40 if (IsEqualGUID(riid, &IID_IDirect3DTexture9)
41 || IsEqualGUID(riid, &IID_IDirect3DBaseTexture9)
42 || IsEqualGUID(riid, &IID_IDirect3DResource9)
43 || IsEqualGUID(riid, &IID_IUnknown))
45 IDirect3DTexture9_AddRef(iface);
50 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
56 static ULONG WINAPI d3d9_texture_2d_AddRef(IDirect3DTexture9 *iface)
58 struct d3d9_texture *texture = impl_from_IDirect3DTexture9(iface);
59 ULONG ref = InterlockedIncrement(&texture->refcount);
61 TRACE("%p increasing refcount to %u.\n", iface, ref);
65 IDirect3DDevice9Ex_AddRef(texture->parent_device);
67 wined3d_texture_incref(texture->wined3d_texture);
68 wined3d_mutex_unlock();
74 static ULONG WINAPI d3d9_texture_2d_Release(IDirect3DTexture9 *iface)
76 struct d3d9_texture *texture = impl_from_IDirect3DTexture9(iface);
77 ULONG ref = InterlockedDecrement(&texture->refcount);
79 TRACE("%p decreasing refcount to %u.\n", iface, ref);
83 IDirect3DDevice9Ex *parent_device = texture->parent_device;
86 wined3d_texture_decref(texture->wined3d_texture);
87 wined3d_mutex_unlock();
89 /* Release the device last, as it may cause the device to be destroyed. */
90 IDirect3DDevice9Ex_Release(parent_device);
95 static HRESULT WINAPI d3d9_texture_2d_GetDevice(IDirect3DTexture9 *iface, IDirect3DDevice9 **device)
97 struct d3d9_texture *texture = impl_from_IDirect3DTexture9(iface);
99 TRACE("iface %p, device %p.\n", iface, device);
101 *device = (IDirect3DDevice9 *)texture->parent_device;
102 IDirect3DDevice9_AddRef(*device);
104 TRACE("Returning device %p.\n", *device);
109 static HRESULT WINAPI d3d9_texture_2d_SetPrivateData(IDirect3DTexture9 *iface,
110 REFGUID guid, const void *data, DWORD data_size, DWORD flags)
112 struct d3d9_texture *texture = impl_from_IDirect3DTexture9(iface);
113 struct wined3d_resource *resource;
116 TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
117 iface, debugstr_guid(guid), data, data_size, flags);
119 wined3d_mutex_lock();
120 resource = wined3d_texture_get_resource(texture->wined3d_texture);
121 hr = wined3d_resource_set_private_data(resource, guid, data, data_size, flags);
122 wined3d_mutex_unlock();
127 static HRESULT WINAPI d3d9_texture_2d_GetPrivateData(IDirect3DTexture9 *iface,
128 REFGUID guid, void *data, DWORD *data_size)
130 struct d3d9_texture *texture = impl_from_IDirect3DTexture9(iface);
131 struct wined3d_resource *resource;
134 TRACE("iface %p, guid %s, data %p, data_size %p.\n",
135 iface, debugstr_guid(guid), data, data_size);
137 wined3d_mutex_lock();
138 resource = wined3d_texture_get_resource(texture->wined3d_texture);
139 hr = wined3d_resource_get_private_data(resource, guid, data, data_size);
140 wined3d_mutex_unlock();
145 static HRESULT WINAPI d3d9_texture_2d_FreePrivateData(IDirect3DTexture9 *iface, REFGUID guid)
147 struct d3d9_texture *texture = impl_from_IDirect3DTexture9(iface);
148 struct wined3d_resource *resource;
151 TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid));
153 wined3d_mutex_lock();
154 resource = wined3d_texture_get_resource(texture->wined3d_texture);
155 hr = wined3d_resource_free_private_data(resource, guid);
156 wined3d_mutex_unlock();
161 static DWORD WINAPI d3d9_texture_2d_SetPriority(IDirect3DTexture9 *iface, DWORD priority)
163 struct d3d9_texture *texture = impl_from_IDirect3DTexture9(iface);
166 TRACE("iface %p, priority %u.\n", iface, priority);
168 wined3d_mutex_lock();
169 ret = wined3d_texture_set_priority(texture->wined3d_texture, priority);
170 wined3d_mutex_unlock();
175 static DWORD WINAPI d3d9_texture_2d_GetPriority(IDirect3DTexture9 *iface)
177 struct d3d9_texture *texture = impl_from_IDirect3DTexture9(iface);
180 TRACE("iface %p.\n", iface);
182 wined3d_mutex_lock();
183 ret = wined3d_texture_get_priority(texture->wined3d_texture);
184 wined3d_mutex_unlock();
189 static void WINAPI d3d9_texture_2d_PreLoad(IDirect3DTexture9 *iface)
191 struct d3d9_texture *texture = impl_from_IDirect3DTexture9(iface);
193 TRACE("iface %p.\n", iface);
195 wined3d_mutex_lock();
196 wined3d_texture_preload(texture->wined3d_texture);
197 wined3d_mutex_unlock();
200 static D3DRESOURCETYPE WINAPI d3d9_texture_2d_GetType(IDirect3DTexture9 *iface)
202 TRACE("iface %p.\n", iface);
204 return D3DRTYPE_TEXTURE;
207 static DWORD WINAPI d3d9_texture_2d_SetLOD(IDirect3DTexture9 *iface, DWORD lod)
209 struct d3d9_texture *texture = impl_from_IDirect3DTexture9(iface);
212 TRACE("iface %p, lod %u.\n", iface, lod);
214 wined3d_mutex_lock();
215 ret = wined3d_texture_set_lod(texture->wined3d_texture, lod);
216 wined3d_mutex_unlock();
221 static DWORD WINAPI d3d9_texture_2d_GetLOD(IDirect3DTexture9 *iface)
223 struct d3d9_texture *texture = impl_from_IDirect3DTexture9(iface);
226 TRACE("iface %p.\n", iface);
228 wined3d_mutex_lock();
229 ret = wined3d_texture_get_lod(texture->wined3d_texture);
230 wined3d_mutex_unlock();
235 static DWORD WINAPI d3d9_texture_2d_GetLevelCount(IDirect3DTexture9 *iface)
237 struct d3d9_texture *texture = impl_from_IDirect3DTexture9(iface);
240 TRACE("iface %p.\n", iface);
242 wined3d_mutex_lock();
243 ret = wined3d_texture_get_level_count(texture->wined3d_texture);
244 wined3d_mutex_unlock();
249 static HRESULT WINAPI d3d9_texture_2d_SetAutoGenFilterType(IDirect3DTexture9 *iface, D3DTEXTUREFILTERTYPE filter_type)
251 struct d3d9_texture *texture = impl_from_IDirect3DTexture9(iface);
254 TRACE("iface %p, filter_type %#x.\n", iface, filter_type);
256 wined3d_mutex_lock();
257 hr = wined3d_texture_set_autogen_filter_type(texture->wined3d_texture,
258 (enum wined3d_texture_filter_type)filter_type);
259 wined3d_mutex_unlock();
264 static D3DTEXTUREFILTERTYPE WINAPI d3d9_texture_2d_GetAutoGenFilterType(IDirect3DTexture9 *iface)
266 struct d3d9_texture *texture = impl_from_IDirect3DTexture9(iface);
267 D3DTEXTUREFILTERTYPE ret;
269 TRACE("iface %p.\n", iface);
271 wined3d_mutex_lock();
272 ret = (D3DTEXTUREFILTERTYPE)wined3d_texture_get_autogen_filter_type(texture->wined3d_texture);
273 wined3d_mutex_unlock();
278 static void WINAPI d3d9_texture_2d_GenerateMipSubLevels(IDirect3DTexture9 *iface)
280 struct d3d9_texture *texture = impl_from_IDirect3DTexture9(iface);
282 TRACE("iface %p.\n", iface);
284 wined3d_mutex_lock();
285 wined3d_texture_generate_mipmaps(texture->wined3d_texture);
286 wined3d_mutex_unlock();
289 static HRESULT WINAPI d3d9_texture_2d_GetLevelDesc(IDirect3DTexture9 *iface, UINT level, D3DSURFACE_DESC *desc)
291 struct d3d9_texture *texture = impl_from_IDirect3DTexture9(iface);
292 struct wined3d_resource *sub_resource;
295 TRACE("iface %p, level %u, desc %p.\n", iface, level, desc);
297 wined3d_mutex_lock();
298 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level)))
299 hr = D3DERR_INVALIDCALL;
302 struct wined3d_resource_desc wined3d_desc;
304 wined3d_resource_get_desc(sub_resource, &wined3d_desc);
305 desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format);
306 desc->Type = wined3d_desc.resource_type;
307 desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK;
308 desc->Pool = wined3d_desc.pool;
309 desc->MultiSampleType = wined3d_desc.multisample_type;
310 desc->MultiSampleQuality = wined3d_desc.multisample_quality;
311 desc->Width = wined3d_desc.width;
312 desc->Height = wined3d_desc.height;
314 wined3d_mutex_unlock();
319 static HRESULT WINAPI d3d9_texture_2d_GetSurfaceLevel(IDirect3DTexture9 *iface,
320 UINT level, IDirect3DSurface9 **surface)
322 struct d3d9_texture *texture = impl_from_IDirect3DTexture9(iface);
323 struct wined3d_resource *sub_resource;
325 TRACE("iface %p, level %u, surface %p.\n", iface, level, surface);
327 wined3d_mutex_lock();
328 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level)))
330 wined3d_mutex_unlock();
331 return D3DERR_INVALIDCALL;
334 *surface = wined3d_resource_get_parent(sub_resource);
335 IDirect3DSurface9_AddRef(*surface);
336 wined3d_mutex_unlock();
341 static HRESULT WINAPI d3d9_texture_2d_LockRect(IDirect3DTexture9 *iface,
342 UINT level, D3DLOCKED_RECT *locked_rect, const RECT *rect, DWORD flags)
344 struct d3d9_texture *texture = impl_from_IDirect3DTexture9(iface);
345 struct wined3d_resource *sub_resource;
348 TRACE("iface %p, level %u, locked_rect %p, rect %p, flags %#x.\n",
349 iface, level, locked_rect, rect, flags);
351 wined3d_mutex_lock();
352 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level)))
353 hr = D3DERR_INVALIDCALL;
355 hr = IDirect3DSurface9_LockRect((IDirect3DSurface9 *)wined3d_resource_get_parent(sub_resource),
356 locked_rect, rect, flags);
357 wined3d_mutex_unlock();
362 static HRESULT WINAPI d3d9_texture_2d_UnlockRect(IDirect3DTexture9 *iface, UINT level)
364 struct d3d9_texture *texture = impl_from_IDirect3DTexture9(iface);
365 struct wined3d_resource *sub_resource;
368 TRACE("iface %p, level %u.\n", iface, level);
370 wined3d_mutex_lock();
371 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level)))
372 hr = D3DERR_INVALIDCALL;
374 hr = IDirect3DSurface9_UnlockRect((IDirect3DSurface9 *)wined3d_resource_get_parent(sub_resource));
375 wined3d_mutex_unlock();
380 static HRESULT WINAPI d3d9_texture_2d_AddDirtyRect(IDirect3DTexture9 *iface, const RECT *dirty_rect)
382 struct d3d9_texture *texture = impl_from_IDirect3DTexture9(iface);
385 TRACE("iface %p, dirty_rect %s.\n",
386 iface, wine_dbgstr_rect(dirty_rect));
388 wined3d_mutex_lock();
390 hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, 0, NULL);
393 struct wined3d_box dirty_region;
395 dirty_region.left = dirty_rect->left;
396 dirty_region.top = dirty_rect->top;
397 dirty_region.right = dirty_rect->right;
398 dirty_region.bottom = dirty_rect->bottom;
399 dirty_region.front = 0;
400 dirty_region.back = 1;
401 hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, 0, &dirty_region);
403 wined3d_mutex_unlock();
408 static const IDirect3DTexture9Vtbl d3d9_texture_2d_vtbl =
411 d3d9_texture_2d_QueryInterface,
412 d3d9_texture_2d_AddRef,
413 d3d9_texture_2d_Release,
414 /* IDirect3DResource9 */
415 d3d9_texture_2d_GetDevice,
416 d3d9_texture_2d_SetPrivateData,
417 d3d9_texture_2d_GetPrivateData,
418 d3d9_texture_2d_FreePrivateData,
419 d3d9_texture_2d_SetPriority,
420 d3d9_texture_2d_GetPriority,
421 d3d9_texture_2d_PreLoad,
422 d3d9_texture_2d_GetType,
423 /* IDirect3dBaseTexture9 */
424 d3d9_texture_2d_SetLOD,
425 d3d9_texture_2d_GetLOD,
426 d3d9_texture_2d_GetLevelCount,
427 d3d9_texture_2d_SetAutoGenFilterType,
428 d3d9_texture_2d_GetAutoGenFilterType,
429 d3d9_texture_2d_GenerateMipSubLevels,
430 /* IDirect3DTexture9 */
431 d3d9_texture_2d_GetLevelDesc,
432 d3d9_texture_2d_GetSurfaceLevel,
433 d3d9_texture_2d_LockRect,
434 d3d9_texture_2d_UnlockRect,
435 d3d9_texture_2d_AddDirtyRect,
438 static HRESULT WINAPI d3d9_texture_cube_QueryInterface(IDirect3DCubeTexture9 *iface, REFIID riid, void **out)
440 TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
442 if (IsEqualGUID(riid, &IID_IDirect3DCubeTexture9)
443 || IsEqualGUID(riid, &IID_IDirect3DBaseTexture9)
444 || IsEqualGUID(riid, &IID_IDirect3DResource9)
445 || IsEqualGUID(riid, &IID_IUnknown))
447 IDirect3DCubeTexture9_AddRef(iface);
452 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
455 return E_NOINTERFACE;
458 static ULONG WINAPI d3d9_texture_cube_AddRef(IDirect3DCubeTexture9 *iface)
460 struct d3d9_texture *texture = impl_from_IDirect3DCubeTexture9(iface);
461 ULONG ref = InterlockedIncrement(&texture->refcount);
463 TRACE("%p increasing refcount to %u.\n", iface, ref);
467 IDirect3DDevice9Ex_AddRef(texture->parent_device);
468 wined3d_mutex_lock();
469 wined3d_texture_incref(texture->wined3d_texture);
470 wined3d_mutex_unlock();
476 static ULONG WINAPI d3d9_texture_cube_Release(IDirect3DCubeTexture9 *iface)
478 struct d3d9_texture *texture = impl_from_IDirect3DCubeTexture9(iface);
479 ULONG ref = InterlockedDecrement(&texture->refcount);
481 TRACE("%p decreasing refcount to %u.\n", iface, ref);
485 IDirect3DDevice9Ex *parent_device = texture->parent_device;
487 TRACE("Releasing child %p.\n", texture->wined3d_texture);
489 wined3d_mutex_lock();
490 wined3d_texture_decref(texture->wined3d_texture);
491 wined3d_mutex_unlock();
493 /* Release the device last, as it may cause the device to be destroyed. */
494 IDirect3DDevice9Ex_Release(parent_device);
499 static HRESULT WINAPI d3d9_texture_cube_GetDevice(IDirect3DCubeTexture9 *iface, IDirect3DDevice9 **device)
501 struct d3d9_texture *texture = impl_from_IDirect3DCubeTexture9(iface);
503 TRACE("iface %p, device %p.\n", iface, device);
505 *device = (IDirect3DDevice9 *)texture->parent_device;
506 IDirect3DDevice9_AddRef(*device);
508 TRACE("Returning device %p.\n", *device);
513 static HRESULT WINAPI d3d9_texture_cube_SetPrivateData(IDirect3DCubeTexture9 *iface,
514 REFGUID guid, const void *data, DWORD data_size, DWORD flags)
516 struct d3d9_texture *texture = impl_from_IDirect3DCubeTexture9(iface);
517 struct wined3d_resource *resource;
520 TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n",
521 iface, debugstr_guid(guid), data, data_size, flags);
523 wined3d_mutex_lock();
524 resource = wined3d_texture_get_resource(texture->wined3d_texture);
525 hr = wined3d_resource_set_private_data(resource, guid, data, data_size, flags);
526 wined3d_mutex_unlock();
531 static HRESULT WINAPI d3d9_texture_cube_GetPrivateData(IDirect3DCubeTexture9 *iface,
532 REFGUID guid, void *data, DWORD *data_size)
534 struct d3d9_texture *texture = impl_from_IDirect3DCubeTexture9(iface);
535 struct wined3d_resource *resource;
538 TRACE("iface %p, guid %s, data %p, data_size %p.\n",
539 iface, debugstr_guid(guid), data, data_size);
541 wined3d_mutex_lock();
542 resource = wined3d_texture_get_resource(texture->wined3d_texture);
543 hr = wined3d_resource_get_private_data(resource, guid, data, data_size);
544 wined3d_mutex_unlock();
549 static HRESULT WINAPI d3d9_texture_cube_FreePrivateData(IDirect3DCubeTexture9 *iface, REFGUID guid)
551 struct d3d9_texture *texture = impl_from_IDirect3DCubeTexture9(iface);
552 struct wined3d_resource *resource;
555 TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid));
557 wined3d_mutex_lock();
558 resource = wined3d_texture_get_resource(texture->wined3d_texture);
559 hr = wined3d_resource_free_private_data(resource, guid);
560 wined3d_mutex_unlock();
565 static DWORD WINAPI d3d9_texture_cube_SetPriority(IDirect3DCubeTexture9 *iface, DWORD priority)
567 struct d3d9_texture *texture = impl_from_IDirect3DCubeTexture9(iface);
570 TRACE("iface %p, priority %u.\n", iface, priority);
572 wined3d_mutex_lock();
573 ret = wined3d_texture_set_priority(texture->wined3d_texture, priority);
574 wined3d_mutex_unlock();
579 static DWORD WINAPI d3d9_texture_cube_GetPriority(IDirect3DCubeTexture9 *iface)
581 struct d3d9_texture *texture = impl_from_IDirect3DCubeTexture9(iface);
584 TRACE("iface %p.\n", iface);
586 wined3d_mutex_lock();
587 ret = wined3d_texture_get_priority(texture->wined3d_texture);
588 wined3d_mutex_unlock();
593 static void WINAPI d3d9_texture_cube_PreLoad(IDirect3DCubeTexture9 *iface)
595 struct d3d9_texture *texture = impl_from_IDirect3DCubeTexture9(iface);
597 TRACE("iface %p.\n", iface);
599 wined3d_mutex_lock();
600 wined3d_texture_preload(texture->wined3d_texture);
601 wined3d_mutex_unlock();
604 static D3DRESOURCETYPE WINAPI d3d9_texture_cube_GetType(IDirect3DCubeTexture9 *iface)
606 TRACE("iface %p.\n", iface);
608 return D3DRTYPE_CUBETEXTURE;
611 static DWORD WINAPI d3d9_texture_cube_SetLOD(IDirect3DCubeTexture9 *iface, DWORD lod)
613 struct d3d9_texture *texture = impl_from_IDirect3DCubeTexture9(iface);
616 TRACE("iface %p, lod %u.\n", iface, lod);
618 wined3d_mutex_lock();
619 ret = wined3d_texture_set_lod(texture->wined3d_texture, lod);
620 wined3d_mutex_unlock();
625 static DWORD WINAPI d3d9_texture_cube_GetLOD(IDirect3DCubeTexture9 *iface)
627 struct d3d9_texture *texture = impl_from_IDirect3DCubeTexture9(iface);
630 TRACE("iface %p.\n", iface);
632 wined3d_mutex_lock();
633 ret = wined3d_texture_get_lod(texture->wined3d_texture);
634 wined3d_mutex_unlock();
639 static DWORD WINAPI d3d9_texture_cube_GetLevelCount(IDirect3DCubeTexture9 *iface)
641 struct d3d9_texture *texture = impl_from_IDirect3DCubeTexture9(iface);
644 TRACE("iface %p.\n", iface);
646 wined3d_mutex_lock();
647 ret = wined3d_texture_get_level_count(texture->wined3d_texture);
648 wined3d_mutex_unlock();
653 static HRESULT WINAPI d3d9_texture_cube_SetAutoGenFilterType(IDirect3DCubeTexture9 *iface,
654 D3DTEXTUREFILTERTYPE filter_type)
656 struct d3d9_texture *texture = impl_from_IDirect3DCubeTexture9(iface);
659 TRACE("iface %p, filter_type %#x.\n", iface, filter_type);
661 wined3d_mutex_lock();
662 hr = wined3d_texture_set_autogen_filter_type(texture->wined3d_texture,
663 (enum wined3d_texture_filter_type)filter_type);
664 wined3d_mutex_unlock();
669 static D3DTEXTUREFILTERTYPE WINAPI d3d9_texture_cube_GetAutoGenFilterType(IDirect3DCubeTexture9 *iface)
671 struct d3d9_texture *texture = impl_from_IDirect3DCubeTexture9(iface);
672 D3DTEXTUREFILTERTYPE ret;
674 TRACE("iface %p.\n", iface);
676 wined3d_mutex_lock();
677 ret = (D3DTEXTUREFILTERTYPE)wined3d_texture_get_autogen_filter_type(texture->wined3d_texture);
678 wined3d_mutex_unlock();
683 static void WINAPI d3d9_texture_cube_GenerateMipSubLevels(IDirect3DCubeTexture9 *iface)
685 struct d3d9_texture *texture = impl_from_IDirect3DCubeTexture9(iface);
687 TRACE("iface %p.\n", iface);
689 wined3d_mutex_lock();
690 wined3d_texture_generate_mipmaps(texture->wined3d_texture);
691 wined3d_mutex_unlock();
694 static HRESULT WINAPI d3d9_texture_cube_GetLevelDesc(IDirect3DCubeTexture9 *iface, UINT level, D3DSURFACE_DESC *desc)
696 struct d3d9_texture *texture = impl_from_IDirect3DCubeTexture9(iface);
697 struct wined3d_resource *sub_resource;
700 TRACE("iface %p, level %u, desc %p.\n", iface, level, desc);
702 wined3d_mutex_lock();
703 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, level)))
704 hr = D3DERR_INVALIDCALL;
707 struct wined3d_resource_desc wined3d_desc;
709 wined3d_resource_get_desc(sub_resource, &wined3d_desc);
710 desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format);
711 desc->Type = wined3d_desc.resource_type;
712 desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK;
713 desc->Pool = wined3d_desc.pool;
714 desc->MultiSampleType = wined3d_desc.multisample_type;
715 desc->MultiSampleQuality = wined3d_desc.multisample_quality;
716 desc->Width = wined3d_desc.width;
717 desc->Height = wined3d_desc.height;
719 wined3d_mutex_unlock();
724 static HRESULT WINAPI d3d9_texture_cube_GetCubeMapSurface(IDirect3DCubeTexture9 *iface,
725 D3DCUBEMAP_FACES face, UINT level, IDirect3DSurface9 **surface)
727 struct d3d9_texture *texture = impl_from_IDirect3DCubeTexture9(iface);
728 struct wined3d_resource *sub_resource;
729 UINT sub_resource_idx;
731 TRACE("iface %p, face %#x, level %u, surface %p.\n", iface, face, level, surface);
733 wined3d_mutex_lock();
734 sub_resource_idx = wined3d_texture_get_level_count(texture->wined3d_texture) * face + level;
735 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, sub_resource_idx)))
737 wined3d_mutex_unlock();
738 return D3DERR_INVALIDCALL;
741 *surface = wined3d_resource_get_parent(sub_resource);
742 IDirect3DSurface9_AddRef(*surface);
743 wined3d_mutex_unlock();
748 static HRESULT WINAPI d3d9_texture_cube_LockRect(IDirect3DCubeTexture9 *iface,
749 D3DCUBEMAP_FACES face, UINT level, D3DLOCKED_RECT *locked_rect, const RECT *rect,
752 struct d3d9_texture *texture = impl_from_IDirect3DCubeTexture9(iface);
753 struct wined3d_resource *sub_resource;
754 UINT sub_resource_idx;
757 TRACE("iface %p, face %#x, level %u, locked_rect %p, rect %p, flags %#x.\n",
758 iface, face, level, locked_rect, rect, flags);
760 wined3d_mutex_lock();
761 sub_resource_idx = wined3d_texture_get_level_count(texture->wined3d_texture) * face + level;
762 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, sub_resource_idx)))
763 hr = D3DERR_INVALIDCALL;
765 hr = IDirect3DSurface9_LockRect((IDirect3DSurface9 *)wined3d_resource_get_parent(sub_resource),
766 locked_rect, rect, flags);
767 wined3d_mutex_unlock();
772 static HRESULT WINAPI d3d9_texture_cube_UnlockRect(IDirect3DCubeTexture9 *iface,
773 D3DCUBEMAP_FACES face, UINT level)
775 struct d3d9_texture *texture = impl_from_IDirect3DCubeTexture9(iface);
776 struct wined3d_resource *sub_resource;
777 UINT sub_resource_idx;
780 TRACE("iface %p, face %#x, level %u.\n", iface, face, level);
782 wined3d_mutex_lock();
783 sub_resource_idx = wined3d_texture_get_level_count(texture->wined3d_texture) * face + level;
784 if (!(sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, sub_resource_idx)))
785 hr = D3DERR_INVALIDCALL;
787 hr = IDirect3DSurface9_UnlockRect((IDirect3DSurface9 *)wined3d_resource_get_parent(sub_resource));
788 wined3d_mutex_unlock();
793 static HRESULT WINAPI d3d9_texture_cube_AddDirtyRect(IDirect3DCubeTexture9 *iface,
794 D3DCUBEMAP_FACES face, const RECT *dirty_rect)
796 struct d3d9_texture *texture = impl_from_IDirect3DCubeTexture9(iface);
799 TRACE("iface %p, face %#x, dirty_rect %s.\n",
800 iface, face, wine_dbgstr_rect(dirty_rect));
802 wined3d_mutex_lock();
804 hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, face, NULL);
807 struct wined3d_box dirty_region;
809 dirty_region.left = dirty_rect->left;
810 dirty_region.top = dirty_rect->top;
811 dirty_region.right = dirty_rect->right;
812 dirty_region.bottom = dirty_rect->bottom;
813 dirty_region.front = 0;
814 dirty_region.back = 1;
815 hr = wined3d_texture_add_dirty_region(texture->wined3d_texture, face, &dirty_region);
817 wined3d_mutex_unlock();
822 static const IDirect3DCubeTexture9Vtbl d3d9_texture_cube_vtbl =
825 d3d9_texture_cube_QueryInterface,
826 d3d9_texture_cube_AddRef,
827 d3d9_texture_cube_Release,
828 /* IDirect3DResource9 */
829 d3d9_texture_cube_GetDevice,
830 d3d9_texture_cube_SetPrivateData,
831 d3d9_texture_cube_GetPrivateData,
832 d3d9_texture_cube_FreePrivateData,
833 d3d9_texture_cube_SetPriority,
834 d3d9_texture_cube_GetPriority,
835 d3d9_texture_cube_PreLoad,
836 d3d9_texture_cube_GetType,
837 /* IDirect3DBaseTexture9 */
838 d3d9_texture_cube_SetLOD,
839 d3d9_texture_cube_GetLOD,
840 d3d9_texture_cube_GetLevelCount,
841 d3d9_texture_cube_SetAutoGenFilterType,
842 d3d9_texture_cube_GetAutoGenFilterType,
843 d3d9_texture_cube_GenerateMipSubLevels,
844 /* IDirect3DCubeTexture9 */
845 d3d9_texture_cube_GetLevelDesc,
846 d3d9_texture_cube_GetCubeMapSurface,
847 d3d9_texture_cube_LockRect,
848 d3d9_texture_cube_UnlockRect,
849 d3d9_texture_cube_AddDirtyRect,
852 static void STDMETHODCALLTYPE d3d9_texture_wined3d_object_destroyed(void *parent)
854 HeapFree(GetProcessHeap(), 0, parent);
857 static const struct wined3d_parent_ops d3d9_texture_wined3d_parent_ops =
859 d3d9_texture_wined3d_object_destroyed,
862 HRESULT texture_init(struct d3d9_texture *texture, IDirect3DDevice9Impl *device,
863 UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool)
867 texture->IDirect3DBaseTexture9_iface.lpVtbl = (const IDirect3DBaseTexture9Vtbl *)&d3d9_texture_2d_vtbl;
868 texture->refcount = 1;
870 wined3d_mutex_lock();
871 hr = wined3d_texture_create_2d(device->wined3d_device, width, height, levels,
872 usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), pool,
873 texture, &d3d9_texture_wined3d_parent_ops, &texture->wined3d_texture);
874 wined3d_mutex_unlock();
877 WARN("Failed to create wined3d texture, hr %#x.\n", hr);
881 texture->parent_device = &device->IDirect3DDevice9Ex_iface;
882 IDirect3DDevice9Ex_AddRef(texture->parent_device);
887 HRESULT cubetexture_init(struct d3d9_texture *texture, IDirect3DDevice9Impl *device,
888 UINT edge_length, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool)
892 texture->IDirect3DBaseTexture9_iface.lpVtbl = (const IDirect3DBaseTexture9Vtbl *)&d3d9_texture_cube_vtbl;
893 texture->refcount = 1;
895 wined3d_mutex_lock();
896 hr = wined3d_texture_create_cube(device->wined3d_device, edge_length,
897 levels, usage, wined3dformat_from_d3dformat(format), pool, texture,
898 &d3d9_texture_wined3d_parent_ops, &texture->wined3d_texture);
899 wined3d_mutex_unlock();
902 WARN("Failed to create wined3d cube texture, hr %#x.\n", hr);
906 texture->parent_device = &device->IDirect3DDevice9Ex_iface;
907 IDirect3DDevice9Ex_AddRef(texture->parent_device);