2 * Copyright 2009 Henri Verbeet for CodeWeavers
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
21 #include "wine/port.h"
23 #include "d3d10core_private.h"
25 WINE_DEFAULT_DEBUG_CHANNEL(d3d10core
);
27 static inline struct d3d10_texture2d
*impl_from_ID3D10Texture2D(ID3D10Texture2D
*iface
)
29 return CONTAINING_RECORD(iface
, struct d3d10_texture2d
, ID3D10Texture2D_iface
);
32 /* IUnknown methods */
34 static HRESULT STDMETHODCALLTYPE
d3d10_texture2d_QueryInterface(ID3D10Texture2D
*iface
, REFIID riid
, void **object
)
36 struct d3d10_texture2d
*This
= impl_from_ID3D10Texture2D(iface
);
38 TRACE("iface %p, riid %s, object %p\n", iface
, debugstr_guid(riid
), object
);
40 if (IsEqualGUID(riid
, &IID_ID3D10Texture2D
)
41 || IsEqualGUID(riid
, &IID_ID3D10Resource
)
42 || IsEqualGUID(riid
, &IID_ID3D10DeviceChild
)
43 || IsEqualGUID(riid
, &IID_IUnknown
))
45 IUnknown_AddRef(iface
);
50 if (This
->dxgi_surface
)
52 TRACE("Forwarding to dxgi surface\n");
53 return IUnknown_QueryInterface(This
->dxgi_surface
, riid
, object
);
56 WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid
));
62 static ULONG STDMETHODCALLTYPE
d3d10_texture2d_AddRef(ID3D10Texture2D
*iface
)
64 struct d3d10_texture2d
*This
= impl_from_ID3D10Texture2D(iface
);
65 ULONG refcount
= InterlockedIncrement(&This
->refcount
);
67 TRACE("%p increasing refcount to %u\n", This
, refcount
);
71 ID3D10Device1_AddRef(This
->device
);
72 wined3d_texture_incref(This
->wined3d_texture
);
78 static void STDMETHODCALLTYPE
d3d10_texture2d_wined3d_object_released(void *parent
)
80 struct d3d10_texture2d
*This
= parent
;
82 if (This
->dxgi_surface
) IUnknown_Release(This
->dxgi_surface
);
83 wined3d_private_store_cleanup(&This
->private_store
);
84 HeapFree(GetProcessHeap(), 0, This
);
87 static ULONG STDMETHODCALLTYPE
d3d10_texture2d_Release(ID3D10Texture2D
*iface
)
89 struct d3d10_texture2d
*This
= impl_from_ID3D10Texture2D(iface
);
90 ULONG refcount
= InterlockedDecrement(&This
->refcount
);
92 TRACE("%p decreasing refcount to %u\n", This
, refcount
);
96 ID3D10Device1
*device
= This
->device
;
98 wined3d_texture_decref(This
->wined3d_texture
);
99 /* Release the device last, it may cause the wined3d device to be
101 ID3D10Device1_Release(device
);
107 /* ID3D10DeviceChild methods */
109 static void STDMETHODCALLTYPE
d3d10_texture2d_GetDevice(ID3D10Texture2D
*iface
, ID3D10Device
**device
)
111 struct d3d10_texture2d
*texture
= impl_from_ID3D10Texture2D(iface
);
113 TRACE("iface %p, device %p.\n", iface
, device
);
115 *device
= (ID3D10Device
*)texture
->device
;
116 ID3D10Device_AddRef(*device
);
119 static HRESULT STDMETHODCALLTYPE
d3d10_texture2d_GetPrivateData(ID3D10Texture2D
*iface
,
120 REFGUID guid
, UINT
*data_size
, void *data
)
122 struct d3d10_texture2d
*texture
= impl_from_ID3D10Texture2D(iface
);
123 IDXGISurface
*dxgi_surface
;
126 TRACE("iface %p, guid %s, data_size %p, data %p.\n",
127 iface
, debugstr_guid(guid
), data_size
, data
);
129 if (texture
->dxgi_surface
130 && SUCCEEDED(IUnknown_QueryInterface(texture
->dxgi_surface
, &IID_IDXGISurface
, (void **)&dxgi_surface
)))
132 hr
= IDXGISurface_GetPrivateData(dxgi_surface
, guid
, data_size
, data
);
133 IDXGISurface_Release(dxgi_surface
);
137 return d3d10_get_private_data(&texture
->private_store
, guid
, data_size
, data
);
140 static HRESULT STDMETHODCALLTYPE
d3d10_texture2d_SetPrivateData(ID3D10Texture2D
*iface
,
141 REFGUID guid
, UINT data_size
, const void *data
)
143 struct d3d10_texture2d
*texture
= impl_from_ID3D10Texture2D(iface
);
144 IDXGISurface
*dxgi_surface
;
147 TRACE("iface %p, guid %s, data_size %u, data %p.\n",
148 iface
, debugstr_guid(guid
), data_size
, data
);
150 if (texture
->dxgi_surface
151 && SUCCEEDED(IUnknown_QueryInterface(texture
->dxgi_surface
, &IID_IDXGISurface
, (void **)&dxgi_surface
)))
153 hr
= IDXGISurface_SetPrivateData(dxgi_surface
, guid
, data_size
, data
);
154 IDXGISurface_Release(dxgi_surface
);
158 return d3d10_set_private_data(&texture
->private_store
, guid
, data_size
, data
);
161 static HRESULT STDMETHODCALLTYPE
d3d10_texture2d_SetPrivateDataInterface(ID3D10Texture2D
*iface
,
162 REFGUID guid
, const IUnknown
*data
)
164 struct d3d10_texture2d
*texture
= impl_from_ID3D10Texture2D(iface
);
165 IDXGISurface
*dxgi_surface
;
168 TRACE("iface %p, guid %s, data %p.\n", iface
, debugstr_guid(guid
), data
);
170 if (texture
->dxgi_surface
171 && SUCCEEDED(IUnknown_QueryInterface(texture
->dxgi_surface
, &IID_IDXGISurface
, (void **)&dxgi_surface
)))
173 hr
= IDXGISurface_SetPrivateDataInterface(dxgi_surface
, guid
, data
);
174 IDXGISurface_Release(dxgi_surface
);
178 return d3d10_set_private_data_interface(&texture
->private_store
, guid
, data
);
181 /* ID3D10Resource methods */
183 static void STDMETHODCALLTYPE
d3d10_texture2d_GetType(ID3D10Texture2D
*iface
,
184 D3D10_RESOURCE_DIMENSION
*resource_dimension
)
186 TRACE("iface %p, resource_dimension %p\n", iface
, resource_dimension
);
188 *resource_dimension
= D3D10_RESOURCE_DIMENSION_TEXTURE2D
;
191 static void STDMETHODCALLTYPE
d3d10_texture2d_SetEvictionPriority(ID3D10Texture2D
*iface
, UINT eviction_priority
)
193 FIXME("iface %p, eviction_priority %u stub!\n", iface
, eviction_priority
);
196 static UINT STDMETHODCALLTYPE
d3d10_texture2d_GetEvictionPriority(ID3D10Texture2D
*iface
)
198 FIXME("iface %p stub!\n", iface
);
203 /* ID3D10Texture2D methods */
205 static HRESULT STDMETHODCALLTYPE
d3d10_texture2d_Map(ID3D10Texture2D
*iface
, UINT sub_resource_idx
,
206 D3D10_MAP map_type
, UINT map_flags
, D3D10_MAPPED_TEXTURE2D
*mapped_texture
)
208 struct d3d10_texture2d
*texture
= impl_from_ID3D10Texture2D(iface
);
209 struct wined3d_map_desc wined3d_map_desc
;
210 struct wined3d_resource
*sub_resource
;
213 TRACE("iface %p, sub_resource_idx %u, map_type %u, map_flags %#x, mapped_texture %p.\n",
214 iface
, sub_resource_idx
, map_type
, map_flags
, mapped_texture
);
217 FIXME("Ignoring map_flags %#x.\n", map_flags
);
219 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, sub_resource_idx
)))
221 else if (SUCCEEDED(hr
= wined3d_surface_map(wined3d_surface_from_resource(sub_resource
),
222 &wined3d_map_desc
, NULL
, wined3d_map_flags_from_d3d10_map_type(map_type
))))
224 mapped_texture
->pData
= wined3d_map_desc
.data
;
225 mapped_texture
->RowPitch
= wined3d_map_desc
.row_pitch
;
231 static void STDMETHODCALLTYPE
d3d10_texture2d_Unmap(ID3D10Texture2D
*iface
, UINT sub_resource_idx
)
233 struct d3d10_texture2d
*texture
= impl_from_ID3D10Texture2D(iface
);
234 struct wined3d_resource
*sub_resource
;
236 TRACE("iface %p, sub_resource_idx %u.\n", iface
, sub_resource_idx
);
238 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, sub_resource_idx
)))
241 wined3d_surface_unmap(wined3d_surface_from_resource(sub_resource
));
244 static void STDMETHODCALLTYPE
d3d10_texture2d_GetDesc(ID3D10Texture2D
*iface
, D3D10_TEXTURE2D_DESC
*desc
)
246 struct d3d10_texture2d
*This
= impl_from_ID3D10Texture2D(iface
);
248 TRACE("iface %p, desc %p\n", iface
, desc
);
253 static const struct ID3D10Texture2DVtbl d3d10_texture2d_vtbl
=
255 /* IUnknown methods */
256 d3d10_texture2d_QueryInterface
,
257 d3d10_texture2d_AddRef
,
258 d3d10_texture2d_Release
,
259 /* ID3D10DeviceChild methods */
260 d3d10_texture2d_GetDevice
,
261 d3d10_texture2d_GetPrivateData
,
262 d3d10_texture2d_SetPrivateData
,
263 d3d10_texture2d_SetPrivateDataInterface
,
264 /* ID3D10Resource methods */
265 d3d10_texture2d_GetType
,
266 d3d10_texture2d_SetEvictionPriority
,
267 d3d10_texture2d_GetEvictionPriority
,
268 /* ID3D10Texture2D methods */
270 d3d10_texture2d_Unmap
,
271 d3d10_texture2d_GetDesc
,
274 struct d3d10_texture2d
*unsafe_impl_from_ID3D10Texture2D(ID3D10Texture2D
*iface
)
278 assert(iface
->lpVtbl
== &d3d10_texture2d_vtbl
);
279 return CONTAINING_RECORD(iface
, struct d3d10_texture2d
, ID3D10Texture2D_iface
);
282 static const struct wined3d_parent_ops d3d10_texture2d_wined3d_parent_ops
=
284 d3d10_texture2d_wined3d_object_released
,
287 HRESULT
d3d10_texture2d_init(struct d3d10_texture2d
*texture
, struct d3d10_device
*device
,
288 const D3D10_TEXTURE2D_DESC
*desc
, const D3D10_SUBRESOURCE_DATA
*data
)
290 struct wined3d_resource_desc wined3d_desc
;
294 texture
->ID3D10Texture2D_iface
.lpVtbl
= &d3d10_texture2d_vtbl
;
295 texture
->refcount
= 1;
296 wined3d_private_store_init(&texture
->private_store
);
297 texture
->desc
= *desc
;
299 if (desc
->MipLevels
== 1 && desc
->ArraySize
== 1)
301 DXGI_SURFACE_DESC surface_desc
;
302 IWineDXGIDevice
*wine_device
;
304 if (FAILED(hr
= ID3D10Device1_QueryInterface(&device
->ID3D10Device1_iface
, &IID_IWineDXGIDevice
,
305 (void **)&wine_device
)))
307 ERR("Device should implement IWineDXGIDevice.\n");
308 wined3d_private_store_cleanup(&texture
->private_store
);
312 surface_desc
.Width
= desc
->Width
;
313 surface_desc
.Height
= desc
->Height
;
314 surface_desc
.Format
= desc
->Format
;
315 surface_desc
.SampleDesc
= desc
->SampleDesc
;
317 hr
= IWineDXGIDevice_create_surface(wine_device
, &surface_desc
, 0, NULL
,
318 (IUnknown
*)&texture
->ID3D10Texture2D_iface
, (void **)&texture
->dxgi_surface
);
319 IWineDXGIDevice_Release(wine_device
);
322 ERR("Failed to create DXGI surface, returning %#x\n", hr
);
323 wined3d_private_store_cleanup(&texture
->private_store
);
328 if (desc
->ArraySize
!= 1)
329 FIXME("Array textures not implemented.\n");
330 if (desc
->SampleDesc
.Count
> 1)
331 FIXME("Multisampled textures not implemented.\n");
333 wined3d_desc
.resource_type
= WINED3D_RTYPE_TEXTURE
;
334 wined3d_desc
.format
= wined3dformat_from_dxgi_format(desc
->Format
);
335 wined3d_desc
.multisample_type
= desc
->SampleDesc
.Count
> 1 ? desc
->SampleDesc
.Count
: WINED3D_MULTISAMPLE_NONE
;
336 wined3d_desc
.multisample_quality
= desc
->SampleDesc
.Quality
;
337 wined3d_desc
.usage
= wined3d_usage_from_d3d10core(desc
->BindFlags
, desc
->Usage
);
338 wined3d_desc
.pool
= WINED3D_POOL_DEFAULT
;
339 wined3d_desc
.width
= desc
->Width
;
340 wined3d_desc
.height
= desc
->Height
;
341 wined3d_desc
.depth
= 1;
342 wined3d_desc
.size
= 0;
344 levels
= desc
->MipLevels
? desc
->MipLevels
: wined3d_log2i(max(desc
->Width
, desc
->Height
)) + 1;
346 if (FAILED(hr
= wined3d_texture_create(device
->wined3d_device
, &wined3d_desc
,
347 levels
, 0, (struct wined3d_sub_resource_data
*)data
, texture
,
348 &d3d10_texture2d_wined3d_parent_ops
, &texture
->wined3d_texture
)))
350 WARN("Failed to create wined3d texture, hr %#x.\n", hr
);
351 if (texture
->dxgi_surface
)
352 IUnknown_Release(texture
->dxgi_surface
);
353 wined3d_private_store_cleanup(&texture
->private_store
);
356 texture
->desc
.MipLevels
= levels
;
358 texture
->device
= &device
->ID3D10Device1_iface
;
359 ID3D10Device1_AddRef(texture
->device
);
364 static inline struct d3d10_texture3d
*impl_from_ID3D10Texture3D(ID3D10Texture3D
*iface
)
366 return CONTAINING_RECORD(iface
, struct d3d10_texture3d
, ID3D10Texture3D_iface
);
369 static HRESULT STDMETHODCALLTYPE
d3d10_texture3d_QueryInterface(ID3D10Texture3D
*iface
, REFIID riid
, void **object
)
371 TRACE("iface %p, riid %s, object %p.\n", iface
, debugstr_guid(riid
), object
);
373 if (IsEqualGUID(riid
, &IID_ID3D10Texture3D
)
374 || IsEqualGUID(riid
, &IID_ID3D10Resource
)
375 || IsEqualGUID(riid
, &IID_ID3D10DeviceChild
)
376 || IsEqualGUID(riid
, &IID_IUnknown
))
378 IUnknown_AddRef(iface
);
383 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
386 return E_NOINTERFACE
;
389 static ULONG STDMETHODCALLTYPE
d3d10_texture3d_AddRef(ID3D10Texture3D
*iface
)
391 struct d3d10_texture3d
*texture
= impl_from_ID3D10Texture3D(iface
);
392 ULONG refcount
= InterlockedIncrement(&texture
->refcount
);
394 TRACE("%p increasing refcount to %u.\n", texture
, refcount
);
398 ID3D10Device1_AddRef(texture
->device
);
399 wined3d_texture_incref(texture
->wined3d_texture
);
405 static void STDMETHODCALLTYPE
d3d10_texture3d_wined3d_object_released(void *parent
)
407 struct d3d10_texture3d
*texture
= parent
;
409 wined3d_private_store_cleanup(&texture
->private_store
);
410 HeapFree(GetProcessHeap(), 0, parent
);
413 static ULONG STDMETHODCALLTYPE
d3d10_texture3d_Release(ID3D10Texture3D
*iface
)
415 struct d3d10_texture3d
*texture
= impl_from_ID3D10Texture3D(iface
);
416 ULONG refcount
= InterlockedDecrement(&texture
->refcount
);
418 TRACE("%p decreasing refcount to %u.\n", texture
, refcount
);
422 ID3D10Device1
*device
= texture
->device
;
424 wined3d_texture_decref(texture
->wined3d_texture
);
425 /* Release the device last, it may cause the wined3d device to be
427 ID3D10Device1_Release(device
);
433 static void STDMETHODCALLTYPE
d3d10_texture3d_GetDevice(ID3D10Texture3D
*iface
, ID3D10Device
**device
)
435 struct d3d10_texture3d
*texture
= impl_from_ID3D10Texture3D(iface
);
437 TRACE("iface %p, device %p.\n", iface
, device
);
439 *device
= (ID3D10Device
*)texture
->device
;
440 ID3D10Device_AddRef(*device
);
443 static HRESULT STDMETHODCALLTYPE
d3d10_texture3d_GetPrivateData(ID3D10Texture3D
*iface
,
444 REFGUID guid
, UINT
*data_size
, void *data
)
446 struct d3d10_texture3d
*texture
= impl_from_ID3D10Texture3D(iface
);
448 TRACE("iface %p, guid %s, data_size %p, data %p.\n",
449 iface
, debugstr_guid(guid
), data_size
, data
);
451 return d3d10_get_private_data(&texture
->private_store
, guid
, data_size
, data
);
454 static HRESULT STDMETHODCALLTYPE
d3d10_texture3d_SetPrivateData(ID3D10Texture3D
*iface
,
455 REFGUID guid
, UINT data_size
, const void *data
)
457 struct d3d10_texture3d
*texture
= impl_from_ID3D10Texture3D(iface
);
459 TRACE("iface %p, guid %s, data_size %u, data %p.\n",
460 iface
, debugstr_guid(guid
), data_size
, data
);
462 return d3d10_set_private_data(&texture
->private_store
, guid
, data_size
, data
);
465 static HRESULT STDMETHODCALLTYPE
d3d10_texture3d_SetPrivateDataInterface(ID3D10Texture3D
*iface
,
466 REFGUID guid
, const IUnknown
*data
)
468 struct d3d10_texture3d
*texture
= impl_from_ID3D10Texture3D(iface
);
470 TRACE("iface %p, guid %s, data %p.\n", iface
, debugstr_guid(guid
), data
);
472 return d3d10_set_private_data_interface(&texture
->private_store
, guid
, data
);
475 static void STDMETHODCALLTYPE
d3d10_texture3d_GetType(ID3D10Texture3D
*iface
,
476 D3D10_RESOURCE_DIMENSION
*resource_dimension
)
478 TRACE("iface %p, resource_dimension %p.\n", iface
, resource_dimension
);
480 *resource_dimension
= D3D10_RESOURCE_DIMENSION_TEXTURE3D
;
483 static void STDMETHODCALLTYPE
d3d10_texture3d_SetEvictionPriority(ID3D10Texture3D
*iface
, UINT eviction_priority
)
485 FIXME("iface %p, eviction_priority %u stub!\n", iface
, eviction_priority
);
488 static UINT STDMETHODCALLTYPE
d3d10_texture3d_GetEvictionPriority(ID3D10Texture3D
*iface
)
490 FIXME("iface %p stub!\n", iface
);
495 static HRESULT STDMETHODCALLTYPE
d3d10_texture3d_Map(ID3D10Texture3D
*iface
, UINT sub_resource_idx
,
496 D3D10_MAP map_type
, UINT map_flags
, D3D10_MAPPED_TEXTURE3D
*mapped_texture
)
498 struct d3d10_texture3d
*texture
= impl_from_ID3D10Texture3D(iface
);
499 struct wined3d_map_desc wined3d_map_desc
;
500 struct wined3d_resource
*sub_resource
;
503 TRACE("iface %p, sub_resource_idx %u, map_type %u, map_flags %#x, mapped_texture %p.\n",
504 iface
, sub_resource_idx
, map_type
, map_flags
, mapped_texture
);
507 FIXME("Ignoring map_flags %#x.\n", map_flags
);
509 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, sub_resource_idx
)))
511 else if (SUCCEEDED(hr
= wined3d_volume_map(wined3d_volume_from_resource(sub_resource
),
512 &wined3d_map_desc
, NULL
, wined3d_map_flags_from_d3d10_map_type(map_type
))))
514 mapped_texture
->pData
= wined3d_map_desc
.data
;
515 mapped_texture
->RowPitch
= wined3d_map_desc
.row_pitch
;
516 mapped_texture
->DepthPitch
= wined3d_map_desc
.slice_pitch
;
522 static void STDMETHODCALLTYPE
d3d10_texture3d_Unmap(ID3D10Texture3D
*iface
, UINT sub_resource_idx
)
524 struct d3d10_texture3d
*texture
= impl_from_ID3D10Texture3D(iface
);
525 struct wined3d_resource
*sub_resource
;
527 TRACE("iface %p, sub_resource_idx %u.\n", iface
, sub_resource_idx
);
529 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, sub_resource_idx
)))
532 wined3d_volume_unmap(wined3d_volume_from_resource(sub_resource
));
535 static void STDMETHODCALLTYPE
d3d10_texture3d_GetDesc(ID3D10Texture3D
*iface
, D3D10_TEXTURE3D_DESC
*desc
)
537 struct d3d10_texture3d
*texture
= impl_from_ID3D10Texture3D(iface
);
539 TRACE("iface %p, desc %p.\n", iface
, desc
);
541 *desc
= texture
->desc
;
544 static const struct ID3D10Texture3DVtbl d3d10_texture3d_vtbl
=
546 /* IUnknown methods */
547 d3d10_texture3d_QueryInterface
,
548 d3d10_texture3d_AddRef
,
549 d3d10_texture3d_Release
,
550 /* ID3D10DeviceChild methods */
551 d3d10_texture3d_GetDevice
,
552 d3d10_texture3d_GetPrivateData
,
553 d3d10_texture3d_SetPrivateData
,
554 d3d10_texture3d_SetPrivateDataInterface
,
555 /* ID3D10Resource methods */
556 d3d10_texture3d_GetType
,
557 d3d10_texture3d_SetEvictionPriority
,
558 d3d10_texture3d_GetEvictionPriority
,
559 /* ID3D10Texture3D methods */
561 d3d10_texture3d_Unmap
,
562 d3d10_texture3d_GetDesc
,
565 static const struct wined3d_parent_ops d3d10_texture3d_wined3d_parent_ops
=
567 d3d10_texture3d_wined3d_object_released
,
570 HRESULT
d3d10_texture3d_init(struct d3d10_texture3d
*texture
, struct d3d10_device
*device
,
571 const D3D10_TEXTURE3D_DESC
*desc
, const D3D10_SUBRESOURCE_DATA
*data
)
573 struct wined3d_resource_desc wined3d_desc
;
577 texture
->ID3D10Texture3D_iface
.lpVtbl
= &d3d10_texture3d_vtbl
;
578 texture
->refcount
= 1;
579 wined3d_private_store_init(&texture
->private_store
);
580 texture
->desc
= *desc
;
582 wined3d_desc
.resource_type
= WINED3D_RTYPE_VOLUME_TEXTURE
;
583 wined3d_desc
.format
= wined3dformat_from_dxgi_format(desc
->Format
);
584 wined3d_desc
.multisample_type
= WINED3D_MULTISAMPLE_NONE
;
585 wined3d_desc
.multisample_quality
= 0;
586 wined3d_desc
.usage
= wined3d_usage_from_d3d10core(desc
->BindFlags
, desc
->Usage
);
587 wined3d_desc
.pool
= WINED3D_POOL_DEFAULT
;
588 wined3d_desc
.width
= desc
->Width
;
589 wined3d_desc
.height
= desc
->Height
;
590 wined3d_desc
.depth
= desc
->Depth
;
591 wined3d_desc
.size
= 0;
593 levels
= desc
->MipLevels
? desc
->MipLevels
: wined3d_log2i(max(max(desc
->Width
, desc
->Height
), desc
->Depth
)) + 1;
595 if (FAILED(hr
= wined3d_texture_create(device
->wined3d_device
, &wined3d_desc
,
596 levels
, 0, (struct wined3d_sub_resource_data
*)data
, texture
,
597 &d3d10_texture3d_wined3d_parent_ops
, &texture
->wined3d_texture
)))
599 WARN("Failed to create wined3d texture, hr %#x.\n", hr
);
600 wined3d_private_store_cleanup(&texture
->private_store
);
603 texture
->desc
.MipLevels
= levels
;
605 texture
->device
= &device
->ID3D10Device1_iface
;
606 ID3D10Device1_AddRef(texture
->device
);