d3d8: Get rid of the format switching code in d3d8_device_CopyRects().
[wine.git] / dlls / d3d10core / view.c
blob5c021313ed7d23c11c2a6b77176856e433f4e132
1 /*
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
20 #include "config.h"
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);
34 switch (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");
44 return E_INVALIDARG;
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;
56 else
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;
64 return S_OK;
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");
75 return E_INVALIDARG;
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;
89 else
91 desc->ViewDimension = D3D10_DSV_DIMENSION_TEXTURE2DMS;
94 else
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;
103 else
105 desc->ViewDimension = D3D10_DSV_DIMENSION_TEXTURE2DMSARRAY;
106 desc->u.Texture2DMSArray.FirstArraySlice = 0;
107 desc->u.Texture2DMSArray.ArraySize = 1;
111 return S_OK;
114 default:
115 FIXME("Unhandled resource dimension %#x.\n", dimension);
116 case D3D10_RESOURCE_DIMENSION_BUFFER:
117 case D3D10_RESOURCE_DIMENSION_TEXTURE3D:
118 return E_INVALIDARG;
122 static HRESULT set_rtdesc_from_resource(D3D10_RENDER_TARGET_VIEW_DESC *desc, ID3D10Resource *resource)
124 D3D10_RESOURCE_DIMENSION dimension;
125 HRESULT hr;
127 ID3D10Resource_GetType(resource, &dimension);
129 switch(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);
137 if (FAILED(hr))
139 ERR("Resource of type TEXTURE1D doesn't implement ID3D10Texture1D?\n");
140 return E_INVALIDARG;
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;
152 else
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;
160 return S_OK;
163 case D3D10_RESOURCE_DIMENSION_TEXTURE2D:
165 ID3D10Texture2D *texture;
166 D3D10_TEXTURE2D_DESC texture_desc;
168 hr = ID3D10Resource_QueryInterface(resource, &IID_ID3D10Texture2D, (void **)&texture);
169 if (FAILED(hr))
171 ERR("Resource of type TEXTURE2D doesn't implement ID3D10Texture2D?\n");
172 return E_INVALIDARG;
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;
186 else
188 desc->ViewDimension = D3D10_RTV_DIMENSION_TEXTURE2DMS;
191 else
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;
200 else
202 desc->ViewDimension = D3D10_RTV_DIMENSION_TEXTURE2DMSARRAY;
203 desc->u.Texture2DMSArray.FirstArraySlice = 0;
204 desc->u.Texture2DMSArray.ArraySize = 1;
208 return S_OK;
211 case D3D10_RESOURCE_DIMENSION_TEXTURE3D:
213 ID3D10Texture3D *texture;
214 D3D10_TEXTURE3D_DESC texture_desc;
216 hr = ID3D10Resource_QueryInterface(resource, &IID_ID3D10Texture3D, (void **)&texture);
217 if (FAILED(hr))
219 ERR("Resource of type TEXTURE3D doesn't implement ID3D10Texture3D?\n");
220 return E_INVALIDARG;
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;
232 return S_OK;
235 default:
236 FIXME("Unhandled resource dimension %#x.\n", dimension);
237 return E_INVALIDARG;
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);
247 switch (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");
257 return E_INVALIDARG;
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;
270 else
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;
279 return S_OK;
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");
290 return E_INVALIDARG;
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;
305 else
307 desc->ViewDimension = D3D10_SRV_DIMENSION_TEXTURE2DMS;
310 else
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;
320 else
322 desc->ViewDimension = D3D10_SRV_DIMENSION_TEXTURE2DMSARRAY;
323 desc->u.Texture2DMSArray.FirstArraySlice = 0;
324 desc->u.Texture2DMSArray.ArraySize = texture_desc.ArraySize;
328 return S_OK;
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");
339 return E_INVALIDARG;
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;
350 return S_OK;
353 default:
354 FIXME("Unhandled resource dimension %#x.\n", dimension);
355 case D3D10_RESOURCE_DIMENSION_BUFFER:
356 return E_INVALIDARG;
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);
378 *object = iface;
379 return S_OK;
382 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
384 *object = NULL;
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);
395 return 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);
405 if (!refcount)
407 wined3d_rendertarget_view_decref(This->wined3d_view);
408 ID3D10Resource_Release(This->resource);
409 ID3D10Device1_Release(This->device);
410 HeapFree(GetProcessHeap(), 0, This);
413 return refcount;
416 /* ID3D10DeviceChild methods */
418 static void STDMETHODCALLTYPE d3d10_depthstencil_view_GetDevice(ID3D10DepthStencilView *iface, ID3D10Device **device)
420 struct d3d10_depthstencil_view *view = impl_from_ID3D10DepthStencilView(iface);
422 TRACE("iface %p, device %p.\n", iface, device);
424 *device = (ID3D10Device *)view->device;
425 ID3D10Device_AddRef(*device);
428 static HRESULT STDMETHODCALLTYPE d3d10_depthstencil_view_GetPrivateData(ID3D10DepthStencilView *iface,
429 REFGUID guid, UINT *data_size, void *data)
431 FIXME("iface %p, guid %s, data_size %p, data %p stub!\n",
432 iface, debugstr_guid(guid), data_size, data);
434 return E_NOTIMPL;
437 static HRESULT STDMETHODCALLTYPE d3d10_depthstencil_view_SetPrivateData(ID3D10DepthStencilView *iface,
438 REFGUID guid, UINT data_size, const void *data)
440 FIXME("iface %p, guid %s, data_size %u, data %p stub!\n",
441 iface, debugstr_guid(guid), data_size, data);
443 return E_NOTIMPL;
446 static HRESULT STDMETHODCALLTYPE d3d10_depthstencil_view_SetPrivateDataInterface(ID3D10DepthStencilView *iface,
447 REFGUID guid, const IUnknown *data)
449 FIXME("iface %p, guid %s, data %p stub!\n", iface, debugstr_guid(guid), data);
451 return E_NOTIMPL;
454 /* ID3D10View methods */
456 static void STDMETHODCALLTYPE d3d10_depthstencil_view_GetResource(ID3D10DepthStencilView *iface,
457 ID3D10Resource **resource)
459 struct d3d10_depthstencil_view *view = impl_from_ID3D10DepthStencilView(iface);
461 TRACE("iface %p, resource %p.\n", iface, resource);
463 *resource = view->resource;
464 ID3D10Resource_AddRef(*resource);
467 /* ID3D10DepthStencilView methods */
469 static void STDMETHODCALLTYPE d3d10_depthstencil_view_GetDesc(ID3D10DepthStencilView *iface,
470 D3D10_DEPTH_STENCIL_VIEW_DESC *desc)
472 struct d3d10_depthstencil_view *view = impl_from_ID3D10DepthStencilView(iface);
474 TRACE("iface %p, desc %p.\n", iface, desc);
476 *desc = view->desc;
479 static const struct ID3D10DepthStencilViewVtbl d3d10_depthstencil_view_vtbl =
481 /* IUnknown methods */
482 d3d10_depthstencil_view_QueryInterface,
483 d3d10_depthstencil_view_AddRef,
484 d3d10_depthstencil_view_Release,
485 /* ID3D10DeviceChild methods */
486 d3d10_depthstencil_view_GetDevice,
487 d3d10_depthstencil_view_GetPrivateData,
488 d3d10_depthstencil_view_SetPrivateData,
489 d3d10_depthstencil_view_SetPrivateDataInterface,
490 /* ID3D10View methods */
491 d3d10_depthstencil_view_GetResource,
492 /* ID3D10DepthStencilView methods */
493 d3d10_depthstencil_view_GetDesc,
496 static void wined3d_depth_stencil_view_desc_from_d3d10core(struct wined3d_rendertarget_view_desc *wined3d_desc,
497 const D3D10_DEPTH_STENCIL_VIEW_DESC *desc)
499 wined3d_desc->format_id = wined3dformat_from_dxgi_format(desc->Format);
501 switch (desc->ViewDimension)
503 case D3D10_DSV_DIMENSION_TEXTURE1D:
504 wined3d_desc->u.texture.level_idx = desc->u.Texture1D.MipSlice;
505 wined3d_desc->u.texture.layer_idx = 0;
506 wined3d_desc->u.texture.layer_count = 1;
507 break;
509 case D3D10_DSV_DIMENSION_TEXTURE1DARRAY:
510 wined3d_desc->u.texture.level_idx = desc->u.Texture1DArray.MipSlice;
511 wined3d_desc->u.texture.layer_idx = desc->u.Texture1DArray.FirstArraySlice;
512 wined3d_desc->u.texture.layer_count = desc->u.Texture1DArray.ArraySize;
513 break;
515 case D3D10_DSV_DIMENSION_TEXTURE2D:
516 wined3d_desc->u.texture.level_idx = desc->u.Texture2D.MipSlice;
517 wined3d_desc->u.texture.layer_idx = 0;
518 wined3d_desc->u.texture.layer_count = 1;
519 break;
521 case D3D10_DSV_DIMENSION_TEXTURE2DARRAY:
522 wined3d_desc->u.texture.level_idx = desc->u.Texture2DArray.MipSlice;
523 wined3d_desc->u.texture.layer_idx = desc->u.Texture2DArray.FirstArraySlice;
524 wined3d_desc->u.texture.layer_count = desc->u.Texture2DArray.ArraySize;
525 break;
527 case D3D10_DSV_DIMENSION_TEXTURE2DMS:
528 wined3d_desc->u.texture.level_idx = 0;
529 wined3d_desc->u.texture.layer_idx = 0;
530 wined3d_desc->u.texture.layer_count = 1;
531 break;
533 case D3D10_DSV_DIMENSION_TEXTURE2DMSARRAY:
534 wined3d_desc->u.texture.level_idx = 0;
535 wined3d_desc->u.texture.layer_idx = desc->u.Texture2DMSArray.FirstArraySlice;
536 wined3d_desc->u.texture.layer_count = desc->u.Texture2DMSArray.ArraySize;
537 break;
539 default:
540 FIXME("Unhandled view dimension %#x.\n", desc->ViewDimension);
541 wined3d_desc->u.texture.level_idx = 0;
542 wined3d_desc->u.texture.layer_idx = 0;
543 wined3d_desc->u.texture.layer_count = 1;
544 break;
548 HRESULT d3d10_depthstencil_view_init(struct d3d10_depthstencil_view *view, struct d3d10_device *device,
549 ID3D10Resource *resource, const D3D10_DEPTH_STENCIL_VIEW_DESC *desc)
551 struct wined3d_rendertarget_view_desc wined3d_desc;
552 struct wined3d_resource *wined3d_resource;
553 HRESULT hr;
555 view->ID3D10DepthStencilView_iface.lpVtbl = &d3d10_depthstencil_view_vtbl;
556 view->refcount = 1;
558 if (!desc)
560 if (FAILED(hr = set_dsdesc_from_resource(&view->desc, resource)))
561 return hr;
563 else
565 view->desc = *desc;
568 if (!(wined3d_resource = wined3d_resource_from_resource(resource)))
570 ERR("Failed to get wined3d resource for d3d10 resource %p.\n", resource);
571 return E_FAIL;
574 wined3d_depth_stencil_view_desc_from_d3d10core(&wined3d_desc, &view->desc);
575 if (FAILED(hr = wined3d_rendertarget_view_create(&wined3d_desc, wined3d_resource,
576 view, &d3d10_null_wined3d_parent_ops, &view->wined3d_view)))
578 WARN("Failed to create a wined3d rendertarget view, hr %#x.\n", hr);
579 return hr;
582 view->resource = resource;
583 ID3D10Resource_AddRef(resource);
584 view->device = &device->ID3D10Device1_iface;
585 ID3D10Device1_AddRef(view->device);
587 return S_OK;
590 struct d3d10_depthstencil_view *unsafe_impl_from_ID3D10DepthStencilView(ID3D10DepthStencilView *iface)
592 if (!iface)
593 return NULL;
594 assert(iface->lpVtbl == &d3d10_depthstencil_view_vtbl);
596 return impl_from_ID3D10DepthStencilView(iface);
599 static inline struct d3d10_rendertarget_view *impl_from_ID3D10RenderTargetView(ID3D10RenderTargetView *iface)
601 return CONTAINING_RECORD(iface, struct d3d10_rendertarget_view, ID3D10RenderTargetView_iface);
604 /* IUnknown methods */
606 static HRESULT STDMETHODCALLTYPE d3d10_rendertarget_view_QueryInterface(ID3D10RenderTargetView *iface,
607 REFIID riid, void **object)
609 TRACE("iface %p, riid %s, object %p\n", iface, debugstr_guid(riid), object);
611 if (IsEqualGUID(riid, &IID_ID3D10RenderTargetView)
612 || IsEqualGUID(riid, &IID_ID3D10View)
613 || IsEqualGUID(riid, &IID_ID3D10DeviceChild)
614 || IsEqualGUID(riid, &IID_IUnknown))
616 IUnknown_AddRef(iface);
617 *object = iface;
618 return S_OK;
621 WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid));
623 *object = NULL;
624 return E_NOINTERFACE;
627 static ULONG STDMETHODCALLTYPE d3d10_rendertarget_view_AddRef(ID3D10RenderTargetView *iface)
629 struct d3d10_rendertarget_view *This = impl_from_ID3D10RenderTargetView(iface);
630 ULONG refcount = InterlockedIncrement(&This->refcount);
632 TRACE("%p increasing refcount to %u\n", This, refcount);
634 return refcount;
637 static ULONG STDMETHODCALLTYPE d3d10_rendertarget_view_Release(ID3D10RenderTargetView *iface)
639 struct d3d10_rendertarget_view *This = impl_from_ID3D10RenderTargetView(iface);
640 ULONG refcount = InterlockedDecrement(&This->refcount);
642 TRACE("%p decreasing refcount to %u\n", This, refcount);
644 if (!refcount)
646 wined3d_rendertarget_view_decref(This->wined3d_view);
647 ID3D10Resource_Release(This->resource);
648 ID3D10Device1_Release(This->device);
649 HeapFree(GetProcessHeap(), 0, This);
652 return refcount;
655 /* ID3D10DeviceChild methods */
657 static void STDMETHODCALLTYPE d3d10_rendertarget_view_GetDevice(ID3D10RenderTargetView *iface, ID3D10Device **device)
659 struct d3d10_rendertarget_view *view = impl_from_ID3D10RenderTargetView(iface);
661 TRACE("iface %p, device %p.\n", iface, device);
663 *device = (ID3D10Device *)view->device;
664 ID3D10Device_AddRef(*device);
667 static HRESULT STDMETHODCALLTYPE d3d10_rendertarget_view_GetPrivateData(ID3D10RenderTargetView *iface,
668 REFGUID guid, UINT *data_size, void *data)
670 FIXME("iface %p, guid %s, data_size %p, data %p stub!\n",
671 iface, debugstr_guid(guid), data_size, data);
673 return E_NOTIMPL;
676 static HRESULT STDMETHODCALLTYPE d3d10_rendertarget_view_SetPrivateData(ID3D10RenderTargetView *iface,
677 REFGUID guid, UINT data_size, const void *data)
679 FIXME("iface %p, guid %s, data_size %u, data %p stub!\n",
680 iface, debugstr_guid(guid), data_size, data);
682 return E_NOTIMPL;
685 static HRESULT STDMETHODCALLTYPE d3d10_rendertarget_view_SetPrivateDataInterface(ID3D10RenderTargetView *iface,
686 REFGUID guid, const IUnknown *data)
688 FIXME("iface %p, guid %s, data %p stub!\n", iface, debugstr_guid(guid), data);
690 return E_NOTIMPL;
693 /* ID3D10View methods */
695 static void STDMETHODCALLTYPE d3d10_rendertarget_view_GetResource(ID3D10RenderTargetView *iface,
696 ID3D10Resource **resource)
698 struct d3d10_rendertarget_view *view = impl_from_ID3D10RenderTargetView(iface);
700 TRACE("iface %p, resource %p\n", iface, resource);
702 *resource = view->resource;
703 ID3D10Resource_AddRef(*resource);
706 /* ID3D10RenderTargetView methods */
708 static void STDMETHODCALLTYPE d3d10_rendertarget_view_GetDesc(ID3D10RenderTargetView *iface,
709 D3D10_RENDER_TARGET_VIEW_DESC *desc)
711 struct d3d10_rendertarget_view *This = impl_from_ID3D10RenderTargetView(iface);
713 TRACE("iface %p, desc %p\n", iface, desc);
715 *desc = This->desc;
718 static const struct ID3D10RenderTargetViewVtbl d3d10_rendertarget_view_vtbl =
720 /* IUnknown methods */
721 d3d10_rendertarget_view_QueryInterface,
722 d3d10_rendertarget_view_AddRef,
723 d3d10_rendertarget_view_Release,
724 /* ID3D10DeviceChild methods */
725 d3d10_rendertarget_view_GetDevice,
726 d3d10_rendertarget_view_GetPrivateData,
727 d3d10_rendertarget_view_SetPrivateData,
728 d3d10_rendertarget_view_SetPrivateDataInterface,
729 /* ID3D10View methods */
730 d3d10_rendertarget_view_GetResource,
731 /* ID3D10RenderTargetView methods */
732 d3d10_rendertarget_view_GetDesc,
735 static void wined3d_rendertarget_view_desc_from_d3d10core(struct wined3d_rendertarget_view_desc *wined3d_desc,
736 const D3D10_RENDER_TARGET_VIEW_DESC *desc)
738 wined3d_desc->format_id = wined3dformat_from_dxgi_format(desc->Format);
740 switch (desc->ViewDimension)
742 case D3D10_RTV_DIMENSION_BUFFER:
743 wined3d_desc->u.buffer.start_idx = desc->u.Buffer.ElementOffset;
744 wined3d_desc->u.buffer.count = desc->u.Buffer.ElementWidth;
745 break;
747 case D3D10_RTV_DIMENSION_TEXTURE1D:
748 wined3d_desc->u.texture.level_idx = desc->u.Texture1D.MipSlice;
749 wined3d_desc->u.texture.layer_idx = 0;
750 wined3d_desc->u.texture.layer_count = 1;
751 break;
753 case D3D10_RTV_DIMENSION_TEXTURE1DARRAY:
754 wined3d_desc->u.texture.level_idx = desc->u.Texture1DArray.MipSlice;
755 wined3d_desc->u.texture.layer_idx = desc->u.Texture1DArray.FirstArraySlice;
756 wined3d_desc->u.texture.layer_count = desc->u.Texture1DArray.ArraySize;
757 break;
759 case D3D10_RTV_DIMENSION_TEXTURE2D:
760 wined3d_desc->u.texture.level_idx = desc->u.Texture2D.MipSlice;
761 wined3d_desc->u.texture.layer_idx = 0;
762 wined3d_desc->u.texture.layer_count = 1;
763 break;
765 case D3D10_RTV_DIMENSION_TEXTURE2DARRAY:
766 wined3d_desc->u.texture.level_idx = desc->u.Texture2DArray.MipSlice;
767 wined3d_desc->u.texture.layer_idx = desc->u.Texture2DArray.FirstArraySlice;
768 wined3d_desc->u.texture.layer_count = desc->u.Texture2DArray.ArraySize;
769 break;
771 case D3D10_RTV_DIMENSION_TEXTURE2DMS:
772 wined3d_desc->u.texture.level_idx = 0;
773 wined3d_desc->u.texture.layer_idx = 0;
774 wined3d_desc->u.texture.layer_count = 1;
775 break;
777 case D3D10_RTV_DIMENSION_TEXTURE2DMSARRAY:
778 wined3d_desc->u.texture.level_idx = 0;
779 wined3d_desc->u.texture.layer_idx = desc->u.Texture2DMSArray.FirstArraySlice;
780 wined3d_desc->u.texture.layer_count = desc->u.Texture2DMSArray.ArraySize;
781 break;
783 case D3D10_RTV_DIMENSION_TEXTURE3D:
784 wined3d_desc->u.texture.level_idx = desc->u.Texture3D.MipSlice;
785 wined3d_desc->u.texture.layer_idx = desc->u.Texture3D.FirstWSlice;
786 wined3d_desc->u.texture.layer_count = desc->u.Texture3D.WSize;
787 break;
789 default:
790 FIXME("Unhandled view dimension %#x.\n", desc->ViewDimension);
791 wined3d_desc->u.texture.level_idx = 0;
792 wined3d_desc->u.texture.layer_idx = 0;
793 wined3d_desc->u.texture.layer_count = 1;
794 break;
798 HRESULT d3d10_rendertarget_view_init(struct d3d10_rendertarget_view *view, struct d3d10_device *device,
799 ID3D10Resource *resource, const D3D10_RENDER_TARGET_VIEW_DESC *desc)
801 struct wined3d_rendertarget_view_desc wined3d_desc;
802 struct wined3d_resource *wined3d_resource;
803 HRESULT hr;
805 view->ID3D10RenderTargetView_iface.lpVtbl = &d3d10_rendertarget_view_vtbl;
806 view->refcount = 1;
808 if (!desc)
810 HRESULT hr = set_rtdesc_from_resource(&view->desc, resource);
811 if (FAILED(hr)) return hr;
813 else
815 view->desc = *desc;
818 wined3d_resource = wined3d_resource_from_resource(resource);
819 if (!wined3d_resource)
821 ERR("Failed to get wined3d resource for d3d10 resource %p.\n", resource);
822 return E_FAIL;
825 wined3d_rendertarget_view_desc_from_d3d10core(&wined3d_desc, &view->desc);
826 if (FAILED(hr = wined3d_rendertarget_view_create(&wined3d_desc, wined3d_resource,
827 view, &d3d10_null_wined3d_parent_ops, &view->wined3d_view)))
829 WARN("Failed to create a wined3d rendertarget view, hr %#x.\n", hr);
830 return hr;
833 view->resource = resource;
834 ID3D10Resource_AddRef(resource);
835 view->device = &device->ID3D10Device1_iface;
836 ID3D10Device1_AddRef(view->device);
838 return S_OK;
841 struct d3d10_rendertarget_view *unsafe_impl_from_ID3D10RenderTargetView(ID3D10RenderTargetView *iface)
843 if (!iface)
844 return NULL;
845 assert(iface->lpVtbl == &d3d10_rendertarget_view_vtbl);
847 return impl_from_ID3D10RenderTargetView(iface);
850 static inline struct d3d10_shader_resource_view *impl_from_ID3D10ShaderResourceView(ID3D10ShaderResourceView *iface)
852 return CONTAINING_RECORD(iface, struct d3d10_shader_resource_view, ID3D10ShaderResourceView_iface);
855 /* IUnknown methods */
857 static HRESULT STDMETHODCALLTYPE d3d10_shader_resource_view_QueryInterface(ID3D10ShaderResourceView *iface,
858 REFIID riid, void **object)
860 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
862 if (IsEqualGUID(riid, &IID_ID3D10ShaderResourceView)
863 || IsEqualGUID(riid, &IID_ID3D10View)
864 || IsEqualGUID(riid, &IID_ID3D10DeviceChild)
865 || IsEqualGUID(riid, &IID_IUnknown))
867 IUnknown_AddRef(iface);
868 *object = iface;
869 return S_OK;
872 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
874 *object = NULL;
875 return E_NOINTERFACE;
878 static ULONG STDMETHODCALLTYPE d3d10_shader_resource_view_AddRef(ID3D10ShaderResourceView *iface)
880 struct d3d10_shader_resource_view *This = impl_from_ID3D10ShaderResourceView(iface);
881 ULONG refcount = InterlockedIncrement(&This->refcount);
883 TRACE("%p increasing refcount to %u.\n", This, refcount);
885 return refcount;
888 static ULONG STDMETHODCALLTYPE d3d10_shader_resource_view_Release(ID3D10ShaderResourceView *iface)
890 struct d3d10_shader_resource_view *This = impl_from_ID3D10ShaderResourceView(iface);
891 ULONG refcount = InterlockedDecrement(&This->refcount);
893 TRACE("%p decreasing refcount to %u.\n", This, refcount);
895 if (!refcount)
897 wined3d_shader_resource_view_decref(This->wined3d_view);
898 ID3D10Resource_Release(This->resource);
899 ID3D10Device1_Release(This->device);
900 HeapFree(GetProcessHeap(), 0, This);
903 return refcount;
906 /* ID3D10DeviceChild methods */
908 static void STDMETHODCALLTYPE d3d10_shader_resource_view_GetDevice(ID3D10ShaderResourceView *iface,
909 ID3D10Device **device)
911 struct d3d10_shader_resource_view *view = impl_from_ID3D10ShaderResourceView(iface);
913 TRACE("iface %p, device %p.\n", iface, device);
915 *device = (ID3D10Device *)view->device;
916 ID3D10Device_AddRef(*device);
919 static HRESULT STDMETHODCALLTYPE d3d10_shader_resource_view_GetPrivateData(ID3D10ShaderResourceView *iface,
920 REFGUID guid, UINT *data_size, void *data)
922 FIXME("iface %p, guid %s, data_size %p, data %p stub!\n",
923 iface, debugstr_guid(guid), data_size, data);
925 return E_NOTIMPL;
928 static HRESULT STDMETHODCALLTYPE d3d10_shader_resource_view_SetPrivateData(ID3D10ShaderResourceView *iface,
929 REFGUID guid, UINT data_size, const void *data)
931 FIXME("iface %p, guid %s, data_size %u, data %p stub!\n",
932 iface, debugstr_guid(guid), data_size, data);
934 return E_NOTIMPL;
937 static HRESULT STDMETHODCALLTYPE d3d10_shader_resource_view_SetPrivateDataInterface(ID3D10ShaderResourceView *iface,
938 REFGUID guid, const IUnknown *data)
940 FIXME("iface %p, guid %s, data %p stub!\n", iface, debugstr_guid(guid), data);
942 return E_NOTIMPL;
945 /* ID3D10View methods */
947 static void STDMETHODCALLTYPE d3d10_shader_resource_view_GetResource(ID3D10ShaderResourceView *iface,
948 ID3D10Resource **resource)
950 struct d3d10_shader_resource_view *view = impl_from_ID3D10ShaderResourceView(iface);
952 TRACE("iface %p, resource %p.\n", iface, resource);
954 *resource = view->resource;
955 ID3D10Resource_AddRef(*resource);
958 /* ID3D10ShaderResourceView methods */
960 static void STDMETHODCALLTYPE d3d10_shader_resource_view_GetDesc(ID3D10ShaderResourceView *iface,
961 D3D10_SHADER_RESOURCE_VIEW_DESC *desc)
963 struct d3d10_shader_resource_view *view = impl_from_ID3D10ShaderResourceView(iface);
965 TRACE("iface %p, desc %p.\n", iface, desc);
967 *desc = view->desc;
970 static const struct ID3D10ShaderResourceViewVtbl d3d10_shader_resource_view_vtbl =
972 /* IUnknown methods */
973 d3d10_shader_resource_view_QueryInterface,
974 d3d10_shader_resource_view_AddRef,
975 d3d10_shader_resource_view_Release,
976 /* ID3D10DeviceChild methods */
977 d3d10_shader_resource_view_GetDevice,
978 d3d10_shader_resource_view_GetPrivateData,
979 d3d10_shader_resource_view_SetPrivateData,
980 d3d10_shader_resource_view_SetPrivateDataInterface,
981 /* ID3D10View methods */
982 d3d10_shader_resource_view_GetResource,
983 /* ID3D10ShaderResourceView methods */
984 d3d10_shader_resource_view_GetDesc,
987 HRESULT d3d10_shader_resource_view_init(struct d3d10_shader_resource_view *view, struct d3d10_device *device,
988 ID3D10Resource *resource, const D3D10_SHADER_RESOURCE_VIEW_DESC *desc)
990 HRESULT hr;
992 view->ID3D10ShaderResourceView_iface.lpVtbl = &d3d10_shader_resource_view_vtbl;
993 view->refcount = 1;
995 if (!desc)
997 if (FAILED(hr = set_srdesc_from_resource(&view->desc, resource)))
998 return hr;
1000 else
1002 view->desc = *desc;
1005 if (FAILED(hr = wined3d_shader_resource_view_create(view, &d3d10_null_wined3d_parent_ops, &view->wined3d_view)))
1007 WARN("Failed to create wined3d shader resource view, hr %#x.\n", hr);
1008 return hr;
1011 view->resource = resource;
1012 ID3D10Resource_AddRef(resource);
1013 view->device = &device->ID3D10Device1_iface;
1014 ID3D10Device1_AddRef(view->device);
1016 return S_OK;
1019 struct d3d10_shader_resource_view *unsafe_impl_from_ID3D10ShaderResourceView(ID3D10ShaderResourceView *iface)
1021 if (!iface)
1022 return NULL;
1023 assert(iface->lpVtbl == &d3d10_shader_resource_view_vtbl);
1024 return CONTAINING_RECORD(iface, struct d3d10_shader_resource_view, ID3D10ShaderResourceView_iface);