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 HeapFree(GetProcessHeap(), 0, This
);
86 static ULONG STDMETHODCALLTYPE
d3d10_texture2d_Release(ID3D10Texture2D
*iface
)
88 struct d3d10_texture2d
*This
= impl_from_ID3D10Texture2D(iface
);
89 ULONG refcount
= InterlockedDecrement(&This
->refcount
);
91 TRACE("%p decreasing refcount to %u\n", This
, refcount
);
95 ID3D10Device1
*device
= This
->device
;
97 wined3d_texture_decref(This
->wined3d_texture
);
98 /* Release the device last, it may cause the wined3d device to be
100 ID3D10Device1_Release(device
);
106 /* ID3D10DeviceChild methods */
108 static void STDMETHODCALLTYPE
d3d10_texture2d_GetDevice(ID3D10Texture2D
*iface
, ID3D10Device
**device
)
110 struct d3d10_texture2d
*texture
= impl_from_ID3D10Texture2D(iface
);
112 TRACE("iface %p, device %p.\n", iface
, device
);
114 *device
= (ID3D10Device
*)texture
->device
;
115 ID3D10Device_AddRef(*device
);
118 static HRESULT STDMETHODCALLTYPE
d3d10_texture2d_GetPrivateData(ID3D10Texture2D
*iface
,
119 REFGUID guid
, UINT
*data_size
, void *data
)
121 FIXME("iface %p, guid %s, data_size %p, data %p stub!\n",
122 iface
, debugstr_guid(guid
), data_size
, data
);
127 static HRESULT STDMETHODCALLTYPE
d3d10_texture2d_SetPrivateData(ID3D10Texture2D
*iface
,
128 REFGUID guid
, UINT data_size
, const void *data
)
130 FIXME("iface %p, guid %s, data_size %u, data %p stub!\n",
131 iface
, debugstr_guid(guid
), data_size
, data
);
136 static HRESULT STDMETHODCALLTYPE
d3d10_texture2d_SetPrivateDataInterface(ID3D10Texture2D
*iface
,
137 REFGUID guid
, const IUnknown
*data
)
139 FIXME("iface %p, guid %s, data %p stub!\n", iface
, debugstr_guid(guid
), data
);
144 /* ID3D10Resource methods */
146 static void STDMETHODCALLTYPE
d3d10_texture2d_GetType(ID3D10Texture2D
*iface
,
147 D3D10_RESOURCE_DIMENSION
*resource_dimension
)
149 TRACE("iface %p, resource_dimension %p\n", iface
, resource_dimension
);
151 *resource_dimension
= D3D10_RESOURCE_DIMENSION_TEXTURE2D
;
154 static void STDMETHODCALLTYPE
d3d10_texture2d_SetEvictionPriority(ID3D10Texture2D
*iface
, UINT eviction_priority
)
156 FIXME("iface %p, eviction_priority %u stub!\n", iface
, eviction_priority
);
159 static UINT STDMETHODCALLTYPE
d3d10_texture2d_GetEvictionPriority(ID3D10Texture2D
*iface
)
161 FIXME("iface %p stub!\n", iface
);
166 /* ID3D10Texture2D methods */
168 static HRESULT STDMETHODCALLTYPE
d3d10_texture2d_Map(ID3D10Texture2D
*iface
, UINT sub_resource_idx
,
169 D3D10_MAP map_type
, UINT map_flags
, D3D10_MAPPED_TEXTURE2D
*mapped_texture
)
171 struct d3d10_texture2d
*texture
= impl_from_ID3D10Texture2D(iface
);
172 struct wined3d_map_desc wined3d_map_desc
;
173 struct wined3d_resource
*sub_resource
;
176 TRACE("iface %p, sub_resource_idx %u, map_type %u, map_flags %#x, mapped_texture %p.\n",
177 iface
, sub_resource_idx
, map_type
, map_flags
, mapped_texture
);
180 FIXME("Ignoring map_flags %#x.\n", map_flags
);
182 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, sub_resource_idx
)))
184 else if (SUCCEEDED(hr
= wined3d_surface_map(wined3d_surface_from_resource(sub_resource
),
185 &wined3d_map_desc
, NULL
, wined3d_map_flags_from_d3d10_map_type(map_type
))))
187 mapped_texture
->pData
= wined3d_map_desc
.data
;
188 mapped_texture
->RowPitch
= wined3d_map_desc
.row_pitch
;
194 static void STDMETHODCALLTYPE
d3d10_texture2d_Unmap(ID3D10Texture2D
*iface
, UINT sub_resource_idx
)
196 struct d3d10_texture2d
*texture
= impl_from_ID3D10Texture2D(iface
);
197 struct wined3d_resource
*sub_resource
;
199 TRACE("iface %p, sub_resource_idx %u.\n", iface
, sub_resource_idx
);
201 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, sub_resource_idx
)))
204 wined3d_surface_unmap(wined3d_surface_from_resource(sub_resource
));
207 static void STDMETHODCALLTYPE
d3d10_texture2d_GetDesc(ID3D10Texture2D
*iface
, D3D10_TEXTURE2D_DESC
*desc
)
209 struct d3d10_texture2d
*This
= impl_from_ID3D10Texture2D(iface
);
211 TRACE("iface %p, desc %p\n", iface
, desc
);
216 static const struct ID3D10Texture2DVtbl d3d10_texture2d_vtbl
=
218 /* IUnknown methods */
219 d3d10_texture2d_QueryInterface
,
220 d3d10_texture2d_AddRef
,
221 d3d10_texture2d_Release
,
222 /* ID3D10DeviceChild methods */
223 d3d10_texture2d_GetDevice
,
224 d3d10_texture2d_GetPrivateData
,
225 d3d10_texture2d_SetPrivateData
,
226 d3d10_texture2d_SetPrivateDataInterface
,
227 /* ID3D10Resource methods */
228 d3d10_texture2d_GetType
,
229 d3d10_texture2d_SetEvictionPriority
,
230 d3d10_texture2d_GetEvictionPriority
,
231 /* ID3D10Texture2D methods */
233 d3d10_texture2d_Unmap
,
234 d3d10_texture2d_GetDesc
,
237 struct d3d10_texture2d
*unsafe_impl_from_ID3D10Texture2D(ID3D10Texture2D
*iface
)
241 assert(iface
->lpVtbl
== &d3d10_texture2d_vtbl
);
242 return CONTAINING_RECORD(iface
, struct d3d10_texture2d
, ID3D10Texture2D_iface
);
245 static const struct wined3d_parent_ops d3d10_texture2d_wined3d_parent_ops
=
247 d3d10_texture2d_wined3d_object_released
,
250 HRESULT
d3d10_texture2d_init(struct d3d10_texture2d
*texture
, struct d3d10_device
*device
,
251 const D3D10_TEXTURE2D_DESC
*desc
)
253 struct wined3d_resource_desc wined3d_desc
;
256 texture
->ID3D10Texture2D_iface
.lpVtbl
= &d3d10_texture2d_vtbl
;
257 texture
->refcount
= 1;
258 texture
->desc
= *desc
;
260 if (desc
->MipLevels
== 1 && desc
->ArraySize
== 1)
262 DXGI_SURFACE_DESC surface_desc
;
263 IWineDXGIDevice
*wine_device
;
265 if (FAILED(hr
= ID3D10Device1_QueryInterface(&device
->ID3D10Device1_iface
, &IID_IWineDXGIDevice
,
266 (void **)&wine_device
)))
268 ERR("Device should implement IWineDXGIDevice.\n");
272 surface_desc
.Width
= desc
->Width
;
273 surface_desc
.Height
= desc
->Height
;
274 surface_desc
.Format
= desc
->Format
;
275 surface_desc
.SampleDesc
= desc
->SampleDesc
;
277 hr
= IWineDXGIDevice_create_surface(wine_device
, &surface_desc
, 0, NULL
,
278 (IUnknown
*)&texture
->ID3D10Texture2D_iface
, (void **)&texture
->dxgi_surface
);
279 IWineDXGIDevice_Release(wine_device
);
282 ERR("Failed to create DXGI surface, returning %#x\n", hr
);
287 if (desc
->ArraySize
!= 1)
288 FIXME("Array textures not implemented.\n");
289 if (desc
->SampleDesc
.Count
> 1)
290 FIXME("Multisampled textures not implemented.\n");
292 wined3d_desc
.resource_type
= WINED3D_RTYPE_TEXTURE
;
293 wined3d_desc
.format
= wined3dformat_from_dxgi_format(desc
->Format
);
294 wined3d_desc
.multisample_type
= desc
->SampleDesc
.Count
> 1 ? desc
->SampleDesc
.Count
: WINED3D_MULTISAMPLE_NONE
;
295 wined3d_desc
.multisample_quality
= desc
->SampleDesc
.Quality
;
296 wined3d_desc
.usage
= wined3d_usage_from_d3d10core(desc
->BindFlags
, desc
->Usage
);
297 wined3d_desc
.pool
= WINED3D_POOL_DEFAULT
;
298 wined3d_desc
.width
= desc
->Width
;
299 wined3d_desc
.height
= desc
->Height
;
300 wined3d_desc
.depth
= 1;
301 wined3d_desc
.size
= 0;
303 if (FAILED(hr
= wined3d_texture_create(device
->wined3d_device
, &wined3d_desc
, desc
->MipLevels
,
304 0, texture
, &d3d10_texture2d_wined3d_parent_ops
, &texture
->wined3d_texture
)))
306 WARN("Failed to create wined3d texture, hr %#x.\n", hr
);
307 if (texture
->dxgi_surface
)
308 IUnknown_Release(texture
->dxgi_surface
);
311 texture
->desc
.MipLevels
= wined3d_texture_get_level_count(texture
->wined3d_texture
);
313 texture
->device
= &device
->ID3D10Device1_iface
;
314 ID3D10Device1_AddRef(texture
->device
);
319 static inline struct d3d10_texture3d
*impl_from_ID3D10Texture3D(ID3D10Texture3D
*iface
)
321 return CONTAINING_RECORD(iface
, struct d3d10_texture3d
, ID3D10Texture3D_iface
);
324 static HRESULT STDMETHODCALLTYPE
d3d10_texture3d_QueryInterface(ID3D10Texture3D
*iface
, REFIID riid
, void **object
)
326 TRACE("iface %p, riid %s, object %p.\n", iface
, debugstr_guid(riid
), object
);
328 if (IsEqualGUID(riid
, &IID_ID3D10Texture3D
)
329 || IsEqualGUID(riid
, &IID_ID3D10Resource
)
330 || IsEqualGUID(riid
, &IID_ID3D10DeviceChild
)
331 || IsEqualGUID(riid
, &IID_IUnknown
))
333 IUnknown_AddRef(iface
);
338 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
341 return E_NOINTERFACE
;
344 static ULONG STDMETHODCALLTYPE
d3d10_texture3d_AddRef(ID3D10Texture3D
*iface
)
346 struct d3d10_texture3d
*texture
= impl_from_ID3D10Texture3D(iface
);
347 ULONG refcount
= InterlockedIncrement(&texture
->refcount
);
349 TRACE("%p increasing refcount to %u.\n", texture
, refcount
);
353 ID3D10Device1_AddRef(texture
->device
);
354 wined3d_texture_incref(texture
->wined3d_texture
);
360 static void STDMETHODCALLTYPE
d3d10_texture3d_wined3d_object_released(void *parent
)
362 HeapFree(GetProcessHeap(), 0, parent
);
365 static ULONG STDMETHODCALLTYPE
d3d10_texture3d_Release(ID3D10Texture3D
*iface
)
367 struct d3d10_texture3d
*texture
= impl_from_ID3D10Texture3D(iface
);
368 ULONG refcount
= InterlockedDecrement(&texture
->refcount
);
370 TRACE("%p decreasing refcount to %u.\n", texture
, refcount
);
374 ID3D10Device1
*device
= texture
->device
;
376 wined3d_texture_decref(texture
->wined3d_texture
);
377 /* Release the device last, it may cause the wined3d device to be
379 ID3D10Device1_Release(device
);
385 static void STDMETHODCALLTYPE
d3d10_texture3d_GetDevice(ID3D10Texture3D
*iface
, ID3D10Device
**device
)
387 struct d3d10_texture3d
*texture
= impl_from_ID3D10Texture3D(iface
);
389 TRACE("iface %p, device %p.\n", iface
, device
);
391 *device
= (ID3D10Device
*)texture
->device
;
392 ID3D10Device_AddRef(*device
);
395 static HRESULT STDMETHODCALLTYPE
d3d10_texture3d_GetPrivateData(ID3D10Texture3D
*iface
,
396 REFGUID guid
, UINT
*data_size
, void *data
)
398 FIXME("iface %p, guid %s, data_size %p, data %p stub!\n",
399 iface
, debugstr_guid(guid
), data_size
, data
);
404 static HRESULT STDMETHODCALLTYPE
d3d10_texture3d_SetPrivateData(ID3D10Texture3D
*iface
,
405 REFGUID guid
, UINT data_size
, const void *data
)
407 FIXME("iface %p, guid %s, data_size %u, data %p stub!\n",
408 iface
, debugstr_guid(guid
), data_size
, data
);
413 static HRESULT STDMETHODCALLTYPE
d3d10_texture3d_SetPrivateDataInterface(ID3D10Texture3D
*iface
,
414 REFGUID guid
, const IUnknown
*data
)
416 FIXME("iface %p, guid %s, data %p stub!\n", iface
, debugstr_guid(guid
), data
);
421 static void STDMETHODCALLTYPE
d3d10_texture3d_GetType(ID3D10Texture3D
*iface
,
422 D3D10_RESOURCE_DIMENSION
*resource_dimension
)
424 TRACE("iface %p, resource_dimension %p.\n", iface
, resource_dimension
);
426 *resource_dimension
= D3D10_RESOURCE_DIMENSION_TEXTURE3D
;
429 static void STDMETHODCALLTYPE
d3d10_texture3d_SetEvictionPriority(ID3D10Texture3D
*iface
, UINT eviction_priority
)
431 FIXME("iface %p, eviction_priority %u stub!\n", iface
, eviction_priority
);
434 static UINT STDMETHODCALLTYPE
d3d10_texture3d_GetEvictionPriority(ID3D10Texture3D
*iface
)
436 FIXME("iface %p stub!\n", iface
);
441 static HRESULT STDMETHODCALLTYPE
d3d10_texture3d_Map(ID3D10Texture3D
*iface
, UINT sub_resource_idx
,
442 D3D10_MAP map_type
, UINT map_flags
, D3D10_MAPPED_TEXTURE3D
*mapped_texture
)
444 struct d3d10_texture3d
*texture
= impl_from_ID3D10Texture3D(iface
);
445 struct wined3d_map_desc wined3d_map_desc
;
446 struct wined3d_resource
*sub_resource
;
449 TRACE("iface %p, sub_resource_idx %u, map_type %u, map_flags %#x, mapped_texture %p.\n",
450 iface
, sub_resource_idx
, map_type
, map_flags
, mapped_texture
);
453 FIXME("Ignoring map_flags %#x.\n", map_flags
);
455 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, sub_resource_idx
)))
457 else if (SUCCEEDED(hr
= wined3d_volume_map(wined3d_volume_from_resource(sub_resource
),
458 &wined3d_map_desc
, NULL
, wined3d_map_flags_from_d3d10_map_type(map_type
))))
460 mapped_texture
->pData
= wined3d_map_desc
.data
;
461 mapped_texture
->RowPitch
= wined3d_map_desc
.row_pitch
;
462 mapped_texture
->DepthPitch
= wined3d_map_desc
.slice_pitch
;
468 static void STDMETHODCALLTYPE
d3d10_texture3d_Unmap(ID3D10Texture3D
*iface
, UINT sub_resource_idx
)
470 struct d3d10_texture3d
*texture
= impl_from_ID3D10Texture3D(iface
);
471 struct wined3d_resource
*sub_resource
;
473 TRACE("iface %p, sub_resource_idx %u.\n", iface
, sub_resource_idx
);
475 if (!(sub_resource
= wined3d_texture_get_sub_resource(texture
->wined3d_texture
, sub_resource_idx
)))
478 wined3d_volume_unmap(wined3d_volume_from_resource(sub_resource
));
481 static void STDMETHODCALLTYPE
d3d10_texture3d_GetDesc(ID3D10Texture3D
*iface
, D3D10_TEXTURE3D_DESC
*desc
)
483 struct d3d10_texture3d
*texture
= impl_from_ID3D10Texture3D(iface
);
485 TRACE("iface %p, desc %p.\n", iface
, desc
);
487 *desc
= texture
->desc
;
490 static const struct ID3D10Texture3DVtbl d3d10_texture3d_vtbl
=
492 /* IUnknown methods */
493 d3d10_texture3d_QueryInterface
,
494 d3d10_texture3d_AddRef
,
495 d3d10_texture3d_Release
,
496 /* ID3D10DeviceChild methods */
497 d3d10_texture3d_GetDevice
,
498 d3d10_texture3d_GetPrivateData
,
499 d3d10_texture3d_SetPrivateData
,
500 d3d10_texture3d_SetPrivateDataInterface
,
501 /* ID3D10Resource methods */
502 d3d10_texture3d_GetType
,
503 d3d10_texture3d_SetEvictionPriority
,
504 d3d10_texture3d_GetEvictionPriority
,
505 /* ID3D10Texture3D methods */
507 d3d10_texture3d_Unmap
,
508 d3d10_texture3d_GetDesc
,
511 static const struct wined3d_parent_ops d3d10_texture3d_wined3d_parent_ops
=
513 d3d10_texture3d_wined3d_object_released
,
516 HRESULT
d3d10_texture3d_init(struct d3d10_texture3d
*texture
, struct d3d10_device
*device
,
517 const D3D10_TEXTURE3D_DESC
*desc
)
519 struct wined3d_resource_desc wined3d_desc
;
522 texture
->ID3D10Texture3D_iface
.lpVtbl
= &d3d10_texture3d_vtbl
;
523 texture
->refcount
= 1;
524 texture
->desc
= *desc
;
526 wined3d_desc
.resource_type
= WINED3D_RTYPE_VOLUME_TEXTURE
;
527 wined3d_desc
.format
= wined3dformat_from_dxgi_format(desc
->Format
);
528 wined3d_desc
.multisample_type
= WINED3D_MULTISAMPLE_NONE
;
529 wined3d_desc
.multisample_quality
= 0;
530 wined3d_desc
.usage
= wined3d_usage_from_d3d10core(desc
->BindFlags
, desc
->Usage
);
531 wined3d_desc
.pool
= WINED3D_POOL_DEFAULT
;
532 wined3d_desc
.width
= desc
->Width
;
533 wined3d_desc
.height
= desc
->Height
;
534 wined3d_desc
.depth
= desc
->Depth
;
535 wined3d_desc
.size
= 0;
537 if (FAILED(hr
= wined3d_texture_create(device
->wined3d_device
, &wined3d_desc
, desc
->MipLevels
,
538 0, texture
, &d3d10_texture3d_wined3d_parent_ops
, &texture
->wined3d_texture
)))
540 WARN("Failed to create wined3d texture, hr %#x.\n", hr
);
543 texture
->desc
.MipLevels
= wined3d_texture_get_level_count(texture
->wined3d_texture
);
545 texture
->device
= &device
->ID3D10Device1_iface
;
546 ID3D10Device1_AddRef(texture
->device
);