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 static HRESULT
shdr_handler(const char *data
, DWORD data_size
, DWORD tag
, void *ctx
)
29 struct wined3d_shader_desc
*desc
= ctx
;
35 if (FAILED(hr
= shader_parse_signature(data
, data_size
, &desc
->input_signature
)))
40 if (FAILED(hr
= shader_parse_signature(data
, data_size
, &desc
->output_signature
)))
47 FIXME("Multiple SHDR/SHEX chunks.\n");
48 desc
->byte_code
= (const DWORD
*)data
;
52 FIXME("Unhandled chunk %s\n", debugstr_an((const char *)&tag
, 4));
59 static HRESULT
shader_extract_from_dxbc(const void *dxbc
, SIZE_T dxbc_length
, struct wined3d_shader_desc
*desc
)
63 desc
->byte_code
= NULL
;
64 memset(&desc
->input_signature
, 0, sizeof(desc
->input_signature
));
65 memset(&desc
->output_signature
, 0, sizeof(desc
->output_signature
));
67 hr
= parse_dxbc(dxbc
, dxbc_length
, shdr_handler
, desc
);
73 FIXME("Failed to parse shader, hr %#x.\n", hr
);
74 shader_free_signature(&desc
->input_signature
);
75 shader_free_signature(&desc
->output_signature
);
81 HRESULT
shader_parse_signature(const char *data
, DWORD data_size
, struct wined3d_shader_signature
*s
)
83 struct wined3d_shader_signature_element
*e
;
84 const char *ptr
= data
;
88 read_dword(&ptr
, &count
);
89 TRACE("%u elements\n", count
);
91 skip_dword_unknown(&ptr
, 1);
93 e
= HeapAlloc(GetProcessHeap(), 0, count
* sizeof(*e
));
96 ERR("Failed to allocate input signature memory.\n");
100 for (i
= 0; i
< count
; ++i
)
104 read_dword(&ptr
, &name_offset
);
105 e
[i
].semantic_name
= data
+ name_offset
;
106 read_dword(&ptr
, &e
[i
].semantic_idx
);
107 read_dword(&ptr
, &e
[i
].sysval_semantic
);
108 read_dword(&ptr
, &e
[i
].component_type
);
109 read_dword(&ptr
, &e
[i
].register_idx
);
110 read_dword(&ptr
, &e
[i
].mask
);
112 TRACE("semantic: %s, semantic idx: %u, sysval_semantic %#x, "
113 "type %u, register idx: %u, use_mask %#x, input_mask %#x\n",
114 debugstr_a(e
[i
].semantic_name
), e
[i
].semantic_idx
, e
[i
].sysval_semantic
,
115 e
[i
].component_type
, e
[i
].register_idx
, (e
[i
].mask
>> 8) & 0xff, e
[i
].mask
& 0xff);
119 s
->element_count
= count
;
124 void shader_free_signature(struct wined3d_shader_signature
*s
)
126 HeapFree(GetProcessHeap(), 0, s
->elements
);
129 /* ID3D11VertexShader methods */
131 static inline struct d3d_vertex_shader
*impl_from_ID3D11VertexShader(ID3D11VertexShader
*iface
)
133 return CONTAINING_RECORD(iface
, struct d3d_vertex_shader
, ID3D11VertexShader_iface
);
136 static HRESULT STDMETHODCALLTYPE
d3d11_vertex_shader_QueryInterface(ID3D11VertexShader
*iface
,
137 REFIID riid
, void **object
)
139 struct d3d_vertex_shader
*shader
= impl_from_ID3D11VertexShader(iface
);
141 TRACE("iface %p, riid %s, object %p.\n", iface
, debugstr_guid(riid
), object
);
143 if (IsEqualGUID(riid
, &IID_ID3D11VertexShader
)
144 || IsEqualGUID(riid
, &IID_ID3D11DeviceChild
)
145 || IsEqualGUID(riid
, &IID_IUnknown
))
147 ID3D11VertexShader_AddRef(iface
);
152 if (IsEqualGUID(riid
, &IID_ID3D10VertexShader
)
153 || IsEqualGUID(riid
, &IID_ID3D10DeviceChild
))
155 IUnknown_AddRef(&shader
->ID3D10VertexShader_iface
);
156 *object
= &shader
->ID3D10VertexShader_iface
;
160 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
163 return E_NOINTERFACE
;
166 static ULONG STDMETHODCALLTYPE
d3d11_vertex_shader_AddRef(ID3D11VertexShader
*iface
)
168 struct d3d_vertex_shader
*shader
= impl_from_ID3D11VertexShader(iface
);
169 ULONG refcount
= InterlockedIncrement(&shader
->refcount
);
171 TRACE("%p increasing refcount to %u.\n", shader
, refcount
);
175 ID3D11Device_AddRef(shader
->device
);
176 wined3d_mutex_lock();
177 wined3d_shader_incref(shader
->wined3d_shader
);
178 wined3d_mutex_unlock();
184 static ULONG STDMETHODCALLTYPE
d3d11_vertex_shader_Release(ID3D11VertexShader
*iface
)
186 struct d3d_vertex_shader
*shader
= impl_from_ID3D11VertexShader(iface
);
187 ULONG refcount
= InterlockedDecrement(&shader
->refcount
);
189 TRACE("%p decreasing refcount to %u.\n", shader
, refcount
);
193 ID3D11Device
*device
= shader
->device
;
195 wined3d_mutex_lock();
196 wined3d_shader_decref(shader
->wined3d_shader
);
197 wined3d_mutex_unlock();
198 /* Release the device last, it may cause the wined3d device to be
200 ID3D11Device_Release(device
);
206 static void STDMETHODCALLTYPE
d3d11_vertex_shader_GetDevice(ID3D11VertexShader
*iface
,
207 ID3D11Device
**device
)
209 struct d3d_vertex_shader
*shader
= impl_from_ID3D11VertexShader(iface
);
211 TRACE("iface %p, device %p.\n", iface
, device
);
213 *device
= shader
->device
;
214 ID3D11Device_AddRef(*device
);
217 static HRESULT STDMETHODCALLTYPE
d3d11_vertex_shader_GetPrivateData(ID3D11VertexShader
*iface
,
218 REFGUID guid
, UINT
*data_size
, void *data
)
220 struct d3d_vertex_shader
*shader
= impl_from_ID3D11VertexShader(iface
);
222 TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface
, debugstr_guid(guid
), data_size
, data
);
224 return d3d_get_private_data(&shader
->private_store
, guid
, data_size
, data
);
227 static HRESULT STDMETHODCALLTYPE
d3d11_vertex_shader_SetPrivateData(ID3D11VertexShader
*iface
,
228 REFGUID guid
, UINT data_size
, const void *data
)
230 struct d3d_vertex_shader
*shader
= impl_from_ID3D11VertexShader(iface
);
232 TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface
, debugstr_guid(guid
), data_size
, data
);
234 return d3d_set_private_data(&shader
->private_store
, guid
, data_size
, data
);
237 static HRESULT STDMETHODCALLTYPE
d3d11_vertex_shader_SetPrivateDataInterface(ID3D11VertexShader
*iface
,
238 REFGUID guid
, const IUnknown
*data
)
240 struct d3d_vertex_shader
*shader
= impl_from_ID3D11VertexShader(iface
);
242 TRACE("iface %p, guid %s, data %p.\n", iface
, debugstr_guid(guid
), data
);
244 return d3d_set_private_data_interface(&shader
->private_store
, guid
, data
);
247 static const struct ID3D11VertexShaderVtbl d3d11_vertex_shader_vtbl
=
249 /* IUnknown methods */
250 d3d11_vertex_shader_QueryInterface
,
251 d3d11_vertex_shader_AddRef
,
252 d3d11_vertex_shader_Release
,
253 /* ID3D11DeviceChild methods */
254 d3d11_vertex_shader_GetDevice
,
255 d3d11_vertex_shader_GetPrivateData
,
256 d3d11_vertex_shader_SetPrivateData
,
257 d3d11_vertex_shader_SetPrivateDataInterface
,
260 /* ID3D10VertexShader methods */
262 static inline struct d3d_vertex_shader
*impl_from_ID3D10VertexShader(ID3D10VertexShader
*iface
)
264 return CONTAINING_RECORD(iface
, struct d3d_vertex_shader
, ID3D10VertexShader_iface
);
267 /* IUnknown methods */
269 static HRESULT STDMETHODCALLTYPE
d3d10_vertex_shader_QueryInterface(ID3D10VertexShader
*iface
,
270 REFIID riid
, void **object
)
272 struct d3d_vertex_shader
*shader
= impl_from_ID3D10VertexShader(iface
);
274 TRACE("iface %p, riid %s, object %p.\n", iface
, debugstr_guid(riid
), object
);
276 return d3d11_vertex_shader_QueryInterface(&shader
->ID3D11VertexShader_iface
, riid
, object
);
279 static ULONG STDMETHODCALLTYPE
d3d10_vertex_shader_AddRef(ID3D10VertexShader
*iface
)
281 struct d3d_vertex_shader
*shader
= impl_from_ID3D10VertexShader(iface
);
283 TRACE("iface %p.\n", iface
);
285 return d3d11_vertex_shader_AddRef(&shader
->ID3D11VertexShader_iface
);
288 static ULONG STDMETHODCALLTYPE
d3d10_vertex_shader_Release(ID3D10VertexShader
*iface
)
290 struct d3d_vertex_shader
*shader
= impl_from_ID3D10VertexShader(iface
);
292 TRACE("iface %p.\n", iface
);
294 return d3d11_vertex_shader_Release(&shader
->ID3D11VertexShader_iface
);
297 /* ID3D10DeviceChild methods */
299 static void STDMETHODCALLTYPE
d3d10_vertex_shader_GetDevice(ID3D10VertexShader
*iface
, ID3D10Device
**device
)
301 struct d3d_vertex_shader
*shader
= impl_from_ID3D10VertexShader(iface
);
303 TRACE("iface %p, device %p.\n", iface
, device
);
305 ID3D11Device_QueryInterface(shader
->device
, &IID_ID3D10Device
, (void **)device
);
308 static HRESULT STDMETHODCALLTYPE
d3d10_vertex_shader_GetPrivateData(ID3D10VertexShader
*iface
,
309 REFGUID guid
, UINT
*data_size
, void *data
)
311 struct d3d_vertex_shader
*shader
= impl_from_ID3D10VertexShader(iface
);
313 TRACE("iface %p, guid %s, data_size %p, data %p.\n",
314 iface
, debugstr_guid(guid
), data_size
, data
);
316 return d3d_get_private_data(&shader
->private_store
, guid
, data_size
, data
);
319 static HRESULT STDMETHODCALLTYPE
d3d10_vertex_shader_SetPrivateData(ID3D10VertexShader
*iface
,
320 REFGUID guid
, UINT data_size
, const void *data
)
322 struct d3d_vertex_shader
*shader
= impl_from_ID3D10VertexShader(iface
);
324 TRACE("iface %p, guid %s, data_size %u, data %p.\n",
325 iface
, debugstr_guid(guid
), data_size
, data
);
327 return d3d_set_private_data(&shader
->private_store
, guid
, data_size
, data
);
330 static HRESULT STDMETHODCALLTYPE
d3d10_vertex_shader_SetPrivateDataInterface(ID3D10VertexShader
*iface
,
331 REFGUID guid
, const IUnknown
*data
)
333 struct d3d_vertex_shader
*shader
= impl_from_ID3D10VertexShader(iface
);
335 TRACE("iface %p, guid %s, data %p.\n", iface
, debugstr_guid(guid
), data
);
337 return d3d_set_private_data_interface(&shader
->private_store
, guid
, data
);
340 static const struct ID3D10VertexShaderVtbl d3d10_vertex_shader_vtbl
=
342 /* IUnknown methods */
343 d3d10_vertex_shader_QueryInterface
,
344 d3d10_vertex_shader_AddRef
,
345 d3d10_vertex_shader_Release
,
346 /* ID3D10DeviceChild methods */
347 d3d10_vertex_shader_GetDevice
,
348 d3d10_vertex_shader_GetPrivateData
,
349 d3d10_vertex_shader_SetPrivateData
,
350 d3d10_vertex_shader_SetPrivateDataInterface
,
353 static void STDMETHODCALLTYPE
d3d_vertex_shader_wined3d_object_destroyed(void *parent
)
355 struct d3d_vertex_shader
*shader
= parent
;
357 wined3d_private_store_cleanup(&shader
->private_store
);
358 HeapFree(GetProcessHeap(), 0, parent
);
361 static const struct wined3d_parent_ops d3d_vertex_shader_wined3d_parent_ops
=
363 d3d_vertex_shader_wined3d_object_destroyed
,
366 static unsigned int d3d_sm_from_feature_level(D3D_FEATURE_LEVEL feature_level
)
368 switch (feature_level
)
370 case D3D_FEATURE_LEVEL_11_1
:
371 case D3D_FEATURE_LEVEL_11_0
:
373 case D3D_FEATURE_LEVEL_10_1
:
374 case D3D_FEATURE_LEVEL_10_0
:
376 case D3D_FEATURE_LEVEL_9_3
:
378 case D3D_FEATURE_LEVEL_9_2
:
379 case D3D_FEATURE_LEVEL_9_1
:
382 ERR("Unexpected feature_level %#x.\n", feature_level
);
387 static HRESULT
d3d_vertex_shader_init(struct d3d_vertex_shader
*shader
, struct d3d_device
*device
,
388 const void *byte_code
, SIZE_T byte_code_length
)
390 struct wined3d_shader_desc desc
;
393 shader
->ID3D11VertexShader_iface
.lpVtbl
= &d3d11_vertex_shader_vtbl
;
394 shader
->ID3D10VertexShader_iface
.lpVtbl
= &d3d10_vertex_shader_vtbl
;
395 shader
->refcount
= 1;
396 wined3d_mutex_lock();
397 wined3d_private_store_init(&shader
->private_store
);
399 if (FAILED(hr
= shader_extract_from_dxbc(byte_code
, byte_code_length
, &desc
)))
401 WARN("Failed to extract shader, hr %#x.\n", hr
);
402 wined3d_private_store_cleanup(&shader
->private_store
);
403 wined3d_mutex_unlock();
406 desc
.max_version
= d3d_sm_from_feature_level(device
->feature_level
);
408 hr
= wined3d_shader_create_vs(device
->wined3d_device
, &desc
, shader
,
409 &d3d_vertex_shader_wined3d_parent_ops
, &shader
->wined3d_shader
);
410 shader_free_signature(&desc
.input_signature
);
411 shader_free_signature(&desc
.output_signature
);
414 WARN("Failed to create wined3d vertex shader, hr %#x.\n", hr
);
415 wined3d_private_store_cleanup(&shader
->private_store
);
416 wined3d_mutex_unlock();
419 wined3d_mutex_unlock();
421 shader
->device
= &device
->ID3D11Device_iface
;
422 ID3D11Device_AddRef(shader
->device
);
427 HRESULT
d3d_vertex_shader_create(struct d3d_device
*device
, const void *byte_code
, SIZE_T byte_code_length
,
428 struct d3d_vertex_shader
**shader
)
430 struct d3d_vertex_shader
*object
;
433 if (!(object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*object
))))
434 return E_OUTOFMEMORY
;
436 if (FAILED(hr
= d3d_vertex_shader_init(object
, device
, byte_code
, byte_code_length
)))
438 WARN("Failed to initialize vertex shader, hr %#x.\n", hr
);
439 HeapFree(GetProcessHeap(), 0, object
);
443 TRACE("Created vertex shader %p.\n", object
);
449 struct d3d_vertex_shader
*unsafe_impl_from_ID3D11VertexShader(ID3D11VertexShader
*iface
)
453 assert(iface
->lpVtbl
== &d3d11_vertex_shader_vtbl
);
455 return impl_from_ID3D11VertexShader(iface
);
458 struct d3d_vertex_shader
*unsafe_impl_from_ID3D10VertexShader(ID3D10VertexShader
*iface
)
462 assert(iface
->lpVtbl
== &d3d10_vertex_shader_vtbl
);
464 return impl_from_ID3D10VertexShader(iface
);
467 /* ID3D11HullShader methods */
469 static inline struct d3d11_hull_shader
*impl_from_ID3D11HullShader(ID3D11HullShader
*iface
)
471 return CONTAINING_RECORD(iface
, struct d3d11_hull_shader
, ID3D11HullShader_iface
);
474 static HRESULT STDMETHODCALLTYPE
d3d11_hull_shader_QueryInterface(ID3D11HullShader
*iface
,
475 REFIID riid
, void **object
)
477 TRACE("iface %p, riid %s, object %p.\n", iface
, debugstr_guid(riid
), object
);
479 if (IsEqualGUID(riid
, &IID_ID3D11HullShader
)
480 || IsEqualGUID(riid
, &IID_ID3D11DeviceChild
)
481 || IsEqualGUID(riid
, &IID_IUnknown
))
483 ID3D11HullShader_AddRef(iface
);
488 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
491 return E_NOINTERFACE
;
494 static ULONG STDMETHODCALLTYPE
d3d11_hull_shader_AddRef(ID3D11HullShader
*iface
)
496 struct d3d11_hull_shader
*shader
= impl_from_ID3D11HullShader(iface
);
497 ULONG refcount
= InterlockedIncrement(&shader
->refcount
);
499 TRACE("%p increasing refcount to %u.\n", shader
, refcount
);
504 static ULONG STDMETHODCALLTYPE
d3d11_hull_shader_Release(ID3D11HullShader
*iface
)
506 struct d3d11_hull_shader
*shader
= impl_from_ID3D11HullShader(iface
);
507 ULONG refcount
= InterlockedDecrement(&shader
->refcount
);
509 TRACE("%p decreasing refcount to %u.\n", shader
, refcount
);
513 ID3D11Device
*device
= shader
->device
;
515 wined3d_mutex_lock();
516 wined3d_shader_decref(shader
->wined3d_shader
);
517 wined3d_mutex_unlock();
519 /* Release the device last, it may cause the wined3d device to be
521 ID3D11Device_Release(device
);
527 static void STDMETHODCALLTYPE
d3d11_hull_shader_GetDevice(ID3D11HullShader
*iface
,
528 ID3D11Device
**device
)
530 struct d3d11_hull_shader
*shader
= impl_from_ID3D11HullShader(iface
);
532 TRACE("iface %p, device %p.\n", iface
, device
);
534 *device
= shader
->device
;
535 ID3D11Device_AddRef(*device
);
538 static HRESULT STDMETHODCALLTYPE
d3d11_hull_shader_GetPrivateData(ID3D11HullShader
*iface
,
539 REFGUID guid
, UINT
*data_size
, void *data
)
541 struct d3d11_hull_shader
*shader
= impl_from_ID3D11HullShader(iface
);
543 TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface
, debugstr_guid(guid
), data_size
, data
);
545 return d3d_get_private_data(&shader
->private_store
, guid
, data_size
, data
);
548 static HRESULT STDMETHODCALLTYPE
d3d11_hull_shader_SetPrivateData(ID3D11HullShader
*iface
,
549 REFGUID guid
, UINT data_size
, const void *data
)
551 struct d3d11_hull_shader
*shader
= impl_from_ID3D11HullShader(iface
);
553 TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface
, debugstr_guid(guid
), data_size
, data
);
555 return d3d_set_private_data(&shader
->private_store
, guid
, data_size
, data
);
558 static HRESULT STDMETHODCALLTYPE
d3d11_hull_shader_SetPrivateDataInterface(ID3D11HullShader
*iface
,
559 REFGUID guid
, const IUnknown
*data
)
561 struct d3d11_hull_shader
*shader
= impl_from_ID3D11HullShader(iface
);
563 TRACE("iface %p, guid %s, data %p.\n", iface
, debugstr_guid(guid
), data
);
565 return d3d_set_private_data_interface(&shader
->private_store
, guid
, data
);
568 static const struct ID3D11HullShaderVtbl d3d11_hull_shader_vtbl
=
570 /* IUnknown methods */
571 d3d11_hull_shader_QueryInterface
,
572 d3d11_hull_shader_AddRef
,
573 d3d11_hull_shader_Release
,
574 /* ID3D11DeviceChild methods */
575 d3d11_hull_shader_GetDevice
,
576 d3d11_hull_shader_GetPrivateData
,
577 d3d11_hull_shader_SetPrivateData
,
578 d3d11_hull_shader_SetPrivateDataInterface
,
581 static void STDMETHODCALLTYPE
d3d11_hull_shader_wined3d_object_destroyed(void *parent
)
583 struct d3d11_hull_shader
*shader
= parent
;
585 wined3d_private_store_cleanup(&shader
->private_store
);
586 HeapFree(GetProcessHeap(), 0, parent
);
589 static const struct wined3d_parent_ops d3d11_hull_shader_wined3d_parent_ops
=
591 d3d11_hull_shader_wined3d_object_destroyed
,
594 static HRESULT
d3d11_hull_shader_init(struct d3d11_hull_shader
*shader
, struct d3d_device
*device
,
595 const void *byte_code
, SIZE_T byte_code_length
)
597 struct wined3d_shader_desc desc
;
600 shader
->ID3D11HullShader_iface
.lpVtbl
= &d3d11_hull_shader_vtbl
;
601 shader
->refcount
= 1;
602 wined3d_mutex_lock();
603 wined3d_private_store_init(&shader
->private_store
);
605 if (FAILED(hr
= shader_extract_from_dxbc(byte_code
, byte_code_length
, &desc
)))
607 WARN("Failed to extract shader, hr %#x.\n", hr
);
608 wined3d_private_store_cleanup(&shader
->private_store
);
609 wined3d_mutex_unlock();
612 desc
.max_version
= d3d_sm_from_feature_level(device
->feature_level
);
614 hr
= wined3d_shader_create_hs(device
->wined3d_device
, &desc
, shader
,
615 &d3d11_hull_shader_wined3d_parent_ops
, &shader
->wined3d_shader
);
616 shader_free_signature(&desc
.input_signature
);
617 shader_free_signature(&desc
.output_signature
);
620 WARN("Failed to create wined3d hull shader, hr %#x.\n", hr
);
621 wined3d_private_store_cleanup(&shader
->private_store
);
622 wined3d_mutex_unlock();
625 wined3d_mutex_unlock();
627 shader
->device
= &device
->ID3D11Device_iface
;
628 ID3D11Device_AddRef(shader
->device
);
633 HRESULT
d3d11_hull_shader_create(struct d3d_device
*device
, const void *byte_code
, SIZE_T byte_code_length
,
634 struct d3d11_hull_shader
**shader
)
636 struct d3d11_hull_shader
*object
;
639 if (!(object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*object
))))
640 return E_OUTOFMEMORY
;
642 if (FAILED(hr
= d3d11_hull_shader_init(object
, device
, byte_code
, byte_code_length
)))
644 HeapFree(GetProcessHeap(), 0, object
);
648 TRACE("Created hull shader %p.\n", object
);
654 /* ID3D11DomainShader methods */
656 static inline struct d3d11_domain_shader
*impl_from_ID3D11DomainShader(ID3D11DomainShader
*iface
)
658 return CONTAINING_RECORD(iface
, struct d3d11_domain_shader
, ID3D11DomainShader_iface
);
661 static HRESULT STDMETHODCALLTYPE
d3d11_domain_shader_QueryInterface(ID3D11DomainShader
*iface
,
662 REFIID riid
, void **object
)
664 TRACE("iface %p, riid %s, object %p.\n", iface
, debugstr_guid(riid
), object
);
666 if (IsEqualGUID(riid
, &IID_ID3D11DomainShader
)
667 || IsEqualGUID(riid
, &IID_ID3D11DeviceChild
)
668 || IsEqualGUID(riid
, &IID_IUnknown
))
670 ID3D11DomainShader_AddRef(iface
);
675 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
678 return E_NOINTERFACE
;
681 static ULONG STDMETHODCALLTYPE
d3d11_domain_shader_AddRef(ID3D11DomainShader
*iface
)
683 struct d3d11_domain_shader
*shader
= impl_from_ID3D11DomainShader(iface
);
684 ULONG refcount
= InterlockedIncrement(&shader
->refcount
);
686 TRACE("%p increasing refcount to %u.\n", shader
, refcount
);
691 static ULONG STDMETHODCALLTYPE
d3d11_domain_shader_Release(ID3D11DomainShader
*iface
)
693 struct d3d11_domain_shader
*shader
= impl_from_ID3D11DomainShader(iface
);
694 ULONG refcount
= InterlockedDecrement(&shader
->refcount
);
696 TRACE("%p decreasing refcount to %u.\n", shader
, refcount
);
700 ID3D11Device
*device
= shader
->device
;
702 wined3d_mutex_lock();
703 wined3d_shader_decref(shader
->wined3d_shader
);
704 wined3d_mutex_unlock();
706 /* Release the device last, it may cause the wined3d device to be
708 ID3D11Device_Release(device
);
714 static void STDMETHODCALLTYPE
d3d11_domain_shader_GetDevice(ID3D11DomainShader
*iface
,
715 ID3D11Device
**device
)
717 struct d3d11_domain_shader
*shader
= impl_from_ID3D11DomainShader(iface
);
719 TRACE("iface %p, device %p.\n", iface
, device
);
721 *device
= shader
->device
;
722 ID3D11Device_AddRef(*device
);
725 static HRESULT STDMETHODCALLTYPE
d3d11_domain_shader_GetPrivateData(ID3D11DomainShader
*iface
,
726 REFGUID guid
, UINT
*data_size
, void *data
)
728 struct d3d11_domain_shader
*shader
= impl_from_ID3D11DomainShader(iface
);
730 TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface
, debugstr_guid(guid
), data_size
, data
);
732 return d3d_get_private_data(&shader
->private_store
, guid
, data_size
, data
);
735 static HRESULT STDMETHODCALLTYPE
d3d11_domain_shader_SetPrivateData(ID3D11DomainShader
*iface
,
736 REFGUID guid
, UINT data_size
, const void *data
)
738 struct d3d11_domain_shader
*shader
= impl_from_ID3D11DomainShader(iface
);
740 TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface
, debugstr_guid(guid
), data_size
, data
);
742 return d3d_set_private_data(&shader
->private_store
, guid
, data_size
, data
);
745 static HRESULT STDMETHODCALLTYPE
d3d11_domain_shader_SetPrivateDataInterface(ID3D11DomainShader
*iface
,
746 REFGUID guid
, const IUnknown
*data
)
748 struct d3d11_domain_shader
*shader
= impl_from_ID3D11DomainShader(iface
);
750 TRACE("iface %p, guid %s, data %p.\n", iface
, debugstr_guid(guid
), data
);
752 return d3d_set_private_data_interface(&shader
->private_store
, guid
, data
);
755 static const struct ID3D11DomainShaderVtbl d3d11_domain_shader_vtbl
=
757 /* IUnknown methods */
758 d3d11_domain_shader_QueryInterface
,
759 d3d11_domain_shader_AddRef
,
760 d3d11_domain_shader_Release
,
761 /* ID3D11DeviceChild methods */
762 d3d11_domain_shader_GetDevice
,
763 d3d11_domain_shader_GetPrivateData
,
764 d3d11_domain_shader_SetPrivateData
,
765 d3d11_domain_shader_SetPrivateDataInterface
,
768 static void STDMETHODCALLTYPE
d3d11_domain_shader_wined3d_object_destroyed(void *parent
)
770 struct d3d11_domain_shader
*shader
= parent
;
772 wined3d_private_store_cleanup(&shader
->private_store
);
773 HeapFree(GetProcessHeap(), 0, parent
);
776 static const struct wined3d_parent_ops d3d11_domain_shader_wined3d_parent_ops
=
778 d3d11_domain_shader_wined3d_object_destroyed
,
781 static HRESULT
d3d11_domain_shader_init(struct d3d11_domain_shader
*shader
, struct d3d_device
*device
,
782 const void *byte_code
, SIZE_T byte_code_length
)
784 struct wined3d_shader_desc desc
;
787 shader
->ID3D11DomainShader_iface
.lpVtbl
= &d3d11_domain_shader_vtbl
;
788 shader
->refcount
= 1;
789 wined3d_mutex_lock();
790 wined3d_private_store_init(&shader
->private_store
);
792 if (FAILED(hr
= shader_extract_from_dxbc(byte_code
, byte_code_length
, &desc
)))
794 WARN("Failed to extract shader, hr %#x.\n", hr
);
795 wined3d_private_store_cleanup(&shader
->private_store
);
796 wined3d_mutex_unlock();
799 desc
.max_version
= d3d_sm_from_feature_level(device
->feature_level
);
801 hr
= wined3d_shader_create_ds(device
->wined3d_device
, &desc
, shader
,
802 &d3d11_domain_shader_wined3d_parent_ops
, &shader
->wined3d_shader
);
803 shader_free_signature(&desc
.input_signature
);
804 shader_free_signature(&desc
.output_signature
);
807 WARN("Failed to create wined3d domain shader, hr %#x.\n", hr
);
808 wined3d_private_store_cleanup(&shader
->private_store
);
809 wined3d_mutex_unlock();
812 wined3d_mutex_unlock();
814 shader
->device
= &device
->ID3D11Device_iface
;
815 ID3D11Device_AddRef(shader
->device
);
820 HRESULT
d3d11_domain_shader_create(struct d3d_device
*device
, const void *byte_code
, SIZE_T byte_code_length
,
821 struct d3d11_domain_shader
**shader
)
823 struct d3d11_domain_shader
*object
;
826 if (!(object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*object
))))
827 return E_OUTOFMEMORY
;
829 if (FAILED(hr
= d3d11_domain_shader_init(object
, device
, byte_code
, byte_code_length
)))
831 HeapFree(GetProcessHeap(), 0, object
);
835 TRACE("Created domain shader %p.\n", object
);
841 /* ID3D11GeometryShader methods */
843 static inline struct d3d_geometry_shader
*impl_from_ID3D11GeometryShader(ID3D11GeometryShader
*iface
)
845 return CONTAINING_RECORD(iface
, struct d3d_geometry_shader
, ID3D11GeometryShader_iface
);
848 static HRESULT STDMETHODCALLTYPE
d3d11_geometry_shader_QueryInterface(ID3D11GeometryShader
*iface
,
849 REFIID riid
, void **object
)
851 struct d3d_geometry_shader
*shader
= impl_from_ID3D11GeometryShader(iface
);
853 TRACE("iface %p, riid %s, object %p.\n", iface
, debugstr_guid(riid
), object
);
855 if (IsEqualGUID(riid
, &IID_ID3D11GeometryShader
)
856 || IsEqualGUID(riid
, &IID_ID3D11DeviceChild
)
857 || IsEqualGUID(riid
, &IID_IUnknown
))
859 ID3D11GeometryShader_AddRef(iface
);
864 if (IsEqualGUID(riid
, &IID_ID3D10GeometryShader
)
865 || IsEqualGUID(riid
, &IID_ID3D10DeviceChild
))
867 ID3D10GeometryShader_AddRef(&shader
->ID3D10GeometryShader_iface
);
868 *object
= &shader
->ID3D10GeometryShader_iface
;
872 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
875 return E_NOINTERFACE
;
878 static ULONG STDMETHODCALLTYPE
d3d11_geometry_shader_AddRef(ID3D11GeometryShader
*iface
)
880 struct d3d_geometry_shader
*shader
= impl_from_ID3D11GeometryShader(iface
);
881 ULONG refcount
= InterlockedIncrement(&shader
->refcount
);
883 TRACE("%p increasing refcount to %u.\n", shader
, refcount
);
888 static ULONG STDMETHODCALLTYPE
d3d11_geometry_shader_Release(ID3D11GeometryShader
*iface
)
890 struct d3d_geometry_shader
*shader
= impl_from_ID3D11GeometryShader(iface
);
891 ULONG refcount
= InterlockedDecrement(&shader
->refcount
);
893 TRACE("%p decreasing refcount to %u.\n", shader
, refcount
);
897 ID3D11Device
*device
= shader
->device
;
899 wined3d_mutex_lock();
900 wined3d_shader_decref(shader
->wined3d_shader
);
901 wined3d_mutex_unlock();
903 /* Release the device last, it may cause the wined3d device to be
905 ID3D11Device_Release(device
);
911 static void STDMETHODCALLTYPE
d3d11_geometry_shader_GetDevice(ID3D11GeometryShader
*iface
,
912 ID3D11Device
**device
)
914 struct d3d_geometry_shader
*shader
= impl_from_ID3D11GeometryShader(iface
);
916 TRACE("iface %p, device %p.\n", iface
, device
);
918 *device
= shader
->device
;
919 ID3D11Device_AddRef(*device
);
922 static HRESULT STDMETHODCALLTYPE
d3d11_geometry_shader_GetPrivateData(ID3D11GeometryShader
*iface
,
923 REFGUID guid
, UINT
*data_size
, void *data
)
925 struct d3d_geometry_shader
*shader
= impl_from_ID3D11GeometryShader(iface
);
927 TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface
, debugstr_guid(guid
), data_size
, data
);
929 return d3d_get_private_data(&shader
->private_store
, guid
, data_size
, data
);
932 static HRESULT STDMETHODCALLTYPE
d3d11_geometry_shader_SetPrivateData(ID3D11GeometryShader
*iface
,
933 REFGUID guid
, UINT data_size
, const void *data
)
935 struct d3d_geometry_shader
*shader
= impl_from_ID3D11GeometryShader(iface
);
937 TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface
, debugstr_guid(guid
), data_size
, data
);
939 return d3d_set_private_data(&shader
->private_store
, guid
, data_size
, data
);
942 static HRESULT STDMETHODCALLTYPE
d3d11_geometry_shader_SetPrivateDataInterface(ID3D11GeometryShader
*iface
,
943 REFGUID guid
, const IUnknown
*data
)
945 struct d3d_geometry_shader
*shader
= impl_from_ID3D11GeometryShader(iface
);
947 TRACE("iface %p, guid %s, data %p.\n", iface
, debugstr_guid(guid
), data
);
949 return d3d_set_private_data_interface(&shader
->private_store
, guid
, data
);
952 static const struct ID3D11GeometryShaderVtbl d3d11_geometry_shader_vtbl
=
954 /* IUnknown methods */
955 d3d11_geometry_shader_QueryInterface
,
956 d3d11_geometry_shader_AddRef
,
957 d3d11_geometry_shader_Release
,
958 /* ID3D11DeviceChild methods */
959 d3d11_geometry_shader_GetDevice
,
960 d3d11_geometry_shader_GetPrivateData
,
961 d3d11_geometry_shader_SetPrivateData
,
962 d3d11_geometry_shader_SetPrivateDataInterface
,
965 /* ID3D10GeometryShader methods */
967 static inline struct d3d_geometry_shader
*impl_from_ID3D10GeometryShader(ID3D10GeometryShader
*iface
)
969 return CONTAINING_RECORD(iface
, struct d3d_geometry_shader
, ID3D10GeometryShader_iface
);
972 /* IUnknown methods */
974 static HRESULT STDMETHODCALLTYPE
d3d10_geometry_shader_QueryInterface(ID3D10GeometryShader
*iface
,
975 REFIID riid
, void **object
)
977 struct d3d_geometry_shader
*shader
= impl_from_ID3D10GeometryShader(iface
);
979 TRACE("iface %p, riid %s, object %p.\n", iface
, debugstr_guid(riid
), object
);
981 return d3d11_geometry_shader_QueryInterface(&shader
->ID3D11GeometryShader_iface
, riid
, object
);
984 static ULONG STDMETHODCALLTYPE
d3d10_geometry_shader_AddRef(ID3D10GeometryShader
*iface
)
986 struct d3d_geometry_shader
*shader
= impl_from_ID3D10GeometryShader(iface
);
988 TRACE("iface %p.\n", iface
);
990 return d3d11_geometry_shader_AddRef(&shader
->ID3D11GeometryShader_iface
);
993 static ULONG STDMETHODCALLTYPE
d3d10_geometry_shader_Release(ID3D10GeometryShader
*iface
)
995 struct d3d_geometry_shader
*shader
= impl_from_ID3D10GeometryShader(iface
);
997 TRACE("iface %p.\n", iface
);
999 return d3d11_geometry_shader_Release(&shader
->ID3D11GeometryShader_iface
);
1002 /* ID3D10DeviceChild methods */
1004 static void STDMETHODCALLTYPE
d3d10_geometry_shader_GetDevice(ID3D10GeometryShader
*iface
, ID3D10Device
**device
)
1006 struct d3d_geometry_shader
*shader
= impl_from_ID3D10GeometryShader(iface
);
1008 TRACE("iface %p, device %p.\n", iface
, device
);
1010 ID3D11Device_QueryInterface(shader
->device
, &IID_ID3D10Device
, (void **)device
);
1013 static HRESULT STDMETHODCALLTYPE
d3d10_geometry_shader_GetPrivateData(ID3D10GeometryShader
*iface
,
1014 REFGUID guid
, UINT
*data_size
, void *data
)
1016 struct d3d_geometry_shader
*shader
= impl_from_ID3D10GeometryShader(iface
);
1018 TRACE("iface %p, guid %s, data_size %p, data %p.\n",
1019 iface
, debugstr_guid(guid
), data_size
, data
);
1021 return d3d_get_private_data(&shader
->private_store
, guid
, data_size
, data
);
1024 static HRESULT STDMETHODCALLTYPE
d3d10_geometry_shader_SetPrivateData(ID3D10GeometryShader
*iface
,
1025 REFGUID guid
, UINT data_size
, const void *data
)
1027 struct d3d_geometry_shader
*shader
= impl_from_ID3D10GeometryShader(iface
);
1029 TRACE("iface %p, guid %s, data_size %u, data %p.\n",
1030 iface
, debugstr_guid(guid
), data_size
, data
);
1032 return d3d_set_private_data(&shader
->private_store
, guid
, data_size
, data
);
1035 static HRESULT STDMETHODCALLTYPE
d3d10_geometry_shader_SetPrivateDataInterface(ID3D10GeometryShader
*iface
,
1036 REFGUID guid
, const IUnknown
*data
)
1038 struct d3d_geometry_shader
*shader
= impl_from_ID3D10GeometryShader(iface
);
1040 TRACE("iface %p, guid %s, data %p.\n", iface
, debugstr_guid(guid
), data
);
1042 return d3d_set_private_data_interface(&shader
->private_store
, guid
, data
);
1045 static const struct ID3D10GeometryShaderVtbl d3d10_geometry_shader_vtbl
=
1047 /* IUnknown methods */
1048 d3d10_geometry_shader_QueryInterface
,
1049 d3d10_geometry_shader_AddRef
,
1050 d3d10_geometry_shader_Release
,
1051 /* ID3D10DeviceChild methods */
1052 d3d10_geometry_shader_GetDevice
,
1053 d3d10_geometry_shader_GetPrivateData
,
1054 d3d10_geometry_shader_SetPrivateData
,
1055 d3d10_geometry_shader_SetPrivateDataInterface
,
1058 static void STDMETHODCALLTYPE
d3d_geometry_shader_wined3d_object_destroyed(void *parent
)
1060 struct d3d_geometry_shader
*shader
= parent
;
1062 wined3d_private_store_cleanup(&shader
->private_store
);
1063 HeapFree(GetProcessHeap(), 0, parent
);
1066 static const struct wined3d_parent_ops d3d_geometry_shader_wined3d_parent_ops
=
1068 d3d_geometry_shader_wined3d_object_destroyed
,
1071 static HRESULT
d3d_geometry_shader_init(struct d3d_geometry_shader
*shader
, struct d3d_device
*device
,
1072 const void *byte_code
, SIZE_T byte_code_length
)
1074 struct wined3d_shader_desc desc
;
1077 shader
->ID3D11GeometryShader_iface
.lpVtbl
= &d3d11_geometry_shader_vtbl
;
1078 shader
->ID3D10GeometryShader_iface
.lpVtbl
= &d3d10_geometry_shader_vtbl
;
1079 shader
->refcount
= 1;
1080 wined3d_mutex_lock();
1081 wined3d_private_store_init(&shader
->private_store
);
1083 if (FAILED(hr
= shader_extract_from_dxbc(byte_code
, byte_code_length
, &desc
)))
1085 WARN("Failed to extract shader, hr %#x.\n", hr
);
1086 wined3d_private_store_cleanup(&shader
->private_store
);
1087 wined3d_mutex_unlock();
1090 desc
.max_version
= d3d_sm_from_feature_level(device
->feature_level
);
1092 hr
= wined3d_shader_create_gs(device
->wined3d_device
, &desc
, shader
,
1093 &d3d_geometry_shader_wined3d_parent_ops
, &shader
->wined3d_shader
);
1094 shader_free_signature(&desc
.input_signature
);
1095 shader_free_signature(&desc
.output_signature
);
1098 WARN("Failed to create wined3d geometry shader, hr %#x.\n", hr
);
1099 wined3d_private_store_cleanup(&shader
->private_store
);
1100 wined3d_mutex_unlock();
1101 return E_INVALIDARG
;
1103 wined3d_mutex_unlock();
1105 shader
->device
= &device
->ID3D11Device_iface
;
1106 ID3D11Device_AddRef(shader
->device
);
1111 HRESULT
d3d_geometry_shader_create(struct d3d_device
*device
, const void *byte_code
, SIZE_T byte_code_length
,
1112 struct d3d_geometry_shader
**shader
)
1114 struct d3d_geometry_shader
*object
;
1117 if (!(object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*object
))))
1118 return E_OUTOFMEMORY
;
1120 if (FAILED(hr
= d3d_geometry_shader_init(object
, device
, byte_code
, byte_code_length
)))
1122 WARN("Failed to initialize geometry shader, hr %#x.\n", hr
);
1123 HeapFree(GetProcessHeap(), 0, object
);
1127 TRACE("Created geometry shader %p.\n", object
);
1133 struct d3d_geometry_shader
*unsafe_impl_from_ID3D11GeometryShader(ID3D11GeometryShader
*iface
)
1137 assert(iface
->lpVtbl
== &d3d11_geometry_shader_vtbl
);
1139 return impl_from_ID3D11GeometryShader(iface
);
1142 struct d3d_geometry_shader
*unsafe_impl_from_ID3D10GeometryShader(ID3D10GeometryShader
*iface
)
1146 assert(iface
->lpVtbl
== &d3d10_geometry_shader_vtbl
);
1148 return impl_from_ID3D10GeometryShader(iface
);
1151 /* ID3D11PixelShader methods */
1153 static inline struct d3d_pixel_shader
*impl_from_ID3D11PixelShader(ID3D11PixelShader
*iface
)
1155 return CONTAINING_RECORD(iface
, struct d3d_pixel_shader
, ID3D11PixelShader_iface
);
1158 static HRESULT STDMETHODCALLTYPE
d3d11_pixel_shader_QueryInterface(ID3D11PixelShader
*iface
,
1159 REFIID riid
, void **object
)
1161 struct d3d_pixel_shader
*shader
= impl_from_ID3D11PixelShader(iface
);
1163 TRACE("iface %p, riid %s, object %p.\n", iface
, debugstr_guid(riid
), object
);
1165 if (IsEqualGUID(riid
, &IID_ID3D11PixelShader
)
1166 || IsEqualGUID(riid
, &IID_ID3D11DeviceChild
)
1167 || IsEqualGUID(riid
, &IID_IUnknown
))
1169 ID3D11PixelShader_AddRef(iface
);
1174 if (IsEqualGUID(riid
, &IID_ID3D10PixelShader
)
1175 || IsEqualGUID(riid
, &IID_ID3D10DeviceChild
))
1177 IUnknown_AddRef(&shader
->ID3D10PixelShader_iface
);
1178 *object
= &shader
->ID3D10PixelShader_iface
;
1182 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
1185 return E_NOINTERFACE
;
1188 static ULONG STDMETHODCALLTYPE
d3d11_pixel_shader_AddRef(ID3D11PixelShader
*iface
)
1190 struct d3d_pixel_shader
*shader
= impl_from_ID3D11PixelShader(iface
);
1191 ULONG refcount
= InterlockedIncrement(&shader
->refcount
);
1193 TRACE("%p increasing refcount to %u.\n", shader
, refcount
);
1197 ID3D11Device_AddRef(shader
->device
);
1198 wined3d_mutex_lock();
1199 wined3d_shader_incref(shader
->wined3d_shader
);
1200 wined3d_mutex_unlock();
1206 static ULONG STDMETHODCALLTYPE
d3d11_pixel_shader_Release(ID3D11PixelShader
*iface
)
1208 struct d3d_pixel_shader
*shader
= impl_from_ID3D11PixelShader(iface
);
1209 ULONG refcount
= InterlockedDecrement(&shader
->refcount
);
1211 TRACE("%p decreasing refcount to %u.\n", shader
, refcount
);
1215 ID3D11Device
*device
= shader
->device
;
1217 wined3d_mutex_lock();
1218 wined3d_shader_decref(shader
->wined3d_shader
);
1219 wined3d_mutex_unlock();
1220 /* Release the device last, it may cause the wined3d device to be
1222 ID3D11Device_Release(device
);
1228 static void STDMETHODCALLTYPE
d3d11_pixel_shader_GetDevice(ID3D11PixelShader
*iface
,
1229 ID3D11Device
**device
)
1231 struct d3d_pixel_shader
*shader
= impl_from_ID3D11PixelShader(iface
);
1233 TRACE("iface %p, device %p.\n", iface
, device
);
1235 *device
= shader
->device
;
1236 ID3D11Device_AddRef(*device
);
1239 static HRESULT STDMETHODCALLTYPE
d3d11_pixel_shader_GetPrivateData(ID3D11PixelShader
*iface
,
1240 REFGUID guid
, UINT
*data_size
, void *data
)
1242 struct d3d_pixel_shader
*shader
= impl_from_ID3D11PixelShader(iface
);
1244 TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface
, debugstr_guid(guid
), data_size
, data
);
1246 return d3d_get_private_data(&shader
->private_store
, guid
, data_size
, data
);
1249 static HRESULT STDMETHODCALLTYPE
d3d11_pixel_shader_SetPrivateData(ID3D11PixelShader
*iface
,
1250 REFGUID guid
, UINT data_size
, const void *data
)
1252 struct d3d_pixel_shader
*shader
= impl_from_ID3D11PixelShader(iface
);
1254 TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface
, debugstr_guid(guid
), data_size
, data
);
1256 return d3d_set_private_data(&shader
->private_store
, guid
, data_size
, data
);
1259 static HRESULT STDMETHODCALLTYPE
d3d11_pixel_shader_SetPrivateDataInterface(ID3D11PixelShader
*iface
,
1260 REFGUID guid
, const IUnknown
*data
)
1262 struct d3d_pixel_shader
*shader
= impl_from_ID3D11PixelShader(iface
);
1264 TRACE("iface %p, guid %s, data %p.\n", iface
, debugstr_guid(guid
), data
);
1266 return d3d_set_private_data_interface(&shader
->private_store
, guid
, data
);
1269 static const struct ID3D11PixelShaderVtbl d3d11_pixel_shader_vtbl
=
1271 /* IUnknown methods */
1272 d3d11_pixel_shader_QueryInterface
,
1273 d3d11_pixel_shader_AddRef
,
1274 d3d11_pixel_shader_Release
,
1275 /* ID3D11DeviceChild methods */
1276 d3d11_pixel_shader_GetDevice
,
1277 d3d11_pixel_shader_GetPrivateData
,
1278 d3d11_pixel_shader_SetPrivateData
,
1279 d3d11_pixel_shader_SetPrivateDataInterface
,
1282 /* ID3D10PixelShader methods */
1284 static inline struct d3d_pixel_shader
*impl_from_ID3D10PixelShader(ID3D10PixelShader
*iface
)
1286 return CONTAINING_RECORD(iface
, struct d3d_pixel_shader
, ID3D10PixelShader_iface
);
1289 /* IUnknown methods */
1291 static HRESULT STDMETHODCALLTYPE
d3d10_pixel_shader_QueryInterface(ID3D10PixelShader
*iface
,
1292 REFIID riid
, void **object
)
1294 struct d3d_pixel_shader
*shader
= impl_from_ID3D10PixelShader(iface
);
1296 TRACE("iface %p, riid %s, object %p.\n", iface
, debugstr_guid(riid
), object
);
1298 return d3d11_pixel_shader_QueryInterface(&shader
->ID3D11PixelShader_iface
, riid
, object
);
1301 static ULONG STDMETHODCALLTYPE
d3d10_pixel_shader_AddRef(ID3D10PixelShader
*iface
)
1303 struct d3d_pixel_shader
*shader
= impl_from_ID3D10PixelShader(iface
);
1305 TRACE("iface %p.\n", iface
);
1307 return d3d11_pixel_shader_AddRef(&shader
->ID3D11PixelShader_iface
);
1310 static ULONG STDMETHODCALLTYPE
d3d10_pixel_shader_Release(ID3D10PixelShader
*iface
)
1312 struct d3d_pixel_shader
*shader
= impl_from_ID3D10PixelShader(iface
);
1314 TRACE("iface %p.\n", iface
);
1316 return d3d11_pixel_shader_Release(&shader
->ID3D11PixelShader_iface
);
1319 /* ID3D10DeviceChild methods */
1321 static void STDMETHODCALLTYPE
d3d10_pixel_shader_GetDevice(ID3D10PixelShader
*iface
, ID3D10Device
**device
)
1323 struct d3d_pixel_shader
*shader
= impl_from_ID3D10PixelShader(iface
);
1325 TRACE("iface %p, device %p.\n", iface
, device
);
1327 ID3D11Device_QueryInterface(shader
->device
, &IID_ID3D10Device
, (void **)device
);
1330 static HRESULT STDMETHODCALLTYPE
d3d10_pixel_shader_GetPrivateData(ID3D10PixelShader
*iface
,
1331 REFGUID guid
, UINT
*data_size
, void *data
)
1333 struct d3d_pixel_shader
*shader
= impl_from_ID3D10PixelShader(iface
);
1335 TRACE("iface %p, guid %s, data_size %p, data %p.\n",
1336 iface
, debugstr_guid(guid
), data_size
, data
);
1338 return d3d_get_private_data(&shader
->private_store
, guid
, data_size
, data
);
1341 static HRESULT STDMETHODCALLTYPE
d3d10_pixel_shader_SetPrivateData(ID3D10PixelShader
*iface
,
1342 REFGUID guid
, UINT data_size
, const void *data
)
1344 struct d3d_pixel_shader
*shader
= impl_from_ID3D10PixelShader(iface
);
1346 TRACE("iface %p, guid %s, data_size %u, data %p.\n",
1347 iface
, debugstr_guid(guid
), data_size
, data
);
1349 return d3d_set_private_data(&shader
->private_store
, guid
, data_size
, data
);
1352 static HRESULT STDMETHODCALLTYPE
d3d10_pixel_shader_SetPrivateDataInterface(ID3D10PixelShader
*iface
,
1353 REFGUID guid
, const IUnknown
*data
)
1355 struct d3d_pixel_shader
*shader
= impl_from_ID3D10PixelShader(iface
);
1357 TRACE("iface %p, guid %s, data %p.\n", iface
, debugstr_guid(guid
), data
);
1359 return d3d_set_private_data_interface(&shader
->private_store
, guid
, data
);
1362 static const struct ID3D10PixelShaderVtbl d3d10_pixel_shader_vtbl
=
1364 /* IUnknown methods */
1365 d3d10_pixel_shader_QueryInterface
,
1366 d3d10_pixel_shader_AddRef
,
1367 d3d10_pixel_shader_Release
,
1368 /* ID3D10DeviceChild methods */
1369 d3d10_pixel_shader_GetDevice
,
1370 d3d10_pixel_shader_GetPrivateData
,
1371 d3d10_pixel_shader_SetPrivateData
,
1372 d3d10_pixel_shader_SetPrivateDataInterface
,
1375 static void STDMETHODCALLTYPE
d3d_pixel_shader_wined3d_object_destroyed(void *parent
)
1377 struct d3d_pixel_shader
*shader
= parent
;
1379 wined3d_private_store_cleanup(&shader
->private_store
);
1380 HeapFree(GetProcessHeap(), 0, parent
);
1383 static const struct wined3d_parent_ops d3d_pixel_shader_wined3d_parent_ops
=
1385 d3d_pixel_shader_wined3d_object_destroyed
,
1388 static HRESULT
d3d_pixel_shader_init(struct d3d_pixel_shader
*shader
, struct d3d_device
*device
,
1389 const void *byte_code
, SIZE_T byte_code_length
)
1391 struct wined3d_shader_desc desc
;
1394 shader
->ID3D11PixelShader_iface
.lpVtbl
= &d3d11_pixel_shader_vtbl
;
1395 shader
->ID3D10PixelShader_iface
.lpVtbl
= &d3d10_pixel_shader_vtbl
;
1396 shader
->refcount
= 1;
1397 wined3d_mutex_lock();
1398 wined3d_private_store_init(&shader
->private_store
);
1400 if (FAILED(hr
= shader_extract_from_dxbc(byte_code
, byte_code_length
, &desc
)))
1402 WARN("Failed to extract shader, hr %#x.\n", hr
);
1403 wined3d_private_store_cleanup(&shader
->private_store
);
1404 wined3d_mutex_unlock();
1407 desc
.max_version
= d3d_sm_from_feature_level(device
->feature_level
);
1409 hr
= wined3d_shader_create_ps(device
->wined3d_device
, &desc
, shader
,
1410 &d3d_pixel_shader_wined3d_parent_ops
, &shader
->wined3d_shader
);
1411 shader_free_signature(&desc
.input_signature
);
1412 shader_free_signature(&desc
.output_signature
);
1415 WARN("Failed to create wined3d pixel shader, hr %#x.\n", hr
);
1416 wined3d_private_store_cleanup(&shader
->private_store
);
1417 wined3d_mutex_unlock();
1418 return E_INVALIDARG
;
1420 wined3d_mutex_unlock();
1422 shader
->device
= &device
->ID3D11Device_iface
;
1423 ID3D11Device_AddRef(shader
->device
);
1428 HRESULT
d3d_pixel_shader_create(struct d3d_device
*device
, const void *byte_code
, SIZE_T byte_code_length
,
1429 struct d3d_pixel_shader
**shader
)
1431 struct d3d_pixel_shader
*object
;
1434 if (!(object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*object
))))
1435 return E_OUTOFMEMORY
;
1437 if (FAILED(hr
= d3d_pixel_shader_init(object
, device
, byte_code
, byte_code_length
)))
1439 WARN("Failed to initialize pixel shader, hr %#x.\n", hr
);
1440 HeapFree(GetProcessHeap(), 0, object
);
1444 TRACE("Created pixel shader %p.\n", object
);
1450 struct d3d_pixel_shader
*unsafe_impl_from_ID3D11PixelShader(ID3D11PixelShader
*iface
)
1454 assert(iface
->lpVtbl
== &d3d11_pixel_shader_vtbl
);
1456 return impl_from_ID3D11PixelShader(iface
);
1459 struct d3d_pixel_shader
*unsafe_impl_from_ID3D10PixelShader(ID3D10PixelShader
*iface
)
1463 assert(iface
->lpVtbl
== &d3d10_pixel_shader_vtbl
);
1465 return impl_from_ID3D10PixelShader(iface
);
1468 /* ID3D11ClassLinkage methods */
1470 static inline struct d3d11_class_linkage
*impl_from_ID3D11ClassLinkage(ID3D11ClassLinkage
*iface
)
1472 return CONTAINING_RECORD(iface
, struct d3d11_class_linkage
, ID3D11ClassLinkage_iface
);
1475 static HRESULT STDMETHODCALLTYPE
d3d11_class_linkage_QueryInterface(ID3D11ClassLinkage
*iface
,
1476 REFIID riid
, void **object
)
1478 TRACE("iface %p, riid %s, object %p.\n", iface
, debugstr_guid(riid
), object
);
1480 if (IsEqualGUID(riid
, &IID_ID3D11ClassLinkage
)
1481 || IsEqualGUID(riid
, &IID_ID3D11DeviceChild
)
1482 || IsEqualGUID(riid
, &IID_IUnknown
))
1484 ID3D11ClassLinkage_AddRef(*object
= iface
);
1488 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
1491 return E_NOINTERFACE
;
1494 static ULONG STDMETHODCALLTYPE
d3d11_class_linkage_AddRef(ID3D11ClassLinkage
*iface
)
1496 struct d3d11_class_linkage
*class_linkage
= impl_from_ID3D11ClassLinkage(iface
);
1497 ULONG refcount
= InterlockedIncrement(&class_linkage
->refcount
);
1499 TRACE("%p increasing refcount to %u.\n", class_linkage
, refcount
);
1504 static ULONG STDMETHODCALLTYPE
d3d11_class_linkage_Release(ID3D11ClassLinkage
*iface
)
1506 struct d3d11_class_linkage
*class_linkage
= impl_from_ID3D11ClassLinkage(iface
);
1507 ULONG refcount
= InterlockedDecrement(&class_linkage
->refcount
);
1509 TRACE("%p decreasing refcount to %u.\n", class_linkage
, refcount
);
1513 wined3d_private_store_cleanup(&class_linkage
->private_store
);
1514 HeapFree(GetProcessHeap(), 0, class_linkage
);
1520 static void STDMETHODCALLTYPE
d3d11_class_linkage_GetDevice(ID3D11ClassLinkage
*iface
,
1521 ID3D11Device
**device
)
1523 FIXME("iface %p, device %p stub!\n", iface
, device
);
1526 static HRESULT STDMETHODCALLTYPE
d3d11_class_linkage_GetPrivateData(ID3D11ClassLinkage
*iface
,
1527 REFGUID guid
, UINT
*data_size
, void *data
)
1529 struct d3d11_class_linkage
*class_linkage
= impl_from_ID3D11ClassLinkage(iface
);
1531 TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface
, debugstr_guid(guid
), data_size
, data
);
1533 return d3d_get_private_data(&class_linkage
->private_store
, guid
, data_size
, data
);
1536 static HRESULT STDMETHODCALLTYPE
d3d11_class_linkage_SetPrivateData(ID3D11ClassLinkage
*iface
,
1537 REFGUID guid
, UINT data_size
, const void *data
)
1539 struct d3d11_class_linkage
*class_linkage
= impl_from_ID3D11ClassLinkage(iface
);
1541 TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface
, debugstr_guid(guid
), data_size
, data
);
1543 return d3d_set_private_data(&class_linkage
->private_store
, guid
, data_size
, data
);
1546 static HRESULT STDMETHODCALLTYPE
d3d11_class_linkage_SetPrivateDataInterface(ID3D11ClassLinkage
*iface
,
1547 REFGUID guid
, const IUnknown
*data
)
1549 struct d3d11_class_linkage
*class_linkage
= impl_from_ID3D11ClassLinkage(iface
);
1551 TRACE("iface %p, guid %s, data %p.\n", iface
, debugstr_guid(guid
), data
);
1553 return d3d_set_private_data_interface(&class_linkage
->private_store
, guid
, data
);
1556 static HRESULT STDMETHODCALLTYPE
d3d11_class_linkage_GetClassInstance(ID3D11ClassLinkage
*iface
,
1557 const char *instance_name
, UINT instance_index
, ID3D11ClassInstance
**class_instance
)
1559 FIXME("iface %p, instance_name %s, instance_index %u, class_instance %p stub!\n",
1560 iface
, debugstr_a(instance_name
), instance_index
, class_instance
);
1565 static HRESULT STDMETHODCALLTYPE
d3d11_class_linkage_CreateClassInstance(ID3D11ClassLinkage
*iface
,
1566 const char *type_name
, UINT cb_offset
, UINT cb_vector_offset
, UINT texture_offset
,
1567 UINT sampler_offset
, ID3D11ClassInstance
**class_instance
)
1569 FIXME("iface %p, type_name %s, cb_offset %u, cb_vector_offset %u, texture_offset %u, "
1570 "sampler_offset %u, class_instance %p stub!\n",
1571 iface
, debugstr_a(type_name
), cb_offset
, cb_vector_offset
, texture_offset
,
1572 sampler_offset
, class_instance
);
1577 static const struct ID3D11ClassLinkageVtbl d3d11_class_linkage_vtbl
=
1579 /* IUnknown methods */
1580 d3d11_class_linkage_QueryInterface
,
1581 d3d11_class_linkage_AddRef
,
1582 d3d11_class_linkage_Release
,
1583 /* ID3D11DeviceChild methods */
1584 d3d11_class_linkage_GetDevice
,
1585 d3d11_class_linkage_GetPrivateData
,
1586 d3d11_class_linkage_SetPrivateData
,
1587 d3d11_class_linkage_SetPrivateDataInterface
,
1588 /* ID3D11ClassLinkage methods */
1589 d3d11_class_linkage_GetClassInstance
,
1590 d3d11_class_linkage_CreateClassInstance
,
1593 HRESULT
d3d11_class_linkage_create(struct d3d_device
*device
, struct d3d11_class_linkage
**class_linkage
)
1595 struct d3d11_class_linkage
*object
;
1597 if (!(object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*object
))))
1598 return E_OUTOFMEMORY
;
1600 object
->ID3D11ClassLinkage_iface
.lpVtbl
= &d3d11_class_linkage_vtbl
;
1601 object
->refcount
= 1;
1602 wined3d_private_store_init(&object
->private_store
);
1604 TRACE("Created class linkage %p.\n", object
);
1605 *class_linkage
= object
;