d3d11: Get rid of struct d3d_shader_info.
[wine.git] / dlls / d3d11 / shader.c
blobf8647ff763e20563c4eac8f0c46b17d2ee617298
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 #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;
30 HRESULT hr;
32 switch (tag)
34 case TAG_ISGN:
35 if (FAILED(hr = shader_parse_signature(data, data_size, &desc->input_signature)))
36 return hr;
37 break;
39 case TAG_OSGN:
40 if (FAILED(hr = shader_parse_signature(data, data_size, &desc->output_signature)))
41 return hr;
42 break;
44 case TAG_SHDR:
45 case TAG_SHEX:
46 if (desc->byte_code)
47 FIXME("Multiple SHDR/SHEX chunks.\n");
48 desc->byte_code = (const DWORD *)data;
49 break;
51 default:
52 FIXME("Unhandled chunk %s\n", debugstr_an((const char *)&tag, 4));
53 break;
56 return S_OK;
59 static HRESULT shader_extract_from_dxbc(const void *dxbc, SIZE_T dxbc_length, struct wined3d_shader_desc *desc)
61 HRESULT hr;
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);
68 if (!desc->byte_code)
69 hr = E_INVALIDARG;
71 if (FAILED(hr))
73 FIXME("Failed to parse shader, hr %#x.\n", hr);
74 shader_free_signature(&desc->input_signature);
75 shader_free_signature(&desc->output_signature);
78 return hr;
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;
85 unsigned int i;
86 DWORD count;
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));
94 if (!e)
96 ERR("Failed to allocate input signature memory.\n");
97 return E_OUTOFMEMORY;
100 for (i = 0; i < count; ++i)
102 UINT name_offset;
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);
118 s->elements = e;
119 s->element_count = count;
121 return S_OK;
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);
148 *object = iface;
149 return S_OK;
152 if (IsEqualGUID(riid, &IID_ID3D10VertexShader)
153 || IsEqualGUID(riid, &IID_ID3D10DeviceChild))
155 IUnknown_AddRef(&shader->ID3D10VertexShader_iface);
156 *object = &shader->ID3D10VertexShader_iface;
157 return S_OK;
160 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
162 *object = NULL;
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);
173 if (refcount == 1)
175 ID3D11Device_AddRef(shader->device);
176 wined3d_mutex_lock();
177 wined3d_shader_incref(shader->wined3d_shader);
178 wined3d_mutex_unlock();
181 return refcount;
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);
191 if (!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
199 * destroyed. */
200 ID3D11Device_Release(device);
203 return refcount;
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:
372 return 5;
373 case D3D_FEATURE_LEVEL_10_1:
374 case D3D_FEATURE_LEVEL_10_0:
375 return 4;
376 case D3D_FEATURE_LEVEL_9_3:
377 return 3;
378 case D3D_FEATURE_LEVEL_9_2:
379 case D3D_FEATURE_LEVEL_9_1:
380 return 2;
381 default:
382 ERR("Unexpected feature_level %#x.\n", feature_level);
384 return 0;
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;
391 HRESULT hr;
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();
404 return hr;
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);
412 if (FAILED(hr))
414 WARN("Failed to create wined3d vertex shader, hr %#x.\n", hr);
415 wined3d_private_store_cleanup(&shader->private_store);
416 wined3d_mutex_unlock();
417 return E_INVALIDARG;
419 wined3d_mutex_unlock();
421 shader->device = &device->ID3D11Device_iface;
422 ID3D11Device_AddRef(shader->device);
424 return S_OK;
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;
431 HRESULT hr;
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);
440 return hr;
443 TRACE("Created vertex shader %p.\n", object);
444 *shader = object;
446 return S_OK;
449 struct d3d_vertex_shader *unsafe_impl_from_ID3D11VertexShader(ID3D11VertexShader *iface)
451 if (!iface)
452 return NULL;
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)
460 if (!iface)
461 return NULL;
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);
484 *object = iface;
485 return S_OK;
488 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
490 *object = NULL;
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);
501 return 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);
511 if (!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
520 * destroyed. */
521 ID3D11Device_Release(device);
524 return refcount;
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;
598 HRESULT hr;
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();
610 return hr;
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);
618 if (FAILED(hr))
620 WARN("Failed to create wined3d hull shader, hr %#x.\n", hr);
621 wined3d_private_store_cleanup(&shader->private_store);
622 wined3d_mutex_unlock();
623 return E_INVALIDARG;
625 wined3d_mutex_unlock();
627 shader->device = &device->ID3D11Device_iface;
628 ID3D11Device_AddRef(shader->device);
630 return S_OK;
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;
637 HRESULT hr;
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);
645 return hr;
648 TRACE("Created hull shader %p.\n", object);
649 *shader = object;
651 return S_OK;
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);
671 *object = iface;
672 return S_OK;
675 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
677 *object = NULL;
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);
688 return 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);
698 if (!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
707 * destroyed. */
708 ID3D11Device_Release(device);
711 return refcount;
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;
785 HRESULT hr;
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();
797 return hr;
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);
805 if (FAILED(hr))
807 WARN("Failed to create wined3d domain shader, hr %#x.\n", hr);
808 wined3d_private_store_cleanup(&shader->private_store);
809 wined3d_mutex_unlock();
810 return E_INVALIDARG;
812 wined3d_mutex_unlock();
814 shader->device = &device->ID3D11Device_iface;
815 ID3D11Device_AddRef(shader->device);
817 return S_OK;
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;
824 HRESULT hr;
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);
832 return hr;
835 TRACE("Created domain shader %p.\n", object);
836 *shader = object;
838 return S_OK;
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);
860 *object = iface;
861 return S_OK;
864 if (IsEqualGUID(riid, &IID_ID3D10GeometryShader)
865 || IsEqualGUID(riid, &IID_ID3D10DeviceChild))
867 ID3D10GeometryShader_AddRef(&shader->ID3D10GeometryShader_iface);
868 *object = &shader->ID3D10GeometryShader_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 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);
885 return 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);
895 if (!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
904 * destroyed. */
905 ID3D11Device_Release(device);
908 return refcount;
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;
1075 HRESULT hr;
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();
1088 return hr;
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);
1096 if (FAILED(hr))
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);
1108 return S_OK;
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;
1115 HRESULT hr;
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);
1124 return hr;
1127 TRACE("Created geometry shader %p.\n", object);
1128 *shader = object;
1130 return S_OK;
1133 struct d3d_geometry_shader *unsafe_impl_from_ID3D11GeometryShader(ID3D11GeometryShader *iface)
1135 if (!iface)
1136 return NULL;
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)
1144 if (!iface)
1145 return NULL;
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);
1170 *object = iface;
1171 return S_OK;
1174 if (IsEqualGUID(riid, &IID_ID3D10PixelShader)
1175 || IsEqualGUID(riid, &IID_ID3D10DeviceChild))
1177 IUnknown_AddRef(&shader->ID3D10PixelShader_iface);
1178 *object = &shader->ID3D10PixelShader_iface;
1179 return S_OK;
1182 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
1184 *object = NULL;
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);
1195 if (refcount == 1)
1197 ID3D11Device_AddRef(shader->device);
1198 wined3d_mutex_lock();
1199 wined3d_shader_incref(shader->wined3d_shader);
1200 wined3d_mutex_unlock();
1203 return refcount;
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);
1213 if (!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
1221 * destroyed. */
1222 ID3D11Device_Release(device);
1225 return refcount;
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;
1392 HRESULT hr;
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();
1405 return hr;
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);
1413 if (FAILED(hr))
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);
1425 return S_OK;
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;
1432 HRESULT hr;
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);
1441 return hr;
1444 TRACE("Created pixel shader %p.\n", object);
1445 *shader = object;
1447 return S_OK;
1450 struct d3d_pixel_shader *unsafe_impl_from_ID3D11PixelShader(ID3D11PixelShader *iface)
1452 if (!iface)
1453 return NULL;
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)
1461 if (!iface)
1462 return NULL;
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);
1485 return S_OK;
1488 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
1490 *object = NULL;
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);
1501 return 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);
1511 if (!refcount)
1513 wined3d_private_store_cleanup(&class_linkage->private_store);
1514 HeapFree(GetProcessHeap(), 0, class_linkage);
1517 return refcount;
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);
1562 return E_NOTIMPL;
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);
1574 return E_NOTIMPL;
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;
1607 return S_OK;