diff --git a/dlls/d3d10core/inputlayout.c b/dlls/d3d10core/inputlayout.c index bb3e4c56a9..fa08822435 100644 --- a/dlls/d3d10core/inputlayout.c +++ b/dlls/d3d10core/inputlayout.c @@ -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, 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; HRESULT hr; @@ -61,33 +61,32 @@ static HRESULT d3d10_input_layout_to_wined3d_declaration(const D3D10_INPUT_ELEME HeapFree(GetProcessHeap(), 0, is.elements); return E_OUTOFMEMORY; } - *wined3d_element_count = 0; 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; + 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) { if (!strcmp(element_descs[i].SemanticName, is.elements[j].semantic_name) && 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->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; } } @@ -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) { struct wined3d_vertex_element *wined3d_elements; - UINT wined3d_element_count; HRESULT hr; layout->ID3D10InputLayout_iface.lpVtbl = &d3d10_input_layout_vtbl; layout->refcount = 1; wined3d_private_store_init(&layout->private_store); - hr = d3d10_input_layout_to_wined3d_declaration(element_descs, element_count, - shader_byte_code, shader_byte_code_length, &wined3d_elements, &wined3d_element_count); - if (FAILED(hr)) + if (FAILED(hr = d3d10_input_layout_to_wined3d_declaration(element_descs, element_count, + shader_byte_code, shader_byte_code_length, &wined3d_elements))) { WARN("Failed to create wined3d vertex declaration elements, hr %#x.\n", hr); wined3d_private_store_cleanup(&layout->private_store); 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); HeapFree(GetProcessHeap(), 0, wined3d_elements); if (FAILED(hr)) diff --git a/dlls/d3d9/vertexdeclaration.c b/dlls/d3d9/vertexdeclaration.c index 502b7d372b..086ac70b9b 100644 --- a/dlls/d3d9/vertexdeclaration.c +++ b/dlls/d3d9/vertexdeclaration.c @@ -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].input_slot = d3d9_elements[i].Stream; (*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].usage = d3d9_elements[i].Usage; (*wined3d_elements)[i].usage_idx = d3d9_elements[i].UsageIndex; diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index 9cc68ab812..894e2599d2 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -2771,7 +2771,11 @@ void context_stream_info_from_declaration(struct wined3d_context *context, 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 * same or a similar shader, it might be worth it to store the diff --git a/dlls/wined3d/vertexdeclaration.c b/dlls/wined3d/vertexdeclaration.c index 97992d6c5c..df54bdc0b5 100644 --- a/dlls/wined3d/vertexdeclaration.c +++ b/dlls/wined3d/vertexdeclaration.c @@ -296,7 +296,7 @@ static void append_decl_element(struct wined3d_fvf_convert_state *state, elements[idx].format = format_id; elements[idx].input_slot = 0; 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].usage = usage; elements[idx].usage_idx = usage_idx; diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 69055850a5..b576e1abba 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -1496,6 +1496,9 @@ enum wined3d_display_rotation #define WINED3D_APPEND_ALIGNED_ELEMENT 0xffffffff +#define WINED3D_OUTPUT_SLOT_SEMANTIC 0xffffffff +#define WINED3D_OUTPUT_SLOT_UNUSED 0xfffffffe + struct wined3d_display_mode { UINT width;