[v2 3/3] d3dx9/tests: Add more tests for preshader relative addressing.

Paul Gofman gofmanp at gmail.com
Thu Mar 23 10:25:58 CDT 2017


Signed-off-by: Paul Gofman <gofmanp at gmail.com>
---

v2: Fixed a bug and compiler warning in the new test.

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

diff --git a/dlls/d3dx9_36/tests/effect.c b/dlls/d3dx9_36/tests/effect.c
index 622a8d5..23430f6 100644
--- a/dlls/d3dx9_36/tests/effect.c
+++ b/dlls/d3dx9_36/tests/effect.c
@@ -4957,6 +4957,152 @@ 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 result[4];
+    }
+    test_out_of_bounds_index[] =
+    {
+        {{1.0f, 2.0f, 3.0f, 4.0f}, {101.f, 101.f, 101.f, 101.f}, {0x447ac000, 0x42ca0000, 0, 0}},
+        {{1.0f, 2.0f, 3.0f, 4.0f}, {3333.f, 1094.f, 2222.f, 3333.f}, {0, 0x450ae000, 0, 0}},
+        {{1.0f, 2.0f, 3.0f, 4.0f}, {3333.f, 1094.f, 2222.f, 1.f}, {0, 0x450ae000, 0x45bb9800, 0x453b9000}},
+        {{1.0f, 2.0f, 3.0f, 4.0f}, {1.f, 1094.f, 2222.f, 3333.f}, {0, 0x450ae000, 0, 0x453ba000}},
+        {{1.0f, 2.0f, 3.0f, 4.0f}, {1111.f, 1094.f, 2222.f, 1111.f}, {0, 0x450ae000, 0, 0}},
+        {{1.0f, 2.0f, 3.0f, 4.0f}, {1111.f, 1094.f, 2222.f, 3333.f}, {0, 0x450ae000, 0, 0}},
+        {{-1111.f, 1094.f, -2222.f, -3333.f}, {4.f, 3.f, 2.f, 1.f}, {0x447ac000, 0, 0x45bb9800, 0x453bc000}},
+        {{1.0f, 2.0f, 3.0f, 4.0f}, {-1.f, -1.f, -1.f, -1.f}, {0, 0xbf800000, 0, 0}},
+        {{1.0f, 2.0f, 3.0f, 4.0f}, {-2.f, -2.f, -2.f, -2.f}, {0, 0xc0000000, 0, 0}},
+        {{1.0f, 2.0f, 3.0f, 4.0f}, {-3.f, -3.f, -3.f, -3.f}, {0, 0xc0400000, 0, 0}},
+        {{1.0f, 2.0f, 3.0f, 4.0f}, {-4.f, -4.f, -4.f, -4.f}, {0, 0xc0800000, 0xc1000000, 0xc1000000}},
+        {{1.0f, 2.0f, 3.0f, 4.0f}, {-5.f, -5.f, -5.f, -5.f}, {0, 0xc0a00000, 0x40400000, 0x40400000}},
+        {{1.0f, 2.0f, 3.0f, 4.0f}, {-6.f, -6.f, -6.f, -6.f}, {0, 0xc0c00000, 0x44fa6000, 0x44fa6000}},
+        {{1.0f, 2.0f, 3.0f, 4.0f}, {-7.f, -7.f, -7.f, -7.f}, {0x447b0000, 0xc0e00000, 0x45bb9800, 0x45bb9800}},
+        {{1.0f, 2.0f, 3.0f, 4.0f}, {-8.f, -8.f, -8.f, -8.f}, {0x447ac000, 0xc1000000, 0x457a3000, 0x457a3000}},
+        {{1.0f, 2.0f, 3.0f, 4.0f}, {-9.f, -9.f, -9.f, -9.f}, {0x447a8000, 0xc1100000, 0, 0}},
+        {{1.0f, 2.0f, 3.0f, 4.0f}, {-10.f, -10.f, -10.f, -10.f}, {0x447a4000, 0xc1200000, 0, 0}},
+        {{1.0f, 2.0f, 3.0f, 4.0f}, {-11.f, -11.f, -11.f, -11.f}, {0, 0xc1300000, 0, 0}},
+        {{1.0f, 2.0f, 3.0f, 4.0f}, {-12.f, -12.f, -12.f, -12.f}, {0, 0xc1400000, 0xc1c00000, 0xc1c00000}},
+        {{1.0f, 2.0f, 3.0f, 4.0f}, {5.f, 5.f, 5.f, 5.f}, {0, 0x40a00000, 0, 0}},
+        {{1.0f, 2.0f, 3.0f, 4.0f}, {-1111.f, 1094.f, -2222.f, -3333.f}, {0x447ac000, 0xc50ae000, 0x40400000, 0x453bb000}},
+        {{1.0f, 2.0f, 3.0f, 4.0f}, {-3333.f, 1094.f, -2222.f, -1111.f}, {0x447ac000, 0xc50ae000, 0x45bb9800, 0x453bb000}},
+        {{1.0f, 2.0f, 3.0f, 4.0f}, {-3333.f, 1094.f, -2222.f, -3333.f}, {0x447ac000, 0xc50ae000, 0x40400000, 0x40400000}},
+        {{1.0f, 2.0f, 3.0f, 4.0f}, {-1111.f, 1094.f, -2222.f, -1111.f}, {0x447ac000, 0xc50ae000, 0x45bb9800, 0x45bb9800}},
+    };
+    static const struct
+    {
+        unsigned int zw[2];
+    }
+    test_index_range[] =
+    {
+        {{0x457a3000, 0x44fa2000}},
+        {{0x45bb9800, 0x453b9000}},
+        {{0x44fa6000, 0x447a4000}},
+        {{0x40400000, 0x3f800000}},
+        {{0xc0000000, 0xbf800000}},
+        {{0, 0}},
+        {{0, 0}},
+        {{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}};
+
+    ID3DXEffect *effect;
+    HRESULT hr;
+    unsigned int j, passes_count;
+    int i;
+    D3DXVECTOR4 fvect;
+    D3DLIGHT9 light;
+    const float *v;
+
+    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.f; fvect.y = 1002.f; fvect.z = 1003.f; fvect.w = 1004.f;
+    hr = effect->lpVtbl->SetVector(effect, "opvect1", &fvect);
+    ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+    fvect.x = 2001.f; fvect.y = 2002.f; fvect.z = 2003.f; fvect.w = 2004.f;
+    hr = effect->lpVtbl->SetVector(effect, "g_Selector[0]", &fvect);
+    ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+    fvect.x = 3001.f; fvect.y = 3002.f; fvect.z = 3003.f; fvect.w = 3004.f;
+    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);
+        for (j = 0; j < 4; ++j)
+        {
+            ok(compare_float(v[j], ((const float *)test_out_of_bounds_index[i].result)[j], 0),
+                    "Test %u, component %u, expected %#x (%g), got %#x (%g).\n",
+                    i, j, test_out_of_bounds_index[i].result[j],
+                    ((const float *)test_out_of_bounds_index[i].result)[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;
+    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);
+
+        for (j = 0; j < 2; ++j)
+        {
+            ok(compare_float(v[j + 2], ((const float *)test_index_range[(unsigned int)i & 7].zw)[j], 0),
+                    "Test %u, component %u, expected %#x (%g), got %#x (%g).\n",
+                    i, j, test_index_range[(unsigned int)i & 7].zw[j],
+                    ((const float *)test_index_range[(unsigned int)i & 7].zw)[j],
+                    ((const unsigned int *)v)[j + 2], v[j + 2]);
+        }
+    }
+
+    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;
@@ -5002,6 +5148,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);
-- 
2.9.3




More information about the wine-patches mailing list