d3dx9/tests: Add more tests for relative addressing in preshaders.

Signed-off-by: Paul Gofman <gofmanp@gmail.com>
Signed-off-by: Matteo Bruni <mbruni@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Paul Gofman 2017-04-03 19:51:24 +02:00 committed by Alexandre Julliard
parent b096f03ca6
commit 8b1737c0fd
1 changed files with 269 additions and 0 deletions

View File

@ -5041,6 +5041,274 @@ static void test_effect_commitchanges(IDirect3DDevice9 *device)
effect->lpVtbl->Release(effect);
}
static void test_effect_preshader_relative_addressing(IDirect3DDevice9 *device)
{
static const struct
{
D3DXVECTOR4 opvect2;
D3DXVECTOR4 g_ivect;
unsigned int expected[4];
}
test_out_of_bounds_index[] =
{
{{1.0f, 2.0f, 3.0f, 4.0f}, {101.0f, 101.0f, 101.0f, 101.0f}, {0, 0x42ca0000, 0x3f800000, 0}},
{{1.0f, 2.0f, 3.0f, 4.0f}, {3333.0f, 1094.0f, 2222.0f, 3333.0f},
{0x447ac000, 0x45505000, 0x3f800000, 0}},
{{1.0f, 2.0f, 3.0f, 4.0f}, {3333.0f, 1094.0f, 2222.0f, 1.0f},
{0x447ac000, 0x3f800000, 0x447a8000, 0x453b9000}},
{{1.0f, 2.0f, 3.0f, 4.0f}, {1.0f, 1094.0f, 2222.0f, 3333.0f},
{0x447ac000, 0x45505000, 0x3f800000, 0x453ba000}},
{{1.0f, 2.0f, 3.0f, 4.0f}, {1111.0f, 1094.0f, 2222.0f, 1111.0f},
{0x447ac000, 0x448ae000, 0, 0}},
{{1.0f, 2.0f, 3.0f, 4.0f}, {1111.0f, 1094.0f, 2222.0f, 3333.0f},
{0x447ac000, 0x45505000, 0x3f800000, 0}},
{{-1111.0f, 1094.0f, -2222.0f, -3333.0f}, {4.0f, 3.0f, 2.0f, 1.0f},
{0x447ac000, 0x40800000, 0x447a8000, 0x453b9000}},
{{1.0f, 2.0f, 3.0f, 4.0f}, {-1.0f, -1.0f, -1.0f, -1.0f}, {0, 0xbf800000, 0, 0}},
{{1.0f, 2.0f, 3.0f, 4.0f}, {-2.0f, -2.0f, -2.0f, -2.0f}, {0, 0xc0000000, 0x459c4800, 0}},
{{1.0f, 2.0f, 3.0f, 4.0f}, {-3.0f, -3.0f, -3.0f, -3.0f}, {0, 0xc0400000, 0x453b9000, 0}},
{{1.0f, 2.0f, 3.0f, 4.0f}, {-4.0f, -4.0f, -4.0f, -4.0f}, {0, 0xc0800000, 0x44fa2000, 0}},
{{1.0f, 2.0f, 3.0f, 4.0f}, {-5.0f, -5.0f, -5.0f, -5.0f}, {0, 0xc0a00000, 0x459c5000, 0}},
{{1.0f, 2.0f, 3.0f, 4.0f}, {-6.0f, -6.0f, -6.0f, -6.0f}, {0, 0xc0c00000, 0x453ba000, 0xc1400000}},
{{1.0f, 2.0f, 3.0f, 4.0f}, {-7.0f, -7.0f, -7.0f, -7.0f}, {0, 0xc0e00000, 0x44fa4000, 0x40400000}},
{{1.0f, 2.0f, 3.0f, 4.0f}, {-8.0f, -8.0f, -8.0f, -8.0f}, {0, 0xc1000000, 0, 0x44fa6000}},
{{1.0f, 2.0f, 3.0f, 4.0f}, {-9.0f, -9.0f, -9.0f, -9.0f}, {0, 0xc1100000, 0, 0}},
{{1.0f, 2.0f, 3.0f, 4.0f}, {-10.0f, -10.0f, -10.0f, -10.0f}, {0, 0xc1200000, 0xc1200000, 0}},
{{1.0f, 2.0f, 3.0f, 4.0f}, {-11.0f, -11.0f, -11.0f, -11.0f}, {0, 0xc1300000, 0x3f800000, 0}},
{{1.0f, 2.0f, 3.0f, 4.0f}, {-12.0f, -12.0f, -12.0f, -12.0f}, {0, 0xc1400000, 0x447a4000, 0}},
{{1.0f, 2.0f, 3.0f, 4.0f}, {5.0f, 5.0f, 5.0f, 5.0f}, {0, 0x40a00000, 0x3f800000, 0}},
{{1.0f, 2.0f, 3.0f, 4.0f}, {-1111.0f, 1094.0f, -2222.0f, -3333.0f},
{0x447ac000, 0xc5505000, 0x459c5000, 0x40000000}},
{{1.0f, 2.0f, 3.0f, 4.0f}, {-3333.0f, 1094.0f, -2222.0f, -1111.0f},
{0x447ac000, 0xc48ae000, 0x44fa4000, 0x3f800000}},
{{1.0f, 2.0f, 3.0f, 4.0f}, {-3333.0f, 1094.0f, -2222.0f, -3333.0f},
{0x447ac000, 0xc5505000, 0x459c5000, 0}},
{{1.0f, 2.0f, 3.0f, 4.0f}, {-1111.0f, 1094.0f, -2222.0f, -1111.0f},
{0x447ac000, 0xc48ae000, 0x44fa4000, 0x40400000}},
};
static const struct
{
unsigned int zw[2];
}
expected_light_specular[] =
{
{{0, 0x44fa2000}},
{{0x447a8000, 0x453b9000}},
{{0x40000000, 0x459c4800}},
{{0xbf800000, 0}},
{{0x447a4000, 0}},
{{0x3f800000, 0}},
{{0xbf800000, 0}},
{{0, 0}},
{{0, 0x447a4000}},
{{0x44fa4000, 0x3f800000}},
{{0x453ba000, 0xbf800000}},
{{0x459c5000, 0}},
{{0x44fa2000, 0}},
{{0x453b9000, 0}},
{{0x459c4800, 0}},
{{0, 0}},
};
static const struct
{
int index_value;
unsigned int expected[4];
}
test_index_to_immediate_table[] =
{
{-1000000, {0, 0x40800000, 0x45bbd800, 0x41300000}},
{-1001, {0x448d4000, 0x41300000, 0, 0}},
{-32, {0x448d4000, 0x40800000, 0, 0}},
{-31, {0x45843000, 0x41400000, 0, 0}},
{-30, {0x46a64000, 0x41400000, 0x447a4000, 0x3f800000}},
{-29, {0, 0x447a4000, 0x447a8000, 0x40000000}},
{-28, {0, 0, 0x447ac000, 0x40400000}},
{-27, {0, 0x3f800000, 0, 0}},
{-26, {0, 0x41100000, 0x45bbd800, 0x41300000}},
{-25, {0, 0x41300000, 0, 0}},
{-24, {0, 0x41600000, 0, 0}},
{-23, {0, 0, 0, 0}},
{-22, {0, 0, 0, 0}},
{-21, {0, 0x40a00000, 0, 0}},
{-20, {0, 0x41500000, 0, 0}},
{-19, {0, 0x41500000, 0, 0}},
{-18, {0, 0xc1900000, 0, 0}},
{-17, {0, 0, 0, 0}},
{-16, {0, 0x40800000, 0, 0}},
{-15, {0, 0x41400000, 0, 0}},
{-14, {0, 0x41400000, 0, 0}},
{-13, {0, 0x447a4000, 0x447a4000, 0x3f800000}},
{-12, {0, 0, 0, 0}},
{-11, {0, 0x3f800000, 0, 0}},
{-10, {0, 0x41100000, 0, 0}},
{-9, {0, 0x41300000, 0, 0}},
{-8, {0, 0x41600000, 0, 0}},
{-7, {0, 0, 0, 0}},
{-6, {0, 0, 0, 0}},
{-5, {0, 0x40a00000, 0, 0}},
{-4, {0, 0x41500000, 0, 0}},
{-3, {0, 0x41500000, 0, 0}},
{-2, {0, 0xc0000000, 0, 0}},
{-1, {0, 0, 0, 0}},
{0, {0x45052000, 0x40800000, 0x447a4000, 0x3f800000}},
{1, {0x467e6000, 0x41400000, 0x447a8000, 0x40000000}},
{2, {0, 0x41400000, 0x447ac000, 0x40400000}},
{3, {0, 0x447a4000, 0, 0}},
{4, {0, 0, 0x45bbd800, 0x41300000}},
{5, {0, 0x3f800000, 0, 0}},
{6, {0, 0x41100000, 0, 0}},
{7, {0, 0x41300000, 0, 0}},
{8, {0, 0x41600000, 0, 0}},
{9, {0, 0, 0, 0}},
{10, {0, 0, 0, 0}},
{11, {0, 0x40a00000, 0, 0}},
{12, {0, 0x41500000, 0, 0}},
{13, {0, 0x41500000, 0, 0}},
{14, {0, 0x41600000, 0, 0}},
{15, {0, 0, 0, 0}},
{16, {0, 0x40800000, 0, 0}},
{17, {0x45052000, 0x41400000, 0x447a4000, 0x3f800000}},
{18, {0x467e6000, 0x41400000, 0x447a8000, 0x40000000}},
{19, {0, 0x447a4000, 0x447ac000, 0x40400000}},
{20, {0, 0, 0, 0}},
{21, {0, 0x3f800000, 0x45bbd800, 0x41300000}},
{22, {0, 0x41100000, 0, 0}},
{23, {0, 0x41300000, 0, 0}},
{24, {0, 0x41600000, 0, 0}},
{25, {0, 0, 0, 0}},
{26, {0, 0, 0, 0}},
{27, {0, 0x40a00000, 0, 0}},
{28, {0, 0x41500000, 0, 0}},
{29, {0, 0x41500000, 0, 0}},
{30, {0, 0x41f00000, 0, 0}},
{31, {0, 0, 0, 0}},
{1001, {0, 0, 0, 0}},
{1000000, {0, 0x40800000, 0, 0}},
};
static const D3DLIGHT9 light_filler = {D3DLIGHT_POINT, {1.0f, 1.0f, 1.0f, 1.0f}, {1.0f, 1.0f, 1.0f, 1.0f},
{1.0f, 1.0f, 1.0f, 1.0f}};
unsigned int j, passes_count;
const unsigned int *expected;
const float *expected_float;
ID3DXEffect *effect;
D3DXVECTOR4 fvect;
D3DLIGHT9 light;
const float *v;
HRESULT hr;
int i;
hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob),
NULL, NULL, 0, NULL, &effect, NULL);
ok(hr == D3D_OK, "Got result %#x.\n", hr);
hr = effect->lpVtbl->Begin(effect, &passes_count, 0);
ok(hr == D3D_OK, "Got result %#x.\n", hr);
hr = effect->lpVtbl->BeginPass(effect, 0);
ok(hr == D3D_OK, "Got result %#x.\n", hr);
fvect.x = 1001.0f; fvect.y = 1002.0f; fvect.z = 1003.0f; fvect.w = 1004.0f;
hr = effect->lpVtbl->SetVector(effect, "opvect1", &fvect);
ok(hr == D3D_OK, "Got result %#x.\n", hr);
fvect.x = 2001.0f; fvect.y = 2002.0f; fvect.z = 2003.0f; fvect.w = 2004.0f;
hr = effect->lpVtbl->SetVector(effect, "g_Selector[0]", &fvect);
ok(hr == D3D_OK, "Got result %#x.\n", hr);
fvect.x = 3001.0f; fvect.y = 3002.0f; fvect.z = 3003.0f; fvect.w = 3004.0f;
hr = effect->lpVtbl->SetVector(effect, "g_Selector[1]", &fvect);
ok(hr == D3D_OK, "Got result %#x.\n", hr);
v = &light.Specular.r;
for (i = 0; i < ARRAY_SIZE(test_out_of_bounds_index); ++i)
{
hr = effect->lpVtbl->SetVector(effect, "opvect2", &test_out_of_bounds_index[i].opvect2);
ok(hr == D3D_OK, "Got result %#x.\n", hr);
hr = effect->lpVtbl->SetVector(effect, "g_iVect", &test_out_of_bounds_index[i].g_ivect);
ok(hr == D3D_OK, "Got result %#x.\n", hr);
hr = IDirect3DDevice9_SetLight(device, 1, &light_filler);
ok(hr == D3D_OK, "Got result %#x.\n", hr);
hr = effect->lpVtbl->CommitChanges(effect);
ok(hr == D3D_OK, "Got result %#x.\n", hr);
hr = IDirect3DDevice9_GetLight(device, 1, &light);
ok(hr == D3D_OK, "Got result %#x.\n", hr);
expected = test_out_of_bounds_index[i].expected;
expected_float = (const float *)expected;
for (j = 0; j < 4; ++j)
{
ok(compare_float(v[j], expected_float[j], 0),
"Test %d, component %u, expected %#x (%g), got %#x (%g).\n",
i, j, expected[j], expected_float[j], ((const unsigned int *)v)[j], v[j]);
}
}
hr = effect->lpVtbl->SetVector(effect, "opvect2", &test_out_of_bounds_index[7].opvect2);
ok(hr == D3D_OK, "Got result %#x.\n", hr);
hr = effect->lpVtbl->SetVector(effect, "g_iVect", &test_out_of_bounds_index[7].g_ivect);
ok(hr == D3D_OK, "Got result %#x.\n", hr);
hr = IDirect3DDevice9_SetLight(device, 1, &light_filler);
ok(hr == D3D_OK, "Got result %#x.\n", hr);
fvect = test_out_of_bounds_index[7].g_ivect;
v = &light.Specular.b;
for (i = -100; i < 100; ++i)
{
fvect.w = i;
hr = effect->lpVtbl->SetVector(effect, "g_iVect", &fvect);
ok(hr == D3D_OK, "Got result %#x.\n", hr);
hr = effect->lpVtbl->CommitChanges(effect);
ok(hr == D3D_OK, "Got result %#x.\n", hr);
hr = IDirect3DDevice9_GetLight(device, 1, &light);
ok(hr == D3D_OK, "Got result %#x.\n", hr);
expected = expected_light_specular[(unsigned int)i % ARRAY_SIZE(expected_light_specular)].zw;
expected_float = (const float *)expected;
for (j = 0; j < 2; ++j)
{
ok(compare_float(v[j], expected_float[j], 0),
"i %d, component %u, expected %#x (%g), got %#x (%g).\n",
i, j + 2, expected[j], expected_float[j], ((const unsigned int *)v)[j], v[j]);
}
}
v = &light.Specular.r;
for (i = 0; i < ARRAY_SIZE(test_index_to_immediate_table); ++i)
{
fvect.x = fvect.y = fvect.z = fvect.w = test_index_to_immediate_table[i].index_value;
hr = effect->lpVtbl->SetVector(effect, "g_iVect", &fvect);
ok(hr == D3D_OK, "Got result %#x.\n", hr);
hr = effect->lpVtbl->CommitChanges(effect);
ok(hr == D3D_OK, "Got result %#x.\n", hr);
hr = IDirect3DDevice9_GetLight(device, 2, &light);
ok(hr == D3D_OK, "Got result %#x.\n", hr);
expected = test_index_to_immediate_table[i].expected;
expected_float = (const float *)expected;
for (j = 0; j < 4; ++j)
{
ok(compare_float(v[j], expected_float[j], 0),
"Test %d, component %u, expected %#x (%g), got %#x (%g).\n",
i, j, expected[j], expected_float[j], ((const unsigned int *)v)[j], v[j]);
}
}
hr = effect->lpVtbl->EndPass(effect);
ok(hr == D3D_OK, "Got result %#x.\n", hr);
hr = effect->lpVtbl->End(effect);
ok(hr == D3D_OK, "Got result %#x.\n", hr);
effect->lpVtbl->Release(effect);
}
START_TEST(effect)
{
HWND wnd;
@ -5086,6 +5354,7 @@ START_TEST(effect)
test_effect_isparameterused(device);
test_effect_out_of_bounds_selector(device);
test_effect_commitchanges(device);
test_effect_preshader_relative_addressing(device);
count = IDirect3DDevice9_Release(device);
ok(count == 0, "The device was not properly freed: refcount %u\n", count);