2 * Copyright 2009 Henri Verbeet for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include "wine/port.h"
23 #include "d3d11_private.h"
25 WINE_DEFAULT_DEBUG_CHANNEL(d3d11
);
27 /* ID3D11BlendState methods */
29 static inline struct d3d_blend_state
*impl_from_ID3D11BlendState(ID3D11BlendState
*iface
)
31 return CONTAINING_RECORD(iface
, struct d3d_blend_state
, ID3D11BlendState_iface
);
34 static HRESULT STDMETHODCALLTYPE
d3d11_blend_state_QueryInterface(ID3D11BlendState
*iface
,
35 REFIID riid
, void **object
)
37 struct d3d_blend_state
*state
= impl_from_ID3D11BlendState(iface
);
39 TRACE("iface %p, riid %s, object %p.\n", iface
, debugstr_guid(riid
), object
);
41 if (IsEqualGUID(riid
, &IID_ID3D11BlendState
)
42 || IsEqualGUID(riid
, &IID_ID3D11DeviceChild
)
43 || IsEqualGUID(riid
, &IID_IUnknown
))
45 ID3D11BlendState_AddRef(iface
);
50 if (IsEqualGUID(riid
, &IID_ID3D10BlendState1
)
51 || IsEqualGUID(riid
, &IID_ID3D10BlendState
)
52 || IsEqualGUID(riid
, &IID_ID3D10DeviceChild
))
54 ID3D10BlendState1_AddRef(&state
->ID3D10BlendState1_iface
);
55 *object
= &state
->ID3D10BlendState1_iface
;
59 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
65 static ULONG STDMETHODCALLTYPE
d3d11_blend_state_AddRef(ID3D11BlendState
*iface
)
67 struct d3d_blend_state
*state
= impl_from_ID3D11BlendState(iface
);
68 ULONG refcount
= InterlockedIncrement(&state
->refcount
);
70 TRACE("%p increasing refcount to %u.\n", state
, refcount
);
75 static ULONG STDMETHODCALLTYPE
d3d11_blend_state_Release(ID3D11BlendState
*iface
)
77 struct d3d_blend_state
*state
= impl_from_ID3D11BlendState(iface
);
78 ULONG refcount
= InterlockedDecrement(&state
->refcount
);
80 TRACE("%p decreasing refcount to %u.\n", state
, refcount
);
84 struct d3d_device
*device
= impl_from_ID3D11Device(state
->device
);
86 wine_rb_remove(&device
->blend_states
, &state
->desc
);
87 ID3D11Device_Release(state
->device
);
88 wined3d_private_store_cleanup(&state
->private_store
);
89 wined3d_mutex_unlock();
90 HeapFree(GetProcessHeap(), 0, state
);
96 static void STDMETHODCALLTYPE
d3d11_blend_state_GetDevice(ID3D11BlendState
*iface
,
97 ID3D11Device
**device
)
99 struct d3d_blend_state
*state
= impl_from_ID3D11BlendState(iface
);
101 TRACE("iface %p, device %p.\n", iface
, device
);
103 *device
= state
->device
;
104 ID3D11Device_AddRef(*device
);
107 static HRESULT STDMETHODCALLTYPE
d3d11_blend_state_GetPrivateData(ID3D11BlendState
*iface
,
108 REFGUID guid
, UINT
*data_size
, void *data
)
110 struct d3d_blend_state
*state
= impl_from_ID3D11BlendState(iface
);
112 TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface
, debugstr_guid(guid
), data_size
, data
);
114 return d3d_get_private_data(&state
->private_store
, guid
, data_size
, data
);
117 static HRESULT STDMETHODCALLTYPE
d3d11_blend_state_SetPrivateData(ID3D11BlendState
*iface
,
118 REFGUID guid
, UINT data_size
, const void *data
)
120 struct d3d_blend_state
*state
= impl_from_ID3D11BlendState(iface
);
122 TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface
, debugstr_guid(guid
), data_size
, data
);
124 return d3d_set_private_data(&state
->private_store
, guid
, data_size
, data
);
127 static HRESULT STDMETHODCALLTYPE
d3d11_blend_state_SetPrivateDataInterface(ID3D11BlendState
*iface
,
128 REFGUID guid
, const IUnknown
*data
)
130 struct d3d_blend_state
*state
= impl_from_ID3D11BlendState(iface
);
132 TRACE("iface %p, guid %s, data %p.\n", iface
, debugstr_guid(guid
), data
);
134 return d3d_set_private_data_interface(&state
->private_store
, guid
, data
);
137 static void STDMETHODCALLTYPE
d3d11_blend_state_GetDesc(ID3D11BlendState
*iface
, D3D11_BLEND_DESC
*desc
)
139 struct d3d_blend_state
*state
= impl_from_ID3D11BlendState(iface
);
141 TRACE("iface %p, desc %p.\n", iface
, desc
);
146 static const struct ID3D11BlendStateVtbl d3d11_blend_state_vtbl
=
148 /* IUnknown methods */
149 d3d11_blend_state_QueryInterface
,
150 d3d11_blend_state_AddRef
,
151 d3d11_blend_state_Release
,
152 /* ID3D11DeviceChild methods */
153 d3d11_blend_state_GetDevice
,
154 d3d11_blend_state_GetPrivateData
,
155 d3d11_blend_state_SetPrivateData
,
156 d3d11_blend_state_SetPrivateDataInterface
,
157 /* ID3D11BlendState methods */
158 d3d11_blend_state_GetDesc
,
161 /* ID3D10BlendState methods */
163 static inline struct d3d_blend_state
*impl_from_ID3D10BlendState(ID3D10BlendState1
*iface
)
165 return CONTAINING_RECORD(iface
, struct d3d_blend_state
, ID3D10BlendState1_iface
);
168 /* IUnknown methods */
170 static HRESULT STDMETHODCALLTYPE
d3d10_blend_state_QueryInterface(ID3D10BlendState1
*iface
,
171 REFIID riid
, void **object
)
173 struct d3d_blend_state
*state
= impl_from_ID3D10BlendState(iface
);
175 TRACE("iface %p, riid %s, object %p.\n", iface
, debugstr_guid(riid
), object
);
177 return d3d11_blend_state_QueryInterface(&state
->ID3D11BlendState_iface
, riid
, object
);
180 static ULONG STDMETHODCALLTYPE
d3d10_blend_state_AddRef(ID3D10BlendState1
*iface
)
182 struct d3d_blend_state
*state
= impl_from_ID3D10BlendState(iface
);
184 TRACE("iface %p.\n", iface
);
186 return d3d11_blend_state_AddRef(&state
->ID3D11BlendState_iface
);
189 static ULONG STDMETHODCALLTYPE
d3d10_blend_state_Release(ID3D10BlendState1
*iface
)
191 struct d3d_blend_state
*state
= impl_from_ID3D10BlendState(iface
);
193 TRACE("iface %p.\n", iface
);
195 return d3d11_blend_state_Release(&state
->ID3D11BlendState_iface
);
198 /* ID3D10DeviceChild methods */
200 static void STDMETHODCALLTYPE
d3d10_blend_state_GetDevice(ID3D10BlendState1
*iface
, ID3D10Device
**device
)
202 struct d3d_blend_state
*state
= impl_from_ID3D10BlendState(iface
);
204 TRACE("iface %p, device %p.\n", iface
, device
);
206 ID3D11Device_QueryInterface(state
->device
, &IID_ID3D10Device
, (void **)device
);
209 static HRESULT STDMETHODCALLTYPE
d3d10_blend_state_GetPrivateData(ID3D10BlendState1
*iface
,
210 REFGUID guid
, UINT
*data_size
, void *data
)
212 struct d3d_blend_state
*state
= impl_from_ID3D10BlendState(iface
);
214 TRACE("iface %p, guid %s, data_size %p, data %p.\n",
215 iface
, debugstr_guid(guid
), data_size
, data
);
217 return d3d_get_private_data(&state
->private_store
, guid
, data_size
, data
);
220 static HRESULT STDMETHODCALLTYPE
d3d10_blend_state_SetPrivateData(ID3D10BlendState1
*iface
,
221 REFGUID guid
, UINT data_size
, const void *data
)
223 struct d3d_blend_state
*state
= impl_from_ID3D10BlendState(iface
);
225 TRACE("iface %p, guid %s, data_size %u, data %p.\n",
226 iface
, debugstr_guid(guid
), data_size
, data
);
228 return d3d_set_private_data(&state
->private_store
, guid
, data_size
, data
);
231 static HRESULT STDMETHODCALLTYPE
d3d10_blend_state_SetPrivateDataInterface(ID3D10BlendState1
*iface
,
232 REFGUID guid
, const IUnknown
*data
)
234 struct d3d_blend_state
*state
= impl_from_ID3D10BlendState(iface
);
236 TRACE("iface %p, guid %s, data %p.\n", iface
, debugstr_guid(guid
), data
);
238 return d3d_set_private_data_interface(&state
->private_store
, guid
, data
);
241 /* ID3D10BlendState methods */
243 static void STDMETHODCALLTYPE
d3d10_blend_state_GetDesc(ID3D10BlendState1
*iface
, D3D10_BLEND_DESC
*desc
)
245 struct d3d_blend_state
*state
= impl_from_ID3D10BlendState(iface
);
246 const D3D11_BLEND_DESC
*d3d11_desc
= &state
->desc
;
249 TRACE("iface %p, desc %p.\n", iface
, desc
);
251 desc
->AlphaToCoverageEnable
= d3d11_desc
->AlphaToCoverageEnable
;
252 desc
->SrcBlend
= d3d11_desc
->RenderTarget
[0].SrcBlend
;
253 desc
->DestBlend
= d3d11_desc
->RenderTarget
[0].DestBlend
;
254 desc
->BlendOp
= d3d11_desc
->RenderTarget
[0].BlendOp
;
255 desc
->SrcBlendAlpha
= d3d11_desc
->RenderTarget
[0].SrcBlendAlpha
;
256 desc
->DestBlendAlpha
= d3d11_desc
->RenderTarget
[0].DestBlendAlpha
;
257 desc
->BlendOpAlpha
= d3d11_desc
->RenderTarget
[0].BlendOpAlpha
;
258 for (i
= 0; i
< D3D10_SIMULTANEOUS_RENDER_TARGET_COUNT
; ++i
)
260 desc
->BlendEnable
[i
] = d3d11_desc
->RenderTarget
[i
].BlendEnable
;
261 desc
->RenderTargetWriteMask
[i
] = d3d11_desc
->RenderTarget
[i
].RenderTargetWriteMask
;
265 static void STDMETHODCALLTYPE
d3d10_blend_state_GetDesc1(ID3D10BlendState1
*iface
, D3D10_BLEND_DESC1
*desc
)
267 struct d3d_blend_state
*state
= impl_from_ID3D10BlendState(iface
);
269 TRACE("iface %p, desc %p.\n", iface
, desc
);
271 memcpy(desc
, &state
->desc
, sizeof(*desc
));
274 static const struct ID3D10BlendState1Vtbl d3d10_blend_state_vtbl
=
276 /* IUnknown methods */
277 d3d10_blend_state_QueryInterface
,
278 d3d10_blend_state_AddRef
,
279 d3d10_blend_state_Release
,
280 /* ID3D10DeviceChild methods */
281 d3d10_blend_state_GetDevice
,
282 d3d10_blend_state_GetPrivateData
,
283 d3d10_blend_state_SetPrivateData
,
284 d3d10_blend_state_SetPrivateDataInterface
,
285 /* ID3D10BlendState methods */
286 d3d10_blend_state_GetDesc
,
287 /* ID3D10BlendState1 methods */
288 d3d10_blend_state_GetDesc1
,
291 HRESULT
d3d_blend_state_init(struct d3d_blend_state
*state
, struct d3d_device
*device
,
292 const D3D11_BLEND_DESC
*desc
)
294 state
->ID3D11BlendState_iface
.lpVtbl
= &d3d11_blend_state_vtbl
;
295 state
->ID3D10BlendState1_iface
.lpVtbl
= &d3d10_blend_state_vtbl
;
297 wined3d_mutex_lock();
298 wined3d_private_store_init(&state
->private_store
);
301 if (wine_rb_put(&device
->blend_states
, desc
, &state
->entry
) == -1)
303 ERR("Failed to insert blend state entry.\n");
304 wined3d_private_store_cleanup(&state
->private_store
);
305 wined3d_mutex_unlock();
308 wined3d_mutex_unlock();
310 state
->device
= &device
->ID3D11Device_iface
;
311 ID3D11Device_AddRef(state
->device
);
316 struct d3d_blend_state
*unsafe_impl_from_ID3D11BlendState(ID3D11BlendState
*iface
)
320 assert(iface
->lpVtbl
== &d3d11_blend_state_vtbl
);
322 return impl_from_ID3D11BlendState(iface
);
325 struct d3d_blend_state
*unsafe_impl_from_ID3D10BlendState(ID3D10BlendState
*iface
)
329 assert(iface
->lpVtbl
== (ID3D10BlendStateVtbl
*)&d3d10_blend_state_vtbl
);
331 return impl_from_ID3D10BlendState((ID3D10BlendState1
*)iface
);
334 /* ID3D11DepthStencilState methods */
336 static inline struct d3d_depthstencil_state
*impl_from_ID3D11DepthStencilState(ID3D11DepthStencilState
*iface
)
338 return CONTAINING_RECORD(iface
, struct d3d_depthstencil_state
, ID3D11DepthStencilState_iface
);
341 static HRESULT STDMETHODCALLTYPE
d3d11_depthstencil_state_QueryInterface(ID3D11DepthStencilState
*iface
,
342 REFIID riid
, void **object
)
344 struct d3d_depthstencil_state
*state
= impl_from_ID3D11DepthStencilState(iface
);
346 TRACE("iface %p, riid %s, object %p.\n", iface
, debugstr_guid(riid
), object
);
348 if (IsEqualGUID(riid
, &IID_ID3D11DepthStencilState
)
349 || IsEqualGUID(riid
, &IID_ID3D11DeviceChild
)
350 || IsEqualGUID(riid
, &IID_IUnknown
))
352 ID3D11DepthStencilState_AddRef(iface
);
357 if (IsEqualGUID(riid
, &IID_ID3D10DepthStencilState
)
358 || IsEqualGUID(riid
, &IID_ID3D10DeviceChild
))
360 ID3D10DepthStencilState_AddRef(&state
->ID3D10DepthStencilState_iface
);
361 *object
= &state
->ID3D10DepthStencilState_iface
;
365 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
368 return E_NOINTERFACE
;
371 static ULONG STDMETHODCALLTYPE
d3d11_depthstencil_state_AddRef(ID3D11DepthStencilState
*iface
)
373 struct d3d_depthstencil_state
*state
= impl_from_ID3D11DepthStencilState(iface
);
374 ULONG refcount
= InterlockedIncrement(&state
->refcount
);
376 TRACE("%p increasing refcount to %u.\n", state
, refcount
);
381 static ULONG STDMETHODCALLTYPE
d3d11_depthstencil_state_Release(ID3D11DepthStencilState
*iface
)
383 struct d3d_depthstencil_state
*state
= impl_from_ID3D11DepthStencilState(iface
);
384 ULONG refcount
= InterlockedDecrement(&state
->refcount
);
386 TRACE("%p decreasing refcount to %u.\n", state
, refcount
);
390 struct d3d_device
*device
= impl_from_ID3D11Device(state
->device
);
391 wined3d_mutex_lock();
392 wine_rb_remove(&device
->depthstencil_states
, &state
->desc
);
393 ID3D11Device_Release(state
->device
);
394 wined3d_private_store_cleanup(&state
->private_store
);
395 wined3d_mutex_unlock();
396 HeapFree(GetProcessHeap(), 0, state
);
402 static void STDMETHODCALLTYPE
d3d11_depthstencil_state_GetDevice(ID3D11DepthStencilState
*iface
,
403 ID3D11Device
**device
)
405 struct d3d_depthstencil_state
*state
= impl_from_ID3D11DepthStencilState(iface
);
407 TRACE("iface %p, device %p.\n", iface
, device
);
409 *device
= state
->device
;
410 ID3D11Device_AddRef(*device
);
413 static HRESULT STDMETHODCALLTYPE
d3d11_depthstencil_state_GetPrivateData(ID3D11DepthStencilState
*iface
,
414 REFGUID guid
, UINT
*data_size
, void *data
)
416 struct d3d_depthstencil_state
*state
= impl_from_ID3D11DepthStencilState(iface
);
418 TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface
, debugstr_guid(guid
), data_size
, data
);
420 return d3d_get_private_data(&state
->private_store
, guid
, data_size
, data
);
423 static HRESULT STDMETHODCALLTYPE
d3d11_depthstencil_state_SetPrivateData(ID3D11DepthStencilState
*iface
,
424 REFGUID guid
, UINT data_size
, const void *data
)
426 struct d3d_depthstencil_state
*state
= impl_from_ID3D11DepthStencilState(iface
);
428 TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface
, debugstr_guid(guid
), data_size
, data
);
430 return d3d_set_private_data(&state
->private_store
, guid
, data_size
, data
);
433 static HRESULT STDMETHODCALLTYPE
d3d11_depthstencil_state_SetPrivateDataInterface(ID3D11DepthStencilState
*iface
,
434 REFGUID guid
, const IUnknown
*data
)
436 struct d3d_depthstencil_state
*state
= impl_from_ID3D11DepthStencilState(iface
);
438 TRACE("iface %p, guid %s, data %p.\n", iface
, debugstr_guid(guid
), data
);
440 return d3d_set_private_data_interface(&state
->private_store
, guid
, data
);
443 static void STDMETHODCALLTYPE
d3d11_depthstencil_state_GetDesc(ID3D11DepthStencilState
*iface
,
444 D3D11_DEPTH_STENCIL_DESC
*desc
)
446 struct d3d_depthstencil_state
*state
= impl_from_ID3D11DepthStencilState(iface
);
448 TRACE("iface %p, desc %p.\n", iface
, desc
);
453 static const struct ID3D11DepthStencilStateVtbl d3d11_depthstencil_state_vtbl
=
455 /* IUnknown methods */
456 d3d11_depthstencil_state_QueryInterface
,
457 d3d11_depthstencil_state_AddRef
,
458 d3d11_depthstencil_state_Release
,
459 /* ID3D11DeviceChild methods */
460 d3d11_depthstencil_state_GetDevice
,
461 d3d11_depthstencil_state_GetPrivateData
,
462 d3d11_depthstencil_state_SetPrivateData
,
463 d3d11_depthstencil_state_SetPrivateDataInterface
,
464 /* ID3D11DepthStencilState methods */
465 d3d11_depthstencil_state_GetDesc
,
468 /* ID3D10DepthStencilState methods */
470 static inline struct d3d_depthstencil_state
*impl_from_ID3D10DepthStencilState(ID3D10DepthStencilState
*iface
)
472 return CONTAINING_RECORD(iface
, struct d3d_depthstencil_state
, ID3D10DepthStencilState_iface
);
475 /* IUnknown methods */
477 static HRESULT STDMETHODCALLTYPE
d3d10_depthstencil_state_QueryInterface(ID3D10DepthStencilState
*iface
,
478 REFIID riid
, void **object
)
480 struct d3d_depthstencil_state
*state
= impl_from_ID3D10DepthStencilState(iface
);
482 TRACE("iface %p, riid %s, object %p.\n", iface
, debugstr_guid(riid
), object
);
484 return d3d11_depthstencil_state_QueryInterface(&state
->ID3D11DepthStencilState_iface
, riid
, object
);
487 static ULONG STDMETHODCALLTYPE
d3d10_depthstencil_state_AddRef(ID3D10DepthStencilState
*iface
)
489 struct d3d_depthstencil_state
*state
= impl_from_ID3D10DepthStencilState(iface
);
491 TRACE("iface %p.\n", iface
);
493 return d3d11_depthstencil_state_AddRef(&state
->ID3D11DepthStencilState_iface
);
496 static ULONG STDMETHODCALLTYPE
d3d10_depthstencil_state_Release(ID3D10DepthStencilState
*iface
)
498 struct d3d_depthstencil_state
*state
= impl_from_ID3D10DepthStencilState(iface
);
500 TRACE("iface %p.\n", iface
);
502 return d3d11_depthstencil_state_Release(&state
->ID3D11DepthStencilState_iface
);
505 /* ID3D10DeviceChild methods */
507 static void STDMETHODCALLTYPE
d3d10_depthstencil_state_GetDevice(ID3D10DepthStencilState
*iface
, ID3D10Device
**device
)
509 struct d3d_depthstencil_state
*state
= impl_from_ID3D10DepthStencilState(iface
);
511 TRACE("iface %p, device %p.\n", iface
, device
);
513 ID3D11Device_QueryInterface(state
->device
, &IID_ID3D10Device
, (void **)device
);
516 static HRESULT STDMETHODCALLTYPE
d3d10_depthstencil_state_GetPrivateData(ID3D10DepthStencilState
*iface
,
517 REFGUID guid
, UINT
*data_size
, void *data
)
519 struct d3d_depthstencil_state
*state
= impl_from_ID3D10DepthStencilState(iface
);
521 TRACE("iface %p, guid %s, data_size %p, data %p.\n",
522 iface
, debugstr_guid(guid
), data_size
, data
);
524 return d3d_get_private_data(&state
->private_store
, guid
, data_size
, data
);
527 static HRESULT STDMETHODCALLTYPE
d3d10_depthstencil_state_SetPrivateData(ID3D10DepthStencilState
*iface
,
528 REFGUID guid
, UINT data_size
, const void *data
)
530 struct d3d_depthstencil_state
*state
= impl_from_ID3D10DepthStencilState(iface
);
532 TRACE("iface %p, guid %s, data_size %u, data %p.\n",
533 iface
, debugstr_guid(guid
), data_size
, data
);
535 return d3d_set_private_data(&state
->private_store
, guid
, data_size
, data
);
538 static HRESULT STDMETHODCALLTYPE
d3d10_depthstencil_state_SetPrivateDataInterface(ID3D10DepthStencilState
*iface
,
539 REFGUID guid
, const IUnknown
*data
)
541 struct d3d_depthstencil_state
*state
= impl_from_ID3D10DepthStencilState(iface
);
543 TRACE("iface %p, guid %s, data %p.\n", iface
, debugstr_guid(guid
), data
);
545 return d3d_set_private_data_interface(&state
->private_store
, guid
, data
);
548 /* ID3D10DepthStencilState methods */
550 static void STDMETHODCALLTYPE
d3d10_depthstencil_state_GetDesc(ID3D10DepthStencilState
*iface
,
551 D3D10_DEPTH_STENCIL_DESC
*desc
)
553 struct d3d_depthstencil_state
*state
= impl_from_ID3D10DepthStencilState(iface
);
555 TRACE("iface %p, desc %p.\n", iface
, desc
);
557 memcpy(desc
, &state
->desc
, sizeof(*desc
));
560 static const struct ID3D10DepthStencilStateVtbl d3d10_depthstencil_state_vtbl
=
562 /* IUnknown methods */
563 d3d10_depthstencil_state_QueryInterface
,
564 d3d10_depthstencil_state_AddRef
,
565 d3d10_depthstencil_state_Release
,
566 /* ID3D10DeviceChild methods */
567 d3d10_depthstencil_state_GetDevice
,
568 d3d10_depthstencil_state_GetPrivateData
,
569 d3d10_depthstencil_state_SetPrivateData
,
570 d3d10_depthstencil_state_SetPrivateDataInterface
,
571 /* ID3D10DepthStencilState methods */
572 d3d10_depthstencil_state_GetDesc
,
575 HRESULT
d3d_depthstencil_state_init(struct d3d_depthstencil_state
*state
, struct d3d_device
*device
,
576 const D3D11_DEPTH_STENCIL_DESC
*desc
)
578 state
->ID3D11DepthStencilState_iface
.lpVtbl
= &d3d11_depthstencil_state_vtbl
;
579 state
->ID3D10DepthStencilState_iface
.lpVtbl
= &d3d10_depthstencil_state_vtbl
;
581 wined3d_mutex_lock();
582 wined3d_private_store_init(&state
->private_store
);
585 if (wine_rb_put(&device
->depthstencil_states
, desc
, &state
->entry
) == -1)
587 ERR("Failed to insert depthstencil state entry.\n");
588 wined3d_private_store_cleanup(&state
->private_store
);
589 wined3d_mutex_unlock();
592 wined3d_mutex_unlock();
594 state
->device
= &device
->ID3D11Device_iface
;
595 ID3D11Device_AddRef(state
->device
);
600 struct d3d_depthstencil_state
*unsafe_impl_from_ID3D11DepthStencilState(ID3D11DepthStencilState
*iface
)
604 assert(iface
->lpVtbl
== &d3d11_depthstencil_state_vtbl
);
606 return impl_from_ID3D11DepthStencilState(iface
);
609 struct d3d_depthstencil_state
*unsafe_impl_from_ID3D10DepthStencilState(ID3D10DepthStencilState
*iface
)
613 assert(iface
->lpVtbl
== &d3d10_depthstencil_state_vtbl
);
615 return impl_from_ID3D10DepthStencilState(iface
);
618 /* ID3D11RasterizerState methods */
620 static inline struct d3d_rasterizer_state
*impl_from_ID3D11RasterizerState(ID3D11RasterizerState
*iface
)
622 return CONTAINING_RECORD(iface
, struct d3d_rasterizer_state
, ID3D11RasterizerState_iface
);
625 static HRESULT STDMETHODCALLTYPE
d3d11_rasterizer_state_QueryInterface(ID3D11RasterizerState
*iface
,
626 REFIID riid
, void **object
)
628 struct d3d_rasterizer_state
*state
= impl_from_ID3D11RasterizerState(iface
);
630 TRACE("iface %p, riid %s, object %p.\n", iface
, debugstr_guid(riid
), object
);
632 if (IsEqualGUID(riid
, &IID_ID3D11RasterizerState
)
633 || IsEqualGUID(riid
, &IID_ID3D11DeviceChild
)
634 || IsEqualGUID(riid
, &IID_IUnknown
))
636 ID3D11RasterizerState_AddRef(iface
);
641 if (IsEqualGUID(riid
, &IID_ID3D10RasterizerState
)
642 || IsEqualGUID(riid
, &IID_ID3D10DeviceChild
))
644 ID3D10RasterizerState_AddRef(&state
->ID3D10RasterizerState_iface
);
645 *object
= &state
->ID3D10RasterizerState_iface
;
649 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
652 return E_NOINTERFACE
;
655 static ULONG STDMETHODCALLTYPE
d3d11_rasterizer_state_AddRef(ID3D11RasterizerState
*iface
)
657 struct d3d_rasterizer_state
*state
= impl_from_ID3D11RasterizerState(iface
);
658 ULONG refcount
= InterlockedIncrement(&state
->refcount
);
660 TRACE("%p increasing refcount to %u.\n", state
, refcount
);
665 static ULONG STDMETHODCALLTYPE
d3d11_rasterizer_state_Release(ID3D11RasterizerState
*iface
)
667 struct d3d_rasterizer_state
*state
= impl_from_ID3D11RasterizerState(iface
);
668 ULONG refcount
= InterlockedDecrement(&state
->refcount
);
670 TRACE("%p decreasing refcount to %u.\n", state
, refcount
);
674 struct d3d_device
*device
= impl_from_ID3D11Device(state
->device
);
675 wined3d_mutex_lock();
676 wine_rb_remove(&device
->rasterizer_states
, &state
->desc
);
677 ID3D11Device_Release(state
->device
);
678 wined3d_private_store_cleanup(&state
->private_store
);
679 wined3d_mutex_unlock();
680 HeapFree(GetProcessHeap(), 0, state
);
686 static void STDMETHODCALLTYPE
d3d11_rasterizer_state_GetDevice(ID3D11RasterizerState
*iface
,
687 ID3D11Device
**device
)
689 struct d3d_rasterizer_state
*state
= impl_from_ID3D11RasterizerState(iface
);
691 TRACE("iface %p, device %p.\n", iface
, device
);
693 *device
= state
->device
;
694 ID3D11Device_AddRef(*device
);
697 static HRESULT STDMETHODCALLTYPE
d3d11_rasterizer_state_GetPrivateData(ID3D11RasterizerState
*iface
,
698 REFGUID guid
, UINT
*data_size
, void *data
)
700 struct d3d_rasterizer_state
*state
= impl_from_ID3D11RasterizerState(iface
);
702 TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface
, debugstr_guid(guid
), data_size
, data
);
704 return d3d_get_private_data(&state
->private_store
, guid
, data_size
, data
);
707 static HRESULT STDMETHODCALLTYPE
d3d11_rasterizer_state_SetPrivateData(ID3D11RasterizerState
*iface
,
708 REFGUID guid
, UINT data_size
, const void *data
)
710 struct d3d_rasterizer_state
*state
= impl_from_ID3D11RasterizerState(iface
);
712 TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface
, debugstr_guid(guid
), data_size
, data
);
714 return d3d_set_private_data(&state
->private_store
, guid
, data_size
, data
);
717 static HRESULT STDMETHODCALLTYPE
d3d11_rasterizer_state_SetPrivateDataInterface(ID3D11RasterizerState
*iface
,
718 REFGUID guid
, const IUnknown
*data
)
720 struct d3d_rasterizer_state
*state
= impl_from_ID3D11RasterizerState(iface
);
722 TRACE("iface %p, guid %s, data %p.\n", iface
, debugstr_guid(guid
), data
);
724 return d3d_set_private_data_interface(&state
->private_store
, guid
, data
);
727 static void STDMETHODCALLTYPE
d3d11_rasterizer_state_GetDesc(ID3D11RasterizerState
*iface
,
728 D3D11_RASTERIZER_DESC
*desc
)
730 struct d3d_rasterizer_state
*state
= impl_from_ID3D11RasterizerState(iface
);
732 TRACE("iface %p, desc %p.\n", iface
, desc
);
737 static const struct ID3D11RasterizerStateVtbl d3d11_rasterizer_state_vtbl
=
739 /* IUnknown methods */
740 d3d11_rasterizer_state_QueryInterface
,
741 d3d11_rasterizer_state_AddRef
,
742 d3d11_rasterizer_state_Release
,
743 /* ID3D11DeviceChild methods */
744 d3d11_rasterizer_state_GetDevice
,
745 d3d11_rasterizer_state_GetPrivateData
,
746 d3d11_rasterizer_state_SetPrivateData
,
747 d3d11_rasterizer_state_SetPrivateDataInterface
,
748 /* ID3D11RasterizerState methods */
749 d3d11_rasterizer_state_GetDesc
,
752 /* ID3D10RasterizerState methods */
754 static inline struct d3d_rasterizer_state
*impl_from_ID3D10RasterizerState(ID3D10RasterizerState
*iface
)
756 return CONTAINING_RECORD(iface
, struct d3d_rasterizer_state
, ID3D10RasterizerState_iface
);
759 /* IUnknown methods */
761 static HRESULT STDMETHODCALLTYPE
d3d10_rasterizer_state_QueryInterface(ID3D10RasterizerState
*iface
,
762 REFIID riid
, void **object
)
764 struct d3d_rasterizer_state
*state
= impl_from_ID3D10RasterizerState(iface
);
766 TRACE("iface %p, riid %s, object %p.\n", iface
, debugstr_guid(riid
), object
);
768 return d3d11_rasterizer_state_QueryInterface(&state
->ID3D11RasterizerState_iface
, riid
, object
);
771 static ULONG STDMETHODCALLTYPE
d3d10_rasterizer_state_AddRef(ID3D10RasterizerState
*iface
)
773 struct d3d_rasterizer_state
*state
= impl_from_ID3D10RasterizerState(iface
);
775 TRACE("iface %p.\n", iface
);
777 return d3d11_rasterizer_state_AddRef(&state
->ID3D11RasterizerState_iface
);
780 static ULONG STDMETHODCALLTYPE
d3d10_rasterizer_state_Release(ID3D10RasterizerState
*iface
)
782 struct d3d_rasterizer_state
*state
= impl_from_ID3D10RasterizerState(iface
);
784 TRACE("iface %p.\n", state
);
786 return d3d11_rasterizer_state_Release(&state
->ID3D11RasterizerState_iface
);
789 /* ID3D10DeviceChild methods */
791 static void STDMETHODCALLTYPE
d3d10_rasterizer_state_GetDevice(ID3D10RasterizerState
*iface
, ID3D10Device
**device
)
793 struct d3d_rasterizer_state
*state
= impl_from_ID3D10RasterizerState(iface
);
795 TRACE("iface %p, device %p.\n", iface
, device
);
797 ID3D11Device_QueryInterface(state
->device
, &IID_ID3D10Device
, (void **)device
);
800 static HRESULT STDMETHODCALLTYPE
d3d10_rasterizer_state_GetPrivateData(ID3D10RasterizerState
*iface
,
801 REFGUID guid
, UINT
*data_size
, void *data
)
803 struct d3d_rasterizer_state
*state
= impl_from_ID3D10RasterizerState(iface
);
805 TRACE("iface %p, guid %s, data_size %p, data %p.\n",
806 iface
, debugstr_guid(guid
), data_size
, data
);
808 return d3d_get_private_data(&state
->private_store
, guid
, data_size
, data
);
811 static HRESULT STDMETHODCALLTYPE
d3d10_rasterizer_state_SetPrivateData(ID3D10RasterizerState
*iface
,
812 REFGUID guid
, UINT data_size
, const void *data
)
814 struct d3d_rasterizer_state
*state
= impl_from_ID3D10RasterizerState(iface
);
816 TRACE("iface %p, guid %s, data_size %u, data %p.\n",
817 iface
, debugstr_guid(guid
), data_size
, data
);
819 return d3d_set_private_data(&state
->private_store
, guid
, data_size
, data
);
822 static HRESULT STDMETHODCALLTYPE
d3d10_rasterizer_state_SetPrivateDataInterface(ID3D10RasterizerState
*iface
,
823 REFGUID guid
, const IUnknown
*data
)
825 struct d3d_rasterizer_state
*state
= impl_from_ID3D10RasterizerState(iface
);
827 TRACE("iface %p, guid %s, data %p.\n", iface
, debugstr_guid(guid
), data
);
829 return d3d_set_private_data_interface(&state
->private_store
, guid
, data
);
832 /* ID3D10RasterizerState methods */
834 static void STDMETHODCALLTYPE
d3d10_rasterizer_state_GetDesc(ID3D10RasterizerState
*iface
,
835 D3D10_RASTERIZER_DESC
*desc
)
837 struct d3d_rasterizer_state
*state
= impl_from_ID3D10RasterizerState(iface
);
839 TRACE("iface %p, desc %p.\n", iface
, desc
);
841 memcpy(desc
, &state
->desc
, sizeof(*desc
));
844 static const struct ID3D10RasterizerStateVtbl d3d10_rasterizer_state_vtbl
=
846 /* IUnknown methods */
847 d3d10_rasterizer_state_QueryInterface
,
848 d3d10_rasterizer_state_AddRef
,
849 d3d10_rasterizer_state_Release
,
850 /* ID3D10DeviceChild methods */
851 d3d10_rasterizer_state_GetDevice
,
852 d3d10_rasterizer_state_GetPrivateData
,
853 d3d10_rasterizer_state_SetPrivateData
,
854 d3d10_rasterizer_state_SetPrivateDataInterface
,
855 /* ID3D10RasterizerState methods */
856 d3d10_rasterizer_state_GetDesc
,
859 HRESULT
d3d_rasterizer_state_init(struct d3d_rasterizer_state
*state
, struct d3d_device
*device
,
860 const D3D11_RASTERIZER_DESC
*desc
)
862 state
->ID3D11RasterizerState_iface
.lpVtbl
= &d3d11_rasterizer_state_vtbl
;
863 state
->ID3D10RasterizerState_iface
.lpVtbl
= &d3d10_rasterizer_state_vtbl
;
865 wined3d_mutex_lock();
866 wined3d_private_store_init(&state
->private_store
);
869 if (wine_rb_put(&device
->rasterizer_states
, desc
, &state
->entry
) == -1)
871 ERR("Failed to insert rasterizer state entry.\n");
872 wined3d_private_store_cleanup(&state
->private_store
);
873 wined3d_mutex_unlock();
876 wined3d_mutex_unlock();
878 state
->device
= &device
->ID3D11Device_iface
;
879 ID3D11Device_AddRef(state
->device
);
884 struct d3d_rasterizer_state
*unsafe_impl_from_ID3D11RasterizerState(ID3D11RasterizerState
*iface
)
888 assert(iface
->lpVtbl
== &d3d11_rasterizer_state_vtbl
);
890 return impl_from_ID3D11RasterizerState(iface
);
893 struct d3d_rasterizer_state
*unsafe_impl_from_ID3D10RasterizerState(ID3D10RasterizerState
*iface
)
897 assert(iface
->lpVtbl
== &d3d10_rasterizer_state_vtbl
);
899 return impl_from_ID3D10RasterizerState(iface
);
902 /* ID3D11SampleState methods */
904 static inline struct d3d_sampler_state
*impl_from_ID3D11SamplerState(ID3D11SamplerState
*iface
)
906 return CONTAINING_RECORD(iface
, struct d3d_sampler_state
, ID3D11SamplerState_iface
);
909 static HRESULT STDMETHODCALLTYPE
d3d11_sampler_state_QueryInterface(ID3D11SamplerState
*iface
,
910 REFIID riid
, void **object
)
912 struct d3d_sampler_state
*state
= impl_from_ID3D11SamplerState(iface
);
914 TRACE("iface %p, riid %s, object %p.\n", iface
, debugstr_guid(riid
), object
);
916 if (IsEqualGUID(riid
, &IID_ID3D11SamplerState
)
917 || IsEqualGUID(riid
, &IID_ID3D11DeviceChild
)
918 || IsEqualGUID(riid
, &IID_IUnknown
))
920 ID3D11SamplerState_AddRef(iface
);
925 if (IsEqualGUID(riid
, &IID_ID3D10SamplerState
)
926 || IsEqualGUID(riid
, &IID_ID3D10DeviceChild
))
928 ID3D10SamplerState_AddRef(&state
->ID3D10SamplerState_iface
);
929 *object
= &state
->ID3D10SamplerState_iface
;
933 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
936 return E_NOINTERFACE
;
939 static ULONG STDMETHODCALLTYPE
d3d11_sampler_state_AddRef(ID3D11SamplerState
*iface
)
941 struct d3d_sampler_state
*state
= impl_from_ID3D11SamplerState(iface
);
942 ULONG refcount
= InterlockedIncrement(&state
->refcount
);
944 TRACE("%p increasing refcount to %u.\n", state
, refcount
);
949 static ULONG STDMETHODCALLTYPE
d3d11_sampler_state_Release(ID3D11SamplerState
*iface
)
951 struct d3d_sampler_state
*state
= impl_from_ID3D11SamplerState(iface
);
952 ULONG refcount
= InterlockedDecrement(&state
->refcount
);
954 TRACE("%p decreasing refcount to %u.\n", state
, refcount
);
958 struct d3d_device
*device
= impl_from_ID3D11Device(state
->device
);
960 wined3d_mutex_lock();
961 wined3d_sampler_decref(state
->wined3d_sampler
);
962 wine_rb_remove(&device
->sampler_states
, &state
->desc
);
963 ID3D11Device_Release(state
->device
);
964 wined3d_private_store_cleanup(&state
->private_store
);
965 wined3d_mutex_unlock();
966 HeapFree(GetProcessHeap(), 0, state
);
972 static void STDMETHODCALLTYPE
d3d11_sampler_state_GetDevice(ID3D11SamplerState
*iface
,
973 ID3D11Device
**device
)
975 struct d3d_sampler_state
*state
= impl_from_ID3D11SamplerState(iface
);
977 TRACE("iface %p, device %p.\n", iface
, device
);
979 *device
= state
->device
;
980 ID3D11Device_AddRef(*device
);
983 static HRESULT STDMETHODCALLTYPE
d3d11_sampler_state_GetPrivateData(ID3D11SamplerState
*iface
,
984 REFGUID guid
, UINT
*data_size
, void *data
)
986 struct d3d_sampler_state
*state
= impl_from_ID3D11SamplerState(iface
);
988 TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface
, debugstr_guid(guid
), data_size
, data
);
990 return d3d_get_private_data(&state
->private_store
, guid
, data_size
, data
);
993 static HRESULT STDMETHODCALLTYPE
d3d11_sampler_state_SetPrivateData(ID3D11SamplerState
*iface
,
994 REFGUID guid
, UINT data_size
, const void *data
)
996 struct d3d_sampler_state
*state
= impl_from_ID3D11SamplerState(iface
);
998 TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface
, debugstr_guid(guid
), data_size
, data
);
1000 return d3d_set_private_data(&state
->private_store
, guid
, data_size
, data
);
1003 static HRESULT STDMETHODCALLTYPE
d3d11_sampler_state_SetPrivateDataInterface(ID3D11SamplerState
*iface
,
1004 REFGUID guid
, const IUnknown
*data
)
1006 struct d3d_sampler_state
*state
= impl_from_ID3D11SamplerState(iface
);
1008 TRACE("iface %p, guid %s, data %p.\n", iface
, debugstr_guid(guid
), data
);
1010 return d3d_set_private_data_interface(&state
->private_store
, guid
, data
);
1013 static void STDMETHODCALLTYPE
d3d11_sampler_state_GetDesc(ID3D11SamplerState
*iface
,
1014 D3D11_SAMPLER_DESC
*desc
)
1016 struct d3d_sampler_state
*state
= impl_from_ID3D11SamplerState(iface
);
1018 TRACE("iface %p, desc %p.\n", iface
, desc
);
1020 *desc
= state
->desc
;
1023 static const struct ID3D11SamplerStateVtbl d3d11_sampler_state_vtbl
=
1025 /* IUnknown methods */
1026 d3d11_sampler_state_QueryInterface
,
1027 d3d11_sampler_state_AddRef
,
1028 d3d11_sampler_state_Release
,
1029 /* ID3D11DeviceChild methods */
1030 d3d11_sampler_state_GetDevice
,
1031 d3d11_sampler_state_GetPrivateData
,
1032 d3d11_sampler_state_SetPrivateData
,
1033 d3d11_sampler_state_SetPrivateDataInterface
,
1034 /* ID3D11SamplerState methods */
1035 d3d11_sampler_state_GetDesc
,
1038 /* ID3D10SamplerState methods */
1040 static inline struct d3d_sampler_state
*impl_from_ID3D10SamplerState(ID3D10SamplerState
*iface
)
1042 return CONTAINING_RECORD(iface
, struct d3d_sampler_state
, ID3D10SamplerState_iface
);
1045 /* IUnknown methods */
1047 static HRESULT STDMETHODCALLTYPE
d3d10_sampler_state_QueryInterface(ID3D10SamplerState
*iface
,
1048 REFIID riid
, void **object
)
1050 struct d3d_sampler_state
*state
= impl_from_ID3D10SamplerState(iface
);
1052 TRACE("iface %p, riid %s, object %p.\n", iface
, debugstr_guid(riid
), object
);
1054 return d3d11_sampler_state_QueryInterface(&state
->ID3D11SamplerState_iface
, riid
, object
);
1057 static ULONG STDMETHODCALLTYPE
d3d10_sampler_state_AddRef(ID3D10SamplerState
*iface
)
1059 struct d3d_sampler_state
*state
= impl_from_ID3D10SamplerState(iface
);
1061 TRACE("iface %p.\n", iface
);
1063 return d3d11_sampler_state_AddRef(&state
->ID3D11SamplerState_iface
);
1066 static ULONG STDMETHODCALLTYPE
d3d10_sampler_state_Release(ID3D10SamplerState
*iface
)
1068 struct d3d_sampler_state
*state
= impl_from_ID3D10SamplerState(iface
);
1070 TRACE("iface %p.\n", iface
);
1072 return d3d11_sampler_state_Release(&state
->ID3D11SamplerState_iface
);
1075 /* ID3D10DeviceChild methods */
1077 static void STDMETHODCALLTYPE
d3d10_sampler_state_GetDevice(ID3D10SamplerState
*iface
, ID3D10Device
**device
)
1079 struct d3d_sampler_state
*state
= impl_from_ID3D10SamplerState(iface
);
1081 TRACE("iface %p, device %p.\n", iface
, device
);
1083 ID3D11Device_QueryInterface(state
->device
, &IID_ID3D10Device
, (void **)device
);
1086 static HRESULT STDMETHODCALLTYPE
d3d10_sampler_state_GetPrivateData(ID3D10SamplerState
*iface
,
1087 REFGUID guid
, UINT
*data_size
, void *data
)
1089 struct d3d_sampler_state
*state
= impl_from_ID3D10SamplerState(iface
);
1091 TRACE("iface %p, guid %s, data_size %p, data %p.\n",
1092 iface
, debugstr_guid(guid
), data_size
, data
);
1094 return d3d_get_private_data(&state
->private_store
, guid
, data_size
, data
);
1097 static HRESULT STDMETHODCALLTYPE
d3d10_sampler_state_SetPrivateData(ID3D10SamplerState
*iface
,
1098 REFGUID guid
, UINT data_size
, const void *data
)
1100 struct d3d_sampler_state
*state
= impl_from_ID3D10SamplerState(iface
);
1102 TRACE("iface %p, guid %s, data_size %u, data %p.\n",
1103 iface
, debugstr_guid(guid
), data_size
, data
);
1105 return d3d_set_private_data(&state
->private_store
, guid
, data_size
, data
);
1108 static HRESULT STDMETHODCALLTYPE
d3d10_sampler_state_SetPrivateDataInterface(ID3D10SamplerState
*iface
,
1109 REFGUID guid
, const IUnknown
*data
)
1111 struct d3d_sampler_state
*state
= impl_from_ID3D10SamplerState(iface
);
1113 TRACE("iface %p, guid %s, data %p.\n", iface
, debugstr_guid(guid
), data
);
1115 return d3d_set_private_data_interface(&state
->private_store
, guid
, data
);
1118 /* ID3D10SamplerState methods */
1120 static void STDMETHODCALLTYPE
d3d10_sampler_state_GetDesc(ID3D10SamplerState
*iface
,
1121 D3D10_SAMPLER_DESC
*desc
)
1123 struct d3d_sampler_state
*state
= impl_from_ID3D10SamplerState(iface
);
1125 TRACE("iface %p, desc %p.\n", iface
, desc
);
1127 memcpy(desc
, &state
->desc
, sizeof(*desc
));
1130 static const struct ID3D10SamplerStateVtbl d3d10_sampler_state_vtbl
=
1132 /* IUnknown methods */
1133 d3d10_sampler_state_QueryInterface
,
1134 d3d10_sampler_state_AddRef
,
1135 d3d10_sampler_state_Release
,
1136 /* ID3D10DeviceChild methods */
1137 d3d10_sampler_state_GetDevice
,
1138 d3d10_sampler_state_GetPrivateData
,
1139 d3d10_sampler_state_SetPrivateData
,
1140 d3d10_sampler_state_SetPrivateDataInterface
,
1141 /* ID3D10SamplerState methods */
1142 d3d10_sampler_state_GetDesc
,
1145 static enum wined3d_texture_address
wined3d_texture_address_from_d3d11(enum D3D11_TEXTURE_ADDRESS_MODE t
)
1147 return (enum wined3d_texture_address
)t
;
1150 static enum wined3d_texture_filter_type
wined3d_texture_filter_mip_from_d3d11(enum D3D11_FILTER f
)
1152 if (D3D11_DECODE_MIP_FILTER(f
) == D3D11_FILTER_TYPE_LINEAR
)
1153 return WINED3D_TEXF_LINEAR
;
1154 return WINED3D_TEXF_POINT
;
1157 static enum wined3d_texture_filter_type
wined3d_texture_filter_mag_from_d3d11(enum D3D11_FILTER f
)
1159 if (D3D11_DECODE_MAG_FILTER(f
) == D3D11_FILTER_TYPE_LINEAR
)
1160 return WINED3D_TEXF_LINEAR
;
1161 return WINED3D_TEXF_POINT
;
1164 static enum wined3d_texture_filter_type
wined3d_texture_filter_min_from_d3d11(enum D3D11_FILTER f
)
1166 if (D3D11_DECODE_MIN_FILTER(f
) == D3D11_FILTER_TYPE_LINEAR
)
1167 return WINED3D_TEXF_LINEAR
;
1168 return WINED3D_TEXF_POINT
;
1171 static BOOL
wined3d_texture_compare_from_d3d11(enum D3D11_FILTER f
)
1173 return D3D11_DECODE_IS_COMPARISON_FILTER(f
);
1176 static enum wined3d_cmp_func
wined3d_cmp_func_from_d3d11(D3D11_COMPARISON_FUNC f
)
1178 return (enum wined3d_cmp_func
)f
;
1181 HRESULT
d3d_sampler_state_init(struct d3d_sampler_state
*state
, struct d3d_device
*device
,
1182 const D3D11_SAMPLER_DESC
*desc
)
1184 struct wined3d_sampler_desc wined3d_desc
;
1187 state
->ID3D11SamplerState_iface
.lpVtbl
= &d3d11_sampler_state_vtbl
;
1188 state
->ID3D10SamplerState_iface
.lpVtbl
= &d3d10_sampler_state_vtbl
;
1189 state
->refcount
= 1;
1190 wined3d_mutex_lock();
1191 wined3d_private_store_init(&state
->private_store
);
1192 state
->desc
= *desc
;
1194 wined3d_desc
.address_u
= wined3d_texture_address_from_d3d11(desc
->AddressU
);
1195 wined3d_desc
.address_v
= wined3d_texture_address_from_d3d11(desc
->AddressV
);
1196 wined3d_desc
.address_w
= wined3d_texture_address_from_d3d11(desc
->AddressW
);
1197 memcpy(wined3d_desc
.border_color
, desc
->BorderColor
, sizeof(wined3d_desc
.border_color
));
1198 wined3d_desc
.mag_filter
= wined3d_texture_filter_mag_from_d3d11(desc
->Filter
);
1199 wined3d_desc
.min_filter
= wined3d_texture_filter_min_from_d3d11(desc
->Filter
);
1200 wined3d_desc
.mip_filter
= wined3d_texture_filter_mip_from_d3d11(desc
->Filter
);
1201 wined3d_desc
.lod_bias
= desc
->MipLODBias
;
1202 wined3d_desc
.min_lod
= desc
->MinLOD
;
1203 wined3d_desc
.max_lod
= desc
->MaxLOD
;
1204 wined3d_desc
.max_anisotropy
= D3D11_DECODE_IS_ANISOTROPIC_FILTER(desc
->Filter
) ? desc
->MaxAnisotropy
: 1;
1205 wined3d_desc
.compare
= wined3d_texture_compare_from_d3d11(desc
->Filter
);
1206 wined3d_desc
.comparison_func
= wined3d_cmp_func_from_d3d11(desc
->ComparisonFunc
);
1207 wined3d_desc
.srgb_decode
= TRUE
;
1209 if (FAILED(hr
= wined3d_sampler_create(device
->wined3d_device
, &wined3d_desc
, state
, &state
->wined3d_sampler
)))
1211 WARN("Failed to create wined3d sampler, hr %#x.\n", hr
);
1212 wined3d_private_store_cleanup(&state
->private_store
);
1213 wined3d_mutex_unlock();
1217 if (wine_rb_put(&device
->sampler_states
, desc
, &state
->entry
) == -1)
1219 ERR("Failed to insert sampler state entry.\n");
1220 wined3d_sampler_decref(state
->wined3d_sampler
);
1221 wined3d_private_store_cleanup(&state
->private_store
);
1222 wined3d_mutex_unlock();
1225 wined3d_mutex_unlock();
1227 state
->device
= &device
->ID3D11Device_iface
;
1228 ID3D11Device_AddRef(state
->device
);
1233 struct d3d_sampler_state
*unsafe_impl_from_ID3D11SamplerState(ID3D11SamplerState
*iface
)
1237 assert(iface
->lpVtbl
== &d3d11_sampler_state_vtbl
);
1239 return impl_from_ID3D11SamplerState(iface
);
1242 struct d3d_sampler_state
*unsafe_impl_from_ID3D10SamplerState(ID3D10SamplerState
*iface
)
1246 assert(iface
->lpVtbl
== &d3d10_sampler_state_vtbl
);
1248 return impl_from_ID3D10SamplerState(iface
);