Henri Verbeet : wined3d: Handle reading the shader header in the frontend.

Alexandre Julliard julliard at winehq.org
Tue May 5 09:12:52 CDT 2009


Module: wine
Branch: master
Commit: 868f5bfc7c21431fff41c0b4c1dc4d03f56e0109
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=868f5bfc7c21431fff41c0b4c1dc4d03f56e0109

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Tue May  5 09:38:03 2009 +0200

wined3d: Handle reading the shader header in the frontend.

In SM 1-3 this is just the version, in SM4 this also includes the token count.

---

 dlls/wined3d/baseshader.c      |   26 ++++++--------------------
 dlls/wined3d/shader_sm1.c      |    7 +++++++
 dlls/wined3d/shader_sm4.c      |    9 +++++++++
 dlls/wined3d/wined3d_private.h |    1 +
 4 files changed, 23 insertions(+), 20 deletions(-)

diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c
index 9c466fc..75cf2d5 100644
--- a/dlls/wined3d/baseshader.c
+++ b/dlls/wined3d/baseshader.c
@@ -342,13 +342,8 @@ HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3
     shader_delete_constant_list(&This->baseShader.constantsB);
     shader_delete_constant_list(&This->baseShader.constantsI);
 
-    /* The version token is supposed to be the first token */
-    if (!shader_is_version_token(*pToken))
-    {
-        FIXME("First token is not a version token, invalid shader.\n");
-        return WINED3DERR_INVALIDCALL;
-    }
-    reg_maps->shader_version = shader_version = *pToken++;
+    fe->shader_read_header(&pToken, &shader_version);
+    reg_maps->shader_version = shader_version;
     pshader = shader_is_pshader_version(shader_version);
 
     while (!fe->shader_is_end(&pToken))
@@ -868,7 +863,6 @@ void shader_generate_main(IWineD3DBaseShader *iface, SHADER_BUFFER *buffer,
     IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) This->baseShader.device; /* To access shader backend callbacks */
     const SHADER_OPCODE *opcode_table = This->baseShader.shader_ins;
     const SHADER_HANDLER *handler_table = device->shader_backend->shader_instruction_handler_table;
-    DWORD shader_version = reg_maps->shader_version;
     struct wined3d_shader_src_param src_rel_addr[4];
     struct wined3d_shader_src_param src_param[4];
     struct wined3d_shader_src_param dst_rel_addr;
@@ -877,6 +871,7 @@ void shader_generate_main(IWineD3DBaseShader *iface, SHADER_BUFFER *buffer,
     struct wined3d_shader_context ctx;
     const DWORD *pToken = pFunction;
     SHADER_HANDLER hw_fct;
+    DWORD shader_version;
     DWORD i;
 
     /* Initialize current parsing state */
@@ -889,11 +884,7 @@ void shader_generate_main(IWineD3DBaseShader *iface, SHADER_BUFFER *buffer,
     ins.src = src_param;
     This->baseShader.parse_state.current_row = 0;
 
-    if (!shader_is_version_token(*pToken++))
-    {
-        ERR("First token is not a version token, invalid shader.\n");
-        return;
-    }
+    fe->shader_read_header(&pToken, &shader_version);
 
     while (!fe->shader_is_end(&pToken))
     {
@@ -995,13 +986,8 @@ void shader_trace_init(const struct wined3d_shader_frontend *fe,
 
     TRACE("Parsing %p\n", pFunction);
 
-    /* The version token is supposed to be the first token */
-    if (!shader_is_version_token(*pToken))
-    {
-        FIXME("First token is not a version token, invalid shader.\n");
-        return;
-    }
-    shader_version = *pToken++;
+    fe->shader_read_header(&pToken, &shader_version);
+
     TRACE("%s_%u_%u\n", shader_is_pshader_version(shader_version) ? "ps": "vs",
             WINED3DSHADER_VERSION_MAJOR(shader_version), WINED3DSHADER_VERSION_MINOR(shader_version));
 
diff --git a/dlls/wined3d/shader_sm1.c b/dlls/wined3d/shader_sm1.c
index 225f632..7e2484d 100644
--- a/dlls/wined3d/shader_sm1.c
+++ b/dlls/wined3d/shader_sm1.c
@@ -221,6 +221,12 @@ static int shader_skip_unrecognized(const DWORD *ptr, DWORD shader_version)
     return tokens_read;
 }
 
+static void shader_sm1_read_header(const DWORD **ptr, DWORD *shader_version)
+{
+    TRACE("version: 0x%08x\n", **ptr);
+    *shader_version = *(*ptr)++;
+}
+
 static void shader_sm1_read_opcode(const DWORD **ptr, struct wined3d_shader_instruction *ins, UINT *param_size,
         const SHADER_OPCODE *opcode_table, DWORD shader_version)
 {
@@ -318,6 +324,7 @@ static BOOL shader_sm1_is_end(const DWORD **ptr)
 
 const struct wined3d_shader_frontend sm1_shader_frontend =
 {
+    shader_sm1_read_header,
     shader_sm1_read_opcode,
     shader_sm1_read_src_param,
     shader_sm1_read_dst_param,
diff --git a/dlls/wined3d/shader_sm4.c b/dlls/wined3d/shader_sm4.c
index ba66123..c2d7729 100644
--- a/dlls/wined3d/shader_sm4.c
+++ b/dlls/wined3d/shader_sm4.c
@@ -23,6 +23,14 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader);
 
+static void shader_sm4_read_header(const DWORD **ptr, DWORD *shader_version)
+{
+    TRACE("version: 0x%08x\n", **ptr);
+    *shader_version = *(*ptr)++;
+    TRACE("token count: %u\n", **ptr);
+    ++(*ptr);
+}
+
 static void shader_sm4_read_opcode(const DWORD **ptr, struct wined3d_shader_instruction *ins,
         UINT *param_size, const SHADER_OPCODE *opcode_table, DWORD shader_version)
 {
@@ -63,6 +71,7 @@ static BOOL shader_sm4_is_end(const DWORD **ptr)
 
 const struct wined3d_shader_frontend sm4_shader_frontend =
 {
+    shader_sm4_read_header,
     shader_sm4_read_opcode,
     shader_sm4_read_src_param,
     shader_sm4_read_dst_param,
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index c08e4d7..db691d9 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -674,6 +674,7 @@ struct wined3d_shader_semantic
 
 struct wined3d_shader_frontend
 {
+    void (*shader_read_header)(const DWORD **ptr, DWORD *shader_version);
     void (*shader_read_opcode)(const DWORD **ptr, struct wined3d_shader_instruction *ins,
             UINT *param_size, const SHADER_OPCODE *opcode_table, DWORD shader_version);
     void (*shader_read_src_param)(const DWORD **ptr, struct wined3d_shader_src_param *src_param,




More information about the wine-cvs mailing list