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 #define NONAMELESSUNION
24 #include "d3d10core_private.h"
26 WINE_DEFAULT_DEBUG_CHANNEL(d3d10core
);
28 static HRESULT
set_dsdesc_from_resource(D3D10_DEPTH_STENCIL_VIEW_DESC
*desc
, ID3D10Resource
*resource
)
30 D3D10_RESOURCE_DIMENSION dimension
;
32 ID3D10Resource_GetType(resource
, &dimension
);
36 case D3D10_RESOURCE_DIMENSION_TEXTURE1D
:
38 D3D10_TEXTURE1D_DESC texture_desc
;
39 ID3D10Texture1D
*texture
;
41 if (FAILED(ID3D10Resource_QueryInterface(resource
, &IID_ID3D10Texture1D
, (void **)&texture
)))
43 ERR("Resource of type TEXTURE1D doesn't implement ID3D10Texture1D.\n");
47 ID3D10Texture1D_GetDesc(texture
, &texture_desc
);
48 ID3D10Texture1D_Release(texture
);
50 desc
->Format
= texture_desc
.Format
;
51 if (texture_desc
.ArraySize
== 1)
53 desc
->ViewDimension
= D3D10_DSV_DIMENSION_TEXTURE1D
;
54 desc
->u
.Texture1D
.MipSlice
= 0;
58 desc
->ViewDimension
= D3D10_DSV_DIMENSION_TEXTURE1DARRAY
;
59 desc
->u
.Texture1DArray
.MipSlice
= 0;
60 desc
->u
.Texture1DArray
.FirstArraySlice
= 0;
61 desc
->u
.Texture1DArray
.ArraySize
= 1;
67 case D3D10_RESOURCE_DIMENSION_TEXTURE2D
:
69 D3D10_TEXTURE2D_DESC texture_desc
;
70 ID3D10Texture2D
*texture
;
72 if (FAILED(ID3D10Resource_QueryInterface(resource
, &IID_ID3D10Texture2D
, (void **)&texture
)))
74 ERR("Resource of type TEXTURE2D doesn't implement ID3D10Texture2D.\n");
78 ID3D10Texture2D_GetDesc(texture
, &texture_desc
);
79 ID3D10Texture2D_Release(texture
);
81 desc
->Format
= texture_desc
.Format
;
82 if (texture_desc
.ArraySize
== 1)
84 if (texture_desc
.SampleDesc
.Count
== 1)
86 desc
->ViewDimension
= D3D10_DSV_DIMENSION_TEXTURE2D
;
87 desc
->u
.Texture2D
.MipSlice
= 0;
91 desc
->ViewDimension
= D3D10_DSV_DIMENSION_TEXTURE2DMS
;
96 if (texture_desc
.SampleDesc
.Count
== 1)
98 desc
->ViewDimension
= D3D10_DSV_DIMENSION_TEXTURE2DARRAY
;
99 desc
->u
.Texture2DArray
.MipSlice
= 0;
100 desc
->u
.Texture2DArray
.FirstArraySlice
= 0;
101 desc
->u
.Texture2DArray
.ArraySize
= 1;
105 desc
->ViewDimension
= D3D10_DSV_DIMENSION_TEXTURE2DMSARRAY
;
106 desc
->u
.Texture2DMSArray
.FirstArraySlice
= 0;
107 desc
->u
.Texture2DMSArray
.ArraySize
= 1;
115 FIXME("Unhandled resource dimension %#x.\n", dimension
);
116 case D3D10_RESOURCE_DIMENSION_BUFFER
:
117 case D3D10_RESOURCE_DIMENSION_TEXTURE3D
:
122 static HRESULT
set_rtdesc_from_resource(D3D10_RENDER_TARGET_VIEW_DESC
*desc
, ID3D10Resource
*resource
)
124 D3D10_RESOURCE_DIMENSION dimension
;
127 ID3D10Resource_GetType(resource
, &dimension
);
131 case D3D10_RESOURCE_DIMENSION_TEXTURE1D
:
133 ID3D10Texture1D
*texture
;
134 D3D10_TEXTURE1D_DESC texture_desc
;
136 hr
= ID3D10Resource_QueryInterface(resource
, &IID_ID3D10Texture1D
, (void **)&texture
);
139 ERR("Resource of type TEXTURE1D doesn't implement ID3D10Texture1D?\n");
143 ID3D10Texture1D_GetDesc(texture
, &texture_desc
);
144 ID3D10Texture1D_Release(texture
);
146 desc
->Format
= texture_desc
.Format
;
147 if (texture_desc
.ArraySize
== 1)
149 desc
->ViewDimension
= D3D10_RTV_DIMENSION_TEXTURE1D
;
150 desc
->u
.Texture1D
.MipSlice
= 0;
154 desc
->ViewDimension
= D3D10_RTV_DIMENSION_TEXTURE1DARRAY
;
155 desc
->u
.Texture1DArray
.MipSlice
= 0;
156 desc
->u
.Texture1DArray
.FirstArraySlice
= 0;
157 desc
->u
.Texture1DArray
.ArraySize
= 1;
163 case D3D10_RESOURCE_DIMENSION_TEXTURE2D
:
165 ID3D10Texture2D
*texture
;
166 D3D10_TEXTURE2D_DESC texture_desc
;
168 hr
= ID3D10Resource_QueryInterface(resource
, &IID_ID3D10Texture2D
, (void **)&texture
);
171 ERR("Resource of type TEXTURE2D doesn't implement ID3D10Texture2D?\n");
175 ID3D10Texture2D_GetDesc(texture
, &texture_desc
);
176 ID3D10Texture2D_Release(texture
);
178 desc
->Format
= texture_desc
.Format
;
179 if (texture_desc
.ArraySize
== 1)
181 if (texture_desc
.SampleDesc
.Count
== 1)
183 desc
->ViewDimension
= D3D10_RTV_DIMENSION_TEXTURE2D
;
184 desc
->u
.Texture2D
.MipSlice
= 0;
188 desc
->ViewDimension
= D3D10_RTV_DIMENSION_TEXTURE2DMS
;
193 if (texture_desc
.SampleDesc
.Count
== 1)
195 desc
->ViewDimension
= D3D10_RTV_DIMENSION_TEXTURE2DARRAY
;
196 desc
->u
.Texture2DArray
.MipSlice
= 0;
197 desc
->u
.Texture2DArray
.FirstArraySlice
= 0;
198 desc
->u
.Texture2DArray
.ArraySize
= 1;
202 desc
->ViewDimension
= D3D10_RTV_DIMENSION_TEXTURE2DMSARRAY
;
203 desc
->u
.Texture2DMSArray
.FirstArraySlice
= 0;
204 desc
->u
.Texture2DMSArray
.ArraySize
= 1;
211 case D3D10_RESOURCE_DIMENSION_TEXTURE3D
:
213 ID3D10Texture3D
*texture
;
214 D3D10_TEXTURE3D_DESC texture_desc
;
216 hr
= ID3D10Resource_QueryInterface(resource
, &IID_ID3D10Texture3D
, (void **)&texture
);
219 ERR("Resource of type TEXTURE3D doesn't implement ID3D10Texture3D?\n");
223 ID3D10Texture3D_GetDesc(texture
, &texture_desc
);
224 ID3D10Texture3D_Release(texture
);
226 desc
->Format
= texture_desc
.Format
;
227 desc
->ViewDimension
= D3D10_RTV_DIMENSION_TEXTURE3D
;
228 desc
->u
.Texture3D
.MipSlice
= 0;
229 desc
->u
.Texture3D
.FirstWSlice
= 0;
230 desc
->u
.Texture3D
.WSize
= 1;
236 FIXME("Unhandled resource dimension %#x.\n", dimension
);
241 static HRESULT
set_srdesc_from_resource(D3D10_SHADER_RESOURCE_VIEW_DESC
*desc
, ID3D10Resource
*resource
)
243 D3D10_RESOURCE_DIMENSION dimension
;
245 ID3D10Resource_GetType(resource
, &dimension
);
249 case D3D10_RESOURCE_DIMENSION_TEXTURE1D
:
251 D3D10_TEXTURE1D_DESC texture_desc
;
252 ID3D10Texture1D
*texture
;
254 if (FAILED(ID3D10Resource_QueryInterface(resource
, &IID_ID3D10Texture1D
, (void **)&texture
)))
256 ERR("Resource of type TEXTURE1D doesn't implement ID3D10Texture1D.\n");
260 ID3D10Texture1D_GetDesc(texture
, &texture_desc
);
261 ID3D10Texture1D_Release(texture
);
263 desc
->Format
= texture_desc
.Format
;
264 if (texture_desc
.ArraySize
== 1)
266 desc
->ViewDimension
= D3D10_SRV_DIMENSION_TEXTURE1D
;
267 desc
->u
.Texture1D
.MostDetailedMip
= 0;
268 desc
->u
.Texture1D
.MipLevels
= texture_desc
.MipLevels
;
272 desc
->ViewDimension
= D3D10_SRV_DIMENSION_TEXTURE1DARRAY
;
273 desc
->u
.Texture1DArray
.MostDetailedMip
= 0;
274 desc
->u
.Texture1DArray
.MipLevels
= texture_desc
.MipLevels
;
275 desc
->u
.Texture1DArray
.FirstArraySlice
= 0;
276 desc
->u
.Texture1DArray
.ArraySize
= texture_desc
.ArraySize
;
282 case D3D10_RESOURCE_DIMENSION_TEXTURE2D
:
284 D3D10_TEXTURE2D_DESC texture_desc
;
285 ID3D10Texture2D
*texture
;
287 if (FAILED(ID3D10Resource_QueryInterface(resource
, &IID_ID3D10Texture2D
, (void **)&texture
)))
289 ERR("Resource of type TEXTURE2D doesn't implement ID3D10Texture2D.\n");
293 ID3D10Texture2D_GetDesc(texture
, &texture_desc
);
294 ID3D10Texture2D_Release(texture
);
296 desc
->Format
= texture_desc
.Format
;
297 if (texture_desc
.ArraySize
== 1)
299 if (texture_desc
.SampleDesc
.Count
== 1)
301 desc
->ViewDimension
= D3D10_SRV_DIMENSION_TEXTURE2D
;
302 desc
->u
.Texture2D
.MostDetailedMip
= 0;
303 desc
->u
.Texture2D
.MipLevels
= texture_desc
.MipLevels
;
307 desc
->ViewDimension
= D3D10_SRV_DIMENSION_TEXTURE2DMS
;
312 if (texture_desc
.SampleDesc
.Count
== 1)
314 desc
->ViewDimension
= D3D10_SRV_DIMENSION_TEXTURE2DARRAY
;
315 desc
->u
.Texture2DArray
.MostDetailedMip
= 0;
316 desc
->u
.Texture2DArray
.MipLevels
= texture_desc
.MipLevels
;
317 desc
->u
.Texture2DArray
.FirstArraySlice
= 0;
318 desc
->u
.Texture2DArray
.ArraySize
= texture_desc
.ArraySize
;
322 desc
->ViewDimension
= D3D10_SRV_DIMENSION_TEXTURE2DMSARRAY
;
323 desc
->u
.Texture2DMSArray
.FirstArraySlice
= 0;
324 desc
->u
.Texture2DMSArray
.ArraySize
= texture_desc
.ArraySize
;
331 case D3D10_RESOURCE_DIMENSION_TEXTURE3D
:
333 D3D10_TEXTURE3D_DESC texture_desc
;
334 ID3D10Texture3D
*texture
;
336 if (FAILED(ID3D10Resource_QueryInterface(resource
, &IID_ID3D10Texture3D
, (void **)&texture
)))
338 ERR("Resource of type TEXTURE3D doesn't implement ID3D10Texture3D.\n");
342 ID3D10Texture3D_GetDesc(texture
, &texture_desc
);
343 ID3D10Texture3D_Release(texture
);
345 desc
->Format
= texture_desc
.Format
;
346 desc
->ViewDimension
= D3D10_SRV_DIMENSION_TEXTURE3D
;
347 desc
->u
.Texture3D
.MostDetailedMip
= 0;
348 desc
->u
.Texture3D
.MipLevels
= texture_desc
.MipLevels
;
354 FIXME("Unhandled resource dimension %#x.\n", dimension
);
355 case D3D10_RESOURCE_DIMENSION_BUFFER
:
360 static inline struct d3d10_depthstencil_view
*impl_from_ID3D10DepthStencilView(ID3D10DepthStencilView
*iface
)
362 return CONTAINING_RECORD(iface
, struct d3d10_depthstencil_view
, ID3D10DepthStencilView_iface
);
365 /* IUnknown methods */
367 static HRESULT STDMETHODCALLTYPE
d3d10_depthstencil_view_QueryInterface(ID3D10DepthStencilView
*iface
,
368 REFIID riid
, void **object
)
370 TRACE("iface %p, riid %s, object %p.\n", iface
, debugstr_guid(riid
), object
);
372 if (IsEqualGUID(riid
, &IID_ID3D10DepthStencilView
)
373 || IsEqualGUID(riid
, &IID_ID3D10View
)
374 || IsEqualGUID(riid
, &IID_ID3D10DeviceChild
)
375 || IsEqualGUID(riid
, &IID_IUnknown
))
377 IUnknown_AddRef(iface
);
382 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
385 return E_NOINTERFACE
;
388 static ULONG STDMETHODCALLTYPE
d3d10_depthstencil_view_AddRef(ID3D10DepthStencilView
*iface
)
390 struct d3d10_depthstencil_view
*This
= impl_from_ID3D10DepthStencilView(iface
);
391 ULONG refcount
= InterlockedIncrement(&This
->refcount
);
393 TRACE("%p increasing refcount to %u.\n", This
, refcount
);
398 static ULONG STDMETHODCALLTYPE
d3d10_depthstencil_view_Release(ID3D10DepthStencilView
*iface
)
400 struct d3d10_depthstencil_view
*This
= impl_from_ID3D10DepthStencilView(iface
);
401 ULONG refcount
= InterlockedDecrement(&This
->refcount
);
403 TRACE("%p decreasing refcount to %u.\n", This
, refcount
);
407 wined3d_mutex_lock();
408 wined3d_rendertarget_view_decref(This
->wined3d_view
);
409 ID3D10Resource_Release(This
->resource
);
410 ID3D10Device1_Release(This
->device
);
411 wined3d_private_store_cleanup(&This
->private_store
);
412 wined3d_mutex_unlock();
413 HeapFree(GetProcessHeap(), 0, This
);
419 /* ID3D10DeviceChild methods */
421 static void STDMETHODCALLTYPE
d3d10_depthstencil_view_GetDevice(ID3D10DepthStencilView
*iface
, ID3D10Device
**device
)
423 struct d3d10_depthstencil_view
*view
= impl_from_ID3D10DepthStencilView(iface
);
425 TRACE("iface %p, device %p.\n", iface
, device
);
427 *device
= (ID3D10Device
*)view
->device
;
428 ID3D10Device_AddRef(*device
);
431 static HRESULT STDMETHODCALLTYPE
d3d10_depthstencil_view_GetPrivateData(ID3D10DepthStencilView
*iface
,
432 REFGUID guid
, UINT
*data_size
, void *data
)
434 struct d3d10_depthstencil_view
*view
= impl_from_ID3D10DepthStencilView(iface
);
436 TRACE("iface %p, guid %s, data_size %p, data %p.\n",
437 iface
, debugstr_guid(guid
), data_size
, data
);
439 return d3d10_get_private_data(&view
->private_store
, guid
, data_size
, data
);
442 static HRESULT STDMETHODCALLTYPE
d3d10_depthstencil_view_SetPrivateData(ID3D10DepthStencilView
*iface
,
443 REFGUID guid
, UINT data_size
, const void *data
)
445 struct d3d10_depthstencil_view
*view
= impl_from_ID3D10DepthStencilView(iface
);
447 TRACE("iface %p, guid %s, data_size %u, data %p.\n",
448 iface
, debugstr_guid(guid
), data_size
, data
);
450 return d3d10_set_private_data(&view
->private_store
, guid
, data_size
, data
);
453 static HRESULT STDMETHODCALLTYPE
d3d10_depthstencil_view_SetPrivateDataInterface(ID3D10DepthStencilView
*iface
,
454 REFGUID guid
, const IUnknown
*data
)
456 struct d3d10_depthstencil_view
*view
= impl_from_ID3D10DepthStencilView(iface
);
458 TRACE("iface %p, guid %s, data %p.\n", iface
, debugstr_guid(guid
), data
);
460 return d3d10_set_private_data_interface(&view
->private_store
, guid
, data
);
463 /* ID3D10View methods */
465 static void STDMETHODCALLTYPE
d3d10_depthstencil_view_GetResource(ID3D10DepthStencilView
*iface
,
466 ID3D10Resource
**resource
)
468 struct d3d10_depthstencil_view
*view
= impl_from_ID3D10DepthStencilView(iface
);
470 TRACE("iface %p, resource %p.\n", iface
, resource
);
472 *resource
= view
->resource
;
473 ID3D10Resource_AddRef(*resource
);
476 /* ID3D10DepthStencilView methods */
478 static void STDMETHODCALLTYPE
d3d10_depthstencil_view_GetDesc(ID3D10DepthStencilView
*iface
,
479 D3D10_DEPTH_STENCIL_VIEW_DESC
*desc
)
481 struct d3d10_depthstencil_view
*view
= impl_from_ID3D10DepthStencilView(iface
);
483 TRACE("iface %p, desc %p.\n", iface
, desc
);
488 static const struct ID3D10DepthStencilViewVtbl d3d10_depthstencil_view_vtbl
=
490 /* IUnknown methods */
491 d3d10_depthstencil_view_QueryInterface
,
492 d3d10_depthstencil_view_AddRef
,
493 d3d10_depthstencil_view_Release
,
494 /* ID3D10DeviceChild methods */
495 d3d10_depthstencil_view_GetDevice
,
496 d3d10_depthstencil_view_GetPrivateData
,
497 d3d10_depthstencil_view_SetPrivateData
,
498 d3d10_depthstencil_view_SetPrivateDataInterface
,
499 /* ID3D10View methods */
500 d3d10_depthstencil_view_GetResource
,
501 /* ID3D10DepthStencilView methods */
502 d3d10_depthstencil_view_GetDesc
,
505 static void wined3d_depth_stencil_view_desc_from_d3d10core(struct wined3d_rendertarget_view_desc
*wined3d_desc
,
506 const D3D10_DEPTH_STENCIL_VIEW_DESC
*desc
)
508 wined3d_desc
->format_id
= wined3dformat_from_dxgi_format(desc
->Format
);
510 switch (desc
->ViewDimension
)
512 case D3D10_DSV_DIMENSION_TEXTURE1D
:
513 wined3d_desc
->u
.texture
.level_idx
= desc
->u
.Texture1D
.MipSlice
;
514 wined3d_desc
->u
.texture
.layer_idx
= 0;
515 wined3d_desc
->u
.texture
.layer_count
= 1;
518 case D3D10_DSV_DIMENSION_TEXTURE1DARRAY
:
519 wined3d_desc
->u
.texture
.level_idx
= desc
->u
.Texture1DArray
.MipSlice
;
520 wined3d_desc
->u
.texture
.layer_idx
= desc
->u
.Texture1DArray
.FirstArraySlice
;
521 wined3d_desc
->u
.texture
.layer_count
= desc
->u
.Texture1DArray
.ArraySize
;
524 case D3D10_DSV_DIMENSION_TEXTURE2D
:
525 wined3d_desc
->u
.texture
.level_idx
= desc
->u
.Texture2D
.MipSlice
;
526 wined3d_desc
->u
.texture
.layer_idx
= 0;
527 wined3d_desc
->u
.texture
.layer_count
= 1;
530 case D3D10_DSV_DIMENSION_TEXTURE2DARRAY
:
531 wined3d_desc
->u
.texture
.level_idx
= desc
->u
.Texture2DArray
.MipSlice
;
532 wined3d_desc
->u
.texture
.layer_idx
= desc
->u
.Texture2DArray
.FirstArraySlice
;
533 wined3d_desc
->u
.texture
.layer_count
= desc
->u
.Texture2DArray
.ArraySize
;
536 case D3D10_DSV_DIMENSION_TEXTURE2DMS
:
537 wined3d_desc
->u
.texture
.level_idx
= 0;
538 wined3d_desc
->u
.texture
.layer_idx
= 0;
539 wined3d_desc
->u
.texture
.layer_count
= 1;
542 case D3D10_DSV_DIMENSION_TEXTURE2DMSARRAY
:
543 wined3d_desc
->u
.texture
.level_idx
= 0;
544 wined3d_desc
->u
.texture
.layer_idx
= desc
->u
.Texture2DMSArray
.FirstArraySlice
;
545 wined3d_desc
->u
.texture
.layer_count
= desc
->u
.Texture2DMSArray
.ArraySize
;
549 FIXME("Unhandled view dimension %#x.\n", desc
->ViewDimension
);
550 wined3d_desc
->u
.texture
.level_idx
= 0;
551 wined3d_desc
->u
.texture
.layer_idx
= 0;
552 wined3d_desc
->u
.texture
.layer_count
= 1;
557 HRESULT
d3d10_depthstencil_view_init(struct d3d10_depthstencil_view
*view
, struct d3d10_device
*device
,
558 ID3D10Resource
*resource
, const D3D10_DEPTH_STENCIL_VIEW_DESC
*desc
)
560 struct wined3d_rendertarget_view_desc wined3d_desc
;
561 struct wined3d_resource
*wined3d_resource
;
564 view
->ID3D10DepthStencilView_iface
.lpVtbl
= &d3d10_depthstencil_view_vtbl
;
569 if (FAILED(hr
= set_dsdesc_from_resource(&view
->desc
, resource
)))
577 wined3d_mutex_lock();
578 if (!(wined3d_resource
= wined3d_resource_from_resource(resource
)))
580 wined3d_mutex_unlock();
581 ERR("Failed to get wined3d resource for d3d10 resource %p.\n", resource
);
585 wined3d_depth_stencil_view_desc_from_d3d10core(&wined3d_desc
, &view
->desc
);
586 if (FAILED(hr
= wined3d_rendertarget_view_create(&wined3d_desc
, wined3d_resource
,
587 view
, &d3d10_null_wined3d_parent_ops
, &view
->wined3d_view
)))
589 wined3d_mutex_unlock();
590 WARN("Failed to create a wined3d rendertarget view, hr %#x.\n", hr
);
594 wined3d_private_store_init(&view
->private_store
);
595 wined3d_mutex_unlock();
596 view
->resource
= resource
;
597 ID3D10Resource_AddRef(resource
);
598 view
->device
= &device
->ID3D10Device1_iface
;
599 ID3D10Device1_AddRef(view
->device
);
604 struct d3d10_depthstencil_view
*unsafe_impl_from_ID3D10DepthStencilView(ID3D10DepthStencilView
*iface
)
608 assert(iface
->lpVtbl
== &d3d10_depthstencil_view_vtbl
);
610 return impl_from_ID3D10DepthStencilView(iface
);
613 static inline struct d3d10_rendertarget_view
*impl_from_ID3D10RenderTargetView(ID3D10RenderTargetView
*iface
)
615 return CONTAINING_RECORD(iface
, struct d3d10_rendertarget_view
, ID3D10RenderTargetView_iface
);
618 /* IUnknown methods */
620 static HRESULT STDMETHODCALLTYPE
d3d10_rendertarget_view_QueryInterface(ID3D10RenderTargetView
*iface
,
621 REFIID riid
, void **object
)
623 TRACE("iface %p, riid %s, object %p\n", iface
, debugstr_guid(riid
), object
);
625 if (IsEqualGUID(riid
, &IID_ID3D10RenderTargetView
)
626 || IsEqualGUID(riid
, &IID_ID3D10View
)
627 || IsEqualGUID(riid
, &IID_ID3D10DeviceChild
)
628 || IsEqualGUID(riid
, &IID_IUnknown
))
630 IUnknown_AddRef(iface
);
635 WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid
));
638 return E_NOINTERFACE
;
641 static ULONG STDMETHODCALLTYPE
d3d10_rendertarget_view_AddRef(ID3D10RenderTargetView
*iface
)
643 struct d3d10_rendertarget_view
*This
= impl_from_ID3D10RenderTargetView(iface
);
644 ULONG refcount
= InterlockedIncrement(&This
->refcount
);
646 TRACE("%p increasing refcount to %u\n", This
, refcount
);
651 static ULONG STDMETHODCALLTYPE
d3d10_rendertarget_view_Release(ID3D10RenderTargetView
*iface
)
653 struct d3d10_rendertarget_view
*This
= impl_from_ID3D10RenderTargetView(iface
);
654 ULONG refcount
= InterlockedDecrement(&This
->refcount
);
656 TRACE("%p decreasing refcount to %u\n", This
, refcount
);
660 wined3d_mutex_lock();
661 wined3d_rendertarget_view_decref(This
->wined3d_view
);
662 ID3D10Resource_Release(This
->resource
);
663 ID3D10Device1_Release(This
->device
);
664 wined3d_private_store_cleanup(&This
->private_store
);
665 wined3d_mutex_unlock();
666 HeapFree(GetProcessHeap(), 0, This
);
672 /* ID3D10DeviceChild methods */
674 static void STDMETHODCALLTYPE
d3d10_rendertarget_view_GetDevice(ID3D10RenderTargetView
*iface
, ID3D10Device
**device
)
676 struct d3d10_rendertarget_view
*view
= impl_from_ID3D10RenderTargetView(iface
);
678 TRACE("iface %p, device %p.\n", iface
, device
);
680 *device
= (ID3D10Device
*)view
->device
;
681 ID3D10Device_AddRef(*device
);
684 static HRESULT STDMETHODCALLTYPE
d3d10_rendertarget_view_GetPrivateData(ID3D10RenderTargetView
*iface
,
685 REFGUID guid
, UINT
*data_size
, void *data
)
687 struct d3d10_rendertarget_view
*view
= impl_from_ID3D10RenderTargetView(iface
);
689 TRACE("iface %p, guid %s, data_size %p, data %p.\n",
690 iface
, debugstr_guid(guid
), data_size
, data
);
692 return d3d10_get_private_data(&view
->private_store
, guid
, data_size
, data
);
695 static HRESULT STDMETHODCALLTYPE
d3d10_rendertarget_view_SetPrivateData(ID3D10RenderTargetView
*iface
,
696 REFGUID guid
, UINT data_size
, const void *data
)
698 struct d3d10_rendertarget_view
*view
= impl_from_ID3D10RenderTargetView(iface
);
700 TRACE("iface %p, guid %s, data_size %u, data %p.\n",
701 iface
, debugstr_guid(guid
), data_size
, data
);
703 return d3d10_set_private_data(&view
->private_store
, guid
, data_size
, data
);
706 static HRESULT STDMETHODCALLTYPE
d3d10_rendertarget_view_SetPrivateDataInterface(ID3D10RenderTargetView
*iface
,
707 REFGUID guid
, const IUnknown
*data
)
709 struct d3d10_rendertarget_view
*view
= impl_from_ID3D10RenderTargetView(iface
);
711 TRACE("iface %p, guid %s, data %p.\n", iface
, debugstr_guid(guid
), data
);
713 return d3d10_set_private_data_interface(&view
->private_store
, guid
, data
);
716 /* ID3D10View methods */
718 static void STDMETHODCALLTYPE
d3d10_rendertarget_view_GetResource(ID3D10RenderTargetView
*iface
,
719 ID3D10Resource
**resource
)
721 struct d3d10_rendertarget_view
*view
= impl_from_ID3D10RenderTargetView(iface
);
723 TRACE("iface %p, resource %p\n", iface
, resource
);
725 *resource
= view
->resource
;
726 ID3D10Resource_AddRef(*resource
);
729 /* ID3D10RenderTargetView methods */
731 static void STDMETHODCALLTYPE
d3d10_rendertarget_view_GetDesc(ID3D10RenderTargetView
*iface
,
732 D3D10_RENDER_TARGET_VIEW_DESC
*desc
)
734 struct d3d10_rendertarget_view
*This
= impl_from_ID3D10RenderTargetView(iface
);
736 TRACE("iface %p, desc %p\n", iface
, desc
);
741 static const struct ID3D10RenderTargetViewVtbl d3d10_rendertarget_view_vtbl
=
743 /* IUnknown methods */
744 d3d10_rendertarget_view_QueryInterface
,
745 d3d10_rendertarget_view_AddRef
,
746 d3d10_rendertarget_view_Release
,
747 /* ID3D10DeviceChild methods */
748 d3d10_rendertarget_view_GetDevice
,
749 d3d10_rendertarget_view_GetPrivateData
,
750 d3d10_rendertarget_view_SetPrivateData
,
751 d3d10_rendertarget_view_SetPrivateDataInterface
,
752 /* ID3D10View methods */
753 d3d10_rendertarget_view_GetResource
,
754 /* ID3D10RenderTargetView methods */
755 d3d10_rendertarget_view_GetDesc
,
758 static void wined3d_rendertarget_view_desc_from_d3d10core(struct wined3d_rendertarget_view_desc
*wined3d_desc
,
759 const D3D10_RENDER_TARGET_VIEW_DESC
*desc
)
761 wined3d_desc
->format_id
= wined3dformat_from_dxgi_format(desc
->Format
);
763 switch (desc
->ViewDimension
)
765 case D3D10_RTV_DIMENSION_BUFFER
:
766 wined3d_desc
->u
.buffer
.start_idx
= desc
->u
.Buffer
.ElementOffset
;
767 wined3d_desc
->u
.buffer
.count
= desc
->u
.Buffer
.ElementWidth
;
770 case D3D10_RTV_DIMENSION_TEXTURE1D
:
771 wined3d_desc
->u
.texture
.level_idx
= desc
->u
.Texture1D
.MipSlice
;
772 wined3d_desc
->u
.texture
.layer_idx
= 0;
773 wined3d_desc
->u
.texture
.layer_count
= 1;
776 case D3D10_RTV_DIMENSION_TEXTURE1DARRAY
:
777 wined3d_desc
->u
.texture
.level_idx
= desc
->u
.Texture1DArray
.MipSlice
;
778 wined3d_desc
->u
.texture
.layer_idx
= desc
->u
.Texture1DArray
.FirstArraySlice
;
779 wined3d_desc
->u
.texture
.layer_count
= desc
->u
.Texture1DArray
.ArraySize
;
782 case D3D10_RTV_DIMENSION_TEXTURE2D
:
783 wined3d_desc
->u
.texture
.level_idx
= desc
->u
.Texture2D
.MipSlice
;
784 wined3d_desc
->u
.texture
.layer_idx
= 0;
785 wined3d_desc
->u
.texture
.layer_count
= 1;
788 case D3D10_RTV_DIMENSION_TEXTURE2DARRAY
:
789 wined3d_desc
->u
.texture
.level_idx
= desc
->u
.Texture2DArray
.MipSlice
;
790 wined3d_desc
->u
.texture
.layer_idx
= desc
->u
.Texture2DArray
.FirstArraySlice
;
791 wined3d_desc
->u
.texture
.layer_count
= desc
->u
.Texture2DArray
.ArraySize
;
794 case D3D10_RTV_DIMENSION_TEXTURE2DMS
:
795 wined3d_desc
->u
.texture
.level_idx
= 0;
796 wined3d_desc
->u
.texture
.layer_idx
= 0;
797 wined3d_desc
->u
.texture
.layer_count
= 1;
800 case D3D10_RTV_DIMENSION_TEXTURE2DMSARRAY
:
801 wined3d_desc
->u
.texture
.level_idx
= 0;
802 wined3d_desc
->u
.texture
.layer_idx
= desc
->u
.Texture2DMSArray
.FirstArraySlice
;
803 wined3d_desc
->u
.texture
.layer_count
= desc
->u
.Texture2DMSArray
.ArraySize
;
806 case D3D10_RTV_DIMENSION_TEXTURE3D
:
807 wined3d_desc
->u
.texture
.level_idx
= desc
->u
.Texture3D
.MipSlice
;
808 wined3d_desc
->u
.texture
.layer_idx
= desc
->u
.Texture3D
.FirstWSlice
;
809 wined3d_desc
->u
.texture
.layer_count
= desc
->u
.Texture3D
.WSize
;
813 FIXME("Unhandled view dimension %#x.\n", desc
->ViewDimension
);
814 wined3d_desc
->u
.texture
.level_idx
= 0;
815 wined3d_desc
->u
.texture
.layer_idx
= 0;
816 wined3d_desc
->u
.texture
.layer_count
= 1;
821 HRESULT
d3d10_rendertarget_view_init(struct d3d10_rendertarget_view
*view
, struct d3d10_device
*device
,
822 ID3D10Resource
*resource
, const D3D10_RENDER_TARGET_VIEW_DESC
*desc
)
824 struct wined3d_rendertarget_view_desc wined3d_desc
;
825 struct wined3d_resource
*wined3d_resource
;
828 view
->ID3D10RenderTargetView_iface
.lpVtbl
= &d3d10_rendertarget_view_vtbl
;
833 HRESULT hr
= set_rtdesc_from_resource(&view
->desc
, resource
);
834 if (FAILED(hr
)) return hr
;
841 wined3d_mutex_lock();
842 if (!(wined3d_resource
= wined3d_resource_from_resource(resource
)))
844 wined3d_mutex_unlock();
845 ERR("Failed to get wined3d resource for d3d10 resource %p.\n", resource
);
849 wined3d_rendertarget_view_desc_from_d3d10core(&wined3d_desc
, &view
->desc
);
850 if (FAILED(hr
= wined3d_rendertarget_view_create(&wined3d_desc
, wined3d_resource
,
851 view
, &d3d10_null_wined3d_parent_ops
, &view
->wined3d_view
)))
853 wined3d_mutex_unlock();
854 WARN("Failed to create a wined3d rendertarget view, hr %#x.\n", hr
);
858 wined3d_private_store_init(&view
->private_store
);
859 wined3d_mutex_unlock();
860 view
->resource
= resource
;
861 ID3D10Resource_AddRef(resource
);
862 view
->device
= &device
->ID3D10Device1_iface
;
863 ID3D10Device1_AddRef(view
->device
);
868 struct d3d10_rendertarget_view
*unsafe_impl_from_ID3D10RenderTargetView(ID3D10RenderTargetView
*iface
)
872 assert(iface
->lpVtbl
== &d3d10_rendertarget_view_vtbl
);
874 return impl_from_ID3D10RenderTargetView(iface
);
877 static inline struct d3d10_shader_resource_view
*impl_from_ID3D10ShaderResourceView(ID3D10ShaderResourceView
*iface
)
879 return CONTAINING_RECORD(iface
, struct d3d10_shader_resource_view
, ID3D10ShaderResourceView_iface
);
882 /* IUnknown methods */
884 static HRESULT STDMETHODCALLTYPE
d3d10_shader_resource_view_QueryInterface(ID3D10ShaderResourceView
*iface
,
885 REFIID riid
, void **object
)
887 TRACE("iface %p, riid %s, object %p.\n", iface
, debugstr_guid(riid
), object
);
889 if (IsEqualGUID(riid
, &IID_ID3D10ShaderResourceView
)
890 || IsEqualGUID(riid
, &IID_ID3D10View
)
891 || IsEqualGUID(riid
, &IID_ID3D10DeviceChild
)
892 || IsEqualGUID(riid
, &IID_IUnknown
))
894 IUnknown_AddRef(iface
);
899 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
902 return E_NOINTERFACE
;
905 static ULONG STDMETHODCALLTYPE
d3d10_shader_resource_view_AddRef(ID3D10ShaderResourceView
*iface
)
907 struct d3d10_shader_resource_view
*This
= impl_from_ID3D10ShaderResourceView(iface
);
908 ULONG refcount
= InterlockedIncrement(&This
->refcount
);
910 TRACE("%p increasing refcount to %u.\n", This
, refcount
);
915 static ULONG STDMETHODCALLTYPE
d3d10_shader_resource_view_Release(ID3D10ShaderResourceView
*iface
)
917 struct d3d10_shader_resource_view
*This
= impl_from_ID3D10ShaderResourceView(iface
);
918 ULONG refcount
= InterlockedDecrement(&This
->refcount
);
920 TRACE("%p decreasing refcount to %u.\n", This
, refcount
);
924 wined3d_mutex_lock();
925 wined3d_shader_resource_view_decref(This
->wined3d_view
);
926 ID3D10Resource_Release(This
->resource
);
927 ID3D10Device1_Release(This
->device
);
928 wined3d_private_store_cleanup(&This
->private_store
);
929 wined3d_mutex_unlock();
930 HeapFree(GetProcessHeap(), 0, This
);
936 /* ID3D10DeviceChild methods */
938 static void STDMETHODCALLTYPE
d3d10_shader_resource_view_GetDevice(ID3D10ShaderResourceView
*iface
,
939 ID3D10Device
**device
)
941 struct d3d10_shader_resource_view
*view
= impl_from_ID3D10ShaderResourceView(iface
);
943 TRACE("iface %p, device %p.\n", iface
, device
);
945 *device
= (ID3D10Device
*)view
->device
;
946 ID3D10Device_AddRef(*device
);
949 static HRESULT STDMETHODCALLTYPE
d3d10_shader_resource_view_GetPrivateData(ID3D10ShaderResourceView
*iface
,
950 REFGUID guid
, UINT
*data_size
, void *data
)
952 struct d3d10_shader_resource_view
*view
= impl_from_ID3D10ShaderResourceView(iface
);
954 TRACE("iface %p, guid %s, data_size %p, data %p.\n",
955 iface
, debugstr_guid(guid
), data_size
, data
);
957 return d3d10_get_private_data(&view
->private_store
, guid
, data_size
, data
);
960 static HRESULT STDMETHODCALLTYPE
d3d10_shader_resource_view_SetPrivateData(ID3D10ShaderResourceView
*iface
,
961 REFGUID guid
, UINT data_size
, const void *data
)
963 struct d3d10_shader_resource_view
*view
= impl_from_ID3D10ShaderResourceView(iface
);
965 TRACE("iface %p, guid %s, data_size %u, data %p.\n",
966 iface
, debugstr_guid(guid
), data_size
, data
);
968 return d3d10_set_private_data(&view
->private_store
, guid
, data_size
, data
);
971 static HRESULT STDMETHODCALLTYPE
d3d10_shader_resource_view_SetPrivateDataInterface(ID3D10ShaderResourceView
*iface
,
972 REFGUID guid
, const IUnknown
*data
)
974 struct d3d10_shader_resource_view
*view
= impl_from_ID3D10ShaderResourceView(iface
);
976 TRACE("iface %p, guid %s, data %p.\n", iface
, debugstr_guid(guid
), data
);
978 return d3d10_set_private_data_interface(&view
->private_store
, guid
, data
);
981 /* ID3D10View methods */
983 static void STDMETHODCALLTYPE
d3d10_shader_resource_view_GetResource(ID3D10ShaderResourceView
*iface
,
984 ID3D10Resource
**resource
)
986 struct d3d10_shader_resource_view
*view
= impl_from_ID3D10ShaderResourceView(iface
);
988 TRACE("iface %p, resource %p.\n", iface
, resource
);
990 *resource
= view
->resource
;
991 ID3D10Resource_AddRef(*resource
);
994 /* ID3D10ShaderResourceView methods */
996 static void STDMETHODCALLTYPE
d3d10_shader_resource_view_GetDesc(ID3D10ShaderResourceView
*iface
,
997 D3D10_SHADER_RESOURCE_VIEW_DESC
*desc
)
999 struct d3d10_shader_resource_view
*view
= impl_from_ID3D10ShaderResourceView(iface
);
1001 TRACE("iface %p, desc %p.\n", iface
, desc
);
1006 static const struct ID3D10ShaderResourceViewVtbl d3d10_shader_resource_view_vtbl
=
1008 /* IUnknown methods */
1009 d3d10_shader_resource_view_QueryInterface
,
1010 d3d10_shader_resource_view_AddRef
,
1011 d3d10_shader_resource_view_Release
,
1012 /* ID3D10DeviceChild methods */
1013 d3d10_shader_resource_view_GetDevice
,
1014 d3d10_shader_resource_view_GetPrivateData
,
1015 d3d10_shader_resource_view_SetPrivateData
,
1016 d3d10_shader_resource_view_SetPrivateDataInterface
,
1017 /* ID3D10View methods */
1018 d3d10_shader_resource_view_GetResource
,
1019 /* ID3D10ShaderResourceView methods */
1020 d3d10_shader_resource_view_GetDesc
,
1023 HRESULT
d3d10_shader_resource_view_init(struct d3d10_shader_resource_view
*view
, struct d3d10_device
*device
,
1024 ID3D10Resource
*resource
, const D3D10_SHADER_RESOURCE_VIEW_DESC
*desc
)
1026 struct wined3d_resource
*wined3d_resource
;
1029 view
->ID3D10ShaderResourceView_iface
.lpVtbl
= &d3d10_shader_resource_view_vtbl
;
1034 if (FAILED(hr
= set_srdesc_from_resource(&view
->desc
, resource
)))
1042 wined3d_mutex_lock();
1043 if (!(wined3d_resource
= wined3d_resource_from_resource(resource
)))
1045 ERR("Failed to get wined3d resource for d3d10 resource %p.\n", resource
);
1049 if (FAILED(hr
= wined3d_shader_resource_view_create(wined3d_resource
,
1050 view
, &d3d10_null_wined3d_parent_ops
, &view
->wined3d_view
)))
1052 WARN("Failed to create wined3d shader resource view, hr %#x.\n", hr
);
1056 wined3d_private_store_init(&view
->private_store
);
1057 wined3d_mutex_unlock();
1058 view
->resource
= resource
;
1059 ID3D10Resource_AddRef(resource
);
1060 view
->device
= &device
->ID3D10Device1_iface
;
1061 ID3D10Device1_AddRef(view
->device
);
1066 struct d3d10_shader_resource_view
*unsafe_impl_from_ID3D10ShaderResourceView(ID3D10ShaderResourceView
*iface
)
1070 assert(iface
->lpVtbl
== &d3d10_shader_resource_view_vtbl
);
1071 return CONTAINING_RECORD(iface
, struct d3d10_shader_resource_view
, ID3D10ShaderResourceView_iface
);