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_rendertarget_view_decref(This
->wined3d_view
);
408 ID3D10Resource_Release(This
->resource
);
409 ID3D10Device1_Release(This
->device
);
410 wined3d_private_store_cleanup(&This
->private_store
);
411 HeapFree(GetProcessHeap(), 0, This
);
417 /* ID3D10DeviceChild methods */
419 static void STDMETHODCALLTYPE
d3d10_depthstencil_view_GetDevice(ID3D10DepthStencilView
*iface
, ID3D10Device
**device
)
421 struct d3d10_depthstencil_view
*view
= impl_from_ID3D10DepthStencilView(iface
);
423 TRACE("iface %p, device %p.\n", iface
, device
);
425 *device
= (ID3D10Device
*)view
->device
;
426 ID3D10Device_AddRef(*device
);
429 static HRESULT STDMETHODCALLTYPE
d3d10_depthstencil_view_GetPrivateData(ID3D10DepthStencilView
*iface
,
430 REFGUID guid
, UINT
*data_size
, void *data
)
432 struct d3d10_depthstencil_view
*view
= impl_from_ID3D10DepthStencilView(iface
);
434 TRACE("iface %p, guid %s, data_size %p, data %p.\n",
435 iface
, debugstr_guid(guid
), data_size
, data
);
437 return d3d10_get_private_data(&view
->private_store
, guid
, data_size
, data
);
440 static HRESULT STDMETHODCALLTYPE
d3d10_depthstencil_view_SetPrivateData(ID3D10DepthStencilView
*iface
,
441 REFGUID guid
, UINT data_size
, const void *data
)
443 struct d3d10_depthstencil_view
*view
= impl_from_ID3D10DepthStencilView(iface
);
445 TRACE("iface %p, guid %s, data_size %u, data %p.\n",
446 iface
, debugstr_guid(guid
), data_size
, data
);
448 return d3d10_set_private_data(&view
->private_store
, guid
, data_size
, data
);
451 static HRESULT STDMETHODCALLTYPE
d3d10_depthstencil_view_SetPrivateDataInterface(ID3D10DepthStencilView
*iface
,
452 REFGUID guid
, const IUnknown
*data
)
454 struct d3d10_depthstencil_view
*view
= impl_from_ID3D10DepthStencilView(iface
);
456 TRACE("iface %p, guid %s, data %p.\n", iface
, debugstr_guid(guid
), data
);
458 return d3d10_set_private_data_interface(&view
->private_store
, guid
, data
);
461 /* ID3D10View methods */
463 static void STDMETHODCALLTYPE
d3d10_depthstencil_view_GetResource(ID3D10DepthStencilView
*iface
,
464 ID3D10Resource
**resource
)
466 struct d3d10_depthstencil_view
*view
= impl_from_ID3D10DepthStencilView(iface
);
468 TRACE("iface %p, resource %p.\n", iface
, resource
);
470 *resource
= view
->resource
;
471 ID3D10Resource_AddRef(*resource
);
474 /* ID3D10DepthStencilView methods */
476 static void STDMETHODCALLTYPE
d3d10_depthstencil_view_GetDesc(ID3D10DepthStencilView
*iface
,
477 D3D10_DEPTH_STENCIL_VIEW_DESC
*desc
)
479 struct d3d10_depthstencil_view
*view
= impl_from_ID3D10DepthStencilView(iface
);
481 TRACE("iface %p, desc %p.\n", iface
, desc
);
486 static const struct ID3D10DepthStencilViewVtbl d3d10_depthstencil_view_vtbl
=
488 /* IUnknown methods */
489 d3d10_depthstencil_view_QueryInterface
,
490 d3d10_depthstencil_view_AddRef
,
491 d3d10_depthstencil_view_Release
,
492 /* ID3D10DeviceChild methods */
493 d3d10_depthstencil_view_GetDevice
,
494 d3d10_depthstencil_view_GetPrivateData
,
495 d3d10_depthstencil_view_SetPrivateData
,
496 d3d10_depthstencil_view_SetPrivateDataInterface
,
497 /* ID3D10View methods */
498 d3d10_depthstencil_view_GetResource
,
499 /* ID3D10DepthStencilView methods */
500 d3d10_depthstencil_view_GetDesc
,
503 static void wined3d_depth_stencil_view_desc_from_d3d10core(struct wined3d_rendertarget_view_desc
*wined3d_desc
,
504 const D3D10_DEPTH_STENCIL_VIEW_DESC
*desc
)
506 wined3d_desc
->format_id
= wined3dformat_from_dxgi_format(desc
->Format
);
508 switch (desc
->ViewDimension
)
510 case D3D10_DSV_DIMENSION_TEXTURE1D
:
511 wined3d_desc
->u
.texture
.level_idx
= desc
->u
.Texture1D
.MipSlice
;
512 wined3d_desc
->u
.texture
.layer_idx
= 0;
513 wined3d_desc
->u
.texture
.layer_count
= 1;
516 case D3D10_DSV_DIMENSION_TEXTURE1DARRAY
:
517 wined3d_desc
->u
.texture
.level_idx
= desc
->u
.Texture1DArray
.MipSlice
;
518 wined3d_desc
->u
.texture
.layer_idx
= desc
->u
.Texture1DArray
.FirstArraySlice
;
519 wined3d_desc
->u
.texture
.layer_count
= desc
->u
.Texture1DArray
.ArraySize
;
522 case D3D10_DSV_DIMENSION_TEXTURE2D
:
523 wined3d_desc
->u
.texture
.level_idx
= desc
->u
.Texture2D
.MipSlice
;
524 wined3d_desc
->u
.texture
.layer_idx
= 0;
525 wined3d_desc
->u
.texture
.layer_count
= 1;
528 case D3D10_DSV_DIMENSION_TEXTURE2DARRAY
:
529 wined3d_desc
->u
.texture
.level_idx
= desc
->u
.Texture2DArray
.MipSlice
;
530 wined3d_desc
->u
.texture
.layer_idx
= desc
->u
.Texture2DArray
.FirstArraySlice
;
531 wined3d_desc
->u
.texture
.layer_count
= desc
->u
.Texture2DArray
.ArraySize
;
534 case D3D10_DSV_DIMENSION_TEXTURE2DMS
:
535 wined3d_desc
->u
.texture
.level_idx
= 0;
536 wined3d_desc
->u
.texture
.layer_idx
= 0;
537 wined3d_desc
->u
.texture
.layer_count
= 1;
540 case D3D10_DSV_DIMENSION_TEXTURE2DMSARRAY
:
541 wined3d_desc
->u
.texture
.level_idx
= 0;
542 wined3d_desc
->u
.texture
.layer_idx
= desc
->u
.Texture2DMSArray
.FirstArraySlice
;
543 wined3d_desc
->u
.texture
.layer_count
= desc
->u
.Texture2DMSArray
.ArraySize
;
547 FIXME("Unhandled view dimension %#x.\n", desc
->ViewDimension
);
548 wined3d_desc
->u
.texture
.level_idx
= 0;
549 wined3d_desc
->u
.texture
.layer_idx
= 0;
550 wined3d_desc
->u
.texture
.layer_count
= 1;
555 HRESULT
d3d10_depthstencil_view_init(struct d3d10_depthstencil_view
*view
, struct d3d10_device
*device
,
556 ID3D10Resource
*resource
, const D3D10_DEPTH_STENCIL_VIEW_DESC
*desc
)
558 struct wined3d_rendertarget_view_desc wined3d_desc
;
559 struct wined3d_resource
*wined3d_resource
;
562 view
->ID3D10DepthStencilView_iface
.lpVtbl
= &d3d10_depthstencil_view_vtbl
;
567 if (FAILED(hr
= set_dsdesc_from_resource(&view
->desc
, resource
)))
575 if (!(wined3d_resource
= wined3d_resource_from_resource(resource
)))
577 ERR("Failed to get wined3d resource for d3d10 resource %p.\n", resource
);
581 wined3d_depth_stencil_view_desc_from_d3d10core(&wined3d_desc
, &view
->desc
);
582 if (FAILED(hr
= wined3d_rendertarget_view_create(&wined3d_desc
, wined3d_resource
,
583 view
, &d3d10_null_wined3d_parent_ops
, &view
->wined3d_view
)))
585 WARN("Failed to create a wined3d rendertarget view, hr %#x.\n", hr
);
589 wined3d_private_store_init(&view
->private_store
);
590 view
->resource
= resource
;
591 ID3D10Resource_AddRef(resource
);
592 view
->device
= &device
->ID3D10Device1_iface
;
593 ID3D10Device1_AddRef(view
->device
);
598 struct d3d10_depthstencil_view
*unsafe_impl_from_ID3D10DepthStencilView(ID3D10DepthStencilView
*iface
)
602 assert(iface
->lpVtbl
== &d3d10_depthstencil_view_vtbl
);
604 return impl_from_ID3D10DepthStencilView(iface
);
607 static inline struct d3d10_rendertarget_view
*impl_from_ID3D10RenderTargetView(ID3D10RenderTargetView
*iface
)
609 return CONTAINING_RECORD(iface
, struct d3d10_rendertarget_view
, ID3D10RenderTargetView_iface
);
612 /* IUnknown methods */
614 static HRESULT STDMETHODCALLTYPE
d3d10_rendertarget_view_QueryInterface(ID3D10RenderTargetView
*iface
,
615 REFIID riid
, void **object
)
617 TRACE("iface %p, riid %s, object %p\n", iface
, debugstr_guid(riid
), object
);
619 if (IsEqualGUID(riid
, &IID_ID3D10RenderTargetView
)
620 || IsEqualGUID(riid
, &IID_ID3D10View
)
621 || IsEqualGUID(riid
, &IID_ID3D10DeviceChild
)
622 || IsEqualGUID(riid
, &IID_IUnknown
))
624 IUnknown_AddRef(iface
);
629 WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid
));
632 return E_NOINTERFACE
;
635 static ULONG STDMETHODCALLTYPE
d3d10_rendertarget_view_AddRef(ID3D10RenderTargetView
*iface
)
637 struct d3d10_rendertarget_view
*This
= impl_from_ID3D10RenderTargetView(iface
);
638 ULONG refcount
= InterlockedIncrement(&This
->refcount
);
640 TRACE("%p increasing refcount to %u\n", This
, refcount
);
645 static ULONG STDMETHODCALLTYPE
d3d10_rendertarget_view_Release(ID3D10RenderTargetView
*iface
)
647 struct d3d10_rendertarget_view
*This
= impl_from_ID3D10RenderTargetView(iface
);
648 ULONG refcount
= InterlockedDecrement(&This
->refcount
);
650 TRACE("%p decreasing refcount to %u\n", This
, refcount
);
654 wined3d_rendertarget_view_decref(This
->wined3d_view
);
655 ID3D10Resource_Release(This
->resource
);
656 ID3D10Device1_Release(This
->device
);
657 wined3d_private_store_cleanup(&This
->private_store
);
658 HeapFree(GetProcessHeap(), 0, This
);
664 /* ID3D10DeviceChild methods */
666 static void STDMETHODCALLTYPE
d3d10_rendertarget_view_GetDevice(ID3D10RenderTargetView
*iface
, ID3D10Device
**device
)
668 struct d3d10_rendertarget_view
*view
= impl_from_ID3D10RenderTargetView(iface
);
670 TRACE("iface %p, device %p.\n", iface
, device
);
672 *device
= (ID3D10Device
*)view
->device
;
673 ID3D10Device_AddRef(*device
);
676 static HRESULT STDMETHODCALLTYPE
d3d10_rendertarget_view_GetPrivateData(ID3D10RenderTargetView
*iface
,
677 REFGUID guid
, UINT
*data_size
, void *data
)
679 struct d3d10_rendertarget_view
*view
= impl_from_ID3D10RenderTargetView(iface
);
681 TRACE("iface %p, guid %s, data_size %p, data %p.\n",
682 iface
, debugstr_guid(guid
), data_size
, data
);
684 return d3d10_get_private_data(&view
->private_store
, guid
, data_size
, data
);
687 static HRESULT STDMETHODCALLTYPE
d3d10_rendertarget_view_SetPrivateData(ID3D10RenderTargetView
*iface
,
688 REFGUID guid
, UINT data_size
, const void *data
)
690 struct d3d10_rendertarget_view
*view
= impl_from_ID3D10RenderTargetView(iface
);
692 TRACE("iface %p, guid %s, data_size %u, data %p.\n",
693 iface
, debugstr_guid(guid
), data_size
, data
);
695 return d3d10_set_private_data(&view
->private_store
, guid
, data_size
, data
);
698 static HRESULT STDMETHODCALLTYPE
d3d10_rendertarget_view_SetPrivateDataInterface(ID3D10RenderTargetView
*iface
,
699 REFGUID guid
, const IUnknown
*data
)
701 struct d3d10_rendertarget_view
*view
= impl_from_ID3D10RenderTargetView(iface
);
703 TRACE("iface %p, guid %s, data %p.\n", iface
, debugstr_guid(guid
), data
);
705 return d3d10_set_private_data_interface(&view
->private_store
, guid
, data
);
708 /* ID3D10View methods */
710 static void STDMETHODCALLTYPE
d3d10_rendertarget_view_GetResource(ID3D10RenderTargetView
*iface
,
711 ID3D10Resource
**resource
)
713 struct d3d10_rendertarget_view
*view
= impl_from_ID3D10RenderTargetView(iface
);
715 TRACE("iface %p, resource %p\n", iface
, resource
);
717 *resource
= view
->resource
;
718 ID3D10Resource_AddRef(*resource
);
721 /* ID3D10RenderTargetView methods */
723 static void STDMETHODCALLTYPE
d3d10_rendertarget_view_GetDesc(ID3D10RenderTargetView
*iface
,
724 D3D10_RENDER_TARGET_VIEW_DESC
*desc
)
726 struct d3d10_rendertarget_view
*This
= impl_from_ID3D10RenderTargetView(iface
);
728 TRACE("iface %p, desc %p\n", iface
, desc
);
733 static const struct ID3D10RenderTargetViewVtbl d3d10_rendertarget_view_vtbl
=
735 /* IUnknown methods */
736 d3d10_rendertarget_view_QueryInterface
,
737 d3d10_rendertarget_view_AddRef
,
738 d3d10_rendertarget_view_Release
,
739 /* ID3D10DeviceChild methods */
740 d3d10_rendertarget_view_GetDevice
,
741 d3d10_rendertarget_view_GetPrivateData
,
742 d3d10_rendertarget_view_SetPrivateData
,
743 d3d10_rendertarget_view_SetPrivateDataInterface
,
744 /* ID3D10View methods */
745 d3d10_rendertarget_view_GetResource
,
746 /* ID3D10RenderTargetView methods */
747 d3d10_rendertarget_view_GetDesc
,
750 static void wined3d_rendertarget_view_desc_from_d3d10core(struct wined3d_rendertarget_view_desc
*wined3d_desc
,
751 const D3D10_RENDER_TARGET_VIEW_DESC
*desc
)
753 wined3d_desc
->format_id
= wined3dformat_from_dxgi_format(desc
->Format
);
755 switch (desc
->ViewDimension
)
757 case D3D10_RTV_DIMENSION_BUFFER
:
758 wined3d_desc
->u
.buffer
.start_idx
= desc
->u
.Buffer
.ElementOffset
;
759 wined3d_desc
->u
.buffer
.count
= desc
->u
.Buffer
.ElementWidth
;
762 case D3D10_RTV_DIMENSION_TEXTURE1D
:
763 wined3d_desc
->u
.texture
.level_idx
= desc
->u
.Texture1D
.MipSlice
;
764 wined3d_desc
->u
.texture
.layer_idx
= 0;
765 wined3d_desc
->u
.texture
.layer_count
= 1;
768 case D3D10_RTV_DIMENSION_TEXTURE1DARRAY
:
769 wined3d_desc
->u
.texture
.level_idx
= desc
->u
.Texture1DArray
.MipSlice
;
770 wined3d_desc
->u
.texture
.layer_idx
= desc
->u
.Texture1DArray
.FirstArraySlice
;
771 wined3d_desc
->u
.texture
.layer_count
= desc
->u
.Texture1DArray
.ArraySize
;
774 case D3D10_RTV_DIMENSION_TEXTURE2D
:
775 wined3d_desc
->u
.texture
.level_idx
= desc
->u
.Texture2D
.MipSlice
;
776 wined3d_desc
->u
.texture
.layer_idx
= 0;
777 wined3d_desc
->u
.texture
.layer_count
= 1;
780 case D3D10_RTV_DIMENSION_TEXTURE2DARRAY
:
781 wined3d_desc
->u
.texture
.level_idx
= desc
->u
.Texture2DArray
.MipSlice
;
782 wined3d_desc
->u
.texture
.layer_idx
= desc
->u
.Texture2DArray
.FirstArraySlice
;
783 wined3d_desc
->u
.texture
.layer_count
= desc
->u
.Texture2DArray
.ArraySize
;
786 case D3D10_RTV_DIMENSION_TEXTURE2DMS
:
787 wined3d_desc
->u
.texture
.level_idx
= 0;
788 wined3d_desc
->u
.texture
.layer_idx
= 0;
789 wined3d_desc
->u
.texture
.layer_count
= 1;
792 case D3D10_RTV_DIMENSION_TEXTURE2DMSARRAY
:
793 wined3d_desc
->u
.texture
.level_idx
= 0;
794 wined3d_desc
->u
.texture
.layer_idx
= desc
->u
.Texture2DMSArray
.FirstArraySlice
;
795 wined3d_desc
->u
.texture
.layer_count
= desc
->u
.Texture2DMSArray
.ArraySize
;
798 case D3D10_RTV_DIMENSION_TEXTURE3D
:
799 wined3d_desc
->u
.texture
.level_idx
= desc
->u
.Texture3D
.MipSlice
;
800 wined3d_desc
->u
.texture
.layer_idx
= desc
->u
.Texture3D
.FirstWSlice
;
801 wined3d_desc
->u
.texture
.layer_count
= desc
->u
.Texture3D
.WSize
;
805 FIXME("Unhandled view dimension %#x.\n", desc
->ViewDimension
);
806 wined3d_desc
->u
.texture
.level_idx
= 0;
807 wined3d_desc
->u
.texture
.layer_idx
= 0;
808 wined3d_desc
->u
.texture
.layer_count
= 1;
813 HRESULT
d3d10_rendertarget_view_init(struct d3d10_rendertarget_view
*view
, struct d3d10_device
*device
,
814 ID3D10Resource
*resource
, const D3D10_RENDER_TARGET_VIEW_DESC
*desc
)
816 struct wined3d_rendertarget_view_desc wined3d_desc
;
817 struct wined3d_resource
*wined3d_resource
;
820 view
->ID3D10RenderTargetView_iface
.lpVtbl
= &d3d10_rendertarget_view_vtbl
;
825 HRESULT hr
= set_rtdesc_from_resource(&view
->desc
, resource
);
826 if (FAILED(hr
)) return hr
;
833 wined3d_resource
= wined3d_resource_from_resource(resource
);
834 if (!wined3d_resource
)
836 ERR("Failed to get wined3d resource for d3d10 resource %p.\n", resource
);
840 wined3d_rendertarget_view_desc_from_d3d10core(&wined3d_desc
, &view
->desc
);
841 if (FAILED(hr
= wined3d_rendertarget_view_create(&wined3d_desc
, wined3d_resource
,
842 view
, &d3d10_null_wined3d_parent_ops
, &view
->wined3d_view
)))
844 WARN("Failed to create a wined3d rendertarget view, hr %#x.\n", hr
);
848 wined3d_private_store_init(&view
->private_store
);
849 view
->resource
= resource
;
850 ID3D10Resource_AddRef(resource
);
851 view
->device
= &device
->ID3D10Device1_iface
;
852 ID3D10Device1_AddRef(view
->device
);
857 struct d3d10_rendertarget_view
*unsafe_impl_from_ID3D10RenderTargetView(ID3D10RenderTargetView
*iface
)
861 assert(iface
->lpVtbl
== &d3d10_rendertarget_view_vtbl
);
863 return impl_from_ID3D10RenderTargetView(iface
);
866 static inline struct d3d10_shader_resource_view
*impl_from_ID3D10ShaderResourceView(ID3D10ShaderResourceView
*iface
)
868 return CONTAINING_RECORD(iface
, struct d3d10_shader_resource_view
, ID3D10ShaderResourceView_iface
);
871 /* IUnknown methods */
873 static HRESULT STDMETHODCALLTYPE
d3d10_shader_resource_view_QueryInterface(ID3D10ShaderResourceView
*iface
,
874 REFIID riid
, void **object
)
876 TRACE("iface %p, riid %s, object %p.\n", iface
, debugstr_guid(riid
), object
);
878 if (IsEqualGUID(riid
, &IID_ID3D10ShaderResourceView
)
879 || IsEqualGUID(riid
, &IID_ID3D10View
)
880 || IsEqualGUID(riid
, &IID_ID3D10DeviceChild
)
881 || IsEqualGUID(riid
, &IID_IUnknown
))
883 IUnknown_AddRef(iface
);
888 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
891 return E_NOINTERFACE
;
894 static ULONG STDMETHODCALLTYPE
d3d10_shader_resource_view_AddRef(ID3D10ShaderResourceView
*iface
)
896 struct d3d10_shader_resource_view
*This
= impl_from_ID3D10ShaderResourceView(iface
);
897 ULONG refcount
= InterlockedIncrement(&This
->refcount
);
899 TRACE("%p increasing refcount to %u.\n", This
, refcount
);
904 static ULONG STDMETHODCALLTYPE
d3d10_shader_resource_view_Release(ID3D10ShaderResourceView
*iface
)
906 struct d3d10_shader_resource_view
*This
= impl_from_ID3D10ShaderResourceView(iface
);
907 ULONG refcount
= InterlockedDecrement(&This
->refcount
);
909 TRACE("%p decreasing refcount to %u.\n", This
, refcount
);
913 wined3d_shader_resource_view_decref(This
->wined3d_view
);
914 ID3D10Resource_Release(This
->resource
);
915 ID3D10Device1_Release(This
->device
);
916 wined3d_private_store_cleanup(&This
->private_store
);
917 HeapFree(GetProcessHeap(), 0, This
);
923 /* ID3D10DeviceChild methods */
925 static void STDMETHODCALLTYPE
d3d10_shader_resource_view_GetDevice(ID3D10ShaderResourceView
*iface
,
926 ID3D10Device
**device
)
928 struct d3d10_shader_resource_view
*view
= impl_from_ID3D10ShaderResourceView(iface
);
930 TRACE("iface %p, device %p.\n", iface
, device
);
932 *device
= (ID3D10Device
*)view
->device
;
933 ID3D10Device_AddRef(*device
);
936 static HRESULT STDMETHODCALLTYPE
d3d10_shader_resource_view_GetPrivateData(ID3D10ShaderResourceView
*iface
,
937 REFGUID guid
, UINT
*data_size
, void *data
)
939 struct d3d10_shader_resource_view
*view
= impl_from_ID3D10ShaderResourceView(iface
);
941 TRACE("iface %p, guid %s, data_size %p, data %p.\n",
942 iface
, debugstr_guid(guid
), data_size
, data
);
944 return d3d10_get_private_data(&view
->private_store
, guid
, data_size
, data
);
947 static HRESULT STDMETHODCALLTYPE
d3d10_shader_resource_view_SetPrivateData(ID3D10ShaderResourceView
*iface
,
948 REFGUID guid
, UINT data_size
, const void *data
)
950 struct d3d10_shader_resource_view
*view
= impl_from_ID3D10ShaderResourceView(iface
);
952 TRACE("iface %p, guid %s, data_size %u, data %p.\n",
953 iface
, debugstr_guid(guid
), data_size
, data
);
955 return d3d10_set_private_data(&view
->private_store
, guid
, data_size
, data
);
958 static HRESULT STDMETHODCALLTYPE
d3d10_shader_resource_view_SetPrivateDataInterface(ID3D10ShaderResourceView
*iface
,
959 REFGUID guid
, const IUnknown
*data
)
961 struct d3d10_shader_resource_view
*view
= impl_from_ID3D10ShaderResourceView(iface
);
963 TRACE("iface %p, guid %s, data %p.\n", iface
, debugstr_guid(guid
), data
);
965 return d3d10_set_private_data_interface(&view
->private_store
, guid
, data
);
968 /* ID3D10View methods */
970 static void STDMETHODCALLTYPE
d3d10_shader_resource_view_GetResource(ID3D10ShaderResourceView
*iface
,
971 ID3D10Resource
**resource
)
973 struct d3d10_shader_resource_view
*view
= impl_from_ID3D10ShaderResourceView(iface
);
975 TRACE("iface %p, resource %p.\n", iface
, resource
);
977 *resource
= view
->resource
;
978 ID3D10Resource_AddRef(*resource
);
981 /* ID3D10ShaderResourceView methods */
983 static void STDMETHODCALLTYPE
d3d10_shader_resource_view_GetDesc(ID3D10ShaderResourceView
*iface
,
984 D3D10_SHADER_RESOURCE_VIEW_DESC
*desc
)
986 struct d3d10_shader_resource_view
*view
= impl_from_ID3D10ShaderResourceView(iface
);
988 TRACE("iface %p, desc %p.\n", iface
, desc
);
993 static const struct ID3D10ShaderResourceViewVtbl d3d10_shader_resource_view_vtbl
=
995 /* IUnknown methods */
996 d3d10_shader_resource_view_QueryInterface
,
997 d3d10_shader_resource_view_AddRef
,
998 d3d10_shader_resource_view_Release
,
999 /* ID3D10DeviceChild methods */
1000 d3d10_shader_resource_view_GetDevice
,
1001 d3d10_shader_resource_view_GetPrivateData
,
1002 d3d10_shader_resource_view_SetPrivateData
,
1003 d3d10_shader_resource_view_SetPrivateDataInterface
,
1004 /* ID3D10View methods */
1005 d3d10_shader_resource_view_GetResource
,
1006 /* ID3D10ShaderResourceView methods */
1007 d3d10_shader_resource_view_GetDesc
,
1010 HRESULT
d3d10_shader_resource_view_init(struct d3d10_shader_resource_view
*view
, struct d3d10_device
*device
,
1011 ID3D10Resource
*resource
, const D3D10_SHADER_RESOURCE_VIEW_DESC
*desc
)
1013 struct wined3d_resource
*wined3d_resource
;
1016 view
->ID3D10ShaderResourceView_iface
.lpVtbl
= &d3d10_shader_resource_view_vtbl
;
1021 if (FAILED(hr
= set_srdesc_from_resource(&view
->desc
, resource
)))
1029 if (!(wined3d_resource
= wined3d_resource_from_resource(resource
)))
1031 ERR("Failed to get wined3d resource for d3d10 resource %p.\n", resource
);
1035 if (FAILED(hr
= wined3d_shader_resource_view_create(wined3d_resource
,
1036 view
, &d3d10_null_wined3d_parent_ops
, &view
->wined3d_view
)))
1038 WARN("Failed to create wined3d shader resource view, hr %#x.\n", hr
);
1042 wined3d_private_store_init(&view
->private_store
);
1043 view
->resource
= resource
;
1044 ID3D10Resource_AddRef(resource
);
1045 view
->device
= &device
->ID3D10Device1_iface
;
1046 ID3D10Device1_AddRef(view
->device
);
1051 struct d3d10_shader_resource_view
*unsafe_impl_from_ID3D10ShaderResourceView(ID3D10ShaderResourceView
*iface
)
1055 assert(iface
->lpVtbl
== &d3d10_shader_resource_view_vtbl
);
1056 return CONTAINING_RECORD(iface
, struct d3d10_shader_resource_view
, ID3D10ShaderResourceView_iface
);