Commit 88f230b5 authored by Henri Verbeet's avatar Henri Verbeet Committed by Alexandre Julliard

d3d10core: Also pass unused input layout elements to wined3d.

While these won't be used by the shader, they potentially affect the calculated offset for WINED3D_APPEND_ALIGNED_ELEMENT elements.
parent cbe717b8
...@@ -41,7 +41,7 @@ static HRESULT isgn_handler(const char *data, DWORD data_size, DWORD tag, void * ...@@ -41,7 +41,7 @@ static HRESULT isgn_handler(const char *data, DWORD data_size, DWORD tag, void *
static HRESULT d3d10_input_layout_to_wined3d_declaration(const D3D10_INPUT_ELEMENT_DESC *element_descs, static HRESULT d3d10_input_layout_to_wined3d_declaration(const D3D10_INPUT_ELEMENT_DESC *element_descs,
UINT element_count, const void *shader_byte_code, SIZE_T shader_byte_code_length, UINT element_count, const void *shader_byte_code, SIZE_T shader_byte_code_length,
struct wined3d_vertex_element **wined3d_elements, UINT *wined3d_element_count) struct wined3d_vertex_element **wined3d_elements)
{ {
struct wined3d_shader_signature is; struct wined3d_shader_signature is;
HRESULT hr; HRESULT hr;
...@@ -61,33 +61,32 @@ static HRESULT d3d10_input_layout_to_wined3d_declaration(const D3D10_INPUT_ELEME ...@@ -61,33 +61,32 @@ static HRESULT d3d10_input_layout_to_wined3d_declaration(const D3D10_INPUT_ELEME
HeapFree(GetProcessHeap(), 0, is.elements); HeapFree(GetProcessHeap(), 0, is.elements);
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
} }
*wined3d_element_count = 0;
for (i = 0; i < element_count; ++i) for (i = 0; i < element_count; ++i)
{ {
struct wined3d_vertex_element *e = &(*wined3d_elements)[i];
const D3D10_INPUT_ELEMENT_DESC *f = &element_descs[i];
UINT j; UINT j;
e->format = wined3dformat_from_dxgi_format(f->Format);
e->input_slot = f->InputSlot;
e->offset = f->AlignedByteOffset;
e->output_slot = WINED3D_OUTPUT_SLOT_UNUSED;
e->method = WINED3D_DECL_METHOD_DEFAULT;
e->usage = 0;
e->usage_idx = 0;
if (f->InputSlotClass != D3D10_INPUT_PER_VERTEX_DATA)
FIXME("Ignoring input slot class (%#x)\n", f->InputSlotClass);
if (f->InstanceDataStepRate)
FIXME("Ignoring instance data step rate (%#x)\n", f->InstanceDataStepRate);
for (j = 0; j < is.element_count; ++j) for (j = 0; j < is.element_count; ++j)
{ {
if (!strcmp(element_descs[i].SemanticName, is.elements[j].semantic_name) if (!strcmp(element_descs[i].SemanticName, is.elements[j].semantic_name)
&& element_descs[i].SemanticIndex == is.elements[j].semantic_idx) && element_descs[i].SemanticIndex == is.elements[j].semantic_idx)
{ {
struct wined3d_vertex_element *e = &(*wined3d_elements)[(*wined3d_element_count)++];
const D3D10_INPUT_ELEMENT_DESC *f = &element_descs[i];
e->format = wined3dformat_from_dxgi_format(f->Format);
e->input_slot = f->InputSlot;
e->offset = f->AlignedByteOffset;
e->output_slot = is.elements[j].register_idx; e->output_slot = is.elements[j].register_idx;
e->method = WINED3D_DECL_METHOD_DEFAULT;
e->usage = 0;
e->usage_idx = 0;
if (f->InputSlotClass != D3D10_INPUT_PER_VERTEX_DATA)
FIXME("Ignoring input slot class (%#x)\n", f->InputSlotClass);
if (f->InstanceDataStepRate)
FIXME("Ignoring instance data step rate (%#x)\n", f->InstanceDataStepRate);
break; break;
} }
} }
...@@ -225,23 +224,21 @@ HRESULT d3d10_input_layout_init(struct d3d10_input_layout *layout, struct d3d10_ ...@@ -225,23 +224,21 @@ HRESULT d3d10_input_layout_init(struct d3d10_input_layout *layout, struct d3d10_
const void *shader_byte_code, SIZE_T shader_byte_code_length) const void *shader_byte_code, SIZE_T shader_byte_code_length)
{ {
struct wined3d_vertex_element *wined3d_elements; struct wined3d_vertex_element *wined3d_elements;
UINT wined3d_element_count;
HRESULT hr; HRESULT hr;
layout->ID3D10InputLayout_iface.lpVtbl = &d3d10_input_layout_vtbl; layout->ID3D10InputLayout_iface.lpVtbl = &d3d10_input_layout_vtbl;
layout->refcount = 1; layout->refcount = 1;
wined3d_private_store_init(&layout->private_store); wined3d_private_store_init(&layout->private_store);
hr = d3d10_input_layout_to_wined3d_declaration(element_descs, element_count, if (FAILED(hr = d3d10_input_layout_to_wined3d_declaration(element_descs, element_count,
shader_byte_code, shader_byte_code_length, &wined3d_elements, &wined3d_element_count); shader_byte_code, shader_byte_code_length, &wined3d_elements)))
if (FAILED(hr))
{ {
WARN("Failed to create wined3d vertex declaration elements, hr %#x.\n", hr); WARN("Failed to create wined3d vertex declaration elements, hr %#x.\n", hr);
wined3d_private_store_cleanup(&layout->private_store); wined3d_private_store_cleanup(&layout->private_store);
return hr; return hr;
} }
hr = wined3d_vertex_declaration_create(device->wined3d_device, wined3d_elements, wined3d_element_count, hr = wined3d_vertex_declaration_create(device->wined3d_device, wined3d_elements, element_count,
layout, &d3d10_input_layout_wined3d_parent_ops, &layout->wined3d_decl); layout, &d3d10_input_layout_wined3d_parent_ops, &layout->wined3d_decl);
HeapFree(GetProcessHeap(), 0, wined3d_elements); HeapFree(GetProcessHeap(), 0, wined3d_elements);
if (FAILED(hr)) if (FAILED(hr))
......
...@@ -353,7 +353,7 @@ static HRESULT convert_to_wined3d_declaration(const D3DVERTEXELEMENT9 *d3d9_elem ...@@ -353,7 +353,7 @@ static HRESULT convert_to_wined3d_declaration(const D3DVERTEXELEMENT9 *d3d9_elem
(*wined3d_elements)[i].format = d3d_dtype_lookup[d3d9_elements[i].Type].format; (*wined3d_elements)[i].format = d3d_dtype_lookup[d3d9_elements[i].Type].format;
(*wined3d_elements)[i].input_slot = d3d9_elements[i].Stream; (*wined3d_elements)[i].input_slot = d3d9_elements[i].Stream;
(*wined3d_elements)[i].offset = d3d9_elements[i].Offset; (*wined3d_elements)[i].offset = d3d9_elements[i].Offset;
(*wined3d_elements)[i].output_slot = ~0U; (*wined3d_elements)[i].output_slot = WINED3D_OUTPUT_SLOT_SEMANTIC;
(*wined3d_elements)[i].method = d3d9_elements[i].Method; (*wined3d_elements)[i].method = d3d9_elements[i].Method;
(*wined3d_elements)[i].usage = d3d9_elements[i].Usage; (*wined3d_elements)[i].usage = d3d9_elements[i].Usage;
(*wined3d_elements)[i].usage_idx = d3d9_elements[i].UsageIndex; (*wined3d_elements)[i].usage_idx = d3d9_elements[i].UsageIndex;
......
...@@ -2771,7 +2771,11 @@ void context_stream_info_from_declaration(struct wined3d_context *context, ...@@ -2771,7 +2771,11 @@ void context_stream_info_from_declaration(struct wined3d_context *context,
if (use_vshader) if (use_vshader)
{ {
if (element->output_slot == ~0U) if (element->output_slot == WINED3D_OUTPUT_SLOT_UNUSED)
{
stride_used = FALSE;
}
else if (element->output_slot == WINED3D_OUTPUT_SLOT_SEMANTIC)
{ {
/* TODO: Assuming vertexdeclarations are usually used with the /* TODO: Assuming vertexdeclarations are usually used with the
* same or a similar shader, it might be worth it to store the * same or a similar shader, it might be worth it to store the
......
...@@ -296,7 +296,7 @@ static void append_decl_element(struct wined3d_fvf_convert_state *state, ...@@ -296,7 +296,7 @@ static void append_decl_element(struct wined3d_fvf_convert_state *state,
elements[idx].format = format_id; elements[idx].format = format_id;
elements[idx].input_slot = 0; elements[idx].input_slot = 0;
elements[idx].offset = offset; elements[idx].offset = offset;
elements[idx].output_slot = 0; elements[idx].output_slot = WINED3D_OUTPUT_SLOT_SEMANTIC;
elements[idx].method = WINED3D_DECL_METHOD_DEFAULT; elements[idx].method = WINED3D_DECL_METHOD_DEFAULT;
elements[idx].usage = usage; elements[idx].usage = usage;
elements[idx].usage_idx = usage_idx; elements[idx].usage_idx = usage_idx;
......
...@@ -1496,6 +1496,9 @@ enum wined3d_display_rotation ...@@ -1496,6 +1496,9 @@ enum wined3d_display_rotation
#define WINED3D_APPEND_ALIGNED_ELEMENT 0xffffffff #define WINED3D_APPEND_ALIGNED_ELEMENT 0xffffffff
#define WINED3D_OUTPUT_SLOT_SEMANTIC 0xffffffff
#define WINED3D_OUTPUT_SLOT_UNUSED 0xfffffffe
struct wined3d_display_mode struct wined3d_display_mode
{ {
UINT width; UINT width;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment