[PATCH 1/6] d3dx9: add test for preshader in effect.

Henri Verbeet hverbeet at gmail.com
Wed Mar 9 08:48:47 CST 2016


On 9 March 2016 at 14:38, Paul Gofman <gofmanp at gmail.com> wrote:
> +static float test_effect_preshader_fconstsv[][4] =
> +{
> +    {11.0, 12.0, 13.0, 0.0 },
> +    {21.0, 22.0, 23.0, 0.0 },
> +    {31.0, 32.0, 33.0, 0.0 },
> +    {41.0, 42.0, 43.0, 0.0 },
> +    {11.0, 21.0, 31.0, 0.0 },
> +    {12.0, 22.0, 32.0, 0.0 },
> +    {13.0, 23.0, 33.0, 0.0 },
> +    {14.0, 24.0, 34.0, 0.0 },
> +    {11.0, 12.0, 13.0, 14.0},
> +    {21.0, 22.0, 23.0, 24.0},
> +    {31.0, 32.0, 33.0, 34.0},
> +    {11.0, 21.0, 31.0, 41.0},
> +    {12.0, 22.0, 32.0, 42.0},
> +    {13.0, 23.0, 33.0, 43.0}
> +};
> +
> +static float test_effect_preshader_fconstsp[][4] =
> +{
> +    {11.0, 21.0, 0.0 , 0.0 },
> +    {12.0, 22.0, 0.0 , 0.0 },
> +    {13.0, 23.0, 0.0 , 0.0 },
> +    {11.0, 12.0, 0.0 , 0.0 },
> +    {21.0, 22.0, 0.0 , 0.0 },
> +    {31.0, 32.0, 0.0 , 0.0 },
> +    {11.0, 12.0, 0.0 , 0.0 },
> +    {21.0, 22.0, 0.0 , 0.0 },
> +    {11.0, 21.0, 0.0 , 0.0 },
> +    {12.0, 22.0, 0.0 , 0.0 },
> +    {11.0, 12.0, 13.0, 0.0 },
> +    {21.0, 22.0, 23.0, 0.0 },
> +    {11.0, 21.0, 31.0, 0.0 },
> +    {12.0, 22.0, 32.0, 0.0 }
> +};
> +
> +static BOOL test_effect_preshader_bconsts[] =
> +{
> +    1, 0, 1, 0, 1, 0
> +};
> +
> +static struct
> +{
> +    const char *comment;
> +    BOOL todo[4];
> +    DWORD result[4];
> +}
> +test_effect_preshader_op_results[] =
> +{
> +    {"1 / op", {1, 1, 1, 1}, {0x7f800000, 0xff800000, 0xbee8ba2e, 0x00200000}},
> +    {"rsq",    {1, 1, 3, 3}, {0x7f800000, 0x7f800000, 0x3f2c985d, 0x1f800000}},
> +    {"mul",    {1, 1, 1, 1}, {0x00000000, 0x80000000, 0x40d33334, 0x7f800000}},
> +    {"add",    {0, 1, 1, 1}, {0x3f800000, 0x40000000, 0xc0a66666, 0x7f7fffff}},
> +    {"lt",     {0, 0, 1, 0}, {0x3f800000, 0x3f800000, 0x00000000, 0x00000000}},
> +    {"ge",     {1, 1, 0, 1}, {0x00000000, 0x00000000, 0x3f800000, 0x3f800000}},
> +    {"neg",    {1, 1, 1, 1}, {0x80000000, 0x00000000, 0x400ccccd, 0xff7fffff}},
> +    {"rcp",    {1, 1, 1, 1}, {0x7f800000, 0xff800000, 0xbee8ba2e, 0x00200000}},
> +    {"frac",   {0, 0, 1, 0}, {0x00000000, 0x00000000, 0x3f4ccccc, 0x00000000}},
> +    {"min",    {0, 1, 1, 1}, {0x00000000, 0x80000000, 0xc0400000, 0x40800000}},
> +    {"max",    {1, 1, 1, 1}, {0x3f800000, 0x40000000, 0xc00ccccd, 0x7f7fffff}},
> +    {"sin",    {0, 1, 1, 3}, {0x00000000, 0x80000000, 0xbf4ef99e, 0xbf0599b3}},
> +    {"cos",    {1, 1, 1, 3}, {0x3f800000, 0x3f800000, 0xbf16a803, 0x3f5a5f96}},
> +    {"den mul",{1, 1, 1, 1}, {0x7f800000, 0xff800000, 0xbb94f209, 0x000051ec}},
> +    {"dot",    {0, 1, 1, 0}, {0x00000000, 0x7f800000, 0x41f00000, 0x00000000}}
> +};
These should all be const. I'd probably use D3DXVECTOR4 for the float
constant arrays.

> +#define TEST_EFFECT_PRES_NFLOATV (sizeof(test_effect_preshader_fconstsv) / sizeof(*test_effect_preshader_fconstsv))
> +#define TEST_EFFECT_PRES_NFLOATP (sizeof(test_effect_preshader_fconstsp) / sizeof(*test_effect_preshader_fconstsp))
> +#define TEST_EFFECT_PRES_NFLOATMAX (TEST_EFFECT_PRES_NFLOATV > TEST_EFFECT_PRES_NFLOATP ? \
> +        TEST_EFFECT_PRES_NFLOATV : TEST_EFFECT_PRES_NFLOATP)
> +#define TEST_EFFECT_PRES_NBOOL (sizeof(test_effect_preshader_bconsts) / sizeof(*test_effect_preshader_bconsts))
> +#define TEST_EFFECT_PRES_NOPTESTS (sizeof(test_effect_preshader_op_results) / \
> +        sizeof(*test_effect_preshader_op_results))
I think you should either just write these out, or introduce an
ARRAY_SIZE macro.

> +    const static D3DXVECTOR4 fvect1 = {28.0f, 29.0f, 30.0f, 31.0f};
> +    const static D3DXVECTOR4 fvect2 = {0.0f, 0.0f, 1.0f, 0.0f};
> +    const static float fvect_empty[] = {-9999.0f, -9999.0f, -9999.0f, -9999.0f};
This is not wrong, but the usual order is "static const".

> +        todo_wine_if(!!bdata[i] != !!test_effect_preshader_bconsts[i])
You can write that as "!bdata[i] != !test_effect_preshader_bconsts[i]"
without changing the meaning.

> +    todo_wine ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
%#x to make it clear it's a hexadecimal value. You don't need to print
the expected value if it's a constant.

> +    hr = IDirect3DDevice9_GetVertexShader(device, &vshader);
> +    ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr);
> +    ok(vshader != NULL, "Got NULL vshader.\n");
> +    if (vshader)
> +    {
That kind of thing is pointless, if "vshader" was NULL, the test would
have failed.

> +    ok(vshader == NULL, "Incorrect shader selected.\n");
I would prefer those as "ok(!vshader, ...);", but it's just style.



More information about the wine-devel mailing list