=?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