d3dx9: ID3DXConstantTable

Rico Schüller kgbricola at web.de
Wed Aug 29 03:15:05 CDT 2012


On 28.08.2012 10:50, Henri Verbeet wrote:
> On 28 August 2012 09:12, Rico Schüller <kgbricola at web.de> wrote:
>> 3. The wine_todo should be fixed in the test. Is there a way to disable them
>> to show up, when running e.g. "wine d3dx9_36_test.exe.so shader"? It's a bit
>> annoying when you search for your own failing tests. Well I could comment
>> out the tests, but that's also not a very fine solution.
>>
> You can set WINETEST_PLATFORM=wine, but the easiest is probably to
> just do "make shader.ok" instead of trying to run the test manually.
>
Well, I found an other way, fixing the test seems also a solution :-) .

But I stumble over a problem:
How could I create shader variables which uses D3DXRS_INT4 or 
D3DXRS_BOOL as register set? My goal is to check different combinations 
of the RegisterSet and the Type (e.g. D3DXRS_FLOAT4 and D3DXPT_FLOAT, 
D3DXRS_INT4 and D3DXPT_FLOAT, D3DXRS_BOOL and D3DXPT_FLOAT, D3DXRS_INT4 
and D3DXPT_INT, D3DXRS_BOOL and D3DXPT_INT, ...). I have an improved 
version of set_float_matrix but I've no glue how to check if the 
assumption is correct, it fixes one todo but I'd like to test the rest 
if possible. Creating variables with D3DXRS_FLOAT4 or D3DXRS_SAMPLER is 
no problem. Anyone an idea?

Attached is a patch. I changed some more stuff (not only the 
set_float_matrix function), but the main goal is a test for that one. 
I'd also be happy if someone has some criticism or suggestions to the 
rest in the patch.

Cheers
Rico
-------------- next part --------------
diff --git a/dlls/d3dx9_36/d3dx9_36_private.h b/dlls/d3dx9_36/d3dx9_36_private.h
index ea7b401..a0ad561 100644
--- a/dlls/d3dx9_36/d3dx9_36_private.h
+++ b/dlls/d3dx9_36/d3dx9_36_private.h
@@ -93,4 +93,10 @@ const char *debug_d3dxparameter_class(D3DXPARAMETER_CLASS c) DECLSPEC_HIDDEN;
 const char *debug_d3dxparameter_type(D3DXPARAMETER_TYPE t) DECLSPEC_HIDDEN;
 const char *debug_d3dxparameter_registerset(D3DXREGISTER_SET r) DECLSPEC_HIDDEN;
 
+/* parameter type conversion helpers */
+INT get_int(D3DXPARAMETER_TYPE type, LPCVOID data) DECLSPEC_HIDDEN;
+FLOAT get_float(D3DXPARAMETER_TYPE type, LPCVOID data) DECLSPEC_HIDDEN;
+inline BOOL get_bool(LPCVOID data) DECLSPEC_HIDDEN;
+void set_number(LPVOID outdata, D3DXPARAMETER_TYPE outtype, LPCVOID indata, D3DXPARAMETER_TYPE intype) DECLSPEC_HIDDEN;
+
 #endif /* __WINE_D3DX9_36_PRIVATE_H */
diff --git a/dlls/d3dx9_36/effect.c b/dlls/d3dx9_36/effect.c
index 7463742..f3a5549 100644
--- a/dlls/d3dx9_36/effect.c
+++ b/dlls/d3dx9_36/effect.c
@@ -847,90 +847,6 @@ static void free_effect_compiler(struct ID3DXEffectCompilerImpl *compiler)
     }
 }
 
-static INT get_int(D3DXPARAMETER_TYPE type, LPCVOID data)
-{
-    INT i;
-
-    switch (type)
-    {
-        case D3DXPT_FLOAT:
-            i = *(FLOAT *)data;
-            break;
-
-        case D3DXPT_INT:
-            i = *(INT *)data;
-            break;
-
-        case D3DXPT_BOOL:
-            i = *(BOOL *)data;
-            break;
-
-        default:
-            i = 0;
-            FIXME("Unhandled type %s. This should not happen!\n", debug_d3dxparameter_type(type));
-            break;
-    }
-
-    return i;
-}
-
-inline static FLOAT get_float(D3DXPARAMETER_TYPE type, LPCVOID data)
-{
-    FLOAT f;
-
-    switch (type)
-    {
-        case D3DXPT_FLOAT:
-            f = *(FLOAT *)data;
-            break;
-
-        case D3DXPT_INT:
-            f = *(INT *)data;
-            break;
-
-        case D3DXPT_BOOL:
-            f = *(BOOL *)data;
-            break;
-
-        default:
-            f = 0.0f;
-            FIXME("Unhandled type %s. This should not happen!\n", debug_d3dxparameter_type(type));
-            break;
-    }
-
-    return f;
-}
-
-static inline BOOL get_bool(LPCVOID data)
-{
-    return (*(DWORD *)data) != 0;
-}
-
-static void set_number(LPVOID outdata, D3DXPARAMETER_TYPE outtype, LPCVOID indata, D3DXPARAMETER_TYPE intype)
-{
-    TRACE("Changing from type %i to type %i\n", intype, outtype);
-
-    switch (outtype)
-    {
-        case D3DXPT_FLOAT:
-            *(FLOAT *)outdata = get_float(intype, indata);
-            break;
-
-        case D3DXPT_BOOL:
-            *(BOOL *)outdata = get_bool(indata);
-            break;
-
-        case D3DXPT_INT:
-            *(INT *)outdata = get_int(intype, indata);
-            break;
-
-        default:
-            FIXME("Error converting to type %i\n", outtype);
-            *(INT *)outdata = 0;
-            break;
-    }
-}
-
 static void get_vector(struct d3dx_parameter *param, D3DXVECTOR4 *vector)
 {
     UINT i;
diff --git a/dlls/d3dx9_36/shader.c b/dlls/d3dx9_36/shader.c
index 33b86f6..cdfca86 100644
--- a/dlls/d3dx9_36/shader.c
+++ b/dlls/d3dx9_36/shader.c
@@ -1122,34 +1122,23 @@ static HRESULT set_vector_array(ID3DXConstantTable *iface, IDirect3DDevice9 *dev
     return D3D_OK;
 }
 
-static HRESULT set_float_matrix(FLOAT *matrix, const D3DXCONSTANT_DESC *desc,
-                                UINT row_offset, UINT column_offset, UINT rows, UINT columns,
-                                const void *data, D3DXPARAMETER_TYPE type, UINT src_columns)
+static void set_matrix(const void *outdata, D3DXPARAMETER_TYPE outtype,
+                       const D3DXCONSTANT_DESC *desc, BOOL transpose, UINT rows, UINT columns,
+                       const void *indata, D3DXPARAMETER_TYPE intype, UINT src_columns)
 {
     UINT i, j;
+    UINT row_offset = transpose ? 1 : 4;
+    UINT column_offset = transpose ? 4 : 1;
+    DWORD tmp;
 
-    switch (type)
+    for (i = 0; i < rows; i++)
     {
-        case D3DXPT_FLOAT:
-            for (i = 0; i < rows; i++)
-            {
-                for (j = 0; j < columns; j++)
-                    matrix[i * row_offset + j * column_offset] = ((FLOAT *)data)[i * src_columns + j];
-            }
-            break;
-        case D3DXPT_INT:
-            for (i = 0; i < rows; i++)
-            {
-                for (j = 0; j < columns; j++)
-                    matrix[i * row_offset + j * column_offset] = ((INT *)data)[i * src_columns + j];
-            }
-            break;
-        default:
-            FIXME("Unhandled type %s\n", debug_d3dxparameter_type(type));
-            return D3DERR_INVALIDCALL;
+        for (j = 0; j < columns; j++)
+        {
+            set_number(&tmp, desc->Type, &((DWORD *)indata)[i * src_columns + j], intype);
+            set_number(&((DWORD *)outdata)[i * row_offset + j * column_offset], outtype, &tmp, desc->Type);
+        }
     }
-
-    return D3D_OK;
 }
 
 static HRESULT set_matrix_array(ID3DXConstantTable *iface, IDirect3DDevice9 *device, D3DXHANDLE constant, const void *data,
@@ -1159,7 +1148,7 @@ static HRESULT set_matrix_array(ID3DXConstantTable *iface, IDirect3DDevice9 *dev
     struct ctab_constant *c = get_valid_constant(This, constant);
     D3DXCONSTANT_DESC *desc;
     UINT registers_per_matrix, num_rows, num_columns, i;
-    UINT row_offset = 1, column_offset = 1;
+    BOOL transpose;
     const DWORD *data_ptr;
     FLOAT matrix[16] = {0.0f, 0.0f, 0.0f, 0.0f,
                         0.0f, 0.0f, 0.0f, 0.0f,
@@ -1178,9 +1167,6 @@ static HRESULT set_matrix_array(ID3DXConstantTable *iface, IDirect3DDevice9 *dev
         || desc->Class == D3DXPC_VECTOR
         || desc->Class == D3DXPC_SCALAR)
     {
-        if (desc->Class == class) row_offset = 4;
-        else column_offset = 4;
-
         if (class == D3DXPC_MATRIX_ROWS)
         {
             if (desc->Class == D3DXPC_VECTOR) return D3D_OK;
@@ -1194,6 +1180,7 @@ static HRESULT set_matrix_array(ID3DXConstantTable *iface, IDirect3DDevice9 *dev
             num_columns = desc->Rows;
         }
 
+        transpose = desc->Class != class;
         registers_per_matrix = (desc->Class == D3DXPC_MATRIX_COLUMNS) ? desc->Columns : desc->Rows;
     }
     else
@@ -1208,14 +1195,10 @@ static HRESULT set_matrix_array(ID3DXConstantTable *iface, IDirect3DDevice9 *dev
             data_ptr = data;
             for (i = 0; i < count; i++)
             {
-                HRESULT hr;
-
                 if (registers_per_matrix * (i + 1) > desc->RegisterCount)
                     break;
 
-                hr = set_float_matrix(matrix, desc, row_offset, column_offset, num_rows, num_columns, data_ptr, type, columns);
-                if (FAILED(hr)) return hr;
-
+                set_matrix(matrix, D3DXPT_FLOAT, desc, transpose, num_rows, num_columns, data_ptr, type, columns);
                 set_float_shader_constant(This, device, desc->RegisterIndex + i * registers_per_matrix, matrix, registers_per_matrix);
 
                 data_ptr += rows * columns;
@@ -1233,101 +1216,64 @@ static HRESULT set_matrix_pointer_array(ID3DXConstantTable *iface, IDirect3DDevi
                                 const D3DXMATRIX **data, UINT count, D3DXPARAMETER_CLASS class)
 {
     struct ID3DXConstantTableImpl *This = impl_from_ID3DXConstantTable(iface);
-    D3DXCONSTANT_DESC desc;
-    HRESULT hr;
-    UINT registers_per_matrix;
-    UINT i, desc_count = 1;
-    UINT num_rows, num_columns;
-    UINT row_offset, column_offset;
+    struct ctab_constant *c = get_valid_constant(This, constant);
+    D3DXCONSTANT_DESC *desc;
+    UINT registers_per_matrix, num_rows, num_columns, i;
+    BOOL transpose;
     FLOAT matrix[16] = {0.0f, 0.0f, 0.0f, 0.0f,
                         0.0f, 0.0f, 0.0f, 0.0f,
                         0.0f, 0.0f, 0.0f, 0.0f,
                         0.0f, 0.0f, 0.0f, 0.0f};
 
-    hr = ID3DXConstantTable_GetConstantDesc(iface, constant, &desc, &desc_count);
-    if (FAILED(hr))
+    if (!c)
     {
-        TRACE("ID3DXConstantTable_GetConstantDesc failed: %08x\n", hr);
+        WARN("Invalid argument specified\n");
         return D3DERR_INVALIDCALL;
     }
+    desc = &c->desc;
 
-    if (desc.Class == D3DXPC_MATRIX_ROWS || desc.Class == D3DXPC_MATRIX_COLUMNS)
+    if (desc->Class == D3DXPC_MATRIX_ROWS
+        || desc->Class == D3DXPC_MATRIX_COLUMNS
+        || desc->Class == D3DXPC_VECTOR
+        || desc->Class == D3DXPC_SCALAR)
     {
-        if (desc.Class == class)
-        {
-            column_offset = 1;
-            row_offset = 4;
-        }
-        else
-        {
-            column_offset = 4;
-            row_offset = 1;
-        }
+        transpose = desc->Class != class && !(desc->Class == D3DXPC_VECTOR && class == D3DXPC_MATRIX_ROWS);
 
         if (class == D3DXPC_MATRIX_ROWS)
         {
-            num_rows = desc.Rows;
-            num_columns = desc.Columns;
+            num_rows = desc->Rows;
+            num_columns = desc->Columns;
         }
         else
         {
-            num_rows = desc.Columns;
-            num_columns = desc.Rows;
+            num_rows = desc->Columns;
+            num_columns = desc->Rows;
         }
 
-        registers_per_matrix = (desc.Class == D3DXPC_MATRIX_ROWS) ? desc.Rows : desc.Columns;
-    }
-    else if (desc.Class == D3DXPC_SCALAR)
-    {
-        registers_per_matrix = 1;
-        column_offset = 1;
-        row_offset = 1;
-        num_rows = desc.Rows;
-        num_columns = desc.Columns;
-    }
-    else if (desc.Class == D3DXPC_VECTOR)
-    {
-        registers_per_matrix = 1;
-
-        if (class == D3DXPC_MATRIX_ROWS)
-        {
-            column_offset = 1;
-            row_offset = 4;
-            num_rows = desc.Rows;
-            num_columns = desc.Columns;
-        }
-        else
-        {
-            column_offset = 4;
-            row_offset = 1;
-            num_rows = desc.Columns;
-            num_columns = desc.Rows;
-        }
+        registers_per_matrix = (desc->Class == D3DXPC_MATRIX_COLUMNS) ? desc->Columns : desc->Rows;
     }
     else
     {
-        FIXME("Unhandled variable class %s\n", debug_d3dxparameter_class(desc.Class));
+        FIXME("Unhandled variable class %s\n", debug_d3dxparameter_class(desc->Class));
         return D3D_OK;
     }
 
-    switch (desc.RegisterSet)
+    switch (desc->RegisterSet)
     {
         case D3DXRS_FLOAT4:
             for (i = 0; i < count; i++)
             {
-                if (registers_per_matrix * (i + 1) > desc.RegisterCount)
+                if (registers_per_matrix * (i + 1) > desc->RegisterCount)
                     break;
 
-                hr = set_float_matrix(matrix, &desc, row_offset, column_offset, num_rows, num_columns, *data, D3DXPT_FLOAT, 4);
-                if (FAILED(hr)) return hr;
-
-                set_float_shader_constant(This, device, desc.RegisterIndex + i * registers_per_matrix, matrix, registers_per_matrix);
+                set_matrix(matrix, D3DXPT_FLOAT, desc, transpose, num_rows, num_columns, *data, D3DXPT_FLOAT, 4);
+                set_float_shader_constant(This, device, desc->RegisterIndex + i * registers_per_matrix, matrix, registers_per_matrix);
 
                 data++;
             }
             break;
         default:
-            FIXME("Unhandled register set %s\n", debug_d3dxparameter_registerset(desc.RegisterSet));
+            FIXME("Unhandled register set %s\n", debug_d3dxparameter_registerset(desc->RegisterSet));
             return E_NOTIMPL;
     }
 
diff --git a/dlls/d3dx9_36/tests/shader.c b/dlls/d3dx9_36/tests/shader.c
index 2792327..295fa09 100644
--- a/dlls/d3dx9_36/tests/shader.c
+++ b/dlls/d3dx9_36/tests/shader.c
@@ -783,7 +783,7 @@ static void test_setting_matrices_table(IDirect3DDevice9 *device)
     ok(res == D3D_OK, "ID3DXConstantTable_SetMatrix failed on variable fmatrix3x1: got %#x\n", res);
 
     IDirect3DDevice9_GetVertexShaderConstantF(device, 4, out, 2);
-    todo_wine ok(out[0] == (int)S(U(fmatrix))._11 && out[1] == (int)S(U(fmatrix))._12 && out[2] == (int)S(U(fmatrix))._13
+    ok(out[0] == (int)S(U(fmatrix))._11 && out[1] == (int)S(U(fmatrix))._12 && out[2] == (int)S(U(fmatrix))._13
             && out[3] == 0
             && out[4] == (int)S(U(fmatrix))._21 && out[5] == (int)S(U(fmatrix))._22 && out[6] == (int)S(U(fmatrix))._23
             && out[7] == 0,
diff --git a/dlls/d3dx9_36/util.c b/dlls/d3dx9_36/util.c
index 5c34834..dd9ad62 100644
--- a/dlls/d3dx9_36/util.c
+++ b/dlls/d3dx9_36/util.c
@@ -270,3 +270,88 @@ const char *debug_d3dxparameter_registerset(D3DXREGISTER_SET r)
 }
 
 #undef WINE_D3DX_TO_STR
+
+/* parameter type conversion helpers */
+INT get_int(D3DXPARAMETER_TYPE type, LPCVOID data)
+{
+    INT i;
+
+    switch (type)
+    {
+        case D3DXPT_FLOAT:
+            i = *(FLOAT *)data;
+            break;
+
+        case D3DXPT_INT:
+            i = *(INT *)data;
+            break;
+
+        case D3DXPT_BOOL:
+            i = *(BOOL *)data;
+            break;
+
+        default:
+            i = 0;
+            FIXME("Unhandled type %s. This should not happen!\n", debug_d3dxparameter_type(type));
+            break;
+    }
+
+    return i;
+}
+
+FLOAT get_float(D3DXPARAMETER_TYPE type, LPCVOID data)
+{
+    FLOAT f;
+
+    switch (type)
+    {
+        case D3DXPT_FLOAT:
+            f = *(FLOAT *)data;
+            break;
+
+        case D3DXPT_INT:
+            f = *(INT *)data;
+            break;
+
+        case D3DXPT_BOOL:
+            f = *(BOOL *)data;
+            break;
+
+        default:
+            f = 0.0f;
+            FIXME("Unhandled type %s. This should not happen!\n", debug_d3dxparameter_type(type));
+            break;
+    }
+
+    return f;
+}
+
+inline BOOL get_bool(LPCVOID data)
+{
+    return (*(DWORD *)data) != 0;
+}
+
+void set_number(LPVOID outdata, D3DXPARAMETER_TYPE outtype, LPCVOID indata, D3DXPARAMETER_TYPE intype)
+{
+    TRACE("Changing from type %s to type %s\n", debug_d3dxparameter_type(intype), debug_d3dxparameter_type(outtype));
+
+    switch (outtype)
+    {
+        case D3DXPT_FLOAT:
+            *(FLOAT *)outdata = get_float(intype, indata);
+            break;
+
+        case D3DXPT_BOOL:
+            *(BOOL *)outdata = get_bool(indata);
+            break;
+
+        case D3DXPT_INT:
+            *(INT *)outdata = get_int(intype, indata);
+            break;
+
+        default:
+            FIXME("Unhandled type %s. This should not happen!\n", debug_d3dxparameter_type(outtype));
+            *(INT *)outdata = 0;
+            break;
+    }
+}
\ No newline at end of file


More information about the wine-devel mailing list