Henri Verbeet : d3d10: Simplify DXBC chunk handlers.

Alexandre Julliard julliard at winehq.org
Tue Mar 3 11:53:43 CST 2009


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Tue Mar  3 09:03:46 2009 +0100

d3d10: Simplify DXBC chunk handlers.

---

 dlls/d3d10/effect.c |   35 ++++++++++++++++++-----------------
 1 files changed, 18 insertions(+), 17 deletions(-)

diff --git a/dlls/d3d10/effect.c b/dlls/d3d10/effect.c
index bb7f7a8..656325c 100644
--- a/dlls/d3d10/effect.c
+++ b/dlls/d3d10/effect.c
@@ -60,7 +60,7 @@ static inline void read_tag(const char **ptr, DWORD *t, char t_str[5])
 }
 
 static HRESULT parse_dxbc(const char *data, SIZE_T data_size,
-        HRESULT (*chunk_handler)(const char *data, void *ctx), void *ctx)
+        HRESULT (*chunk_handler)(const char *data, DWORD data_size, DWORD tag, void *ctx), void *ctx)
 {
     const char *ptr = data;
     HRESULT hr = S_OK;
@@ -92,12 +92,19 @@ static HRESULT parse_dxbc(const char *data, SIZE_T data_size,
 
     for (i = 0; i < chunk_count; ++i)
     {
+        DWORD chunk_tag, chunk_size;
+        const char *chunk_ptr;
         DWORD chunk_offset;
 
         read_dword(&ptr, &chunk_offset);
         TRACE("chunk %u at offset %#x\n", i, chunk_offset);
 
-        hr = chunk_handler(data + chunk_offset, ctx);
+        chunk_ptr = data + chunk_offset;
+
+        read_dword(&chunk_ptr, &chunk_tag);
+        read_dword(&chunk_ptr, &chunk_size);
+
+        hr = chunk_handler(chunk_ptr, chunk_size, chunk_tag, ctx);
         if (FAILED(hr)) break;
     }
 
@@ -170,18 +177,15 @@ static HRESULT parse_fx10_technique_index(struct d3d10_effect_technique *t, cons
     return hr;
 }
 
-static HRESULT shader_chunk_handler(const char *data, void *ctx)
+static HRESULT shader_chunk_handler(const char *data, DWORD data_size, DWORD tag, void *ctx)
 {
-    const char *ptr = data;
-    DWORD chunk_size;
     char tag_str[5];
-    DWORD tag;
 
-    read_tag(&ptr, &tag, tag_str);
+    memcpy(tag_str, &tag, 4);
+    tag_str[4] = '\0';
     TRACE("tag: %s\n", tag_str);
 
-    read_dword(&ptr, &chunk_size);
-    TRACE("chunk size: %#x\n", chunk_size);
+    TRACE("chunk size: %#x\n", data_size);
 
     switch(tag)
     {
@@ -393,24 +397,21 @@ static HRESULT parse_fx10(struct d3d10_effect *e, const char *data, DWORD data_s
     return parse_fx10_body(e, ptr, data_size - (ptr - data));
 }
 
-static HRESULT fx10_chunk_handler(const char *data, void *ctx)
+static HRESULT fx10_chunk_handler(const char *data, DWORD data_size, DWORD tag, void *ctx)
 {
     struct d3d10_effect *e = ctx;
-    const char *ptr = data;
-    DWORD chunk_size;
     char tag_str[5];
-    DWORD tag;
 
-    read_tag(&ptr, &tag, tag_str);
+    memcpy(tag_str, &tag, 4);
+    tag_str[4] = '\0';
     TRACE("tag: %s\n", tag_str);
 
-    read_dword(&ptr, &chunk_size);
-    TRACE("chunk size: %#x\n", chunk_size);
+    TRACE("chunk size: %#x\n", data_size);
 
     switch(tag)
     {
         case TAG_FX10:
-            return parse_fx10(e, ptr, chunk_size);
+            return parse_fx10(e, data, data_size);
 
         default:
             FIXME("Unhandled chunk %s\n", tag_str);




More information about the wine-cvs mailing list