From 569fcd33dca2e15048919bc296173662f0577cac Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Mon, 23 May 2016 18:06:29 +0200 Subject: [PATCH] wined3d: Store shader signatures directly in struct wined3d_shader_desc. Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard --- dlls/d3d11/shader.c | 60 ++++++++++++++---------------------------- dlls/d3d8/shader.c | 8 +++--- dlls/d3d9/shader.c | 8 +++--- dlls/wined3d/shader.c | 41 +++++++++++++---------------- include/wine/wined3d.h | 4 +-- 5 files changed, 48 insertions(+), 73 deletions(-) diff --git a/dlls/d3d11/shader.c b/dlls/d3d11/shader.c index 0b6b29e3474..bab3b632a22 100644 --- a/dlls/d3d11/shader.c +++ b/dlls/d3d11/shader.c @@ -385,8 +385,6 @@ static unsigned int d3d_sm_from_feature_level(D3D_FEATURE_LEVEL feature_level) static HRESULT d3d_vertex_shader_init(struct d3d_vertex_shader *shader, struct d3d_device *device, const void *byte_code, SIZE_T byte_code_length) { - struct wined3d_shader_signature output_signature; - struct wined3d_shader_signature input_signature; struct d3d_shader_info shader_info; struct wined3d_shader_desc desc; HRESULT hr; @@ -397,8 +395,8 @@ static HRESULT d3d_vertex_shader_init(struct d3d_vertex_shader *shader, struct d wined3d_mutex_lock(); wined3d_private_store_init(&shader->private_store); - shader_info.input_signature = &input_signature; - shader_info.output_signature = &output_signature; + shader_info.input_signature = &desc.input_signature; + shader_info.output_signature = &desc.output_signature; if (FAILED(hr = shader_extract_from_dxbc(byte_code, byte_code_length, &shader_info))) { WARN("Failed to extract shader, hr %#x.\n", hr); @@ -408,14 +406,12 @@ static HRESULT d3d_vertex_shader_init(struct d3d_vertex_shader *shader, struct d } desc.byte_code = shader_info.shader_code; - desc.input_signature = &input_signature; - desc.output_signature = &output_signature; desc.max_version = d3d_sm_from_feature_level(device->feature_level); hr = wined3d_shader_create_vs(device->wined3d_device, &desc, shader, &d3d_vertex_shader_wined3d_parent_ops, &shader->wined3d_shader); - shader_free_signature(&input_signature); - shader_free_signature(&output_signature); + shader_free_signature(&desc.input_signature); + shader_free_signature(&desc.output_signature); if (FAILED(hr)) { WARN("Failed to create wined3d vertex shader, hr %#x.\n", hr); @@ -601,8 +597,6 @@ static const struct wined3d_parent_ops d3d11_hull_shader_wined3d_parent_ops = static HRESULT d3d11_hull_shader_init(struct d3d11_hull_shader *shader, struct d3d_device *device, const void *byte_code, SIZE_T byte_code_length) { - struct wined3d_shader_signature output_signature; - struct wined3d_shader_signature input_signature; struct d3d_shader_info shader_info; struct wined3d_shader_desc desc; HRESULT hr; @@ -612,8 +606,8 @@ static HRESULT d3d11_hull_shader_init(struct d3d11_hull_shader *shader, struct d wined3d_mutex_lock(); wined3d_private_store_init(&shader->private_store); - shader_info.input_signature = &input_signature; - shader_info.output_signature = &output_signature; + shader_info.input_signature = &desc.input_signature; + shader_info.output_signature = &desc.output_signature; if (FAILED(hr = shader_extract_from_dxbc(byte_code, byte_code_length, &shader_info))) { WARN("Failed to extract shader, hr %#x.\n", hr); @@ -623,14 +617,12 @@ static HRESULT d3d11_hull_shader_init(struct d3d11_hull_shader *shader, struct d } desc.byte_code = shader_info.shader_code; - desc.input_signature = &input_signature; - desc.output_signature = &output_signature; desc.max_version = d3d_sm_from_feature_level(device->feature_level); hr = wined3d_shader_create_hs(device->wined3d_device, &desc, shader, &d3d11_hull_shader_wined3d_parent_ops, &shader->wined3d_shader); - shader_free_signature(&input_signature); - shader_free_signature(&output_signature); + shader_free_signature(&desc.input_signature); + shader_free_signature(&desc.output_signature); if (FAILED(hr)) { WARN("Failed to create wined3d hull shader, hr %#x.\n", hr); @@ -797,8 +789,6 @@ static const struct wined3d_parent_ops d3d11_domain_shader_wined3d_parent_ops = static HRESULT d3d11_domain_shader_init(struct d3d11_domain_shader *shader, struct d3d_device *device, const void *byte_code, SIZE_T byte_code_length) { - struct wined3d_shader_signature output_signature; - struct wined3d_shader_signature input_signature; struct d3d_shader_info shader_info; struct wined3d_shader_desc desc; HRESULT hr; @@ -808,8 +798,8 @@ static HRESULT d3d11_domain_shader_init(struct d3d11_domain_shader *shader, stru wined3d_mutex_lock(); wined3d_private_store_init(&shader->private_store); - shader_info.input_signature = &input_signature; - shader_info.output_signature = &output_signature; + shader_info.input_signature = &desc.input_signature; + shader_info.output_signature = &desc.output_signature; if (FAILED(hr = shader_extract_from_dxbc(byte_code, byte_code_length, &shader_info))) { WARN("Failed to extract shader, hr %#x.\n", hr); @@ -819,14 +809,12 @@ static HRESULT d3d11_domain_shader_init(struct d3d11_domain_shader *shader, stru } desc.byte_code = shader_info.shader_code; - desc.input_signature = &input_signature; - desc.output_signature = &output_signature; desc.max_version = d3d_sm_from_feature_level(device->feature_level); hr = wined3d_shader_create_ds(device->wined3d_device, &desc, shader, &d3d11_domain_shader_wined3d_parent_ops, &shader->wined3d_shader); - shader_free_signature(&input_signature); - shader_free_signature(&output_signature); + shader_free_signature(&desc.input_signature); + shader_free_signature(&desc.output_signature); if (FAILED(hr)) { WARN("Failed to create wined3d domain shader, hr %#x.\n", hr); @@ -1096,8 +1084,6 @@ static const struct wined3d_parent_ops d3d_geometry_shader_wined3d_parent_ops = static HRESULT d3d_geometry_shader_init(struct d3d_geometry_shader *shader, struct d3d_device *device, const void *byte_code, SIZE_T byte_code_length) { - struct wined3d_shader_signature output_signature; - struct wined3d_shader_signature input_signature; struct d3d_shader_info shader_info; struct wined3d_shader_desc desc; HRESULT hr; @@ -1108,8 +1094,8 @@ static HRESULT d3d_geometry_shader_init(struct d3d_geometry_shader *shader, stru wined3d_mutex_lock(); wined3d_private_store_init(&shader->private_store); - shader_info.input_signature = &input_signature; - shader_info.output_signature = &output_signature; + shader_info.input_signature = &desc.input_signature; + shader_info.output_signature = &desc.output_signature; if (FAILED(hr = shader_extract_from_dxbc(byte_code, byte_code_length, &shader_info))) { WARN("Failed to extract shader, hr %#x.\n", hr); @@ -1119,14 +1105,12 @@ static HRESULT d3d_geometry_shader_init(struct d3d_geometry_shader *shader, stru } desc.byte_code = shader_info.shader_code; - desc.input_signature = &input_signature; - desc.output_signature = &output_signature; desc.max_version = d3d_sm_from_feature_level(device->feature_level); hr = wined3d_shader_create_gs(device->wined3d_device, &desc, shader, &d3d_geometry_shader_wined3d_parent_ops, &shader->wined3d_shader); - shader_free_signature(&input_signature); - shader_free_signature(&output_signature); + shader_free_signature(&desc.input_signature); + shader_free_signature(&desc.output_signature); if (FAILED(hr)) { WARN("Failed to create wined3d geometry shader, hr %#x.\n", hr); @@ -1422,8 +1406,6 @@ static const struct wined3d_parent_ops d3d_pixel_shader_wined3d_parent_ops = static HRESULT d3d_pixel_shader_init(struct d3d_pixel_shader *shader, struct d3d_device *device, const void *byte_code, SIZE_T byte_code_length) { - struct wined3d_shader_signature output_signature; - struct wined3d_shader_signature input_signature; struct d3d_shader_info shader_info; struct wined3d_shader_desc desc; HRESULT hr; @@ -1434,8 +1416,8 @@ static HRESULT d3d_pixel_shader_init(struct d3d_pixel_shader *shader, struct d3d wined3d_mutex_lock(); wined3d_private_store_init(&shader->private_store); - shader_info.input_signature = &input_signature; - shader_info.output_signature = &output_signature; + shader_info.input_signature = &desc.input_signature; + shader_info.output_signature = &desc.output_signature; if (FAILED(hr = shader_extract_from_dxbc(byte_code, byte_code_length, &shader_info))) { WARN("Failed to extract shader, hr %#x.\n", hr); @@ -1445,14 +1427,12 @@ static HRESULT d3d_pixel_shader_init(struct d3d_pixel_shader *shader, struct d3d } desc.byte_code = shader_info.shader_code; - desc.input_signature = &input_signature; - desc.output_signature = &output_signature; desc.max_version = d3d_sm_from_feature_level(device->feature_level); hr = wined3d_shader_create_ps(device->wined3d_device, &desc, shader, &d3d_pixel_shader_wined3d_parent_ops, &shader->wined3d_shader); - shader_free_signature(&input_signature); - shader_free_signature(&output_signature); + shader_free_signature(&desc.input_signature); + shader_free_signature(&desc.output_signature); if (FAILED(hr)) { WARN("Failed to create wined3d pixel shader, hr %#x.\n", hr); diff --git a/dlls/d3d8/shader.c b/dlls/d3d8/shader.c index a0bb3179c07..f920fed8825 100644 --- a/dlls/d3d8/shader.c +++ b/dlls/d3d8/shader.c @@ -117,8 +117,8 @@ HRESULT d3d8_vertex_shader_init(struct d3d8_vertex_shader *shader, struct d3d8_d FIXME("Usage %#x not implemented.\n", usage); desc.byte_code = byte_code; - desc.input_signature = NULL; - desc.output_signature = NULL; + desc.input_signature.element_count = 0; + desc.output_signature.element_count = 0; desc.max_version = 1; wined3d_mutex_lock(); @@ -166,8 +166,8 @@ HRESULT d3d8_pixel_shader_init(struct d3d8_pixel_shader *shader, struct d3d8_dev shader->handle = shader_handle; desc.byte_code = byte_code; - desc.input_signature = NULL; - desc.output_signature = NULL; + desc.input_signature.element_count = 0; + desc.output_signature.element_count = 0; desc.max_version = 1; wined3d_mutex_lock(); diff --git a/dlls/d3d9/shader.c b/dlls/d3d9/shader.c index 9430afd63da..b66762dae48 100644 --- a/dlls/d3d9/shader.c +++ b/dlls/d3d9/shader.c @@ -143,8 +143,8 @@ HRESULT vertexshader_init(struct d3d9_vertexshader *shader, struct d3d9_device * shader->IDirect3DVertexShader9_iface.lpVtbl = &d3d9_vertexshader_vtbl; desc.byte_code = byte_code; - desc.input_signature = NULL; - desc.output_signature = NULL; + desc.input_signature.element_count = 0; + desc.output_signature.element_count = 0; desc.max_version = 3; wined3d_mutex_lock(); @@ -294,8 +294,8 @@ HRESULT pixelshader_init(struct d3d9_pixelshader *shader, struct d3d9_device *de shader->IDirect3DPixelShader9_iface.lpVtbl = &d3d9_pixelshader_vtbl; desc.byte_code = byte_code; - desc.input_signature = NULL; - desc.output_signature = NULL; + desc.input_signature.element_count = 0; + desc.output_signature.element_count = 0; desc.max_version = 3; wined3d_mutex_lock(); diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c index 953efb5af59..c843bc12414 100644 --- a/dlls/wined3d/shader.c +++ b/dlls/wined3d/shader.c @@ -2737,6 +2737,9 @@ static HRESULT shader_signature_copy(struct wined3d_shader_signature *dst, SIZE_T len; char *ptr; + if (!src->element_count) + return WINED3D_OK; + ptr = *signature_strings; dst->element_count = src->element_count; @@ -2778,42 +2781,34 @@ static HRESULT shader_init(struct wined3d_shader *shader, struct wined3d_device shader->parent_ops = parent_ops; total = 0; - if (desc->input_signature) + for (i = 0; i < desc->input_signature.element_count; ++i) { - for (i = 0; i < desc->input_signature->element_count; ++i) - { - e = &desc->input_signature->elements[i]; - len = strlen(e->semantic_name); - if (len >= ~(SIZE_T)0 - total) - return E_OUTOFMEMORY; + e = &desc->input_signature.elements[i]; + len = strlen(e->semantic_name); + if (len >= ~(SIZE_T)0 - total) + return E_OUTOFMEMORY; - total += len + 1; - } + total += len + 1; } - if (desc->output_signature) + for (i = 0; i < desc->output_signature.element_count; ++i) { - for (i = 0; i < desc->output_signature->element_count; ++i) - { - e = &desc->output_signature->elements[i]; - len = strlen(e->semantic_name); - if (len >= ~(SIZE_T)0 - total) - return E_OUTOFMEMORY; + e = &desc->output_signature.elements[i]; + len = strlen(e->semantic_name); + if (len >= ~(SIZE_T)0 - total) + return E_OUTOFMEMORY; - total += len + 1; - } + total += len + 1; } - if (!(shader->signature_strings = HeapAlloc(GetProcessHeap(), 0, total))) + if (total && !(shader->signature_strings = HeapAlloc(GetProcessHeap(), 0, total))) return E_OUTOFMEMORY; ptr = shader->signature_strings; - if (desc->input_signature && FAILED(hr = shader_signature_copy(&shader->input_signature, - desc->input_signature, &ptr))) + if (FAILED(hr = shader_signature_copy(&shader->input_signature, &desc->input_signature, &ptr))) { HeapFree(GetProcessHeap(), 0, shader->signature_strings); return hr; } - if (desc->output_signature && FAILED(hr = shader_signature_copy(&shader->output_signature, - desc->output_signature, &ptr))) + if (FAILED(hr = shader_signature_copy(&shader->output_signature, &desc->output_signature, &ptr))) { HeapFree(GetProcessHeap(), 0, shader->input_signature.elements); HeapFree(GetProcessHeap(), 0, shader->signature_strings); diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index e31f9ca3c29..d5415e09c61 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -1929,8 +1929,8 @@ struct wined3d_shader_signature struct wined3d_shader_desc { const DWORD *byte_code; - const struct wined3d_shader_signature *input_signature; - const struct wined3d_shader_signature *output_signature; + struct wined3d_shader_signature input_signature; + struct wined3d_shader_signature output_signature; unsigned int max_version; };