ReactOS 0.4.17-dev-934-g091855f
inputlayout.c
Go to the documentation of this file.
1/*
2 * Copyright 2009 Henri Verbeet for CodeWeavers
3 *
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.
8 *
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.
13 *
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
17 *
18 */
19
20#include "d3d11_private.h"
21#include "winternl.h"
22#include <vkd3d_shader.h>
23
25
27{
28 return !stricmp(e->semantic_name, "sv_instanceid") || !stricmp(e->semantic_name, "sv_vertexid");
29}
30
31static unsigned int find_input_element(const D3D11_INPUT_ELEMENT_DESC *element_descs, unsigned int element_count,
32 const struct vkd3d_shader_signature_element *ise)
33{
35 unsigned int i;
36
37 if (ise->stream_index)
38 return element_count;
39
40 for (i = 0; i < element_count; ++i)
41 {
42 f = &element_descs[i];
43 if (!stricmp(ise->semantic_name, f->SemanticName) && ise->semantic_index == f->SemanticIndex)
44 return i;
45 }
46 return element_count;
47}
48
50{
51 return (enum wined3d_input_classification)slot_class;
52}
53
55 UINT element_count, const void *shader_byte_code, SIZE_T shader_byte_code_length,
56 struct wined3d_vertex_element **wined3d_elements)
57{
58 const struct vkd3d_shader_code dxbc = {shader_byte_code, shader_byte_code_length};
61 struct vkd3d_shader_signature is;
62 unsigned int i, index;
63 int ret;
64
65 if ((ret = vkd3d_shader_parse_input_signature(&dxbc, &is, NULL)) < 0)
66 {
67 ERR("Failed to extract input signature, ret %d.\n", ret);
68 return E_FAIL;
69 }
70
71 if (!(*wined3d_elements = calloc(element_count, sizeof(**wined3d_elements))))
72 {
73 ERR("Failed to allocate wined3d vertex element array memory.\n");
75 return E_OUTOFMEMORY;
76 }
77
78 for (i = 0; i < element_count; ++i)
79 {
80 struct wined3d_vertex_element *e = &(*wined3d_elements)[i];
81
82 f = &element_descs[i];
83
84 e->format = wined3dformat_from_dxgi_format(f->Format);
85 e->input_slot = f->InputSlot;
86 e->offset = f->AlignedByteOffset;
87 e->output_slot = WINED3D_OUTPUT_SLOT_UNUSED;
88 e->input_slot_class = wined3d_input_classification_from_d3d11(f->InputSlotClass);
89 e->instance_data_step_rate = f->InstanceDataStepRate;
91 e->usage = 0;
92 e->usage_idx = 0;
93 }
94
95 ise = is.elements;
96
97 for (i = 0; i < is.element_count; ++i)
98 {
99 if ((index = find_input_element(element_descs, element_count, &ise[i])) < element_count)
100 {
101 (*wined3d_elements)[index].output_slot = ise[i].register_index;
102 }
103 else if (!is_vs_sysval_semantic(&ise[i]))
104 {
105 WARN("Input element %s%u not found in shader signature.\n", ise[i].semantic_name, ise[i].semantic_index);
106 free(*wined3d_elements);
108 return E_INVALIDARG;
109 }
110 }
111
113
114 return S_OK;
115}
116
117/* ID3D11InputLayout methods */
118
119static inline struct d3d_input_layout *impl_from_ID3D11InputLayout(ID3D11InputLayout *iface)
120{
122}
123
125 REFIID riid, void **object)
126{
127 struct d3d_input_layout *layout = impl_from_ID3D11InputLayout(iface);
128
129 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
130
131 if (IsEqualGUID(riid, &IID_ID3D11InputLayout)
132 || IsEqualGUID(riid, &IID_ID3D11DeviceChild)
134 {
135 ID3D11InputLayout_AddRef(iface);
136 *object = iface;
137 return S_OK;
138 }
139
140 if (IsEqualGUID(riid, &IID_ID3D10InputLayout)
141 || IsEqualGUID(riid, &IID_ID3D10DeviceChild))
142 {
143 ID3D10InputLayout_AddRef(&layout->ID3D10InputLayout_iface);
144 *object = &layout->ID3D10InputLayout_iface;
145 return S_OK;
146 }
147
148 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
149
150 *object = NULL;
151 return E_NOINTERFACE;
152}
153
154static ULONG STDMETHODCALLTYPE d3d11_input_layout_AddRef(ID3D11InputLayout *iface)
155{
156 struct d3d_input_layout *layout = impl_from_ID3D11InputLayout(iface);
158
159 TRACE("%p increasing refcount to %lu.\n", layout, refcount);
160
161 if (refcount == 1)
162 {
163 ID3D11Device2_AddRef(layout->device);
165 }
166
167 return refcount;
168}
169
170static ULONG STDMETHODCALLTYPE d3d11_input_layout_Release(ID3D11InputLayout *iface)
171{
172 struct d3d_input_layout *layout = impl_from_ID3D11InputLayout(iface);
174
175 TRACE("%p decreasing refcount to %lu.\n", layout, refcount);
176
177 if (!refcount)
178 {
179 ID3D11Device2 *device = layout->device;
181 ID3D11Device2_Release(device);
182 }
183
184 return refcount;
185}
186
187static void STDMETHODCALLTYPE d3d11_input_layout_GetDevice(ID3D11InputLayout *iface,
188 ID3D11Device **device)
189{
190 struct d3d_input_layout *layout = impl_from_ID3D11InputLayout(iface);
191
192 TRACE("iface %p, device %p.\n", iface, device);
193
194 ID3D11Device_AddRef(*device = (ID3D11Device *)layout->device);
195}
196
198 REFGUID guid, UINT *data_size, void *data)
199{
200 struct d3d_input_layout *layout = impl_from_ID3D11InputLayout(iface);
201
202 TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface, debugstr_guid(guid), data_size, data);
203
204 return d3d_get_private_data(&layout->private_store, guid, data_size, data);
205}
206
208 REFGUID guid, UINT data_size, const void *data)
209{
210 struct d3d_input_layout *layout = impl_from_ID3D11InputLayout(iface);
211
212 TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data);
213
214 return d3d_set_private_data(&layout->private_store, guid, data_size, data);
215}
216
218 REFGUID guid, const IUnknown *data)
219{
220 struct d3d_input_layout *layout = impl_from_ID3D11InputLayout(iface);
221
222 TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data);
223
225}
226
227static const struct ID3D11InputLayoutVtbl d3d11_input_layout_vtbl =
228{
229 /* IUnknown methods */
233 /* ID3D11DeviceChild methods */
238};
239
240/* ID3D10InputLayout methods */
241
243{
245}
246
247/* IUnknown methods */
248
250 REFIID riid, void **object)
251{
252 struct d3d_input_layout *layout = impl_from_ID3D10InputLayout(iface);
253
254 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
255
257}
258
260{
261 struct d3d_input_layout *layout = impl_from_ID3D10InputLayout(iface);
262
263 TRACE("iface %p.\n", iface);
264
266}
267
269{
270 struct d3d_input_layout *layout = impl_from_ID3D10InputLayout(iface);
271
272 TRACE("iface %p.\n", iface);
273
275}
276
277/* ID3D10DeviceChild methods */
278
280{
281 struct d3d_input_layout *layout = impl_from_ID3D10InputLayout(iface);
282
283 TRACE("iface %p, device %p.\n", iface, device);
284
285 ID3D11Device2_QueryInterface(layout->device, &IID_ID3D10Device, (void **)device);
286}
287
289 REFGUID guid, UINT *data_size, void *data)
290{
291 struct d3d_input_layout *layout = impl_from_ID3D10InputLayout(iface);
292
293 TRACE("iface %p, guid %s, data_size %p, data %p.\n",
294 iface, debugstr_guid(guid), data_size, data);
295
296 return d3d_get_private_data(&layout->private_store, guid, data_size, data);
297}
298
300 REFGUID guid, UINT data_size, const void *data)
301{
302 struct d3d_input_layout *layout = impl_from_ID3D10InputLayout(iface);
303
304 TRACE("iface %p, guid %s, data_size %u, data %p.\n",
305 iface, debugstr_guid(guid), data_size, data);
306
307 return d3d_set_private_data(&layout->private_store, guid, data_size, data);
308}
309
311 REFGUID guid, const IUnknown *data)
312{
313 struct d3d_input_layout *layout = impl_from_ID3D10InputLayout(iface);
314
315 TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data);
316
318}
319
320static const struct ID3D10InputLayoutVtbl d3d10_input_layout_vtbl =
321{
322 /* IUnknown methods */
326 /* ID3D10DeviceChild methods */
331};
332
334{
335 struct d3d_input_layout *layout = parent;
336
338 free(parent);
339}
340
342{
344};
345
347 const D3D11_INPUT_ELEMENT_DESC *element_descs, UINT element_count,
348 const void *shader_byte_code, SIZE_T shader_byte_code_length)
349{
350 struct wined3d_vertex_element *wined3d_elements;
351 HRESULT hr;
352
355 layout->refcount = 1;
358
360 shader_byte_code, shader_byte_code_length, &wined3d_elements)))
361 {
362 WARN("Failed to create wined3d vertex declaration elements, hr %#lx.\n", hr);
365 return hr;
366 }
367
368 hr = wined3d_vertex_declaration_create(device->wined3d_device, wined3d_elements, element_count,
370 free(wined3d_elements);
371 if (FAILED(hr))
372 {
373 WARN("Failed to create wined3d vertex declaration, hr %#lx.\n", hr);
376 return hr;
377 }
379
380 ID3D11Device2_AddRef(layout->device = &device->ID3D11Device2_iface);
381
382 return S_OK;
383}
384
386 const D3D11_INPUT_ELEMENT_DESC *element_descs, UINT element_count,
387 const void *shader_byte_code, SIZE_T shader_byte_code_length,
388 struct d3d_input_layout **layout)
389{
390 struct d3d_input_layout *object;
391 HRESULT hr;
392
393 if (!element_descs) return E_INVALIDARG;
394
395 if (!(object = calloc(1, sizeof(*object))))
396 return E_OUTOFMEMORY;
397
398 if (FAILED(hr = d3d_input_layout_init(object, device, element_descs, element_count,
399 shader_byte_code, shader_byte_code_length)))
400 {
401 WARN("Failed to initialise input layout, hr %#lx.\n", hr);
402 free(object);
403 return hr;
404 }
405
406 TRACE("Created input layout %p.\n", object);
407 *layout = object;
408
409 return S_OK;
410}
411
413{
414 if (!iface)
415 return NULL;
416 assert(iface->lpVtbl == &d3d11_input_layout_vtbl);
417
418 return impl_from_ID3D11InputLayout(iface);
419}
420
422{
423 if (!iface)
424 return NULL;
425 assert(iface->lpVtbl == &d3d10_input_layout_vtbl);
426
427 return impl_from_ID3D10InputLayout(iface);
428}
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define index(s, c)
Definition: various.h:29
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
const GUID IID_IUnknown
#define STDMETHODCALLTYPE
Definition: bdasup.h:9
D3D11_INPUT_CLASSIFICATION
Definition: d3d11.idl:952
enum wined3d_format_id wined3dformat_from_dxgi_format(DXGI_FORMAT format)
Definition: utils.c:323
HRESULT d3d_get_private_data(struct wined3d_private_store *store, REFGUID guid, UINT *data_size, void *data)
Definition: utils.c:803
HRESULT d3d_set_private_data_interface(struct wined3d_private_store *store, REFGUID guid, const IUnknown *object)
Definition: utils.c:867
HRESULT d3d_set_private_data(struct wined3d_private_store *store, REFGUID guid, UINT data_size, const void *data)
Definition: utils.c:841
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_FAIL
Definition: ddrawi.h:102
#define free
Definition: debug_ros.c:5
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
#define stricmp(_String1, _String2)
Definition: compat.h:24
GUID guid
Definition: version.c:147
#define assert(_expr)
Definition: assert.h:32
return ret
Definition: mutex.c:147
r parent
Definition: btrfs.c:3010
unsigned int BOOL
Definition: ntddk_ex.h:94
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLuint index
Definition: glext.h:6031
GLfloat f
Definition: glext.h:7540
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned int UINT
Definition: sysinfo.c:13
REFIID riid
Definition: atlbase.h:39
static ULONG STDMETHODCALLTYPE d3d11_input_layout_Release(ID3D11InputLayout *iface)
Definition: inputlayout.c:170
static struct d3d_input_layout * impl_from_ID3D11InputLayout(ID3D11InputLayout *iface)
Definition: inputlayout.c:119
static HRESULT STDMETHODCALLTYPE d3d11_input_layout_SetPrivateData(ID3D11InputLayout *iface, REFGUID guid, UINT data_size, const void *data)
Definition: inputlayout.c:207
HRESULT d3d_input_layout_create(struct d3d_device *device, const D3D11_INPUT_ELEMENT_DESC *element_descs, UINT element_count, const void *shader_byte_code, SIZE_T shader_byte_code_length, struct d3d_input_layout **layout)
Definition: inputlayout.c:385
static HRESULT STDMETHODCALLTYPE d3d10_input_layout_SetPrivateDataInterface(ID3D10InputLayout *iface, REFGUID guid, const IUnknown *data)
Definition: inputlayout.c:310
static HRESULT STDMETHODCALLTYPE d3d10_input_layout_GetPrivateData(ID3D10InputLayout *iface, REFGUID guid, UINT *data_size, void *data)
Definition: inputlayout.c:288
static const struct ID3D11InputLayoutVtbl d3d11_input_layout_vtbl
Definition: inputlayout.c:227
static HRESULT d3d11_input_layout_to_wined3d_declaration(const D3D11_INPUT_ELEMENT_DESC *element_descs, UINT element_count, const void *shader_byte_code, SIZE_T shader_byte_code_length, struct wined3d_vertex_element **wined3d_elements)
Definition: inputlayout.c:54
static HRESULT STDMETHODCALLTYPE d3d10_input_layout_QueryInterface(ID3D10InputLayout *iface, REFIID riid, void **object)
Definition: inputlayout.c:249
static void STDMETHODCALLTYPE d3d10_input_layout_GetDevice(ID3D10InputLayout *iface, ID3D10Device **device)
Definition: inputlayout.c:279
static void STDMETHODCALLTYPE d3d11_input_layout_GetDevice(ID3D11InputLayout *iface, ID3D11Device **device)
Definition: inputlayout.c:187
static HRESULT d3d_input_layout_init(struct d3d_input_layout *layout, struct d3d_device *device, const D3D11_INPUT_ELEMENT_DESC *element_descs, UINT element_count, const void *shader_byte_code, SIZE_T shader_byte_code_length)
Definition: inputlayout.c:346
static const struct wined3d_parent_ops d3d_input_layout_wined3d_parent_ops
Definition: inputlayout.c:341
static HRESULT STDMETHODCALLTYPE d3d11_input_layout_QueryInterface(ID3D11InputLayout *iface, REFIID riid, void **object)
Definition: inputlayout.c:124
static BOOL is_vs_sysval_semantic(const struct vkd3d_shader_signature_element *e)
Definition: inputlayout.c:26
struct d3d_input_layout * unsafe_impl_from_ID3D10InputLayout(ID3D10InputLayout *iface)
Definition: inputlayout.c:421
static void STDMETHODCALLTYPE d3d_input_layout_wined3d_object_destroyed(void *parent)
Definition: inputlayout.c:333
static HRESULT STDMETHODCALLTYPE d3d11_input_layout_SetPrivateDataInterface(ID3D11InputLayout *iface, REFGUID guid, const IUnknown *data)
Definition: inputlayout.c:217
static ULONG STDMETHODCALLTYPE d3d11_input_layout_AddRef(ID3D11InputLayout *iface)
Definition: inputlayout.c:154
struct d3d_input_layout * unsafe_impl_from_ID3D11InputLayout(ID3D11InputLayout *iface)
Definition: inputlayout.c:412
static struct d3d_input_layout * impl_from_ID3D10InputLayout(ID3D10InputLayout *iface)
Definition: inputlayout.c:242
static enum wined3d_input_classification wined3d_input_classification_from_d3d11(D3D11_INPUT_CLASSIFICATION slot_class)
Definition: inputlayout.c:49
static ULONG STDMETHODCALLTYPE d3d10_input_layout_AddRef(ID3D10InputLayout *iface)
Definition: inputlayout.c:259
static ULONG STDMETHODCALLTYPE d3d10_input_layout_Release(ID3D10InputLayout *iface)
Definition: inputlayout.c:268
static HRESULT STDMETHODCALLTYPE d3d11_input_layout_GetPrivateData(ID3D11InputLayout *iface, REFGUID guid, UINT *data_size, void *data)
Definition: inputlayout.c:197
static const struct ID3D10InputLayoutVtbl d3d10_input_layout_vtbl
Definition: inputlayout.c:320
static unsigned int find_input_element(const D3D11_INPUT_ELEMENT_DESC *element_descs, unsigned int element_count, const struct vkd3d_shader_signature_element *ise)
Definition: inputlayout.c:31
static HRESULT STDMETHODCALLTYPE d3d10_input_layout_SetPrivateData(ID3D10InputLayout *iface, REFGUID guid, UINT data_size, const void *data)
Definition: inputlayout.c:299
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
#define e
Definition: ke_i.h:82
#define f
Definition: ke_i.h:83
#define debugstr_guid
Definition: kernel32.h:35
static ULONG ** element_count
Definition: exception.c:124
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
#define calloc
Definition: rosglue.h:14
#define TRACE(s)
Definition: solgame.cpp:4
Definition: scsiwmi.h:51
struct wined3d_private_store private_store
struct wined3d_vertex_declaration * wined3d_decl
ID3D10InputLayout ID3D10InputLayout_iface
ID3D11InputLayout ID3D11InputLayout_iface
ID3D11Device2 * device
Definition: devices.h:37
struct vkd3d_shader_signature_element * elements
unsigned int element_count
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
VKD3D_SHADER_API int vkd3d_shader_parse_input_signature(const struct vkd3d_shader_code *dxbc, struct vkd3d_shader_signature *signature, char **messages)
VKD3D_SHADER_API void vkd3d_shader_free_shader_signature(struct vkd3d_shader_signature *signature)
HRESULT CDECL wined3d_vertex_declaration_create(struct wined3d_device *device, const struct wined3d_vertex_element *elements, UINT element_count, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_vertex_declaration **declaration)
ULONG CDECL wined3d_vertex_declaration_incref(struct wined3d_vertex_declaration *declaration)
ULONG CDECL wined3d_vertex_declaration_decref(struct wined3d_vertex_declaration *declaration)
static void wined3d_private_store_cleanup(struct wined3d_private_store *store)
Definition: wined3d.h:2636
@ WINED3D_DECL_METHOD_DEFAULT
Definition: wined3d.h:796
#define WINED3D_OUTPUT_SLOT_UNUSED
Definition: wined3d.h:1574
static void wined3d_private_store_init(struct wined3d_private_store *store)
Definition: wined3d.h:2607
wined3d_input_classification
Definition: wined3d.h:1825
void WINAPI wined3d_mutex_unlock(void)
Definition: wined3d_main.c:544
void WINAPI wined3d_mutex_lock(void)
Definition: wined3d_main.c:539
#define E_NOINTERFACE
Definition: winerror.h:3479