[PATCH 3/6] wined3d: Explicitly pass the byte-code format to shader creation functions (AFL).

Henri Verbeet hverbeet at codeweavers.com
Mon Feb 20 17:40:05 CST 2017


Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
 dlls/d3d11/shader.c    |  2 ++
 dlls/d3d8/shader.c     |  2 ++
 dlls/d3d9/shader.c     |  2 ++
 dlls/wined3d/shader.c  | 31 +++++++++++++------------------
 include/wine/wined3d.h |  7 +++++++
 5 files changed, 26 insertions(+), 18 deletions(-)

diff --git a/dlls/d3d11/shader.c b/dlls/d3d11/shader.c
index 0e0c607..ae19eba 100644
--- a/dlls/d3d11/shader.c
+++ b/dlls/d3d11/shader.c
@@ -77,6 +77,7 @@ static HRESULT shdr_handler(const char *data, DWORD data_size, DWORD tag, void *
                 FIXME("Multiple shader code chunks.\n");
             desc->byte_code = (const DWORD *)data;
             desc->byte_code_size = data_size;
+            desc->format = WINED3D_SHADER_BYTE_CODE_FORMAT_SM4;
             break;
 
         case TAG_AON9:
@@ -105,6 +106,7 @@ static HRESULT shdr_handler(const char *data, DWORD data_size, DWORD tag, void *
                     FIXME("Multiple shader code chunks.\n");
                 desc->byte_code = (const DWORD *)byte_code;
                 desc->byte_code_size = data_size - header->byte_code_offset;
+                desc->format = WINED3D_SHADER_BYTE_CODE_FORMAT_SM1;
                 TRACE("Feature level 9 shader version 0%08x, 0%08x.\n", header->shader_version, *desc->byte_code);
             }
             else
diff --git a/dlls/d3d8/shader.c b/dlls/d3d8/shader.c
index 3d6ffa8..ee78b7c 100644
--- a/dlls/d3d8/shader.c
+++ b/dlls/d3d8/shader.c
@@ -118,6 +118,7 @@ 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.max_version = 1;
@@ -168,6 +169,7 @@ 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.max_version = 1;
diff --git a/dlls/d3d9/shader.c b/dlls/d3d9/shader.c
index 9bb8642..05f21e4 100644
--- a/dlls/d3d9/shader.c
+++ b/dlls/d3d9/shader.c
@@ -144,6 +144,7 @@ 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.max_version = 3;
@@ -296,6 +297,7 @@ 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.max_version = 3;
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index 181cebd..a3b3c3d 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -392,24 +392,18 @@ static void shader_signature_from_usage(struct wined3d_shader_signature_element
     e->mask = write_mask;
 }
 
-static const struct wined3d_shader_frontend *shader_select_frontend(DWORD version_token)
+static const struct wined3d_shader_frontend *shader_select_frontend(enum wined3d_shader_byte_code_format format)
 {
-    switch (version_token >> 16)
+    switch (format)
     {
-        case WINED3D_SM1_VS:
-        case WINED3D_SM1_PS:
+        case WINED3D_SHADER_BYTE_CODE_FORMAT_SM1:
             return &sm1_shader_frontend;
 
-        case WINED3D_SM4_PS:
-        case WINED3D_SM4_VS:
-        case WINED3D_SM4_GS:
-        case WINED3D_SM5_HS:
-        case WINED3D_SM5_DS:
-        case WINED3D_SM5_CS:
+        case WINED3D_SHADER_BYTE_CODE_FORMAT_SM4:
             return &sm4_shader_frontend;
 
         default:
-            FIXME("Unrecognised version token %#x.\n", version_token);
+            WARN("Invalid byte code format %#x specified.\n", format);
             return NULL;
     }
 }
@@ -2854,7 +2848,8 @@ const struct wined3d_shader_backend_ops none_shader_backend =
 };
 
 static HRESULT shader_set_function(struct wined3d_shader *shader, const DWORD *byte_code,
-        size_t byte_code_size, DWORD float_const_count, enum wined3d_shader_type type, unsigned int max_version)
+        size_t byte_code_size, enum wined3d_shader_byte_code_format format,
+        DWORD float_const_count, enum wined3d_shader_type type, unsigned int max_version)
 {
     struct wined3d_shader_reg_maps *reg_maps = &shader->reg_maps;
     const struct wined3d_shader_frontend *fe;
@@ -2862,8 +2857,9 @@ static HRESULT shader_set_function(struct wined3d_shader *shader, const DWORD *b
     unsigned int backend_version;
     const struct wined3d_d3d_info *d3d_info = &shader->device->adapter->d3d_info;
 
-    TRACE("shader %p, byte_code %p, byte_code_size %#lx, float_const_count %u, type %#x, max_version %u.\n",
-            shader, byte_code, (long)byte_code_size, float_const_count, type, max_version);
+    TRACE("shader %p, byte_code %p, byte_code_size %#lx, format %#x, "
+            "float_const_count %u, type %#x, max_version %u.\n",
+            shader, byte_code, (long)byte_code_size, format, float_const_count, type, max_version);
 
     list_init(&shader->constantsF);
     list_init(&shader->constantsB);
@@ -2871,8 +2867,7 @@ static HRESULT shader_set_function(struct wined3d_shader *shader, const DWORD *b
     shader->lconst_inf_or_nan = FALSE;
     list_init(&reg_maps->indexable_temps);
 
-    fe = shader_select_frontend(*byte_code);
-    if (!fe)
+    if (!(fe = shader_select_frontend(format)))
     {
         FIXME("Unable to find frontend for shader.\n");
         return WINED3DERR_INVALIDCALL;
@@ -3192,8 +3187,8 @@ static HRESULT shader_init(struct wined3d_shader *shader, struct wined3d_device
     list_init(&shader->linked_programs);
     list_add_head(&device->shaders, &shader->shader_list_entry);
 
-    if (FAILED(hr = shader_set_function(shader, desc->byte_code,
-            desc->byte_code_size, float_const_count, type, desc->max_version)))
+    if (FAILED(hr = shader_set_function(shader, desc->byte_code, desc->byte_code_size,
+            desc->format, float_const_count, type, desc->max_version)))
     {
         WARN("Failed to set function, hr %#x.\n", hr);
         shader_cleanup(shader);
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 834cf11..b511955 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -800,6 +800,12 @@ 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,
+};
+
 #define WINED3DCOLORWRITEENABLE_RED                             (1u << 0)
 #define WINED3DCOLORWRITEENABLE_GREEN                           (1u << 1)
 #define WINED3DCOLORWRITEENABLE_BLUE                            (1u << 2)
@@ -1960,6 +1966,7 @@ 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;
     unsigned int max_version;
-- 
2.1.4




More information about the wine-patches mailing list