=?UTF-8?Q?Rico=20Sch=C3=BCller=20?=: d3dx9: Use the original bytecode in D3DXGetShaderSamplers() instead of using a constant table.

Alexandre Julliard julliard at winehq.org
Fri Sep 16 13:28:34 CDT 2011


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

Author: Rico Schüller <kgbricola at web.de>
Date:   Fri Sep 16 08:38:24 2011 +0200

d3dx9: Use the original bytecode in D3DXGetShaderSamplers() instead of using a constant table.

---

 dlls/d3dx9_36/shader.c       |   57 ++++++++++++++++-------------------------
 dlls/d3dx9_36/tests/shader.c |   53 +++++++++++++++++++++++++++++++-------
 2 files changed, 65 insertions(+), 45 deletions(-)

diff --git a/dlls/d3dx9_36/shader.c b/dlls/d3dx9_36/shader.c
index 50719b2..5a0f1db 100644
--- a/dlls/d3dx9_36/shader.c
+++ b/dlls/d3dx9_36/shader.c
@@ -1273,50 +1273,40 @@ HRESULT WINAPI D3DXGetShaderConstantTable(CONST DWORD* byte_code,
 HRESULT WINAPI D3DXGetShaderSamplers(CONST DWORD *byte_code, LPCSTR *samplers, UINT *count)
 {
     HRESULT hr;
-    LPD3DXCONSTANTTABLE constant_table = NULL;
-    D3DXCONSTANTTABLE_DESC constant_table_desc;
     UINT i, sampler_count = 0;
+    UINT size;
+    LPCSTR data;
+    const D3DXSHADER_CONSTANTTABLE *ctab_header;
+    const D3DXSHADER_CONSTANTINFO *constant_info;
 
     TRACE("byte_code %p, samplers %p, count %p\n", byte_code, samplers, count);
 
     if (count) *count = 0;
 
-    hr = D3DXGetShaderConstantTable(byte_code, &constant_table);
-    if (hr != D3D_OK)
-    {
-        WARN("Failed to get constant table\n");
+    hr = D3DXFindShaderComment(byte_code, MAKEFOURCC('C','T','A','B'), (LPCVOID *)&data, &size);
+    if (hr != D3D_OK) return D3D_OK;
 
-        /* no samplers found, all is fine */
-        return D3D_OK;
-    }
+    if (size < sizeof(D3DXSHADER_CONSTANTTABLE)) return D3D_OK;
 
-    hr = ID3DXConstantTable_GetDesc(constant_table, &constant_table_desc);
-    if (hr != D3D_OK)
-    {
-        WARN("Failed to get constant table desc\n");
-        goto err_out;
-    }
+    ctab_header = (const D3DXSHADER_CONSTANTTABLE *)data;
+    if (ctab_header->Size != sizeof(*ctab_header)) return D3D_OK;
 
-    for (i = 0; i < constant_table_desc.Constants; ++i)
+    constant_info = (D3DXSHADER_CONSTANTINFO *)(data + ctab_header->ConstantInfo);
+    for (i = 0; i < ctab_header->Constants; i++)
     {
-        D3DXHANDLE handle = ID3DXConstantTable_GetConstant(constant_table, NULL, i);
-        D3DXCONSTANT_DESC constant_desc;
-        UINT size;
+        const D3DXSHADER_TYPEINFO *type;
 
-        hr = ID3DXConstantTable_GetConstantDesc(constant_table, handle, &constant_desc, &size);
-        if (hr != D3D_OK)
-        {
-            WARN("Failed to get constant desc\n");
-            goto err_out;
-        }
+        TRACE("name = %s\n", data + constant_info[i].Name);
+
+        type = (D3DXSHADER_TYPEINFO *)(data + constant_info[i].TypeInfo);
 
-        if (constant_desc.Type == D3DXPT_SAMPLER
-                || constant_desc.Type == D3DXPT_SAMPLER1D
-                || constant_desc.Type == D3DXPT_SAMPLER2D
-                || constant_desc.Type == D3DXPT_SAMPLER3D
-                || constant_desc.Type == D3DXPT_SAMPLERCUBE)
+        if (type->Type == D3DXPT_SAMPLER
+                || type->Type == D3DXPT_SAMPLER1D
+                || type->Type == D3DXPT_SAMPLER2D
+                || type->Type == D3DXPT_SAMPLER3D
+                || type->Type == D3DXPT_SAMPLERCUBE)
         {
-            if (samplers) samplers[sampler_count] = constant_desc.Name;
+            if (samplers) samplers[sampler_count] = data + constant_info[i].Name;
 
             ++sampler_count;
         }
@@ -1324,10 +1314,7 @@ HRESULT WINAPI D3DXGetShaderSamplers(CONST DWORD *byte_code, LPCSTR *samplers, U
 
     TRACE("Found %u samplers\n", sampler_count);
 
-err_out:
-
     if (count) *count = sampler_count;
-    if (constant_table) ID3DXConstantTable_Release(constant_table);
 
-    return hr;
+    return D3D_OK;
 }
diff --git a/dlls/d3dx9_36/tests/shader.c b/dlls/d3dx9_36/tests/shader.c
index 0a1b8bf..9220e28 100644
--- a/dlls/d3dx9_36/tests/shader.c
+++ b/dlls/d3dx9_36/tests/shader.c
@@ -768,6 +768,7 @@ static const DWORD get_shader_samplers_blob[] =
 static void test_get_shader_samplers(void)
 {
     LPCSTR samplers[16] = {NULL}; /* maximum number of sampler registers v/ps 3.0 = 16 */
+    LPCSTR sampler_orig;
     UINT count = 2;
     HRESULT hr;
 
@@ -785,11 +786,22 @@ static void test_get_shader_samplers(void)
     hr = D3DXGetShaderSamplers(get_shader_samplers_blob, samplers, NULL);
     ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
 
-    ok(!strcmp(samplers[0], "s"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[0], "s");
-    ok(!strcmp(samplers[1], "s1D"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[1], "s1D");
-    ok(!strcmp(samplers[2], "s2D"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[2], "s2D");
-    ok(!strcmp(samplers[3], "s3D"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[3], "s3D");
-    ok(!strcmp(samplers[4], "scube"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[4], "scube");
+    /* check that sampler points to shader blob */
+    sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x2E];
+    ok(sampler_orig == samplers[0], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[0], sampler_orig);
+
+    sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x33];
+    ok(sampler_orig == samplers[1], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[1], sampler_orig);
+
+    sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x38];
+    ok(sampler_orig == samplers[2], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[2], sampler_orig);
+
+    sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x3D];
+    ok(sampler_orig == samplers[3], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[3], sampler_orig);
+
+    sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x42];
+    ok(sampler_orig == samplers[4], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[4], sampler_orig);
+
     ok(!strcmp(samplers[5], "dummy"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[5], "dummy");
 
     /* reset samplers */
@@ -804,12 +816,33 @@ static void test_get_shader_samplers(void)
     ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
     ok(count == 5, "D3DXGetShaderSamplers failed, got %u, expected %u\n", count, 5);
 
-    ok(!strcmp(samplers[0], "s"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[0], "s");
-    ok(!strcmp(samplers[1], "s1D"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[1], "s1D");
-    ok(!strcmp(samplers[2], "s2D"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[2], "s2D");
-    ok(!strcmp(samplers[3], "s3D"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[3], "s3D");
-    ok(!strcmp(samplers[4], "scube"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[4], "scube");
+    /* check that sampler points to shader blob */
+    sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x2E];
+    ok(sampler_orig == samplers[0], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[0], sampler_orig);
+
+    sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x33];
+    ok(sampler_orig == samplers[1], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[1], sampler_orig);
+
+    sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x38];
+    ok(sampler_orig == samplers[2], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[2], sampler_orig);
+
+    sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x3D];
+    ok(sampler_orig == samplers[3], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[3], sampler_orig);
+
+    sampler_orig = (LPCSTR)&get_shader_samplers_blob[0x42];
+    ok(sampler_orig == samplers[4], "D3DXGetShaderSamplers failed, got %p, expected %p\n", samplers[4], sampler_orig);
+
     ok(!strcmp(samplers[5], "dummy"), "D3DXGetShaderSamplers failed, got \"%s\", expected \"%s\"\n", samplers[5], "dummy");
+
+    /* check without ctab */
+    hr = D3DXGetShaderSamplers(simple_vs, samplers, &count);
+    ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
+    ok(count == 0, "D3DXGetShaderSamplers failed, got %u, expected %u\n", count, 0);
+
+    /* check invalid ctab */
+    hr = D3DXGetShaderSamplers(shader_with_invalid_ctab, samplers, &count);
+    ok(hr == D3D_OK, "D3DXGetShaderSamplers failed, got %x, expected %x\n", hr, D3D_OK);
+    ok(count == 0, "D3DXGetShaderSamplers failed, got %u, expected %u\n", count, 0);
 }
 
 START_TEST(shader)




More information about the wine-cvs mailing list