On 28.08.2012 10:50, Henri Verbeet wrote:
On 28 August 2012 09:12, Rico Schüller <kgbric...@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
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