[6/7] d3dx9: Implement ID3DXConstantTable::SetMatrixPointerArray.
Józef Kucia
joseph.kucia at gmail.com
Mon Aug 20 10:10:23 CDT 2012
---
dlls/d3dx9_36/shader.c | 90 +++++++++++++++++++++++++++++++++++++++++-
dlls/d3dx9_36/tests/shader.c | 18 ++++++++
2 files changed, 106 insertions(+), 2 deletions(-)
diff --git a/dlls/d3dx9_36/shader.c b/dlls/d3dx9_36/shader.c
index 01b2e7c..a3fd52e 100644
--- a/dlls/d3dx9_36/shader.c
+++ b/dlls/d3dx9_36/shader.c
@@ -1079,6 +1079,92 @@ static HRESULT set_matrix_array(ID3DXConstantTable *iface, IDirect3DDevice9 *dev
return D3D_OK;
}
+static HRESULT set_matrix_pointer_array(ID3DXConstantTable *iface, IDirect3DDevice9 *device, D3DXHANDLE constant,
+ 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;
+ 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))
+ {
+ TRACE("ID3DXConstantTable_GetConstantDesc failed: %08x\n", hr);
+ return D3DERR_INVALIDCALL;
+ }
+
+ if (desc.Class == D3DXPC_MATRIX_ROWS || desc.Class == D3DXPC_MATRIX_COLUMNS)
+ {
+ if (desc.Class == class)
+ {
+ column_offset = 1;
+ row_offset = 4;
+ }
+ else
+ {
+ column_offset = 4;
+ row_offset = 1;
+ }
+
+ if (class == D3DXPC_MATRIX_ROWS)
+ {
+ num_rows = desc.Rows;
+ num_columns = desc.Columns;
+ }
+ else
+ {
+ 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
+ {
+ FIXME("Unhandled variable class %#x\n", desc.Class);
+ return D3D_OK;
+ }
+
+ switch (desc.RegisterSet)
+ {
+ case D3DXRS_FLOAT4:
+ for (i = 0; i < count; i++)
+ {
+ 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);
+
+ data++;
+ }
+ break;
+ default:
+ FIXME("Unhandled register set %#x\n", desc.RegisterSet);
+ return E_NOTIMPL;
+ }
+
+ return D3D_OK;
+}
+
static HRESULT WINAPI ID3DXConstantTableImpl_SetDefaults(ID3DXConstantTable *iface, LPDIRECT3DDEVICE9 device)
{
struct ID3DXConstantTableImpl *This = impl_from_ID3DXConstantTable(iface);
@@ -1242,9 +1328,9 @@ static HRESULT WINAPI ID3DXConstantTableImpl_SetMatrixPointerArray(ID3DXConstant
{
struct ID3DXConstantTableImpl *This = impl_from_ID3DXConstantTable(iface);
- FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, matrix, count);
+ TRACE("(%p)->(%p, %p, %p, %d)\n", This, device, constant, matrix, count);
- return E_NOTIMPL;
+ return set_matrix_pointer_array(iface, device, constant, matrix, count, D3DXPC_MATRIX_ROWS);
}
static HRESULT WINAPI ID3DXConstantTableImpl_SetMatrixTranspose(ID3DXConstantTable *iface, LPDIRECT3DDEVICE9 device,
diff --git a/dlls/d3dx9_36/tests/shader.c b/dlls/d3dx9_36/tests/shader.c
index 0b0f273..630ee8d 100644
--- a/dlls/d3dx9_36/tests/shader.c
+++ b/dlls/d3dx9_36/tests/shader.c
@@ -702,6 +702,7 @@ static void test_setting_matrices_table(IDirect3DDevice9 *device)
5.005f, 3.006f, 3.007f, 6.008f,
9.009f, 5.010f, 7.011f, 1.012f,
5.013f, 5.014f, 5.015f, 9.016f}}};
+ static const D3DXMATRIX *matrix_pointer[] = {&fmatrix};
ID3DXConstantTable *ctable;
@@ -854,6 +855,23 @@ static void test_setting_matrices_table(IDirect3DDevice9 *device)
S(U(fmatrix))._11, S(U(fmatrix))._21, S(U(fmatrix))._31, 0.0f,
S(U(fmatrix))._12, S(U(fmatrix))._22, S(U(fmatrix))._32, 0.0f);
+ /* SetMatrixPointerArray */
+ res = ID3DXConstantTable_SetMatrixPointerArray(ctable, device, "c2x3", matrix_pointer, 1);
+ ok(res == D3D_OK, "ID3DXConstantTable_SetMatrixPointerArray failed on variable c2x3: got %#x\n", res);
+
+ IDirect3DDevice9_GetVertexShaderConstantF(device, 7, out, 3);
+ ok(out[0] == S(U(fmatrix))._11 && out[1] == S(U(fmatrix))._21 && out[2] == 0.0f && out[3] == 0.0f
+ && out[4] == S(U(fmatrix))._12 && out[5] == S(U(fmatrix))._22 && out[6] == 0.0f && out[7] == 0.0f
+ && out[8] == S(U(fmatrix))._13 && out[9] == S(U(fmatrix))._23 && out[10] == 0.0f && out[11] == 0.0f,
+ "The variable c2x3 was not set correctly, out={%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}, "
+ "should be {%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f}\n",
+ out[0], out[1], out[2], out[3],
+ out[4], out[5], out[6], out[7],
+ out[8], out[9], out[10], out[11],
+ S(U(fmatrix))._11, S(U(fmatrix))._21, 0.0f, 0.0f,
+ S(U(fmatrix))._12, S(U(fmatrix))._22, 0.0f, 0.0f,
+ S(U(fmatrix))._13, S(U(fmatrix))._23, 0.0f, 0.0f);
+
ID3DXConstantTable_Release(ctable);
}
--
1.7.8.6
More information about the wine-patches
mailing list