2 * Copyright 2005 Oliver Stieber
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #include "d3d8_private.h"
21 WINE_DEFAULT_DEBUG_CHANNEL(d3d8
);
23 static ULONG
d3d8_texture_incref(struct d3d8_texture
*texture
)
25 ULONG ref
= InterlockedIncrement(&texture
->resource
.refcount
);
27 TRACE("%p increasing refcount to %lu.\n", texture
, ref
);
31 struct d3d8_surface
*surface
;
33 IDirect3DDevice8_AddRef(&texture
->parent_device
->IDirect3DDevice8_iface
);
35 LIST_FOR_EACH_ENTRY(surface
, &texture
->rtv_list
, struct d3d8_surface
, rtv_entry
)
37 wined3d_rendertarget_view_incref(surface
->wined3d_rtv
);
39 wined3d_texture_incref(d3d8_texture_get_draw_texture(texture
));
40 wined3d_mutex_unlock();
46 static ULONG
d3d8_texture_decref(struct d3d8_texture
*texture
)
48 ULONG ref
= InterlockedDecrement(&texture
->resource
.refcount
);
50 TRACE("%p decreasing refcount to %lu.\n", texture
, ref
);
54 IDirect3DDevice8
*parent_device
= &texture
->parent_device
->IDirect3DDevice8_iface
;
55 struct d3d8_surface
*surface
;
58 LIST_FOR_EACH_ENTRY(surface
, &texture
->rtv_list
, struct d3d8_surface
, rtv_entry
)
60 wined3d_rendertarget_view_decref(surface
->wined3d_rtv
);
62 wined3d_texture_decref(d3d8_texture_get_draw_texture(texture
));
63 wined3d_mutex_unlock();
65 /* Release the device last, as it may cause the device to be destroyed. */
66 IDirect3DDevice8_Release(parent_device
);
71 static void d3d8_texture_preload(struct d3d8_texture
*texture
)
74 if (texture
->draw_texture
)
75 wined3d_device_update_texture(texture
->parent_device
->wined3d_device
,
76 texture
->wined3d_texture
, texture
->draw_texture
);
78 wined3d_resource_preload(wined3d_texture_get_resource(texture
->wined3d_texture
));
79 wined3d_mutex_unlock();
82 static inline struct d3d8_texture
*impl_from_IDirect3DTexture8(IDirect3DTexture8
*iface
)
84 return CONTAINING_RECORD(iface
, struct d3d8_texture
, IDirect3DBaseTexture8_iface
);
87 static inline struct d3d8_texture
*impl_from_IDirect3DCubeTexture8(IDirect3DCubeTexture8
*iface
)
89 return CONTAINING_RECORD(iface
, struct d3d8_texture
, IDirect3DBaseTexture8_iface
);
92 static inline struct d3d8_texture
*impl_from_IDirect3DVolumeTexture8(IDirect3DVolumeTexture8
*iface
)
94 return CONTAINING_RECORD(iface
, struct d3d8_texture
, IDirect3DBaseTexture8_iface
);
97 static HRESULT WINAPI
d3d8_texture_2d_QueryInterface(IDirect3DTexture8
*iface
, REFIID riid
, void **out
)
99 TRACE("iface %p, riid %s, out %p.\n", iface
, debugstr_guid(riid
), out
);
101 if (IsEqualGUID(riid
, &IID_IDirect3DTexture8
)
102 || IsEqualGUID(riid
, &IID_IDirect3DBaseTexture8
)
103 || IsEqualGUID(riid
, &IID_IDirect3DResource8
)
104 || IsEqualGUID(riid
, &IID_IUnknown
))
106 IDirect3DTexture8_AddRef(iface
);
111 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
114 return E_NOINTERFACE
;
117 static ULONG WINAPI
d3d8_texture_2d_AddRef(IDirect3DTexture8
*iface
)
119 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
121 return d3d8_texture_incref(texture
);
124 static ULONG WINAPI
d3d8_texture_2d_Release(IDirect3DTexture8
*iface
)
126 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
128 return d3d8_texture_decref(texture
);
131 static HRESULT WINAPI
d3d8_texture_2d_GetDevice(IDirect3DTexture8
*iface
, IDirect3DDevice8
**device
)
133 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
135 TRACE("iface %p, device %p.\n", iface
, device
);
137 *device
= &texture
->parent_device
->IDirect3DDevice8_iface
;
138 IDirect3DDevice8_AddRef(*device
);
140 TRACE("Returning device %p.\n", *device
);
145 static HRESULT WINAPI
d3d8_texture_2d_SetPrivateData(IDirect3DTexture8
*iface
,
146 REFGUID guid
, const void *data
, DWORD data_size
, DWORD flags
)
148 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
149 TRACE("iface %p, guid %s, data %p, data_size %lu, flags %#lx.\n",
150 iface
, debugstr_guid(guid
), data
, data_size
, flags
);
152 return d3d8_resource_set_private_data(&texture
->resource
, guid
, data
, data_size
, flags
);
155 static HRESULT WINAPI
d3d8_texture_2d_GetPrivateData(IDirect3DTexture8
*iface
,
156 REFGUID guid
, void *data
, DWORD
*data_size
)
158 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
159 TRACE("iface %p, guid %s, data %p, data_size %p.\n",
160 iface
, debugstr_guid(guid
), data
, data_size
);
162 return d3d8_resource_get_private_data(&texture
->resource
, guid
, data
, data_size
);
165 static HRESULT WINAPI
d3d8_texture_2d_FreePrivateData(IDirect3DTexture8
*iface
, REFGUID guid
)
167 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
168 TRACE("iface %p, guid %s.\n", iface
, debugstr_guid(guid
));
170 return d3d8_resource_free_private_data(&texture
->resource
, guid
);
173 static DWORD WINAPI
d3d8_texture_2d_SetPriority(IDirect3DTexture8
*iface
, DWORD priority
)
175 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
176 struct wined3d_resource
*resource
;
179 TRACE("iface %p, priority %lu.\n", iface
, priority
);
181 wined3d_mutex_lock();
182 resource
= wined3d_texture_get_resource(d3d8_texture_get_draw_texture(texture
));
183 ret
= wined3d_resource_set_priority(resource
, priority
);
184 wined3d_mutex_unlock();
189 static DWORD WINAPI
d3d8_texture_2d_GetPriority(IDirect3DTexture8
*iface
)
191 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
192 const struct wined3d_resource
*resource
;
195 TRACE("iface %p.\n", iface
);
197 wined3d_mutex_lock();
198 resource
= wined3d_texture_get_resource(d3d8_texture_get_draw_texture(texture
));
199 ret
= wined3d_resource_get_priority(resource
);
200 wined3d_mutex_unlock();
205 static void WINAPI
d3d8_texture_2d_PreLoad(IDirect3DTexture8
*iface
)
207 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
209 TRACE("iface %p.\n", iface
);
211 d3d8_texture_preload(texture
);
214 static D3DRESOURCETYPE WINAPI
d3d8_texture_2d_GetType(IDirect3DTexture8
*iface
)
216 TRACE("iface %p.\n", iface
);
218 return D3DRTYPE_TEXTURE
;
221 static DWORD WINAPI
d3d8_texture_2d_SetLOD(IDirect3DTexture8
*iface
, DWORD lod
)
223 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
226 TRACE("iface %p, lod %lu.\n", iface
, lod
);
228 wined3d_mutex_lock();
229 ret
= wined3d_stateblock_set_texture_lod(texture
->parent_device
->state
,
230 d3d8_texture_get_draw_texture(texture
), lod
);
231 wined3d_mutex_unlock();
236 static DWORD WINAPI
d3d8_texture_2d_GetLOD(IDirect3DTexture8
*iface
)
238 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
241 TRACE("iface %p.\n", iface
);
243 wined3d_mutex_lock();
244 ret
= wined3d_texture_get_lod(d3d8_texture_get_draw_texture(texture
));
245 wined3d_mutex_unlock();
250 static DWORD WINAPI
d3d8_texture_2d_GetLevelCount(IDirect3DTexture8
*iface
)
252 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
255 TRACE("iface %p.\n", iface
);
257 wined3d_mutex_lock();
258 ret
= wined3d_texture_get_level_count(texture
->wined3d_texture
);
259 wined3d_mutex_unlock();
264 static HRESULT WINAPI
d3d8_texture_2d_GetLevelDesc(IDirect3DTexture8
*iface
, UINT level
, D3DSURFACE_DESC
*desc
)
266 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
267 struct wined3d_sub_resource_desc wined3d_desc
;
270 TRACE("iface %p, level %u, desc %p.\n", iface
, level
, desc
);
272 wined3d_mutex_lock();
273 if (SUCCEEDED(hr
= wined3d_texture_get_sub_resource_desc(texture
->wined3d_texture
, level
, &wined3d_desc
)))
275 desc
->Format
= d3dformat_from_wined3dformat(wined3d_desc
.format
);
276 desc
->Type
= D3DRTYPE_SURFACE
;
277 desc
->Usage
= d3dusage_from_wined3dusage(wined3d_desc
.usage
, wined3d_desc
.bind_flags
);
278 desc
->Pool
= d3dpool_from_wined3daccess(wined3d_desc
.access
, wined3d_desc
.usage
);
279 desc
->Size
= wined3d_desc
.size
;
280 desc
->MultiSampleType
= d3dmultisample_type_from_wined3d(wined3d_desc
.multisample_type
);
281 desc
->Width
= wined3d_desc
.width
;
282 desc
->Height
= wined3d_desc
.height
;
284 wined3d_mutex_unlock();
289 static HRESULT WINAPI
d3d8_texture_2d_GetSurfaceLevel(IDirect3DTexture8
*iface
,
290 UINT level
, IDirect3DSurface8
**surface
)
292 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
293 struct d3d8_surface
*surface_impl
;
295 TRACE("iface %p, level %u, surface %p.\n", iface
, level
, surface
);
297 wined3d_mutex_lock();
298 if (!(surface_impl
= wined3d_texture_get_sub_resource_parent(texture
->wined3d_texture
, level
)))
300 wined3d_mutex_unlock();
301 return D3DERR_INVALIDCALL
;
304 *surface
= &surface_impl
->IDirect3DSurface8_iface
;
305 IDirect3DSurface8_AddRef(*surface
);
306 wined3d_mutex_unlock();
311 static HRESULT WINAPI
d3d8_texture_2d_LockRect(IDirect3DTexture8
*iface
, UINT level
,
312 D3DLOCKED_RECT
*locked_rect
, const RECT
*rect
, DWORD flags
)
314 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
315 struct d3d8_surface
*surface_impl
;
318 TRACE("iface %p, level %u, locked_rect %p, rect %p, flags %#lx.\n",
319 iface
, level
, locked_rect
, rect
, flags
);
321 wined3d_mutex_lock();
322 if (!(surface_impl
= wined3d_texture_get_sub_resource_parent(texture
->wined3d_texture
, level
)))
323 hr
= D3DERR_INVALIDCALL
;
325 hr
= IDirect3DSurface8_LockRect(&surface_impl
->IDirect3DSurface8_iface
, locked_rect
, rect
, flags
);
326 wined3d_mutex_unlock();
331 static HRESULT WINAPI
d3d8_texture_2d_UnlockRect(IDirect3DTexture8
*iface
, UINT level
)
333 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
334 struct d3d8_surface
*surface_impl
;
337 TRACE("iface %p, level %u.\n", iface
, level
);
339 wined3d_mutex_lock();
340 if (!(surface_impl
= wined3d_texture_get_sub_resource_parent(texture
->wined3d_texture
, level
)))
341 hr
= D3DERR_INVALIDCALL
;
343 hr
= IDirect3DSurface8_UnlockRect(&surface_impl
->IDirect3DSurface8_iface
);
344 wined3d_mutex_unlock();
349 static HRESULT WINAPI
d3d8_texture_2d_AddDirtyRect(IDirect3DTexture8
*iface
, const RECT
*dirty_rect
)
351 struct d3d8_texture
*texture
= impl_from_IDirect3DTexture8(iface
);
354 TRACE("iface %p, dirty_rect %s.\n",
355 iface
, wine_dbgstr_rect(dirty_rect
));
357 wined3d_mutex_lock();
359 hr
= wined3d_texture_add_dirty_region(texture
->wined3d_texture
, 0, NULL
);
362 struct wined3d_box dirty_region
;
364 wined3d_box_set(&dirty_region
, dirty_rect
->left
, dirty_rect
->top
, dirty_rect
->right
, dirty_rect
->bottom
, 0, 1);
365 hr
= wined3d_texture_add_dirty_region(texture
->wined3d_texture
, 0, &dirty_region
);
367 wined3d_mutex_unlock();
372 static const IDirect3DTexture8Vtbl Direct3DTexture8_Vtbl
=
375 d3d8_texture_2d_QueryInterface
,
376 d3d8_texture_2d_AddRef
,
377 d3d8_texture_2d_Release
,
378 /* IDirect3DResource8 */
379 d3d8_texture_2d_GetDevice
,
380 d3d8_texture_2d_SetPrivateData
,
381 d3d8_texture_2d_GetPrivateData
,
382 d3d8_texture_2d_FreePrivateData
,
383 d3d8_texture_2d_SetPriority
,
384 d3d8_texture_2d_GetPriority
,
385 d3d8_texture_2d_PreLoad
,
386 d3d8_texture_2d_GetType
,
387 /* IDirect3dBaseTexture8 */
388 d3d8_texture_2d_SetLOD
,
389 d3d8_texture_2d_GetLOD
,
390 d3d8_texture_2d_GetLevelCount
,
391 /* IDirect3DTexture8 */
392 d3d8_texture_2d_GetLevelDesc
,
393 d3d8_texture_2d_GetSurfaceLevel
,
394 d3d8_texture_2d_LockRect
,
395 d3d8_texture_2d_UnlockRect
,
396 d3d8_texture_2d_AddDirtyRect
,
399 static HRESULT WINAPI
d3d8_texture_cube_QueryInterface(IDirect3DCubeTexture8
*iface
, REFIID riid
, void **out
)
401 TRACE("iface %p, riid %s, out %p.\n", iface
, debugstr_guid(riid
), out
);
403 if (IsEqualGUID(riid
, &IID_IDirect3DCubeTexture8
)
404 || IsEqualGUID(riid
, &IID_IDirect3DBaseTexture8
)
405 || IsEqualGUID(riid
, &IID_IDirect3DResource8
)
406 || IsEqualGUID(riid
, &IID_IUnknown
))
408 IDirect3DCubeTexture8_AddRef(iface
);
413 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
416 return E_NOINTERFACE
;
419 static ULONG WINAPI
d3d8_texture_cube_AddRef(IDirect3DCubeTexture8
*iface
)
421 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
423 return d3d8_texture_incref(texture
);
426 static ULONG WINAPI
d3d8_texture_cube_Release(IDirect3DCubeTexture8
*iface
)
428 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
430 return d3d8_texture_decref(texture
);
433 static HRESULT WINAPI
d3d8_texture_cube_GetDevice(IDirect3DCubeTexture8
*iface
, IDirect3DDevice8
**device
)
435 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
437 TRACE("iface %p, device %p.\n", iface
, device
);
439 *device
= &texture
->parent_device
->IDirect3DDevice8_iface
;
440 IDirect3DDevice8_AddRef(*device
);
442 TRACE("Returning device %p.\n", *device
);
447 static HRESULT WINAPI
d3d8_texture_cube_SetPrivateData(IDirect3DCubeTexture8
*iface
,
448 REFGUID guid
, const void *data
, DWORD data_size
, DWORD flags
)
450 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
451 TRACE("iface %p, guid %s, data %p, data_size %lu, flags %#lx.\n",
452 iface
, debugstr_guid(guid
), data
, data_size
, flags
);
454 return d3d8_resource_set_private_data(&texture
->resource
, guid
, data
, data_size
, flags
);
457 static HRESULT WINAPI
d3d8_texture_cube_GetPrivateData(IDirect3DCubeTexture8
*iface
,
458 REFGUID guid
, void *data
, DWORD
*data_size
)
460 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
461 TRACE("iface %p, guid %s, data %p, data_size %p.\n",
462 iface
, debugstr_guid(guid
), data
, data_size
);
464 return d3d8_resource_get_private_data(&texture
->resource
, guid
, data
, data_size
);
467 static HRESULT WINAPI
d3d8_texture_cube_FreePrivateData(IDirect3DCubeTexture8
*iface
, REFGUID guid
)
469 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
470 TRACE("iface %p, guid %s.\n", iface
, debugstr_guid(guid
));
472 return d3d8_resource_free_private_data(&texture
->resource
, guid
);
475 static DWORD WINAPI
d3d8_texture_cube_SetPriority(IDirect3DCubeTexture8
*iface
, DWORD priority
)
477 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
478 struct wined3d_resource
*resource
;
481 TRACE("iface %p, priority %lu.\n", iface
, priority
);
483 wined3d_mutex_lock();
484 resource
= wined3d_texture_get_resource(d3d8_texture_get_draw_texture(texture
));
485 ret
= wined3d_resource_set_priority(resource
, priority
);
486 wined3d_mutex_unlock();
491 static DWORD WINAPI
d3d8_texture_cube_GetPriority(IDirect3DCubeTexture8
*iface
)
493 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
494 const struct wined3d_resource
*resource
;
497 TRACE("iface %p.\n", iface
);
499 wined3d_mutex_lock();
500 resource
= wined3d_texture_get_resource(d3d8_texture_get_draw_texture(texture
));
501 ret
= wined3d_resource_get_priority(resource
);
502 wined3d_mutex_unlock();
507 static void WINAPI
d3d8_texture_cube_PreLoad(IDirect3DCubeTexture8
*iface
)
509 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
511 TRACE("iface %p.\n", iface
);
513 d3d8_texture_preload(texture
);
516 static D3DRESOURCETYPE WINAPI
d3d8_texture_cube_GetType(IDirect3DCubeTexture8
*iface
)
518 TRACE("iface %p.\n", iface
);
520 return D3DRTYPE_CUBETEXTURE
;
523 static DWORD WINAPI
d3d8_texture_cube_SetLOD(IDirect3DCubeTexture8
*iface
, DWORD lod
)
525 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
528 TRACE("iface %p, lod %lu.\n", iface
, lod
);
530 wined3d_mutex_lock();
531 ret
= wined3d_stateblock_set_texture_lod(texture
->parent_device
->state
,
532 d3d8_texture_get_draw_texture(texture
), lod
);
533 wined3d_mutex_unlock();
538 static DWORD WINAPI
d3d8_texture_cube_GetLOD(IDirect3DCubeTexture8
*iface
)
540 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
543 TRACE("iface %p.\n", iface
);
545 wined3d_mutex_lock();
546 ret
= wined3d_texture_get_lod(d3d8_texture_get_draw_texture(texture
));
547 wined3d_mutex_unlock();
552 static DWORD WINAPI
d3d8_texture_cube_GetLevelCount(IDirect3DCubeTexture8
*iface
)
554 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
557 TRACE("iface %p.\n", iface
);
559 wined3d_mutex_lock();
560 ret
= wined3d_texture_get_level_count(texture
->wined3d_texture
);
561 wined3d_mutex_unlock();
566 static HRESULT WINAPI
d3d8_texture_cube_GetLevelDesc(IDirect3DCubeTexture8
*iface
, UINT level
, D3DSURFACE_DESC
*desc
)
568 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
569 struct wined3d_sub_resource_desc wined3d_desc
;
572 TRACE("iface %p, level %u, desc %p.\n", iface
, level
, desc
);
574 wined3d_mutex_lock();
575 if (level
>= wined3d_texture_get_level_count(texture
->wined3d_texture
))
577 wined3d_mutex_unlock();
578 return D3DERR_INVALIDCALL
;
581 if (SUCCEEDED(hr
= wined3d_texture_get_sub_resource_desc(texture
->wined3d_texture
, level
, &wined3d_desc
)))
583 desc
->Format
= d3dformat_from_wined3dformat(wined3d_desc
.format
);
584 desc
->Type
= D3DRTYPE_SURFACE
;
585 desc
->Usage
= d3dusage_from_wined3dusage(wined3d_desc
.usage
, wined3d_desc
.bind_flags
);
586 desc
->Pool
= d3dpool_from_wined3daccess(wined3d_desc
.access
, wined3d_desc
.usage
);
587 desc
->Size
= wined3d_desc
.size
;
588 desc
->MultiSampleType
= d3dmultisample_type_from_wined3d(wined3d_desc
.multisample_type
);
589 desc
->Width
= wined3d_desc
.width
;
590 desc
->Height
= wined3d_desc
.height
;
592 wined3d_mutex_unlock();
597 static HRESULT WINAPI
d3d8_texture_cube_GetCubeMapSurface(IDirect3DCubeTexture8
*iface
,
598 D3DCUBEMAP_FACES face
, UINT level
, IDirect3DSurface8
**surface
)
600 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
601 struct d3d8_surface
*surface_impl
;
602 UINT sub_resource_idx
;
605 TRACE("iface %p, face %#x, level %u, surface %p.\n", iface
, face
, level
, surface
);
607 wined3d_mutex_lock();
608 level_count
= wined3d_texture_get_level_count(texture
->wined3d_texture
);
609 if (level
>= level_count
)
611 wined3d_mutex_unlock();
612 return D3DERR_INVALIDCALL
;
615 sub_resource_idx
= level_count
* face
+ level
;
616 if (!(surface_impl
= wined3d_texture_get_sub_resource_parent(texture
->wined3d_texture
, sub_resource_idx
)))
618 wined3d_mutex_unlock();
619 return D3DERR_INVALIDCALL
;
622 *surface
= &surface_impl
->IDirect3DSurface8_iface
;
623 IDirect3DSurface8_AddRef(*surface
);
624 wined3d_mutex_unlock();
629 static HRESULT WINAPI
d3d8_texture_cube_LockRect(IDirect3DCubeTexture8
*iface
,
630 D3DCUBEMAP_FACES face
, UINT level
, D3DLOCKED_RECT
*locked_rect
, const RECT
*rect
,
633 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
634 struct d3d8_surface
*surface_impl
;
635 UINT sub_resource_idx
;
638 TRACE("iface %p, face %#x, level %u, locked_rect %p, rect %p, flags %#lx.\n",
639 iface
, face
, level
, locked_rect
, rect
, flags
);
641 wined3d_mutex_lock();
642 sub_resource_idx
= wined3d_texture_get_level_count(texture
->wined3d_texture
) * face
+ level
;
643 if (!(surface_impl
= wined3d_texture_get_sub_resource_parent(texture
->wined3d_texture
, sub_resource_idx
)))
644 hr
= D3DERR_INVALIDCALL
;
646 hr
= IDirect3DSurface8_LockRect(&surface_impl
->IDirect3DSurface8_iface
, locked_rect
, rect
, flags
);
647 wined3d_mutex_unlock();
652 static HRESULT WINAPI
d3d8_texture_cube_UnlockRect(IDirect3DCubeTexture8
*iface
,
653 D3DCUBEMAP_FACES face
, UINT level
)
655 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
656 struct d3d8_surface
*surface_impl
;
657 UINT sub_resource_idx
;
660 TRACE("iface %p, face %#x, level %u.\n", iface
, face
, level
);
662 wined3d_mutex_lock();
663 sub_resource_idx
= wined3d_texture_get_level_count(texture
->wined3d_texture
) * face
+ level
;
664 if (!(surface_impl
= wined3d_texture_get_sub_resource_parent(texture
->wined3d_texture
, sub_resource_idx
)))
665 hr
= D3DERR_INVALIDCALL
;
667 hr
= IDirect3DSurface8_UnlockRect(&surface_impl
->IDirect3DSurface8_iface
);
668 wined3d_mutex_unlock();
673 static HRESULT WINAPI
d3d8_texture_cube_AddDirtyRect(IDirect3DCubeTexture8
*iface
,
674 D3DCUBEMAP_FACES face
, const RECT
*dirty_rect
)
676 struct d3d8_texture
*texture
= impl_from_IDirect3DCubeTexture8(iface
);
679 TRACE("iface %p, face %#x, dirty_rect %s.\n",
680 iface
, face
, wine_dbgstr_rect(dirty_rect
));
682 wined3d_mutex_lock();
684 hr
= wined3d_texture_add_dirty_region(texture
->wined3d_texture
, face
, NULL
);
687 struct wined3d_box dirty_region
;
689 wined3d_box_set(&dirty_region
, dirty_rect
->left
, dirty_rect
->top
, dirty_rect
->right
, dirty_rect
->bottom
, 0, 1);
690 hr
= wined3d_texture_add_dirty_region(texture
->wined3d_texture
, face
, &dirty_region
);
692 wined3d_mutex_unlock();
697 static const IDirect3DCubeTexture8Vtbl Direct3DCubeTexture8_Vtbl
=
700 d3d8_texture_cube_QueryInterface
,
701 d3d8_texture_cube_AddRef
,
702 d3d8_texture_cube_Release
,
703 /* IDirect3DResource8 */
704 d3d8_texture_cube_GetDevice
,
705 d3d8_texture_cube_SetPrivateData
,
706 d3d8_texture_cube_GetPrivateData
,
707 d3d8_texture_cube_FreePrivateData
,
708 d3d8_texture_cube_SetPriority
,
709 d3d8_texture_cube_GetPriority
,
710 d3d8_texture_cube_PreLoad
,
711 d3d8_texture_cube_GetType
,
712 /* IDirect3DBaseTexture8 */
713 d3d8_texture_cube_SetLOD
,
714 d3d8_texture_cube_GetLOD
,
715 d3d8_texture_cube_GetLevelCount
,
716 /* IDirect3DCubeTexture8 */
717 d3d8_texture_cube_GetLevelDesc
,
718 d3d8_texture_cube_GetCubeMapSurface
,
719 d3d8_texture_cube_LockRect
,
720 d3d8_texture_cube_UnlockRect
,
721 d3d8_texture_cube_AddDirtyRect
,
724 static HRESULT WINAPI
d3d8_texture_3d_QueryInterface(IDirect3DVolumeTexture8
*iface
, REFIID riid
, void **out
)
726 TRACE("iface %p, riid %s, out %p.\n", iface
, debugstr_guid(riid
), out
);
728 if (IsEqualGUID(riid
, &IID_IDirect3DVolumeTexture8
)
729 || IsEqualGUID(riid
, &IID_IDirect3DBaseTexture8
)
730 || IsEqualGUID(riid
, &IID_IDirect3DResource8
)
731 || IsEqualGUID(riid
, &IID_IUnknown
))
733 IDirect3DVolumeTexture8_AddRef(iface
);
738 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
741 return E_NOINTERFACE
;
744 static ULONG WINAPI
d3d8_texture_3d_AddRef(IDirect3DVolumeTexture8
*iface
)
746 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
748 return d3d8_texture_incref(texture
);
751 static ULONG WINAPI
d3d8_texture_3d_Release(IDirect3DVolumeTexture8
*iface
)
753 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
755 return d3d8_texture_decref(texture
);
758 static HRESULT WINAPI
d3d8_texture_3d_GetDevice(IDirect3DVolumeTexture8
*iface
, IDirect3DDevice8
**device
)
760 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
762 TRACE("iface %p, device %p.\n", iface
, device
);
764 *device
= &texture
->parent_device
->IDirect3DDevice8_iface
;
765 IDirect3DDevice8_AddRef(*device
);
767 TRACE("Returning device %p.\n", *device
);
772 static HRESULT WINAPI
d3d8_texture_3d_SetPrivateData(IDirect3DVolumeTexture8
*iface
,
773 REFGUID guid
, const void *data
, DWORD data_size
, DWORD flags
)
775 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
776 TRACE("iface %p, guid %s, data %p, data_size %lu, flags %#lx.\n",
777 iface
, debugstr_guid(guid
), data
, data_size
, flags
);
779 return d3d8_resource_set_private_data(&texture
->resource
, guid
, data
, data_size
, flags
);
782 static HRESULT WINAPI
d3d8_texture_3d_GetPrivateData(IDirect3DVolumeTexture8
*iface
,
783 REFGUID guid
, void *data
, DWORD
*data_size
)
785 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
786 TRACE("iface %p, guid %s, data %p, data_size %p.\n",
787 iface
, debugstr_guid(guid
), data
, data_size
);
789 return d3d8_resource_get_private_data(&texture
->resource
, guid
, data
, data_size
);
792 static HRESULT WINAPI
d3d8_texture_3d_FreePrivateData(IDirect3DVolumeTexture8
*iface
, REFGUID guid
)
794 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
795 TRACE("iface %p, guid %s.\n", iface
, debugstr_guid(guid
));
797 return d3d8_resource_free_private_data(&texture
->resource
, guid
);
800 static DWORD WINAPI
d3d8_texture_3d_SetPriority(IDirect3DVolumeTexture8
*iface
, DWORD priority
)
802 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
803 struct wined3d_resource
*resource
;
806 TRACE("iface %p, priority %lu.\n", iface
, priority
);
808 wined3d_mutex_lock();
809 resource
= wined3d_texture_get_resource(d3d8_texture_get_draw_texture(texture
));
810 ret
= wined3d_resource_set_priority(resource
, priority
);
811 wined3d_mutex_unlock();
816 static DWORD WINAPI
d3d8_texture_3d_GetPriority(IDirect3DVolumeTexture8
*iface
)
818 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
819 const struct wined3d_resource
*resource
;
822 TRACE("iface %p.\n", iface
);
824 wined3d_mutex_lock();
825 resource
= wined3d_texture_get_resource(d3d8_texture_get_draw_texture(texture
));
826 ret
= wined3d_resource_get_priority(resource
);
827 wined3d_mutex_unlock();
832 static void WINAPI
d3d8_texture_3d_PreLoad(IDirect3DVolumeTexture8
*iface
)
834 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
836 TRACE("iface %p.\n", iface
);
838 d3d8_texture_preload(texture
);
841 static D3DRESOURCETYPE WINAPI
d3d8_texture_3d_GetType(IDirect3DVolumeTexture8
*iface
)
843 TRACE("iface %p.\n", iface
);
845 return D3DRTYPE_VOLUMETEXTURE
;
848 static DWORD WINAPI
d3d8_texture_3d_SetLOD(IDirect3DVolumeTexture8
*iface
, DWORD lod
)
850 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
853 TRACE("iface %p, lod %lu.\n", iface
, lod
);
855 wined3d_mutex_lock();
856 ret
= wined3d_stateblock_set_texture_lod(texture
->parent_device
->state
,
857 d3d8_texture_get_draw_texture(texture
), lod
);
858 wined3d_mutex_unlock();
863 static DWORD WINAPI
d3d8_texture_3d_GetLOD(IDirect3DVolumeTexture8
*iface
)
865 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
868 TRACE("iface %p.\n", iface
);
870 wined3d_mutex_lock();
871 ret
= wined3d_texture_get_lod(d3d8_texture_get_draw_texture(texture
));
872 wined3d_mutex_unlock();
877 static DWORD WINAPI
d3d8_texture_3d_GetLevelCount(IDirect3DVolumeTexture8
*iface
)
879 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
882 TRACE("iface %p.\n", iface
);
884 wined3d_mutex_lock();
885 ret
= wined3d_texture_get_level_count(texture
->wined3d_texture
);
886 wined3d_mutex_unlock();
891 static HRESULT WINAPI
d3d8_texture_3d_GetLevelDesc(IDirect3DVolumeTexture8
*iface
, UINT level
, D3DVOLUME_DESC
*desc
)
893 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
894 struct wined3d_sub_resource_desc wined3d_desc
;
897 TRACE("iface %p, level %u, desc %p.\n", iface
, level
, desc
);
899 wined3d_mutex_lock();
900 if (SUCCEEDED(hr
= wined3d_texture_get_sub_resource_desc(texture
->wined3d_texture
, level
, &wined3d_desc
)))
902 desc
->Format
= d3dformat_from_wined3dformat(wined3d_desc
.format
);
903 desc
->Type
= D3DRTYPE_VOLUME
;
904 desc
->Usage
= d3dusage_from_wined3dusage(wined3d_desc
.usage
, wined3d_desc
.bind_flags
);
905 desc
->Pool
= d3dpool_from_wined3daccess(wined3d_desc
.access
, wined3d_desc
.usage
);
906 desc
->Size
= wined3d_desc
.size
;
907 desc
->Width
= wined3d_desc
.width
;
908 desc
->Height
= wined3d_desc
.height
;
909 desc
->Depth
= wined3d_desc
.depth
;
911 wined3d_mutex_unlock();
916 static HRESULT WINAPI
d3d8_texture_3d_GetVolumeLevel(IDirect3DVolumeTexture8
*iface
,
917 UINT level
, IDirect3DVolume8
**volume
)
919 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
920 struct d3d8_volume
*volume_impl
;
922 TRACE("iface %p, level %u, volume %p.\n", iface
, level
, volume
);
924 wined3d_mutex_lock();
925 if (!(volume_impl
= wined3d_texture_get_sub_resource_parent(texture
->wined3d_texture
, level
)))
927 wined3d_mutex_unlock();
928 return D3DERR_INVALIDCALL
;
931 *volume
= &volume_impl
->IDirect3DVolume8_iface
;
932 IDirect3DVolume8_AddRef(*volume
);
933 wined3d_mutex_unlock();
938 static HRESULT WINAPI
d3d8_texture_3d_LockBox(IDirect3DVolumeTexture8
*iface
,
939 UINT level
, D3DLOCKED_BOX
*locked_box
, const D3DBOX
*box
, DWORD flags
)
941 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
942 struct d3d8_volume
*volume_impl
;
945 TRACE("iface %p, level %u, locked_box %p, box %p, flags %#lx.\n",
946 iface
, level
, locked_box
, box
, flags
);
948 wined3d_mutex_lock();
949 if (!(volume_impl
= wined3d_texture_get_sub_resource_parent(texture
->wined3d_texture
, level
)))
950 hr
= D3DERR_INVALIDCALL
;
952 hr
= IDirect3DVolume8_LockBox(&volume_impl
->IDirect3DVolume8_iface
, locked_box
, box
, flags
);
953 wined3d_mutex_unlock();
958 static HRESULT WINAPI
d3d8_texture_3d_UnlockBox(IDirect3DVolumeTexture8
*iface
, UINT level
)
960 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
961 struct d3d8_volume
*volume_impl
;
964 TRACE("iface %p, level %u.\n", iface
, level
);
966 wined3d_mutex_lock();
967 if (!(volume_impl
= wined3d_texture_get_sub_resource_parent(texture
->wined3d_texture
, level
)))
968 hr
= D3DERR_INVALIDCALL
;
970 hr
= IDirect3DVolume8_UnlockBox(&volume_impl
->IDirect3DVolume8_iface
);
971 wined3d_mutex_unlock();
976 static HRESULT WINAPI
d3d8_texture_3d_AddDirtyBox(IDirect3DVolumeTexture8
*iface
, const D3DBOX
*dirty_box
)
978 struct d3d8_texture
*texture
= impl_from_IDirect3DVolumeTexture8(iface
);
981 TRACE("iface %p, dirty_box %p.\n", iface
, dirty_box
);
983 wined3d_mutex_lock();
984 hr
= wined3d_texture_add_dirty_region(texture
->wined3d_texture
, 0, (const struct wined3d_box
*)dirty_box
);
985 wined3d_mutex_unlock();
990 static const IDirect3DVolumeTexture8Vtbl Direct3DVolumeTexture8_Vtbl
=
993 d3d8_texture_3d_QueryInterface
,
994 d3d8_texture_3d_AddRef
,
995 d3d8_texture_3d_Release
,
996 /* IDirect3DResource8 */
997 d3d8_texture_3d_GetDevice
,
998 d3d8_texture_3d_SetPrivateData
,
999 d3d8_texture_3d_GetPrivateData
,
1000 d3d8_texture_3d_FreePrivateData
,
1001 d3d8_texture_3d_SetPriority
,
1002 d3d8_texture_3d_GetPriority
,
1003 d3d8_texture_3d_PreLoad
,
1004 d3d8_texture_3d_GetType
,
1005 /* IDirect3DBaseTexture8 */
1006 d3d8_texture_3d_SetLOD
,
1007 d3d8_texture_3d_GetLOD
,
1008 d3d8_texture_3d_GetLevelCount
,
1009 /* IDirect3DVolumeTexture8 */
1010 d3d8_texture_3d_GetLevelDesc
,
1011 d3d8_texture_3d_GetVolumeLevel
,
1012 d3d8_texture_3d_LockBox
,
1013 d3d8_texture_3d_UnlockBox
,
1014 d3d8_texture_3d_AddDirtyBox
1017 struct d3d8_texture
*unsafe_impl_from_IDirect3DBaseTexture8(IDirect3DBaseTexture8
*iface
)
1022 /* SetTexture() in particular doesn't do a lot of validation on the pointer
1023 * that gets passed in, and passing an invalid pointer works as long as the
1024 * application doesn't try to actually render anything with it, so we print
1025 * a WARN and return NULL instead of having the usual assert() here.
1026 * One application affected by this is Fishdom 2. */
1027 if (iface
->lpVtbl
!= (const IDirect3DBaseTexture8Vtbl
*)&Direct3DTexture8_Vtbl
1028 && iface
->lpVtbl
!= (const IDirect3DBaseTexture8Vtbl
*)&Direct3DCubeTexture8_Vtbl
1029 && iface
->lpVtbl
!= (const IDirect3DBaseTexture8Vtbl
*)&Direct3DVolumeTexture8_Vtbl
)
1031 WARN("%p is not a valid IDirect3DBaseTexture8 interface.\n", iface
);
1035 return CONTAINING_RECORD(iface
, struct d3d8_texture
, IDirect3DBaseTexture8_iface
);
1038 static void STDMETHODCALLTYPE
d3d8_texture_wined3d_object_destroyed(void *parent
)
1040 struct d3d8_texture
*texture
= parent
;
1042 /* If the texture was managed, release the sysmem copy now. */
1043 if (texture
->draw_texture
)
1044 wined3d_texture_decref(texture
->wined3d_texture
);
1045 d3d8_resource_cleanup(&texture
->resource
);
1049 static const struct wined3d_parent_ops d3d8_texture_wined3d_parent_ops
=
1051 d3d8_texture_wined3d_object_destroyed
,
1054 static HRESULT
d3d8_texture_init(struct d3d8_texture
*texture
, struct d3d8_device
*device
,
1055 const struct wined3d_resource_desc
*desc
, D3DPOOL pool
, unsigned int layer_count
, unsigned int level_count
)
1057 unsigned int flags
= 0;
1060 d3d8_resource_init(&texture
->resource
);
1061 list_init(&texture
->rtv_list
);
1064 level_count
= wined3d_log2i(max(max(desc
->width
, desc
->height
), desc
->depth
)) + 1;
1066 if (pool
== D3DPOOL_SYSTEMMEM
|| pool
== D3DPOOL_MANAGED
)
1067 flags
|= WINED3D_TEXTURE_CREATE_RECORD_DIRTY_REGIONS
;
1069 wined3d_mutex_lock();
1071 if (pool
== D3DPOOL_MANAGED
)
1073 struct wined3d_resource_desc managed_desc
= *desc
;
1075 managed_desc
.access
= WINED3D_RESOURCE_ACCESS_CPU
| WINED3D_RESOURCE_ACCESS_MAP_R
| WINED3D_RESOURCE_ACCESS_MAP_W
;
1076 managed_desc
.bind_flags
= 0;
1077 if (FAILED(hr
= wined3d_texture_create(device
->wined3d_device
, &managed_desc
, layer_count
, level_count
, flags
,
1078 NULL
, texture
, &d3d8_null_wined3d_parent_ops
, &texture
->wined3d_texture
)))
1080 wined3d_mutex_unlock();
1081 WARN("Failed to create sysmem texture, hr %#lx.\n", hr
);
1085 managed_desc
.access
= WINED3D_RESOURCE_ACCESS_GPU
;
1086 managed_desc
.bind_flags
= desc
->bind_flags
;
1087 if (FAILED(hr
= wined3d_texture_create(device
->wined3d_device
, &managed_desc
, layer_count
, level_count
, 0,
1088 NULL
, texture
, &d3d8_texture_wined3d_parent_ops
, &texture
->draw_texture
)))
1090 wined3d_texture_decref(texture
->wined3d_texture
);
1091 wined3d_mutex_unlock();
1092 WARN("Failed to create draw texture, hr %#lx.\n", hr
);
1098 if (FAILED(hr
= wined3d_texture_create(device
->wined3d_device
, desc
, layer_count
, level_count
, flags
,
1099 NULL
, texture
, &d3d8_texture_wined3d_parent_ops
, &texture
->wined3d_texture
)))
1101 wined3d_mutex_unlock();
1102 WARN("Failed to create wined3d texture, hr %#lx.\n", hr
);
1106 wined3d_mutex_unlock();
1108 texture
->parent_device
= device
;
1109 IDirect3DDevice8_AddRef(&texture
->parent_device
->IDirect3DDevice8_iface
);
1114 HRESULT
d3d8_texture_2d_init(struct d3d8_texture
*texture
, struct d3d8_device
*device
, unsigned int width
,
1115 unsigned int height
, unsigned int level_count
, DWORD usage
, D3DFORMAT format
, D3DPOOL pool
)
1117 struct wined3d_resource_desc desc
;
1119 desc
.resource_type
= WINED3D_RTYPE_TEXTURE_2D
;
1120 desc
.format
= wined3dformat_from_d3dformat(format
);
1121 desc
.multisample_type
= WINED3D_MULTISAMPLE_NONE
;
1122 desc
.multisample_quality
= 0;
1123 desc
.usage
= wined3d_usage_from_d3d(pool
, usage
);
1124 desc
.bind_flags
= wined3d_bind_flags_from_d3d8_usage(usage
) | WINED3D_BIND_SHADER_RESOURCE
;
1125 desc
.access
= wined3daccess_from_d3dpool(pool
, usage
);
1127 desc
.height
= height
;
1131 if (usage
& D3DUSAGE_WRITEONLY
)
1133 WARN("Texture can't be created with the D3DUSAGE_WRITEONLY flag, returning D3DERR_INVALIDCALL.\n");
1134 return D3DERR_INVALIDCALL
;
1137 texture
->IDirect3DBaseTexture8_iface
.lpVtbl
= (const IDirect3DBaseTexture8Vtbl
*)&Direct3DTexture8_Vtbl
;
1138 return d3d8_texture_init(texture
, device
, &desc
, pool
, 1, level_count
);
1141 HRESULT
d3d8_texture_cube_init(struct d3d8_texture
*texture
, struct d3d8_device
*device
,
1142 unsigned int edge_length
, unsigned int level_count
, DWORD usage
, D3DFORMAT format
, D3DPOOL pool
)
1144 struct wined3d_resource_desc desc
;
1146 desc
.resource_type
= WINED3D_RTYPE_TEXTURE_2D
;
1147 desc
.format
= wined3dformat_from_d3dformat(format
);
1148 desc
.multisample_type
= WINED3D_MULTISAMPLE_NONE
;
1149 desc
.multisample_quality
= 0;
1150 desc
.usage
= wined3d_usage_from_d3d(pool
, usage
) | WINED3DUSAGE_LEGACY_CUBEMAP
;
1151 desc
.bind_flags
= wined3d_bind_flags_from_d3d8_usage(usage
) | WINED3D_BIND_SHADER_RESOURCE
;
1152 desc
.access
= wined3daccess_from_d3dpool(pool
, usage
);
1153 desc
.width
= edge_length
;
1154 desc
.height
= edge_length
;
1158 if (usage
& D3DUSAGE_WRITEONLY
)
1160 WARN("Texture can't be created with the D3DUSAGE_WRITEONLY flag, returning D3DERR_INVALIDCALL.\n");
1161 return D3DERR_INVALIDCALL
;
1164 texture
->IDirect3DBaseTexture8_iface
.lpVtbl
= (const IDirect3DBaseTexture8Vtbl
*)&Direct3DCubeTexture8_Vtbl
;
1165 return d3d8_texture_init(texture
, device
, &desc
, pool
, 6, level_count
);
1168 HRESULT
d3d8_texture_3d_init(struct d3d8_texture
*texture
, struct d3d8_device
*device
, unsigned int width
,
1169 unsigned int height
, unsigned int depth
, unsigned int level_count
, DWORD usage
, D3DFORMAT format
, D3DPOOL pool
)
1171 struct wined3d_resource_desc desc
;
1173 /* In d3d8, 3D textures can't be used as rendertarget or depth/stencil buffer. */
1174 if (usage
& (D3DUSAGE_RENDERTARGET
| D3DUSAGE_DEPTHSTENCIL
))
1175 return D3DERR_INVALIDCALL
;
1177 desc
.resource_type
= WINED3D_RTYPE_TEXTURE_3D
;
1178 desc
.format
= wined3dformat_from_d3dformat(format
);
1179 desc
.multisample_type
= WINED3D_MULTISAMPLE_NONE
;
1180 desc
.multisample_quality
= 0;
1181 desc
.usage
= wined3d_usage_from_d3d(pool
, usage
);
1182 desc
.bind_flags
= wined3d_bind_flags_from_d3d8_usage(usage
) | WINED3D_BIND_SHADER_RESOURCE
;
1183 desc
.access
= wined3daccess_from_d3dpool(pool
, usage
);
1185 desc
.height
= height
;
1189 if (usage
& D3DUSAGE_WRITEONLY
)
1191 WARN("Texture can't be created with the D3DUSAGE_WRITEONLY flags, returning D3DERR_INVALIDCALL.\n");
1192 return D3DERR_INVALIDCALL
;
1195 texture
->IDirect3DBaseTexture8_iface
.lpVtbl
= (const IDirect3DBaseTexture8Vtbl
*)&Direct3DVolumeTexture8_Vtbl
;
1196 return d3d8_texture_init(texture
, device
, &desc
, pool
, 1, level_count
);