On 31.07.2013 00:14, Matteo Bruni wrote:
2013/7/30 Rico Schüller <kgbric...@web.de>:
Hi Matteo,

please see the attached patch.


On 25.07.2013 16:13, Matteo Bruni wrote:

2013/7/24 Rico Schüller <kgbric...@web.de>:

---
   dlls/d3dx9_36/tests/shader.c | 308
+++++++++++++++++++++++++++++++++++++++++++
   1 file changed, 308 insertions(+)


This is okay, but as a followup can you add some tests with mixed-type
structs? Something like:

struct
{
      float f;
      int i;
      bool b;
};

If you have already written tests of this kind, I'd like to know what
does the compiler do in this case :)

Single variables could only have the tested types (I was not able to
generate other conversions than bool->bool, int->int, int->float,
bool->float, float->float). But I found a way to do it with structs and
there I found some issues. Hence this has to be fixed in wine, too. Thanks
for the nice question. :-)

Basically you got these for the struct:
1. D3DXRS_FLOAT4: if one variable is used as float or a float variable is
used or an int variable is used as bool (the compiler may do some
optimization), else #2
2. D3DXRS_BOOL: if a bool variable is used as bool (in an if clause), else
#3
3. D3DXRS_INT4

It looks like you could only do it that way with unused variables. I'm not
sure if this makes sense at all. Why would someone set an unused variable?
Maybe I missed something? Do you know anything else?


It does make some sense, although this is not what I expected. Also,
I'm getting different results...

If I understand correctly your test, all the fields of a structure
share the same registerset. Which is silly, since AFAIU each member of
the structure has a separate D3DXCONSTANT_DESC in the constant table,
both on disk and in memory, there is no point the compiler should
force the same registerset for all the struct members.
Yes, they share all the same registerset. The optimization seems to force only the type of the register (it optimizes the not used members out).

Under the constraint of forcing all the members in the same
registerset, the "conversion rules" you mention make sense. In SM3 an
if bool can be replaced by an if_comp with a float register and a
rep/loop, which is controlled by an integer constant, can be emulated
via loop unrolling (although I'm not sure how the compiler can
possibly do that for the shader in your testcase). These are also
pretty much the only use cases of bool and int constants and there are
no int or bool "non-constant" registers so essentially no other type
conversion is possible. You can check the plain text output from fxc
to see how those constants are used in the shader code and how did the
compiler manage to convert those constants from one type to another.

I tried to compile your HLSL shader myself (I had to disable
optimization though, otherwise compilation fails) and, assuming the
text output of fxc matches what actually ends up in the shader
bytecode, in general I'm getting different struct members in different
registersets. E.g. snbf gets allocated to c6-c9 and b8. FWIW, I used
fxc from the June 2010 DirectX SDK, on Windows 7.
I'm not sure why my results are different from yours. Or am I
misunderstanding the test?
The bytecode should match the result in the text output. Also after some additional test these structs seem to set several registers (as could be seen in the text), so the constant table constant desc is not able to give a full description for these. So an app should not depend on those or did I miss something? It's getting tricky again.
E.g.:
struct {float f2; int n2; bool b2;} snb;
sets:
D3DXRS_FLOAT4 15,16 (60-68)
D3DXRS_BOOL 3,4,5 (3-6)

I'll send an update to the tests to cover these issue. I think I have to look at the binary and whats really in there. Hopefully that information could be found somewhere ...

I'm also using the June 2010 SDK tools, but on wine. The problem might be, that "fixme:d3d9:Direct3DShaderValidatorCreate9 stub" will not fail here. If I disable optimization, I get (I think the same you got):
// Registers:
//
//   Name         Reg   Size
//   ------------ ----- ----
//   sb           b0       3
//   snb          b3       3
//   sbn          b6       2
//   sbnf         b8       1
//   sn           c0       3
//   sbn          c3       3
//   sbnf         c6       3
//   sbnf2        c9       3
//   sbnf3        c12      3
//   snb          c15      2

This is what I get (header.fx is the text file containing the shader) for the shader in the test without disabling anything:
wine fxc.exe /E main /Tvs_3_0 header.fx
// Registers:
//
//   Name         Reg   Size
//   ------------ ----- ----
//   sb           b0       3
//   snb          b3       3
//   sbn          b6       3
//   sbnf         b9       2
//   sn           i0       3
//   sbnf3        i3       3
//   sbnf2        i6       2
//   sbnf         c0       3
//   sbnf2        c3       3
//   sbnf3        c6       3

I'm using this receipt to generate the binary blob:
wine fxc.exe /E main /Tvs_3_0 /Fo temporary.fxo header.fx 1>2
od -v -t x4 -A n -w32 temporary.fxo | sed 's/ /, 0x/g' | sed 's/^, //g' | sed 's/\$/,/g'

It doesn't make a difference if you pass a valid or invalid shader to the constant table interface. I think both should work fine. The question is, why does the compiler produce code which may fail on your system? I guess this will fail on any machine... are there systems where this code works? Or is it the nature of the compiler to produce only sometimes code which works when using optimization?


BTW, what needs to be fixed in Wine? I couldn't see anything obvious
by reading the test.
I got 104 test failures with this test case. Those are only in the part when converting float <-> int <-> bool... Yeah, you couldn't see those from just reading the code. ;-)

I've attached a new test with a shader binary without optimization. The results are the same, only the register usage changed (and the shader size).

Cheers
Rico
diff --git a/dlls/d3dx9_36/tests/shader.c b/dlls/d3dx9_36/tests/shader.c
index 42c1455..e27bdfe 100644
--- a/dlls/d3dx9_36/tests/shader.c
+++ b/dlls/d3dx9_36/tests/shader.c
@@ -5585,6 +5585,492 @@ static const struct registerset_test registerset_test_bigvec_float[] =
         0x42800123, 0x43200123, 0x43600123}},
 };
 
+/*
+ * fxc.exe /Tvs_3_0 /Od
+ */
+#if 0
+struct {int n;  float f; bool b;} sb = {50, 7.6, 1};
+struct {bool b1; float f1; int n1;} sn = {1, 8.3, 51};
+struct {float f2; int n2; bool b2;} snb = {6.1, 53, 0};
+struct {float f3; bool b3; int n3;} sbn = {5.2, 1, 52};
+struct {bool b4; int n4; float f4;} sbnf = {1, 54, 4.3};
+struct {bool b5; int n5; float f5;} sbnf2 = {0, 55, 4.4};
+struct {float f6; bool b6; int n6;} sbnf3 = {8.7, 1, 56};
+float4 main(float4 pos : POSITION) : POSITION
+{
+    float4 tmp = 0;
+    int i;
+    if (sb.b) for (i = 0; i < sn.n1; i++) tmp.x += pos.z;
+    else if (snb.b2) for (i = 0; i < snb.n2; i++) tmp.y += pos.y;
+    else if (sbn.b3) for (i = 0; i < sbn.n3; i++) tmp.y += pos.y;
+    else if (sbnf.b4) for (i = 0; i < sbnf.n4; i++) tmp.y += pos.y * sbnf.f4;
+    else if (sbnf2.f5) for (i = 0; i < sbnf2.n5; i++) tmp.y += pos.y;
+    else if (sbnf3.n6)
+    {
+        tmp.y += pos.y;
+        for (i = 0; i < sbnf3.n6; i++) tmp.x += pos.x;
+    }
+    return tmp;
+}
+#endif
+static const DWORD registerset_blob_mixed_struct[] =
+{
+0xfffe0300, 0x0103fffe, 0x42415443, 0x0000001c, 0x000003d7, 0xfffe0300, 0x0000000a, 0x0000001c,
+0x00000104, 0x000003d0, 0x000000e4, 0x00000000, 0x00000003, 0x0000013c, 0x0000014c, 0x00000158,
+0x00030002, 0x00000003, 0x00000180, 0x00000190, 0x00000158, 0x00060000, 0x00000002, 0x00000180,
+0x0000014c, 0x000001c0, 0x00060002, 0x00000003, 0x000001e8, 0x000001f8, 0x000001c0, 0x00080000,
+0x00000001, 0x000001e8, 0x0000014c, 0x00000228, 0x00090002, 0x00000003, 0x00000250, 0x00000260,
+0x00000290, 0x000c0002, 0x00000003, 0x000002b8, 0x000002c8, 0x000002f8, 0x00000002, 0x00000003,
+0x0000031c, 0x0000032c, 0x0000035c, 0x000f0002, 0x00000002, 0x00000384, 0x00000394, 0x0000035c,
+0x00030000, 0x00000003, 0x00000384, 0x000003c4, 0x6e006273, 0xababab00, 0x00020000, 0x00010001,
+0x00000001, 0x00000000, 0xabab0066, 0x00030000, 0x00010001, 0x00000001, 0x00000000, 0xabab0062,
+0x00010000, 0x00010001, 0x00000001, 0x00000000, 0x000000e7, 0x000000ec, 0x000000fc, 0x00000100,
+0x00000110, 0x00000114, 0x00000005, 0x00030001, 0x00030001, 0x00000124, 0xffffffff, 0xffffffff,
+0xffffffff, 0x006e6273, 0x62003366, 0x336e0033, 0xababab00, 0x0000015c, 0x00000100, 0x0000015f,
+0x00000114, 0x00000162, 0x000000ec, 0x00000005, 0x00030001, 0x00030001, 0x00000168, 0x40a66666,
+0x00000000, 0x00000000, 0x00000000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x42500000,
+0x00000000, 0x00000000, 0x00000000, 0x666e6273, 0x00346200, 0x6600346e, 0xabab0034, 0x000001c5,
+0x00000114, 0x000001c8, 0x000000ec, 0x000001cb, 0x00000100, 0x00000005, 0x00030001, 0x00030001,
+0x000001d0, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x42580000, 0x00000000, 0x00000000,
+0x00000000, 0x4089999a, 0x00000000, 0x00000000, 0x00000000, 0x666e6273, 0x35620032, 0x00356e00,
+0xab003566, 0x0000022e, 0x00000114, 0x00000231, 0x000000ec, 0x00000234, 0x00000100, 0x00000005,
+0x00030001, 0x00030001, 0x00000238, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x425c0000,
+0x00000000, 0x00000000, 0x00000000, 0x408ccccd, 0x00000000, 0x00000000, 0x00000000, 0x666e6273,
+0x36660033, 0x00366200, 0xab00366e, 0x00000296, 0x00000100, 0x00000299, 0x00000114, 0x0000029c,
+0x000000ec, 0x00000005, 0x00030001, 0x00030001, 0x000002a0, 0x410b3333, 0x00000000, 0x00000000,
+0x00000000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x42600000, 0x00000000, 0x00000000,
+0x00000000, 0x62006e73, 0x31660031, 0x00316e00, 0x000002fb, 0x00000114, 0x000002fe, 0x00000100,
+0x00000301, 0x000000ec, 0x00000005, 0x00030001, 0x00030001, 0x00000304, 0x3f800000, 0x00000000,
+0x00000000, 0x00000000, 0x4104cccd, 0x00000000, 0x00000000, 0x00000000, 0x424c0000, 0x00000000,
+0x00000000, 0x00000000, 0x00626e73, 0x6e003266, 0x32620032, 0xababab00, 0x00000360, 0x00000100,
+0x00000363, 0x000000ec, 0x00000366, 0x00000114, 0x00000005, 0x00030001, 0x00030001, 0x0000036c,
+0x40c33333, 0x00000000, 0x00000000, 0x00000000, 0x42540000, 0x00000000, 0x00000000, 0x00000000,
+0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x335f7376,
+0x4d00305f, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320,
+0x656c6970, 0x2e392072, 0x392e3932, 0x332e3235, 0x00313131, 0x05000051, 0xa00f0011, 0x00000000,
+0x00000000, 0x3f800000, 0x00000000, 0x05000030, 0xf00f0000, 0x000000ff, 0x00000000, 0x00000000,
+0x00000000, 0x0200001f, 0x80000000, 0x900f0000, 0x0200001f, 0x80000000, 0xe00f0000, 0x01000028,
+0xe0e40802, 0x02000001, 0x80030000, 0xa0550011, 0x01000026, 0xf0e40000, 0x0300000c, 0x80040000,
+0x80550000, 0xa0000002, 0x02000001, 0x80080000, 0x81aa0000, 0x0300000d, 0x80040000, 0x80ff0000,
+0x80aa0000, 0x02000001, 0x80080000, 0x80000000, 0x02000001, 0x80010000, 0x80ff0000, 0x0205002d,
+0x80aa0000, 0x81aa0000, 0x03000002, 0x80010000, 0x80000000, 0x90aa0000, 0x03000002, 0x80020000,
+0x80550000, 0xa0aa0011, 0x00000027, 0x02000001, 0x80020000, 0xa0550011, 0x02000001, 0x80030000,
+0x80e40000, 0x0000002a, 0x01000028, 0xe0e40805, 0x02000001, 0x80030000, 0xa0550011, 0x01000026,
+0xf0e40000, 0x0300000c, 0x80040000, 0x80000000, 0xa0000010, 0x02000001, 0x80080000, 0x81aa0000,
+0x0300000d, 0x80040000, 0x80ff0000, 0x80aa0000, 0x02000001, 0x80080000, 0x80550000, 0x02000001,
+0x80020000, 0x80ff0000, 0x0205002d, 0x80aa0000, 0x81aa0000, 0x03000002, 0x80020000, 0x80550000,
+0x90550000, 0x03000002, 0x80010000, 0x80000000, 0xa0aa0011, 0x00000027, 0x02000001, 0x80010000,
+0xa0550011, 0x02000001, 0x80030000, 0x80e40000, 0x0000002a, 0x01000028, 0xe0e40807, 0x02000001,
+0x80030000, 0xa0550011, 0x01000026, 0xf0e40000, 0x0300000c, 0x80040000, 0x80000000, 0xa0000005,
+0x02000001, 0x80080000, 0x81aa0000, 0x0300000d, 0x80040000, 0x80ff0000, 0x80aa0000, 0x02000001,
+0x80080000, 0x80550000, 0x02000001, 0x80020000, 0x80ff0000, 0x0205002d, 0x80aa0000, 0x81aa0000,
+0x03000002, 0x80020000, 0x80550000, 0x90550000, 0x03000002, 0x80010000, 0x80000000, 0xa0aa0011,
+0x00000027, 0x02000001, 0x80010000, 0xa0550011, 0x02000001, 0x80030000, 0x80e40000, 0x0000002a,
+0x01000028, 0xe0e40808, 0x02000001, 0x80030000, 0xa0550011, 0x01000026, 0xf0e40000, 0x0300000c,
+0x80040000, 0x80000000, 0xa0000007, 0x02000001, 0x80080000, 0x81aa0000, 0x0300000d, 0x80040000,
+0x80ff0000, 0x80aa0000, 0x02000001, 0x80080000, 0x80550000, 0x02000001, 0x80020000, 0x80ff0000,
+0x0205002d, 0x80aa0000, 0x81aa0000, 0x03000005, 0x80040000, 0xa0000008, 0x90550000, 0x03000002,
+0x80020000, 0x80aa0000, 0x80550000, 0x03000002, 0x80010000, 0x80000000, 0xa0aa0011, 0x00000027,
+0x02000001, 0x80010000, 0xa0550011, 0x02000001, 0x80030000, 0x80e40000, 0x0000002a, 0x02000001,
+0x80040000, 0xa100000b, 0x0300000b, 0x80040000, 0x80aa0000, 0xa000000b, 0x02000001, 0x80080000,
+0x81aa0000, 0x0300000c, 0x80040000, 0x80ff0000, 0x80aa0000, 0x02050029, 0x80aa0000, 0x81aa0000,
+0x02000001, 0x80030000, 0xa0550011, 0x01000026, 0xf0e40000, 0x0300000c, 0x80040000, 0x80000000,
+0xa000000a, 0x02000001, 0x80080000, 0x81aa0000, 0x0300000d, 0x80040000, 0x80ff0000, 0x80aa0000,
+0x02000001, 0x80080000, 0x80550000, 0x02000001, 0x80020000, 0x80ff0000, 0x0205002d, 0x80aa0000,
+0x81aa0000, 0x03000002, 0x80020000, 0x80550000, 0x90550000, 0x03000002, 0x80010000, 0x80000000,
+0xa0aa0011, 0x00000027, 0x02000001, 0x80010000, 0xa0550011, 0x02000001, 0x80030000, 0x80e40000,
+0x0000002a, 0x02000001, 0x80040000, 0xa100000e, 0x0300000b, 0x80040000, 0x80aa0000, 0xa000000e,
+0x02000001, 0x80080000, 0x81aa0000, 0x0300000c, 0x80040000, 0x80ff0000, 0x80aa0000, 0x02050029,
+0x80aa0000, 0x81aa0000, 0x03000002, 0x80020000, 0xa0550011, 0x90550000, 0x02000001, 0x800c0000,
+0xa0550011, 0x01000026, 0xf0e40000, 0x0300000c, 0x80010001, 0x80ff0000, 0xa000000e, 0x02000001,
+0x80020001, 0x81000001, 0x0300000d, 0x80010001, 0x80550001, 0x80000001, 0x0205002d, 0x80000001,
+0x81000001, 0x03000002, 0x80040000, 0x80aa0000, 0x90000000, 0x03000002, 0x80080000, 0x80ff0000,
+0xa0aa0011, 0x00000027, 0x02000001, 0x80010000, 0x80aa0000, 0x0000002a, 0x02000001, 0x80030000,
+0xa0550011, 0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b, 0x02000001,
+0xe0030000, 0x80e40000, 0x02000001, 0xe00c0000, 0xa0550011, 0x0000ffff,
+};
+
+static const struct registerset_constants registerset_constants_mixed_struct_bool[] =
+{
+    {"sb",       {"sb", D3DXRS_BOOL, 0, 3, D3DXPC_STRUCT, D3DXPT_VOID,  1, 3, 1, 3, 12, NULL}, 83},
+    {"sb.n",     {"n",  D3DXRS_BOOL, 0, 1, D3DXPC_SCALAR, D3DXPT_INT,   1, 1, 1, 0,  4, NULL}, 83},
+    {"sb.f",     {"f",  D3DXRS_BOOL, 1, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0,  4, NULL}, 84},
+    {"sb.b",     {"b",  D3DXRS_BOOL, 2, 1, D3DXPC_SCALAR, D3DXPT_BOOL,  1, 1, 1, 0,  4, NULL}, 85},
+};
+
+static const struct registerset_test registerset_test_mixed_struct_bool[] =
+{
+    {SetInt},
+    {SetBool},
+    {SetFloat},
+    {SetIntArray, 1, 0, 2},
+    {SetIntArray, 1, 3, REGISTER_OUTPUT_SIZE, 3, {0x00000002, 0x00000001, 0x00000001}},
+    {SetBoolArray, 1, 0, 2},
+    {SetBoolArray, 1, 3, REGISTER_OUTPUT_SIZE, 3, {0x00000001, 0x00000001, 0x00000004}},
+    {SetFloatArray, 0, 0, 2},
+    {SetFloatArray, 0, 3, REGISTER_OUTPUT_SIZE, 3, {0x00000001, 0x00000000, 0x00000001}},
+    {SetValue, 1, 0, 11},
+    {SetValue, 1, 12, REGISTER_OUTPUT_SIZE * 4, 3, {0x00000002, 0x00000003, 0x00000004}},
+    {SetVector, 0, 0, 0, 3, {0x00000001, 0x00000000, 0x00000001}},
+    {SetVectorArray},
+    {SetVectorArray, 0, 1, REGISTER_OUTPUT_SIZE / 4, 3, {0x00000001, 0x00000000, 0x00000001}},
+    {SetMatrix, 0, 0, 0, 3, {0x00000001, 0x00000000, 0x00000001}},
+    {SetMatrixArray},
+    {SetMatrixArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 3, {0x00000001, 0x00000000, 0x00000001}},
+    {SetMatrixTranspose, 0, 0, 0, 3, {0x00000001, 0x00000001, 0x00000001}},
+    {SetMatrixTransposeArray},
+    {SetMatrixTransposeArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 3, {0x00000001, 0x00000001, 0x00000001}},
+    {SetMatrixPointerArray},
+    {SetMatrixPointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 3, {0x00000001, 0x00000000, 0x00000001}},
+    {SetMatrixTransposePointerArray},
+    {SetMatrixTransposePointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 3, {0x00000001, 0x00000001, 0x00000001}},
+};
+
+static const struct registerset_constants registerset_constants_mixed_struct_int[] =
+{
+    {"sn",       {"sn", D3DXRS_FLOAT4, 0, 3, D3DXPC_STRUCT, D3DXPT_VOID,  1, 3, 1, 3, 12, NULL}, 203},
+    {"sn.b1",    {"b1", D3DXRS_FLOAT4, 0, 1, D3DXPC_SCALAR, D3DXPT_BOOL,  1, 1, 1, 0,  4, NULL}, 203},
+    {"sn.f1",    {"f1", D3DXRS_FLOAT4, 1, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0,  4, NULL}, 207},
+    {"sn.n1",    {"n1", D3DXRS_FLOAT4, 2, 1, D3DXPC_SCALAR, D3DXPT_INT,   1, 1, 1, 0,  4, NULL}, 211},
+};
+
+static const struct registerset_test registerset_test_mixed_struct_int[] =
+{
+    {SetInt},
+    {SetBool},
+    {SetFloat},
+    {SetIntArray, 1, 0, 2},
+    {SetIntArray, 1, 3, REGISTER_OUTPUT_SIZE, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x40400000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetBoolArray, 1, 0, 2},
+    {SetBoolArray, 1, 3, REGISTER_OUTPUT_SIZE, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000,
+        0x3f800000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetFloatArray, 0, 0, 2},
+    {SetFloatArray, 0, 3, REGISTER_OUTPUT_SIZE, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetValue, 1, 0, 11},
+    {SetValue, 1, 12, REGISTER_OUTPUT_SIZE * 4, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000000, 0x00000000,
+        0x40800000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetVector, 0, 0, 0, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetVectorArray},
+    {SetVectorArray, 0, 1, REGISTER_OUTPUT_SIZE / 4, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrix, 0, 0, 0, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixArray},
+    {SetMatrixArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixTranspose, 0, 0, 0, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixTransposeArray},
+    {SetMatrixTransposeArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixPointerArray},
+    {SetMatrixPointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixTransposePointerArray},
+    {SetMatrixTransposePointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+};
+
+static const struct registerset_constants registerset_constants_mixed_struct_int_bool[] =
+{
+    {"snb",      {"snb", D3DXRS_FLOAT4, 15, 2, D3DXPC_STRUCT, D3DXPT_VOID,  1, 3, 1, 3, 12, NULL}, 229},
+    {"snb.f2",   {"f2",  D3DXRS_FLOAT4, 15, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0,  4, NULL}, 229},
+    {"snb.n2",   {"n2",  D3DXRS_FLOAT4, 16, 1, D3DXPC_SCALAR, D3DXPT_INT,   1, 1, 1, 0,  4, NULL}, 233},
+    {"snb.b2",   {"b2",  D3DXRS_FLOAT4, 17, 0, D3DXPC_SCALAR, D3DXPT_BOOL,  1, 1, 1, 0,  4, NULL}, 237},
+};
+
+static const struct registerset_test registerset_test_mixed_struct_int_bool[] =
+{
+    {SetInt},
+    {SetBool},
+    {SetFloat},
+    {SetIntArray, 1, 0, 2},
+    {SetIntArray, 1, 3, REGISTER_OUTPUT_SIZE, 8,
+        {0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x40400000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetBoolArray, 1, 0, 2},
+    {SetBoolArray, 1, 3, REGISTER_OUTPUT_SIZE, 8,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetFloatArray, 0, 0, 2},
+    {SetFloatArray, 0, 3, REGISTER_OUTPUT_SIZE, 8,
+        {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetValue, 1, 0, 11},
+    {SetValue, 1, 12, REGISTER_OUTPUT_SIZE * 4, 8,
+        {0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x40400000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetVector, 0, 0, 0, 8,
+        {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetVectorArray},
+    {SetVectorArray, 0, 1, REGISTER_OUTPUT_SIZE / 4, 8,
+        {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrix, 0, 0, 0, 8,
+        {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixArray},
+    {SetMatrixArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 8,
+        {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixTranspose, 0, 0, 0, 8,
+        {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixTransposeArray},
+    {SetMatrixTransposeArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 8,
+        {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixPointerArray},
+    {SetMatrixPointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 8,
+        {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixTransposePointerArray},
+    {SetMatrixTransposePointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 8,
+        {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+};
+
+static const struct registerset_constants registerset_constants_mixed_struct_bool_int[] =
+{
+    {"sbn",      {"sbn", D3DXRS_FLOAT4, 3, 3, D3DXPC_STRUCT, D3DXPT_VOID,  1, 3, 1, 3, 12, NULL}, 100},
+    {"sbn.f3",   {"f3",  D3DXRS_FLOAT4, 3, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0,  4, NULL}, 100},
+    {"sbn.b3",   {"b3",  D3DXRS_FLOAT4, 4, 1, D3DXPC_SCALAR, D3DXPT_BOOL,  1, 1, 1, 0,  4, NULL}, 104},
+    {"sbn.n3",   {"n3",  D3DXRS_FLOAT4, 5, 1, D3DXPC_SCALAR, D3DXPT_INT,   1, 1, 1, 0,  4, NULL}, 108},
+};
+
+static const struct registerset_test registerset_test_mixed_struct_bool_int[] =
+{
+    {SetInt},
+    {SetBool},
+    {SetFloat},
+    {SetIntArray, 1, 0, 2},
+    {SetIntArray, 1, 3, REGISTER_OUTPUT_SIZE, 12,
+        {0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetBoolArray, 1, 0, 2},
+    {SetBoolArray, 1, 3, REGISTER_OUTPUT_SIZE, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000,
+        0x3f800000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetFloatArray, 0, 0, 2},
+    {SetFloatArray, 0, 3, REGISTER_OUTPUT_SIZE, 12,
+        {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetValue, 1, 0, 11},
+    {SetValue, 1, 12, REGISTER_OUTPUT_SIZE * 4, 12,
+        {0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetVector, 0, 0, 0, 12,
+        {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetVectorArray},
+    {SetVectorArray, 0, 1, REGISTER_OUTPUT_SIZE / 4, 12,
+        {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixArray},
+    {SetMatrixArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 12,
+        {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixTranspose, 0, 0, 0, 12,
+        {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixTransposeArray},
+    {SetMatrixTransposeArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 12,
+        {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixPointerArray},
+    {SetMatrixPointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 12,
+        {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixTransposePointerArray},
+    {SetMatrixTransposePointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 12,
+        {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+};
+
+static const struct registerset_constants registerset_constants_mixed_struct_bool_int_float[] =
+{
+    {"sbnf",     {"sbnf", D3DXRS_FLOAT4, 6, 3, D3DXPC_STRUCT, D3DXPT_VOID,  1, 3, 1, 3, 12, NULL}, 126},
+    {"sbnf.b4",  {"b4",   D3DXRS_FLOAT4, 6, 1, D3DXPC_SCALAR, D3DXPT_BOOL,  1, 1, 1, 0,  4, NULL}, 126},
+    {"sbnf.n4",  {"n4",   D3DXRS_FLOAT4, 7, 1, D3DXPC_SCALAR, D3DXPT_INT,   1, 1, 1, 0,  4, NULL}, 130},
+    {"sbnf.f4",  {"f4",   D3DXRS_FLOAT4, 8, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0,  4, NULL}, 134},
+};
+
+static const struct registerset_test registerset_test_mixed_struct_bool_int_float[] =
+{
+    {SetInt},
+    {SetBool},
+    {SetFloat},
+    {SetIntArray, 1, 0, 2},
+    {SetIntArray, 1, 3, REGISTER_OUTPUT_SIZE, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x40400000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetBoolArray, 1, 0, 2},
+    {SetBoolArray, 1, 3, REGISTER_OUTPUT_SIZE, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000,
+        0x3f800000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetFloatArray, 0, 0, 2},
+    {SetFloatArray, 0, 3, REGISTER_OUTPUT_SIZE, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800123, 0x00000000, 0x00000000, 0x00000000}},
+    {SetValue, 1, 0, 11},
+    {SetValue, 1, 12, REGISTER_OUTPUT_SIZE * 4, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x40400000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000004, 0x00000000, 0x00000000, 0x00000000}},
+    {SetVector, 0, 0, 0, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800123, 0x00000000, 0x00000000, 0x00000000}},
+    {SetVectorArray},
+    {SetVectorArray, 0, 1, REGISTER_OUTPUT_SIZE / 4, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800123, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrix, 0, 0, 0, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800123, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixArray},
+    {SetMatrixArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800123, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixTranspose, 0, 0, 0, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixTransposeArray},
+    {SetMatrixTransposeArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixPointerArray},
+    {SetMatrixPointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixTransposePointerArray},
+    {SetMatrixTransposePointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+};
+
+static const struct registerset_constants registerset_constants_mixed_struct_bool_int_float_2[] =
+{
+    {"sbnf2",    {"sbnf2", D3DXRS_FLOAT4,  9, 3, D3DXPC_STRUCT, D3DXPT_VOID,  1, 3, 1, 3, 12, NULL}, 152},
+    {"sbnf2.b5", {"b5",    D3DXRS_FLOAT4,  9, 1, D3DXPC_SCALAR, D3DXPT_BOOL,  1, 1, 1, 0,  4, NULL}, 152},
+    {"sbnf2.n5", {"n5",    D3DXRS_FLOAT4, 10, 1, D3DXPC_SCALAR, D3DXPT_INT,   1, 1, 1, 0,  4, NULL}, 156},
+    {"sbnf2.f5", {"f5",    D3DXRS_FLOAT4, 11, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0,  4, NULL}, 160},
+};
+
+static const struct registerset_test registerset_test_mixed_struct_bool_int_float_2[] =
+{
+    {SetInt},
+    {SetBool},
+    {SetFloat},
+    {SetIntArray, 1, 0, 2},
+    {SetIntArray, 1, 3, REGISTER_OUTPUT_SIZE, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x40400000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetBoolArray, 1, 0, 2},
+    {SetBoolArray, 1, 3, REGISTER_OUTPUT_SIZE, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000,
+        0x3f800000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetFloatArray, 0, 0, 2},
+    {SetFloatArray, 0, 3, REGISTER_OUTPUT_SIZE, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800123, 0x00000000, 0x00000000, 0x00000000}},
+    {SetValue, 1, 0, 11},
+    {SetValue, 1, 12, REGISTER_OUTPUT_SIZE * 4, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x40400000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000004, 0x00000000, 0x00000000, 0x00000000}},
+    {SetVector, 0, 0, 0, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800123, 0x00000000, 0x00000000, 0x00000000}},
+    {SetVectorArray},
+    {SetVectorArray, 0, 1, REGISTER_OUTPUT_SIZE / 4, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800123, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrix, 0, 0, 0, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800123, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixArray},
+    {SetMatrixArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800123, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixTranspose, 0, 0, 0, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixTransposeArray},
+    {SetMatrixTransposeArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixPointerArray},
+    {SetMatrixPointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixTransposePointerArray},
+    {SetMatrixTransposePointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+};
+
+static const struct registerset_constants registerset_constants_mixed_struct_bool_int_float_3[] =
+{
+    {"sbnf3",    {"sbnf3", D3DXRS_FLOAT4, 12, 3, D3DXPC_STRUCT, D3DXPT_VOID,  1, 3, 1, 3, 12, NULL}, 178},
+    {"sbnf3.f6", {"f6",    D3DXRS_FLOAT4, 12, 1, D3DXPC_SCALAR, D3DXPT_FLOAT, 1, 1, 1, 0,  4, NULL}, 178},
+    {"sbnf3.b6", {"b6",    D3DXRS_FLOAT4, 13, 1, D3DXPC_SCALAR, D3DXPT_BOOL,  1, 1, 1, 0,  4, NULL}, 182},
+    {"sbnf3.n6", {"n6",    D3DXRS_FLOAT4, 14, 1, D3DXPC_SCALAR, D3DXPT_INT,   1, 1, 1, 0,  4, NULL}, 186},
+};
+
+static const struct registerset_test registerset_test_mixed_struct_bool_int_float_3[] =
+{
+    {SetInt},
+    {SetBool},
+    {SetFloat},
+    {SetIntArray, 1, 0, 2},
+    {SetIntArray, 1, 3, REGISTER_OUTPUT_SIZE, 12,
+        {0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetBoolArray, 1, 0, 2},
+    {SetBoolArray, 1, 3, REGISTER_OUTPUT_SIZE, 12,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000,
+        0x3f800000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetFloatArray, 0, 0, 2},
+    {SetFloatArray, 0, 3, REGISTER_OUTPUT_SIZE, 12,
+        {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetValue, 1, 0, 11},
+    {SetValue, 1, 12, REGISTER_OUTPUT_SIZE * 4, 12,
+        {0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetVector, 0, 0, 0, 12,
+        {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetVectorArray},
+    {SetVectorArray, 0, 1, REGISTER_OUTPUT_SIZE / 4, 12,
+        {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrix, 0, 0, 0, 12,
+        {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixArray},
+    {SetMatrixArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 12,
+        {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x40800000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixTranspose, 0, 0, 0, 12,
+        {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixTransposeArray},
+    {SetMatrixTransposeArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 12,
+        {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixPointerArray},
+    {SetMatrixPointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 12,
+        {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+    {SetMatrixTransposePointerArray},
+    {SetMatrixTransposePointerArray, 0, 1, REGISTER_OUTPUT_SIZE / 16, 12,
+        {0x40000123, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x00000000, 0x00000000, 0x00000000, 0x00000000}},
+};
+
 static const struct
 {
     const char *name;
@@ -5856,6 +6342,38 @@ registerset_data[] =
         sizeof(registerset_test_bigvec_float) / sizeof(*registerset_test_bigvec_float),
         registerset_constants_bigvec_float,
         sizeof(registerset_constants_bigvec_float) / sizeof(*registerset_constants_bigvec_float)},
+    /* mixed struct */
+    {"mixed struct bool", "sb", 0, D3DXRS_BOOL, registerset_blob_mixed_struct, registerset_test_mixed_struct_bool,
+        sizeof(registerset_test_mixed_struct_bool) / sizeof(*registerset_test_mixed_struct_bool),
+        registerset_constants_mixed_struct_bool,
+        sizeof(registerset_constants_mixed_struct_bool) / sizeof(*registerset_constants_mixed_struct_bool)},
+    {"mixed struct int", "sn", 0, D3DXRS_FLOAT4, registerset_blob_mixed_struct, registerset_test_mixed_struct_int,
+        sizeof(registerset_test_mixed_struct_int) / sizeof(*registerset_test_mixed_struct_int),
+        registerset_constants_mixed_struct_int,
+        sizeof(registerset_constants_mixed_struct_int) / sizeof(*registerset_constants_mixed_struct_int)},
+    {"mixed struct int bool", "snb", 60, D3DXRS_FLOAT4, registerset_blob_mixed_struct, registerset_test_mixed_struct_int_bool,
+        sizeof(registerset_test_mixed_struct_bool) / sizeof(*registerset_test_mixed_struct_bool),
+        registerset_constants_mixed_struct_int_bool,
+        sizeof(registerset_constants_mixed_struct_int_bool) / sizeof(*registerset_constants_mixed_struct_int_bool)},
+    {"mixed struct bool int", "sbn", 12, D3DXRS_FLOAT4, registerset_blob_mixed_struct, registerset_test_mixed_struct_bool_int,
+        sizeof(registerset_test_mixed_struct_bool) / sizeof(*registerset_test_mixed_struct_bool),
+        registerset_constants_mixed_struct_bool_int,
+        sizeof(registerset_constants_mixed_struct_bool_int) / sizeof(*registerset_constants_mixed_struct_bool_int)},
+    {"mixed struct bool int float", "sbnf", 24, D3DXRS_FLOAT4, registerset_blob_mixed_struct,
+        registerset_test_mixed_struct_bool_int_float,
+        sizeof(registerset_test_mixed_struct_bool_int_float) / sizeof(*registerset_test_mixed_struct_bool_int_float),
+        registerset_constants_mixed_struct_bool_int_float,
+        sizeof(registerset_constants_mixed_struct_bool_int_float) / sizeof(*registerset_constants_mixed_struct_bool_int_float)},
+    {"mixed struct bool int float 2", "sbnf2", 36, D3DXRS_FLOAT4, registerset_blob_mixed_struct,
+        registerset_test_mixed_struct_bool_int_float_2,
+        sizeof(registerset_test_mixed_struct_bool_int_float_2) / sizeof(*registerset_test_mixed_struct_bool_int_float_2),
+        registerset_constants_mixed_struct_bool_int_float_2,
+        sizeof(registerset_constants_mixed_struct_bool_int_float_2) / sizeof(*registerset_constants_mixed_struct_bool_int_float_2)},
+    {"mixed struct bool int float 3", "sbnf3", 48, D3DXRS_FLOAT4, registerset_blob_mixed_struct,
+        registerset_test_mixed_struct_bool_int_float_3,
+        sizeof(registerset_test_mixed_struct_bool_int_float_3) / sizeof(*registerset_test_mixed_struct_bool_int_float_3),
+        registerset_constants_mixed_struct_bool_int_float_3,
+        sizeof(registerset_constants_mixed_struct_bool_int_float_3) / sizeof(*registerset_constants_mixed_struct_bool_int_float_3)},
 };
 
 static void registerset_clear(IDirect3DDevice9 *device)
@@ -6289,6 +6807,22 @@ registerset_defaults_data[] =
         {0x00000000}},
     /* DefaultValue = NULL */
     {"big vector", registerset_blob_bigvec},
+    {"mixed struct", registerset_blob_mixed_struct, 68, 0, 9,
+        {0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x4104cccd, 0x00000000, 0x00000000, 0x00000000,
+        0x424c0000, 0x00000000, 0x00000000, 0x00000000, 0x40a66666, 0x00000000, 0x00000000, 0x00000000,
+        0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x42500000, 0x00000000, 0x00000000, 0x00000000,
+        0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x42580000, 0x00000000, 0x00000000, 0x00000000,
+        0x4089999a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+        0x425c0000, 0x00000000, 0x00000000, 0x00000000, 0x408ccccd, 0x00000000, 0x00000000, 0x00000000,
+        0x410b3333, 0x00000000, 0x00000000, 0x00000000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000,
+        0x42600000, 0x00000000, 0x00000000, 0x00000000, 0x40c33333, 0x00000000, 0x00000000, 0x00000000,
+        0x42540000, 0x00000000, 0x00000000, 0x00000000},
+        {0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000008, 0x00000000, 0x00000001, 0x00000000,
+        0x00000033, 0x00000000, 0x00000001, 0x00000000, 0x00000008, 0x00000000, 0x00000001, 0x00000000,
+        0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000038, 0x00000000, 0x00000001, 0x00000000,
+        0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000037, 0x00000000, 0x00000001, 0x00000000},
+        {0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff, 0xffffffff,
+        0xffffffff}},
 };
 
 static void test_registerset_defaults(void)


Reply via email to