[PATCH 1/6] wined3d: Parse the shader version in shader_sm4_init().

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


Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
 dlls/wined3d/arb_program_shader.c |  6 +--
 dlls/wined3d/glsl_shader.c        | 12 ++----
 dlls/wined3d/shader.c             | 16 ++++----
 dlls/wined3d/shader_sm1.c         | 14 ++++---
 dlls/wined3d/shader_sm4.c         | 85 ++++++++++++++++++++-------------------
 dlls/wined3d/wined3d_private.h    |  2 +-
 6 files changed, 66 insertions(+), 69 deletions(-)

diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 24dcb05..1872100 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -3510,7 +3510,6 @@ static GLuint shader_arb_generate_pshader(const struct wined3d_shader *shader,
         const struct arb_ps_compile_args *args, struct arb_ps_compiled_shader *compiled)
 {
     const struct wined3d_shader_reg_maps *reg_maps = &shader->reg_maps;
-    const DWORD *function = shader->function;
     GLuint retval;
     char fragcolor[16];
     DWORD next_local = 0;
@@ -3810,7 +3809,7 @@ static GLuint shader_arb_generate_pshader(const struct wined3d_shader *shader,
     }
 
     /* Base Shader Body */
-    shader_generate_main(shader, buffer, reg_maps, function, &priv_ctx);
+    shader_generate_main(shader, buffer, reg_maps, &priv_ctx);
 
     if(args->super.srgb_correction) {
         arbfp_add_sRGB_correction(buffer, fragcolor, srgbtmp[0], srgbtmp[1], srgbtmp[2], srgbtmp[3],
@@ -4114,7 +4113,6 @@ static GLuint shader_arb_generate_vshader(const struct wined3d_shader *shader,
     const struct arb_vshader_private *shader_data = shader->backend_data;
     const struct wined3d_shader_reg_maps *reg_maps = &shader->reg_maps;
     struct shader_arb_priv *priv = shader->device->shader_priv;
-    const DWORD *function = shader->function;
     GLuint ret;
     DWORD next_local = 0;
     struct shader_arb_ctx_priv priv_ctx;
@@ -4224,7 +4222,7 @@ static GLuint shader_arb_generate_vshader(const struct wined3d_shader *shader,
     /* The shader starts with the main function */
     priv_ctx.in_main_func = TRUE;
     /* Base Shader Body */
-    shader_generate_main(shader, buffer, reg_maps, function, &priv_ctx);
+    shader_generate_main(shader, buffer, reg_maps, &priv_ctx);
 
     if (!priv_ctx.footer_written) vshader_add_footer(&priv_ctx,
             shader_data, args, reg_maps, gl_info, buffer);
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index b583453..f312f15 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -6419,7 +6419,6 @@ static GLuint shader_glsl_generate_pshader(const struct wined3d_context *context
 {
     const struct wined3d_shader_reg_maps *reg_maps = &shader->reg_maps;
     const struct wined3d_gl_info *gl_info = context->gl_info;
-    const DWORD *function = shader->function;
     struct shader_glsl_ctx_priv priv_ctx;
     BOOL legacy_context = gl_info->supported[WINED3D_GL_LEGACY_CONTEXT];
 
@@ -6515,7 +6514,7 @@ static GLuint shader_glsl_generate_pshader(const struct wined3d_context *context
         shader_glsl_input_pack(shader, buffer, &shader->input_signature, reg_maps, args, gl_info);
 
     /* Base Shader Body */
-    shader_generate_main(shader, buffer, reg_maps, function, &priv_ctx);
+    shader_generate_main(shader, buffer, reg_maps, &priv_ctx);
 
     /* In SM4+ the shader epilogue is generated by the "ret" instruction. */
     if (reg_maps->shader_version.major < 4)
@@ -6580,7 +6579,6 @@ static GLuint shader_glsl_generate_vshader(const struct wined3d_context *context
     const struct wined3d_shader_reg_maps *reg_maps = &shader->reg_maps;
     struct wined3d_string_buffer *buffer = &priv->shader_buffer;
     const struct wined3d_gl_info *gl_info = context->gl_info;
-    const DWORD *function = shader->function;
     struct shader_glsl_ctx_priv priv_ctx;
 
     /* Create the hw GLSL shader program and assign it as the shader->prgId */
@@ -6615,7 +6613,7 @@ static GLuint shader_glsl_generate_vshader(const struct wined3d_context *context
     shader_addline(buffer, "void main()\n{\n");
 
     /* Base Shader Body */
-    shader_generate_main(shader, buffer, reg_maps, function, &priv_ctx);
+    shader_generate_main(shader, buffer, reg_maps, &priv_ctx);
 
     /* In SM4+ the shader epilogue is generated by the "ret" instruction. */
     if (reg_maps->shader_version.major < 4)
@@ -6637,7 +6635,6 @@ static GLuint shader_glsl_generate_geometry_shader(const struct wined3d_context
     const struct wined3d_shader_reg_maps *reg_maps = &shader->reg_maps;
     struct wined3d_string_buffer *buffer = &priv->shader_buffer;
     const struct wined3d_gl_info *gl_info = context->gl_info;
-    const DWORD *function = shader->function;
     struct shader_glsl_ctx_priv priv_ctx;
     GLuint shader_id;
 
@@ -6656,7 +6653,7 @@ static GLuint shader_glsl_generate_geometry_shader(const struct wined3d_context
         shader_addline(buffer, "uniform vec4 pos_fixup;\n");
     shader_glsl_generate_sm4_rasterizer_input_setup(priv, shader, args->ps_input_count, gl_info);
     shader_addline(buffer, "void main()\n{\n");
-    shader_generate_main(shader, buffer, reg_maps, function, &priv_ctx);
+    shader_generate_main(shader, buffer, reg_maps, &priv_ctx);
     shader_addline(buffer, "}\n");
 
     TRACE("Compiling shader object %u.\n", shader_id);
@@ -6696,7 +6693,6 @@ static GLuint shader_glsl_generate_compute_shader(const struct wined3d_context *
     const struct wined3d_shader_thread_group_size *thread_group_size = &shader->u.cs.thread_group_size;
     const struct wined3d_shader_reg_maps *reg_maps = &shader->reg_maps;
     const struct wined3d_gl_info *gl_info = context->gl_info;
-    const DWORD *function = shader->function;
     struct shader_glsl_ctx_priv priv_ctx;
     GLuint shader_id;
 
@@ -6716,7 +6712,7 @@ static GLuint shader_glsl_generate_compute_shader(const struct wined3d_context *
             thread_group_size->x, thread_group_size->y, thread_group_size->z);
 
     shader_addline(buffer, "void main()\n{\n");
-    shader_generate_main(shader, buffer, reg_maps, function, &priv_ctx);
+    shader_generate_main(shader, buffer, reg_maps, &priv_ctx);
     shader_addline(buffer, "}\n");
 
     TRACE("Compiling shader object %u.\n", shader_id);
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index 6f012cd..9688b30 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -886,7 +886,7 @@ static HRESULT shader_get_registers_used(struct wined3d_shader *shader, const st
     unsigned int cur_loop_depth = 0, max_loop_depth = 0;
     void *fe_data = shader->frontend_data;
     struct wined3d_shader_version shader_version;
-    const DWORD *ptr = byte_code;
+    const DWORD *ptr;
     unsigned int i;
 
     memset(reg_maps, 0, sizeof(*reg_maps));
@@ -2179,7 +2179,7 @@ static void shader_dump_src_param(struct wined3d_string_buffer *buffer,
 /* Shared code in order to generate the bulk of the shader string.
  * NOTE: A description of how to parse tokens can be found on MSDN. */
 void shader_generate_main(const struct wined3d_shader *shader, struct wined3d_string_buffer *buffer,
-        const struct wined3d_shader_reg_maps *reg_maps, const DWORD *byte_code, void *backend_ctx)
+        const struct wined3d_shader_reg_maps *reg_maps, void *backend_ctx)
 {
     struct wined3d_device *device = shader->device;
     const struct wined3d_shader_frontend *fe = shader->frontend;
@@ -2189,7 +2189,7 @@ void shader_generate_main(const struct wined3d_shader *shader, struct wined3d_st
     struct wined3d_shader_instruction ins;
     struct wined3d_shader_tex_mx tex_mx;
     struct wined3d_shader_context ctx;
-    const DWORD *ptr = byte_code;
+    const DWORD *ptr;
 
     /* Initialize current parsing state. */
     tex_mx.current_row = 0;
@@ -2329,13 +2329,13 @@ static void shader_dump_interpolation_mode(struct wined3d_string_buffer *buffer,
     }
 }
 
-static void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe_data, const DWORD *byte_code)
+static void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe_data)
 {
     struct wined3d_shader_version shader_version;
     struct wined3d_string_buffer buffer;
-    const DWORD *ptr = byte_code;
     const char *type_prefix;
     const char *p, *q;
+    const DWORD *ptr;
     DWORD i;
 
     if (!string_buffer_init(&buffer))
@@ -2344,10 +2344,10 @@ static void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe
         return;
     }
 
-    TRACE("Parsing %p.\n", byte_code);
-
     fe->shader_read_header(fe_data, &ptr, &shader_version);
 
+    TRACE("Parsing %p.\n", ptr);
+
     switch (shader_version.type)
     {
         case WINED3D_SHADER_TYPE_VERTEX:
@@ -2887,7 +2887,7 @@ static HRESULT shader_set_function(struct wined3d_shader *shader, const DWORD *b
 
     /* First pass: trace shader. */
     if (TRACE_ON(d3d_shader))
-        shader_trace_init(fe, shader->frontend_data, byte_code);
+        shader_trace_init(fe, shader->frontend_data);
 
     /* Second pass: figure out which registers are used, what the semantics are, etc. */
     if (FAILED(hr = shader_get_registers_used(shader, fe, reg_maps, &shader->input_signature,
diff --git a/dlls/wined3d/shader_sm1.c b/dlls/wined3d/shader_sm1.c
index 3b6e1b4..2437608 100644
--- a/dlls/wined3d/shader_sm1.c
+++ b/dlls/wined3d/shader_sm1.c
@@ -213,6 +213,7 @@ struct wined3d_sm1_data
 {
     struct wined3d_shader_version shader_version;
     const struct wined3d_sm1_opcode_info *opcode_table;
+    const DWORD *start;
 
     struct wined3d_shader_src_param src_rel_addr[4];
     struct wined3d_shader_src_param pred_rel_addr;
@@ -537,6 +538,8 @@ static void *shader_sm1_init(const DWORD *byte_code, const struct wined3d_shader
     struct wined3d_sm1_data *priv;
     BYTE major, minor;
 
+    TRACE("Version: 0x%08x.\n", *byte_code);
+
     major = WINED3D_SM1_VERSION_MAJOR(*byte_code);
     minor = WINED3D_SM1_VERSION_MINOR(*byte_code);
     if (WINED3D_SHADER_VERSION(major, minor) > WINED3D_SHADER_VERSION(3, 0))
@@ -568,6 +571,10 @@ static void *shader_sm1_init(const DWORD *byte_code, const struct wined3d_shader
             HeapFree(GetProcessHeap(), 0, priv);
             return NULL;
     }
+    priv->shader_version.major = WINED3D_SM1_VERSION_MAJOR(*byte_code);
+    priv->shader_version.minor = WINED3D_SM1_VERSION_MINOR(*byte_code);
+
+    priv->start = &byte_code[1];
 
     return priv;
 }
@@ -580,13 +587,8 @@ static void shader_sm1_free(void *data)
 static void shader_sm1_read_header(void *data, const DWORD **ptr, struct wined3d_shader_version *shader_version)
 {
     struct wined3d_sm1_data *priv = data;
-    DWORD version_token;
-
-    version_token = *(*ptr)++;
-    TRACE("Version: 0x%08x.\n", version_token);
 
-    priv->shader_version.major = WINED3D_SM1_VERSION_MAJOR(version_token);
-    priv->shader_version.minor = WINED3D_SM1_VERSION_MINOR(version_token);
+    *ptr = priv->start;
     *shader_version = priv->shader_version;
 }
 
diff --git a/dlls/wined3d/shader_sm4.c b/dlls/wined3d/shader_sm4.c
index 61af803..a9d731f 100644
--- a/dlls/wined3d/shader_sm4.c
+++ b/dlls/wined3d/shader_sm4.c
@@ -396,7 +396,7 @@ struct wined3d_shader_src_param_entry
 struct wined3d_sm4_data
 {
     struct wined3d_shader_version shader_version;
-    const DWORD *end;
+    const DWORD *start, *end;
 
     unsigned int output_map[MAX_REG_OUTPUT];
 
@@ -1123,15 +1123,56 @@ static enum wined3d_data_type map_data_type(char t)
 
 static void *shader_sm4_init(const DWORD *byte_code, const struct wined3d_shader_signature *output_signature)
 {
+    DWORD version_token, token_count;
     struct wined3d_sm4_data *priv;
     unsigned int i;
 
+    version_token = byte_code[0];
+    TRACE("Version: 0x%08x.\n", version_token);
+    token_count = byte_code[1];
+    TRACE("Token count: %u.\n", token_count);
+
     if (!(priv = HeapAlloc(GetProcessHeap(), 0, sizeof(*priv))))
     {
         ERR("Failed to allocate private data\n");
         return NULL;
     }
 
+    priv->start = &byte_code[2];
+    priv->end = &byte_code[token_count];
+
+    switch (version_token >> 16)
+    {
+        case WINED3D_SM4_PS:
+            priv->shader_version.type = WINED3D_SHADER_TYPE_PIXEL;
+            break;
+
+        case WINED3D_SM4_VS:
+            priv->shader_version.type = WINED3D_SHADER_TYPE_VERTEX;
+            break;
+
+        case WINED3D_SM4_GS:
+            priv->shader_version.type = WINED3D_SHADER_TYPE_GEOMETRY;
+            break;
+
+        case WINED3D_SM5_HS:
+            priv->shader_version.type = WINED3D_SHADER_TYPE_HULL;
+            break;
+
+        case WINED3D_SM5_DS:
+            priv->shader_version.type = WINED3D_SHADER_TYPE_DOMAIN;
+            break;
+
+        case WINED3D_SM5_CS:
+            priv->shader_version.type = WINED3D_SHADER_TYPE_COMPUTE;
+            break;
+
+        default:
+            FIXME("Unrecognised shader type %#x.\n", version_token >> 16);
+    }
+    priv->shader_version.major = WINED3D_SM4_VERSION_MAJOR(version_token);
+    priv->shader_version.minor = WINED3D_SM4_VERSION_MINOR(version_token);
+
     memset(priv->output_map, 0xff, sizeof(priv->output_map));
     for (i = 0; i < output_signature->element_count; ++i)
     {
@@ -1190,48 +1231,8 @@ static struct wined3d_shader_src_param *get_src_param(struct wined3d_sm4_data *p
 static void shader_sm4_read_header(void *data, const DWORD **ptr, struct wined3d_shader_version *shader_version)
 {
     struct wined3d_sm4_data *priv = data;
-    DWORD version_token;
-
-    priv->end = *ptr;
-
-    version_token = *(*ptr)++;
-    TRACE("Version: 0x%08x.\n", version_token);
-
-    TRACE("Token count: %u.\n", **ptr);
-    priv->end += *(*ptr)++;
-
-    switch (version_token >> 16)
-    {
-        case WINED3D_SM4_PS:
-            priv->shader_version.type = WINED3D_SHADER_TYPE_PIXEL;
-            break;
-
-        case WINED3D_SM4_VS:
-            priv->shader_version.type = WINED3D_SHADER_TYPE_VERTEX;
-            break;
-
-        case WINED3D_SM4_GS:
-            priv->shader_version.type = WINED3D_SHADER_TYPE_GEOMETRY;
-            break;
-
-        case WINED3D_SM5_HS:
-            priv->shader_version.type = WINED3D_SHADER_TYPE_HULL;
-            break;
-
-        case WINED3D_SM5_DS:
-            priv->shader_version.type = WINED3D_SHADER_TYPE_DOMAIN;
-            break;
-
-        case WINED3D_SM5_CS:
-            priv->shader_version.type = WINED3D_SHADER_TYPE_COMPUTE;
-            break;
-
-        default:
-            FIXME("Unrecognized shader type %#x.\n", version_token >> 16);
-    }
-    priv->shader_version.major = WINED3D_SM4_VERSION_MAJOR(version_token);
-    priv->shader_version.minor = WINED3D_SM4_VERSION_MINOR(version_token);
 
+    *ptr = priv->start;
     *shader_version = priv->shader_version;
 }
 
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index c518bda..d4380a5 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -3643,7 +3643,7 @@ void string_buffer_free(struct wined3d_string_buffer *buffer) DECLSPEC_HIDDEN;
 unsigned int shader_find_free_input_register(const struct wined3d_shader_reg_maps *reg_maps,
         unsigned int max) DECLSPEC_HIDDEN;
 void shader_generate_main(const struct wined3d_shader *shader, struct wined3d_string_buffer *buffer,
-        const struct wined3d_shader_reg_maps *reg_maps, const DWORD *byte_code, void *backend_ctx) DECLSPEC_HIDDEN;
+        const struct wined3d_shader_reg_maps *reg_maps, void *backend_ctx) DECLSPEC_HIDDEN;
 BOOL shader_match_semantic(const char *semantic_name, enum wined3d_decl_usage usage) DECLSPEC_HIDDEN;
 
 static inline BOOL shader_is_scalar(const struct wined3d_shader_register *reg)
-- 
2.1.4




More information about the wine-patches mailing list