d3dx9: Improve set_matrix_array().

This commit is contained in:
Rico Schüller 2012-08-28 13:42:55 +02:00 committed by Alexandre Julliard
parent 97ef9f9322
commit a4dde8151b
1 changed files with 25 additions and 39 deletions

View File

@ -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) UINT count, D3DXPARAMETER_CLASS class, D3DXPARAMETER_TYPE type, UINT rows, UINT columns)
{ {
struct ID3DXConstantTableImpl *This = impl_from_ID3DXConstantTable(iface); struct ID3DXConstantTableImpl *This = impl_from_ID3DXConstantTable(iface);
D3DXCONSTANT_DESC desc; struct ctab_constant *c = get_valid_constant(This, constant);
HRESULT hr; D3DXCONSTANT_DESC *desc;
UINT registers_per_matrix; UINT registers_per_matrix, num_rows, num_columns, i;
UINT i, desc_count = 1; UINT row_offset = 1, column_offset = 1;
UINT num_rows, num_columns;
UINT row_offset, column_offset;
const DWORD *data_ptr; const DWORD *data_ptr;
FLOAT matrix[16] = {0.0f, 0.0f, 0.0f, 0.0f, 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, 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 (!c)
if (FAILED(hr))
{ {
TRACE("ID3DXConstantTable_GetConstantDesc failed: %08x\n", hr); WARN("Invalid argument specified\n");
return D3DERR_INVALIDCALL; 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) if (desc->Class == class) row_offset = 4;
{ else column_offset = 4;
column_offset = 1;
row_offset = 4;
}
else
{
column_offset = 4;
row_offset = 1;
}
if (class == D3DXPC_MATRIX_ROWS) if (class == D3DXPC_MATRIX_ROWS)
{ {
num_rows = min(desc.Rows, rows); num_rows = min(desc->Rows, rows);
num_columns = min(desc.Columns, columns); num_columns = min(desc->Columns, columns);
} }
else else
{ {
num_rows = min(desc.Columns, columns); num_rows = min(desc->Columns, columns);
num_columns = min(desc.Rows, rows); num_columns = min(desc->Rows, rows);
} }
registers_per_matrix = (desc.Class == D3DXPC_MATRIX_ROWS) ? desc.Rows : desc.Columns; registers_per_matrix = (desc->Class == D3DXPC_MATRIX_COLUMNS) ? desc->Columns : desc->Rows;
}
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;
} }
else 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; return D3D_OK;
} }
switch (desc.RegisterSet) switch (desc->RegisterSet)
{ {
case D3DXRS_FLOAT4: case D3DXRS_FLOAT4:
data_ptr = data; data_ptr = data;
for (i = 0; i < count; i++) 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; 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; 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; data_ptr += rows * columns;
} }
break; break;
default: 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; return E_NOTIMPL;
} }