=?UTF-8?Q?Rico=20Sch=C3=BCller=20?=: d3dx9: Improve set_matrix_array().

Alexandre Julliard julliard at winehq.org
Tue Aug 28 14:44:40 CDT 2012


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

Author: Rico Schüller <kgbricola at web.de>
Date:   Tue Aug 28 13:42:55 2012 +0200

d3dx9: Improve set_matrix_array().

---

 dlls/d3dx9_36/shader.c |   64 ++++++++++++++++++-----------------------------
 1 files changed, 25 insertions(+), 39 deletions(-)

diff --git a/dlls/d3dx9_36/shader.c b/dlls/d3dx9_36/shader.c
index 1295f08..832ba40 100644
--- a/dlls/d3dx9_36/shader.c
+++ b/dlls/d3dx9_36/shader.c
@@ -1158,84 +1158,70 @@ static HRESULT set_matrix_array(ID3DXConstantTable *iface, IDirect3DDevice9 *dev
                                 UINT count, D3DXPARAMETER_CLASS class, D3DXPARAMETER_TYPE type, UINT rows, UINT columns)
 {
     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;
+    UINT row_offset = 1, column_offset = 1;
     const DWORD *data_ptr;
     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_SCALAR)
     {
-        if (desc.Class == class)
-        {
-            column_offset = 1;
-            row_offset = 4;
-        }
-        else
-        {
-            column_offset = 4;
-            row_offset = 1;
-        }
+        if (desc->Class == class) row_offset = 4;
+        else column_offset = 4;
 
         if (class == D3DXPC_MATRIX_ROWS)
         {
-            num_rows = min(desc.Rows, rows);
-            num_columns = min(desc.Columns, columns);
+            num_rows = min(desc->Rows, rows);
+            num_columns = min(desc->Columns, columns);
         }
         else
         {
-            num_rows = min(desc.Columns, columns);
-            num_columns = min(desc.Rows, rows);
+            num_rows = min(desc->Columns, columns);
+            num_columns = min(desc->Rows, rows);
         }
 
-        registers_per_matrix = (desc.Class == D3DXPC_MATRIX_ROWS) ? desc.Rows : desc.Columns;
-    }
-    else if (desc.Class == D3DXPC_SCALAR)
-    {
-        column_offset = 1;
-        row_offset = 1;
-        num_rows = min(desc.Rows, rows);
-        num_columns = min(desc.Columns, columns);
-        registers_per_matrix = 1;
+        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:
             data_ptr = data;
             for (i = 0; i < count; i++)
             {
-                if (registers_per_matrix * (i + 1) > desc.RegisterCount)
+                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);
+                hr = set_float_matrix(matrix, desc, row_offset, column_offset, num_rows, num_columns, data_ptr, type, columns);
                 if (FAILED(hr)) return hr;
 
-                set_float_shader_constant(This, device, desc.RegisterIndex + i * registers_per_matrix, matrix, registers_per_matrix);
+                set_float_shader_constant(This, device, desc->RegisterIndex + i * registers_per_matrix, matrix, registers_per_matrix);
 
                 data_ptr += rows * columns;
             }
             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;
     }
 




More information about the wine-cvs mailing list