=?UTF-8?Q?Rico=20Sch=C3=BCller=20?=: d3dx9: Handle FX/ TX blobs in D3DXFindShaderComment().

Alexandre Julliard julliard at winehq.org
Mon Sep 30 16:07:55 CDT 2013


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

Author: Rico Schüller <kgbricola at web.de>
Date:   Mon Sep 30 01:19:00 2013 +0200

d3dx9: Handle FX/TX blobs in D3DXFindShaderComment().

---

 dlls/d3dx9_36/shader.c       |   14 +++++++++++++-
 dlls/d3dx9_36/tests/shader.c |   40 ++++++++++++++++++++++++++++++++++------
 2 files changed, 47 insertions(+), 7 deletions(-)

diff --git a/dlls/d3dx9_36/shader.c b/dlls/d3dx9_36/shader.c
index 2ff967c..460fe5a 100644
--- a/dlls/d3dx9_36/shader.c
+++ b/dlls/d3dx9_36/shader.c
@@ -154,6 +154,7 @@ const char * WINAPI D3DXGetVertexShaderProfile(struct IDirect3DDevice9 *device)
 HRESULT WINAPI D3DXFindShaderComment(const DWORD *byte_code, DWORD fourcc, const void **data, UINT *size)
 {
     const DWORD *ptr = byte_code;
+    DWORD version;
 
     TRACE("byte_code %p, fourcc %x, data %p, size %p\n", byte_code, fourcc, data, size);
 
@@ -161,7 +162,18 @@ HRESULT WINAPI D3DXFindShaderComment(const DWORD *byte_code, DWORD fourcc, const
     if (size) *size = 0;
 
     if (!byte_code) return D3DERR_INVALIDCALL;
-    if (!is_valid_bytecode(*byte_code)) return D3DXERR_INVALIDDATA;
+
+    version = *ptr >> 16;
+    if (version != 0x4658         /* FX */
+            && version != 0x5458  /* TX */
+            && version != 0x7ffe
+            && version != 0x7fff
+            && version != 0xfffe  /* VS */
+            && version != 0xffff) /* PS */
+    {
+        WARN("Invalid data supplied\n");
+        return D3DXERR_INVALIDDATA;
+    }
 
     while (*++ptr != D3DSIO_END)
     {
diff --git a/dlls/d3dx9_36/tests/shader.c b/dlls/d3dx9_36/tests/shader.c
index 02e69af..c19617f 100644
--- a/dlls/d3dx9_36/tests/shader.c
+++ b/dlls/d3dx9_36/tests/shader.c
@@ -20,12 +20,23 @@
 #include "wine/test.h"
 #include "d3dx9.h"
 
+#define FCC_TEXT MAKEFOURCC('T','E','X','T')
+#define FCC_CTAB MAKEFOURCC('C','T','A','B')
+
 static const DWORD shader_zero[] = {0x0};
 
 static const DWORD shader_invalid[] = {0xeeee0100};
 
 static const DWORD shader_empty[] = {0xfffeffff, 0x0000ffff};
 
+static const DWORD simple_fx[] = {0x46580000, 0x0002fffe, FCC_TEXT, 0x00000000, 0x0000ffff};
+
+static const DWORD simple_tx[] = {0x54580000, 0x0002fffe, FCC_TEXT, 0x00000000, 0x0000ffff};
+
+static const DWORD simple_7ffe[] = {0x7ffe0000, 0x0002fffe, FCC_TEXT, 0x00000000, 0x0000ffff};
+
+static const DWORD simple_7fff[] = {0x7fff0000, 0x0002fffe, FCC_TEXT, 0x00000000, 0x0000ffff};
+
 static const DWORD simple_vs[] = {
     0xfffe0101,                                                             /* vs_1_1                       */
     0x0000001f, 0x80000000, 0x900f0000,                                     /* dcl_position0 v0             */
@@ -44,9 +55,6 @@ static const DWORD simple_ps[] = {
     0x00000005, 0x800f0000, 0xb0e40000, 0x80e40000,                         /* mul r0, t0, r0               */
     0x0000ffff};                                                            /* END                          */
 
-#define FCC_TEXT MAKEFOURCC('T','E','X','T')
-#define FCC_CTAB MAKEFOURCC('C','T','A','B')
-
 static const DWORD shader_with_ctab[] = {
     0xfffe0300,                                                             /* vs_3_0                       */
     0x0002fffe, FCC_TEXT,   0x00000000,                                     /* TEXT comment                 */
@@ -320,7 +328,7 @@ static void test_find_shader_comment(void)
 
     hr = D3DXFindShaderComment(shader_with_ctab, MAKEFOURCC('C','T','A','B'), &data, NULL);
     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
-    ok(data == shader_with_ctab + 6, "Got result %p, expected %p.\n", data, shader_with_ctab + 6);
+    ok(data == shader_with_ctab + 6, "Got result %p, expected %p\n", data, shader_with_ctab + 6);
 
     hr = D3DXFindShaderComment(shader_with_ctab, 0, &data, &size);
     ok(hr == S_FALSE, "Got result %x, expected 1 (S_FALSE)\n", hr);
@@ -334,8 +342,8 @@ static void test_find_shader_comment(void)
 
     hr = D3DXFindShaderComment(shader_with_ctab, MAKEFOURCC('C','T','A','B'), &data, &size);
     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
-    ok(data == shader_with_ctab + 6, "Got result %p, expected %p.\n", data, shader_with_ctab + 6);
-    ok(size == 28, "Got result %d, expected 28\n", size);
+    ok(data == shader_with_ctab + 6, "Got result %p, expected %p\n", data, shader_with_ctab + 6);
+    ok(size == 28, "Got result %u, expected 28\n", size);
 
     hr = D3DXFindShaderComment(shader_zero, MAKEFOURCC('C','T','A','B'), &data, &size);
     ok(hr == D3DXERR_INVALIDDATA, "Got result %x, expected %x (D3DXERR_INVALIDDATA)\n", hr, D3DXERR_INVALIDDATA);
@@ -351,6 +359,26 @@ static void test_find_shader_comment(void)
     ok(hr == S_FALSE, "Got result %x, expected %x (S_FALSE)\n", hr, S_FALSE);
     ok(!data, "Got %p, expected NULL\n", data);
     ok(!size, "Got %u, expected 0\n", size);
+
+    hr = D3DXFindShaderComment(simple_fx, FCC_TEXT, &data, &size);
+    ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
+    ok(data == simple_fx + 3, "Got result %p, expected %p\n", data, simple_fx + 3);
+    ok(size == 4, "Got result %u, expected 4\n", size);
+
+    hr = D3DXFindShaderComment(simple_tx, FCC_TEXT, &data, &size);
+    ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
+    ok(data == simple_tx + 3, "Got result %p, expected %p\n", data, simple_tx + 3);
+    ok(size == 4, "Got result %u, expected 4\n", size);
+
+    hr = D3DXFindShaderComment(simple_7ffe, FCC_TEXT, &data, &size);
+    ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
+    ok(data == simple_7ffe + 3, "Got result %p, expected %p\n", data, simple_7ffe + 3);
+    ok(size == 4, "Got result %u, expected 4\n", size);
+
+    hr = D3DXFindShaderComment(simple_7fff, FCC_TEXT, &data, &size);
+    ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
+    ok(data == simple_7fff + 3, "Got result %p, expected %p\n", data, simple_7fff + 3);
+    ok(size == 4, "Got result %u, expected 4\n", size);
 }
 
 static void test_get_shader_constant_table_ex(void)




More information about the wine-cvs mailing list