[PATCH 3/3] wined3d: Drop support for pre-parsed shader DXBC chunks.

Józef Kucia jkucia at codeweavers.com
Fri Oct 5 07:10:19 CDT 2018


Accept only full DXBC.

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 dlls/d3d11/shader.c            |   6 --
 dlls/d3d8/shader.c             |   8 --
 dlls/d3d9/shader.c             |   8 --
 dlls/wined3d/shader.c          | 195 +++++++++++------------------------------
 dlls/wined3d/wined3d_private.h |   7 +-
 include/wine/wined3d.h         |  11 ---
 6 files changed, 55 insertions(+), 180 deletions(-)

diff --git a/dlls/d3d11/shader.c b/dlls/d3d11/shader.c
index 4b4969135387..3f5c6e147482 100644
--- a/dlls/d3d11/shader.c
+++ b/dlls/d3d11/shader.c
@@ -394,7 +394,6 @@ static HRESULT d3d_vertex_shader_init(struct d3d_vertex_shader *shader, struct d
 
     desc.byte_code = byte_code;
     desc.byte_code_size = byte_code_length;
-    desc.format = WINED3D_SHADER_BYTE_CODE_FORMAT_DXBC;
     if (FAILED(hr = wined3d_shader_create_vs(device->wined3d_device, &desc, shader,
             &d3d_vertex_shader_wined3d_parent_ops, &shader->wined3d_shader)))
     {
@@ -598,7 +597,6 @@ static HRESULT d3d11_hull_shader_init(struct d3d11_hull_shader *shader, struct d
 
     desc.byte_code = byte_code;
     desc.byte_code_size = byte_code_length;
-    desc.format = WINED3D_SHADER_BYTE_CODE_FORMAT_DXBC;
     if (FAILED(hr = wined3d_shader_create_hs(device->wined3d_device, &desc, shader,
             &d3d11_hull_shader_wined3d_parent_ops, &shader->wined3d_shader)))
     {
@@ -792,7 +790,6 @@ static HRESULT d3d11_domain_shader_init(struct d3d11_domain_shader *shader, stru
 
     desc.byte_code = byte_code;
     desc.byte_code_size = byte_code_length;
-    desc.format = WINED3D_SHADER_BYTE_CODE_FORMAT_DXBC;
     if (FAILED(hr = wined3d_shader_create_ds(device->wined3d_device, &desc, shader,
             &d3d11_domain_shader_wined3d_parent_ops, &shader->wined3d_shader)))
     {
@@ -1293,7 +1290,6 @@ static HRESULT d3d_geometry_shader_init(struct d3d_geometry_shader *shader,
 
     desc.byte_code = byte_code;
     desc.byte_code_size = byte_code_length;
-    desc.format = WINED3D_SHADER_BYTE_CODE_FORMAT_DXBC;
 
     memset(&so_desc, 0, sizeof(so_desc));
     if (so_entries)
@@ -1645,7 +1641,6 @@ static HRESULT d3d_pixel_shader_init(struct d3d_pixel_shader *shader, struct d3d
 
     desc.byte_code = byte_code;
     desc.byte_code_size = byte_code_length;
-    desc.format = WINED3D_SHADER_BYTE_CODE_FORMAT_DXBC;
     if (FAILED(hr = wined3d_shader_create_ps(device->wined3d_device, &desc, shader,
             &d3d_pixel_shader_wined3d_parent_ops, &shader->wined3d_shader)))
     {
@@ -1847,7 +1842,6 @@ static HRESULT d3d11_compute_shader_init(struct d3d11_compute_shader *shader, st
 
     desc.byte_code = byte_code;
     desc.byte_code_size = byte_code_length;
-    desc.format = WINED3D_SHADER_BYTE_CODE_FORMAT_DXBC;
     if (FAILED(hr = wined3d_shader_create_cs(device->wined3d_device, &desc, shader,
             &d3d11_compute_shader_wined3d_parent_ops, &shader->wined3d_shader)))
     {
diff --git a/dlls/d3d8/shader.c b/dlls/d3d8/shader.c
index 8a6881200e8b..2a4fbde88c09 100644
--- a/dlls/d3d8/shader.c
+++ b/dlls/d3d8/shader.c
@@ -117,10 +117,6 @@ HRESULT d3d8_vertex_shader_init(struct d3d8_vertex_shader *shader, struct d3d8_d
 
         desc.byte_code = byte_code;
         desc.byte_code_size = ~(size_t)0;
-        desc.format = WINED3D_SHADER_BYTE_CODE_FORMAT_SM1;
-        desc.input_signature.element_count = 0;
-        desc.output_signature.element_count = 0;
-        desc.patch_constant_signature.element_count = 0;
 
         wined3d_mutex_lock();
         hr = wined3d_shader_create_vs(device->wined3d_device, &desc, shader,
@@ -168,10 +164,6 @@ HRESULT d3d8_pixel_shader_init(struct d3d8_pixel_shader *shader, struct d3d8_dev
 
     desc.byte_code = byte_code;
     desc.byte_code_size = ~(size_t)0;
-    desc.format = WINED3D_SHADER_BYTE_CODE_FORMAT_SM1;
-    desc.input_signature.element_count = 0;
-    desc.output_signature.element_count = 0;
-    desc.patch_constant_signature.element_count = 0;
 
     wined3d_mutex_lock();
     hr = wined3d_shader_create_ps(device->wined3d_device, &desc, shader,
diff --git a/dlls/d3d9/shader.c b/dlls/d3d9/shader.c
index 5fc356c8e8af..bc347386b85d 100644
--- a/dlls/d3d9/shader.c
+++ b/dlls/d3d9/shader.c
@@ -144,10 +144,6 @@ HRESULT vertexshader_init(struct d3d9_vertexshader *shader, struct d3d9_device *
 
     desc.byte_code = byte_code;
     desc.byte_code_size = ~(size_t)0;
-    desc.format = WINED3D_SHADER_BYTE_CODE_FORMAT_SM1;
-    desc.input_signature.element_count = 0;
-    desc.output_signature.element_count = 0;
-    desc.patch_constant_signature.element_count = 0;
 
     wined3d_mutex_lock();
     hr = wined3d_shader_create_vs(device->wined3d_device, &desc, shader,
@@ -297,10 +293,6 @@ HRESULT pixelshader_init(struct d3d9_pixelshader *shader, struct d3d9_device *de
 
     desc.byte_code = byte_code;
     desc.byte_code_size = ~(size_t)0;
-    desc.format = WINED3D_SHADER_BYTE_CODE_FORMAT_SM1;
-    desc.input_signature.element_count = 0;
-    desc.output_signature.element_count = 0;
-    desc.patch_constant_signature.element_count = 0;
 
     wined3d_mutex_lock();
     hr = wined3d_shader_create_ps(device->wined3d_device, &desc, shader,
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index ecff0bc299a6..ce45298b539d 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -3150,7 +3150,6 @@ static void shader_cleanup(struct wined3d_shader *shader)
     heap_free(shader->patch_constant_signature.elements);
     heap_free(shader->output_signature.elements);
     heap_free(shader->input_signature.elements);
-    heap_free(shader->signature_strings);
     shader->device->shader_backend->shader_destroy(shader);
     shader_cleanup_reg_maps(&shader->reg_maps);
     heap_free(shader->byte_code);
@@ -3598,107 +3597,12 @@ BOOL vshader_get_input(const struct wined3d_shader *shader,
     return FALSE;
 }
 
-static HRESULT shader_signature_calculate_strings_length(const struct wined3d_shader_signature *signature,
-        SIZE_T *total)
-{
-    struct wined3d_shader_signature_element *e;
-    unsigned int i;
-    SIZE_T len;
-
-    for (i = 0; i < signature->element_count; ++i)
-    {
-        e = &signature->elements[i];
-        len = strlen(e->semantic_name);
-        if (len >= ~(SIZE_T)0 - *total)
-            return E_OUTOFMEMORY;
-
-        *total += len + 1;
-    }
-    return WINED3D_OK;
-}
-
-static HRESULT shader_signature_copy(struct wined3d_shader_signature *dst,
-        const struct wined3d_shader_signature *src, char **signature_strings)
-{
-    struct wined3d_shader_signature_element *e;
-    unsigned int i;
-    SIZE_T len;
-    char *ptr;
-
-    if (!src->element_count)
-        return WINED3D_OK;
-
-    ptr = *signature_strings;
-
-    dst->element_count = src->element_count;
-    if (!(dst->elements = heap_calloc(dst->element_count, sizeof(*dst->elements))))
-        return E_OUTOFMEMORY;
-
-    for (i = 0; i < src->element_count; ++i)
-    {
-        e = &src->elements[i];
-        dst->elements[i] = *e;
-
-        len = strlen(e->semantic_name);
-        memcpy(ptr, e->semantic_name, len + 1);
-        dst->elements[i].semantic_name = ptr;
-        ptr += len + 1;
-    }
-
-    *signature_strings = ptr;
-
-    return WINED3D_OK;
-}
-
-static HRESULT shader_copy_signatures_from_shader_desc(struct wined3d_shader *shader,
-        const struct wined3d_shader_desc *desc)
-{
-    SIZE_T total;
-    HRESULT hr;
-    char *ptr;
-
-    total = 0;
-    if (FAILED(hr = shader_signature_calculate_strings_length(&desc->input_signature, &total)))
-        return hr;
-    if (FAILED(hr = shader_signature_calculate_strings_length(&desc->output_signature, &total)))
-        return hr;
-    if (FAILED(hr = shader_signature_calculate_strings_length(&desc->patch_constant_signature, &total)))
-        return hr;
-    if (total && !(shader->signature_strings = heap_alloc(total)))
-        return E_OUTOFMEMORY;
-    ptr = shader->signature_strings;
-
-    if (FAILED(hr = shader_signature_copy(&shader->input_signature, &desc->input_signature, &ptr)))
-    {
-        heap_free(shader->signature_strings);
-        return hr;
-    }
-    if (FAILED(hr = shader_signature_copy(&shader->output_signature, &desc->output_signature, &ptr)))
-    {
-        heap_free(shader->input_signature.elements);
-        heap_free(shader->signature_strings);
-        return hr;
-    }
-    if (FAILED(hr = shader_signature_copy(&shader->patch_constant_signature, &desc->patch_constant_signature, &ptr)))
-    {
-        heap_free(shader->output_signature.elements);
-        heap_free(shader->input_signature.elements);
-        heap_free(shader->signature_strings);
-        return hr;
-    }
-
-    return S_OK;
-}
-
 static HRESULT shader_init(struct wined3d_shader *shader, struct wined3d_device *device,
         const struct wined3d_shader_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops)
 {
-    enum wined3d_shader_byte_code_format format;
-    unsigned int max_version;
     HRESULT hr;
 
-    TRACE("byte_code %p, byte_code_size %#lx, format %#x.\n",
-            desc->byte_code, (long)desc->byte_code_size, desc->format);
+    TRACE("byte_code %p, byte_code_size %#lx.\n", desc->byte_code, (long)desc->byte_code_size);
 
     if (!desc->byte_code)
         return WINED3DERR_INVALIDCALL;
@@ -3716,74 +3620,73 @@ static HRESULT shader_init(struct wined3d_shader *shader, struct wined3d_device
     list_init(&shader->reg_maps.indexable_temps);
     list_init(&shader->shader_list_entry);
 
-    format = desc->format;
-    if (format == WINED3D_SHADER_BYTE_CODE_FORMAT_DXBC)
+    if (desc->byte_code_size == ~(size_t)0)
     {
-        if (!(shader->byte_code = heap_alloc(desc->byte_code_size)))
+        struct wined3d_shader_version shader_version;
+        const struct wined3d_shader_frontend *fe;
+        struct wined3d_shader_instruction ins;
+        const DWORD *ptr;
+        void *fe_data;
+
+        if (!(shader->frontend = shader_select_frontend(WINED3D_SHADER_BYTE_CODE_FORMAT_SM1)))
         {
-            hr = E_OUTOFMEMORY;
+            FIXME("Unable to find frontend for shader.\n");
+            hr = WINED3DERR_INVALIDCALL;
             goto fail;
         }
-        memcpy(shader->byte_code, desc->byte_code, desc->byte_code_size);
-        shader->byte_code_size = desc->byte_code_size;
-
-        max_version = shader_max_version_from_feature_level(device->feature_level);
-        if (FAILED(hr = shader_extract_from_dxbc(shader, max_version, &format)))
-            goto fail;
-    }
-    else if (FAILED(hr = shader_copy_signatures_from_shader_desc(shader, desc)))
-    {
-        goto fail;
-    }
-
-    if (!(shader->frontend = shader_select_frontend(format)))
-    {
-        FIXME("Unable to find frontend for shader.\n");
-        hr = WINED3DERR_INVALIDCALL;
-        goto fail;
-    }
-
-    if (!shader->byte_code)
-    {
-        size_t byte_code_size = desc->byte_code_size;
 
-        if (byte_code_size == ~(size_t)0)
+        fe = shader->frontend;
+        if (!(fe_data = fe->shader_init(desc->byte_code, desc->byte_code_size, &shader->output_signature)))
         {
-            const struct wined3d_shader_frontend *fe = shader->frontend;
-            struct wined3d_shader_version shader_version;
-            struct wined3d_shader_instruction ins;
-            const DWORD *ptr;
-            void *fe_data;
+            WARN("Failed to initialise frontend data.\n");
+            hr = WINED3DERR_INVALIDCALL;
+            goto fail;
+        }
 
-            if (!(fe_data = fe->shader_init(desc->byte_code, byte_code_size, &shader->output_signature)))
-            {
-                WARN("Failed to initialise frontend data.\n");
-                hr = WINED3DERR_INVALIDCALL;
-                goto fail;
-            }
+        fe->shader_read_header(fe_data, &ptr, &shader_version);
+        while (!fe->shader_is_end(fe_data, &ptr))
+            fe->shader_read_instruction(fe_data, &ptr, &ins);
 
-            fe->shader_read_header(fe_data, &ptr, &shader_version);
-            while (!fe->shader_is_end(fe_data, &ptr))
-                fe->shader_read_instruction(fe_data, &ptr, &ins);
+        fe->shader_free(fe_data);
 
-            fe->shader_free(fe_data);
+        shader->byte_code_size = (ptr - desc->byte_code) * sizeof(*ptr);
 
-            byte_code_size = (ptr - desc->byte_code) * sizeof(*ptr);
-        }
-
-        if (!(shader->byte_code = heap_alloc(byte_code_size)))
+        if (!(shader->byte_code = heap_alloc(shader->byte_code_size)))
         {
             hr = E_OUTOFMEMORY;
             goto fail;
         }
-        memcpy(shader->byte_code, desc->byte_code, byte_code_size);
-        shader->byte_code_size = byte_code_size;
+        memcpy(shader->byte_code, desc->byte_code, shader->byte_code_size);
 
         shader->function = shader->byte_code;
         shader->functionLength = shader->byte_code_size;
     }
+    else
+    {
+        enum wined3d_shader_byte_code_format format;
+        unsigned int max_version;
 
-    return hr;
+        if (!(shader->byte_code = heap_alloc(desc->byte_code_size)))
+        {
+            hr = E_OUTOFMEMORY;
+            goto fail;
+        }
+        memcpy(shader->byte_code, desc->byte_code, desc->byte_code_size);
+        shader->byte_code_size = desc->byte_code_size;
+
+        max_version = shader_max_version_from_feature_level(device->feature_level);
+        if (FAILED(hr = shader_extract_from_dxbc(shader, max_version, &format)))
+            goto fail;
+
+        if (!(shader->frontend = shader_select_frontend(format)))
+        {
+            FIXME("Unable to find frontend for shader.\n");
+            hr = WINED3DERR_INVALIDCALL;
+            goto fail;
+        }
+    }
+
+    return WINED3D_OK;
 
 fail:
     shader_cleanup(shader);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 221b9472aa67..b5e3c79d4fc2 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -397,6 +397,12 @@ struct wined3d_settings
 
 extern struct wined3d_settings wined3d_settings DECLSPEC_HIDDEN;
 
+enum wined3d_shader_byte_code_format
+{
+    WINED3D_SHADER_BYTE_CODE_FORMAT_SM1,
+    WINED3D_SHADER_BYTE_CODE_FORMAT_SM4,
+};
+
 enum wined3d_shader_resource_type
 {
     WINED3D_SHADER_RESOURCE_NONE,
@@ -4108,7 +4114,6 @@ struct wined3d_shader
     struct wined3d_shader_signature input_signature;
     struct wined3d_shader_signature output_signature;
     struct wined3d_shader_signature patch_constant_signature;
-    char *signature_strings;
 
     /* Pointer to the parent device */
     struct wined3d_device *device;
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 297192f7c703..8197a8682ae5 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -854,13 +854,6 @@ enum wined3d_display_rotation
     WINED3D_DISPLAY_ROTATION_270            = 4,
 };
 
-enum wined3d_shader_byte_code_format
-{
-    WINED3D_SHADER_BYTE_CODE_FORMAT_SM1     = 0,
-    WINED3D_SHADER_BYTE_CODE_FORMAT_SM4     = 1,
-    WINED3D_SHADER_BYTE_CODE_FORMAT_DXBC    = 2,
-};
-
 enum wined3d_shader_type
 {
     WINED3D_SHADER_TYPE_PIXEL,
@@ -2062,10 +2055,6 @@ struct wined3d_shader_desc
 {
     const DWORD *byte_code;
     size_t byte_code_size;
-    enum wined3d_shader_byte_code_format format;
-    struct wined3d_shader_signature input_signature;
-    struct wined3d_shader_signature output_signature;
-    struct wined3d_shader_signature patch_constant_signature;
 };
 
 struct wined3d_stream_output_element
-- 
2.16.4




More information about the wine-devel mailing list