[PATCH] d3dx9/tests: Add test for out of bound array selector in effect.

Paul Gofman gofmanp at gmail.com
Tue Mar 7 11:47:10 CST 2017


Signed-off-by: Paul Gofman <gofmanp at gmail.com>
---
 dlls/d3dx9_36/tests/effect.c | 159 ++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 141 insertions(+), 18 deletions(-)

diff --git a/dlls/d3dx9_36/tests/effect.c b/dlls/d3dx9_36/tests/effect.c
index b3845c5..fe84173 100644
--- a/dlls/d3dx9_36/tests/effect.c
+++ b/dlls/d3dx9_36/tests/effect.c
@@ -3813,6 +3813,33 @@ static const DWORD test_effect_preshader_effect_blob[] =
 #define TEST_EFFECT_PRESHADER_VSHADER_POS 2458
 #define TEST_EFFECT_PRESHADER_VSHADER_LEN 13
 
+static BOOL test_effect_preshader_compare_shader(IDirect3DDevice9 *device, int expected_shader_index)
+{
+    IDirect3DVertexShader9 *vshader;
+    void *byte_code;
+    unsigned int byte_code_size;
+    HRESULT hr;
+    BOOL ret;
+
+    if (FAILED(hr = IDirect3DDevice9_GetVertexShader(device, &vshader)) || !vshader)
+        return FALSE;
+    if (FAILED(hr = IDirect3DVertexShader9_GetFunction(vshader, NULL, &byte_code_size))
+            || !byte_code_size)
+    {
+        IDirect3DVertexShader9_Release(vshader);
+        return FALSE;
+    }
+    byte_code = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, byte_code_size);
+    if (FAILED(hr = IDirect3DVertexShader9_GetFunction(vshader, byte_code, &byte_code_size)))
+        ret = FALSE;
+    else
+        ret = !memcmp(byte_code, &test_effect_preshader_effect_blob[TEST_EFFECT_PRESHADER_VSHADER_POS
+                + expected_shader_index * TEST_EFFECT_PRESHADER_VSHADER_LEN], byte_code_size);
+    HeapFree(GetProcessHeap(), 0, byte_code);
+    IDirect3DVertexShader9_Release(vshader);
+    return ret;
+ }
+
 static void test_effect_preshader(IDirect3DDevice9 *device)
 {
     static const D3DXVECTOR4 test_effect_preshader_fconstsv[] =
@@ -3933,8 +3960,6 @@ static void test_effect_preshader(IDirect3DDevice9 *device)
     int idata[TEST_EFFECT_PRES_NINT][4];
     BOOL bdata[TEST_EFFECT_PRES_NBOOL];
     IDirect3DVertexShader9 *vshader;
-    void *byte_code;
-    unsigned int byte_code_size;
     unsigned int i, j;
     D3DCAPS9 caps;
 
@@ -4071,22 +4096,7 @@ static void test_effect_preshader(IDirect3DDevice9 *device)
     hr = effect->lpVtbl->BeginPass(effect, 1);
     ok(hr == D3D_OK, "Got result %#x.\n", hr);
 
-    hr = IDirect3DDevice9_GetVertexShader(device, &vshader);
-    ok(hr == D3D_OK, "Got result %#x.\n", hr);
-    ok(!!vshader, "Got NULL vshader.\n");
-
-    hr = IDirect3DVertexShader9_GetFunction(vshader, NULL, &byte_code_size);
-    ok(hr == D3D_OK, "Got result %#x.\n", hr);
-    byte_code = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, byte_code_size);
-    hr = IDirect3DVertexShader9_GetFunction(vshader, byte_code, &byte_code_size);
-    ok(hr == D3D_OK, "Got result %#x.\n", hr);
-    ok(byte_code_size > 1, "Got unexpected byte code size %u.\n", byte_code_size);
-    ok(!memcmp(byte_code,
-            &test_effect_preshader_effect_blob[TEST_EFFECT_PRESHADER_VSHADER_POS +
-            TEST_EFFECT_PRESHADER_VSHADER_LEN], byte_code_size),
-            "Incorrect shader selected.\n");
-    HeapFree(GetProcessHeap(), 0, byte_code);
-    IDirect3DVertexShader9_Release(vshader);
+    ok(test_effect_preshader_compare_shader(device, 1), "Incorrect shader selected.\n");
 
     hr = IDirect3DDevice9_SetVertexShader(device, NULL);
     ok(hr == D3D_OK, "Got result %#x.\n", hr);
@@ -4284,6 +4294,118 @@ static void test_effect_isparameterused(IDirect3DDevice9 *device)
     effect->lpVtbl->Release(effect);
 }
 
+static void test_effect_out_of_bound_selector(IDirect3DDevice9 *device)
+{
+    ID3DXEffect *effect;
+    HRESULT hr;
+    D3DXHANDLE param;
+    int ivect[4];
+    unsigned int passes_count;
+    IDirect3DVertexShader9 *vshader;
+
+    hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob),
+            NULL, NULL, 0, NULL, &effect, NULL);
+
+    hr = effect->lpVtbl->Begin(effect, &passes_count, 0);
+    ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+    ivect[0] = ivect[1] = ivect[3] = 1;
+
+    param = effect->lpVtbl->GetParameterByName(effect, NULL, "g_iVect");
+    ok(!!param, "GetParameterByName failed.\n");
+    ivect[2] = 3;
+    hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect));
+    ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+    hr = IDirect3DDevice9_SetVertexShader(device, NULL);
+    ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+    hr = effect->lpVtbl->BeginPass(effect, 1);
+    todo_wine ok(hr == E_FAIL, "Got result %#x.\n", hr);
+    if (SUCCEEDED(hr))
+        effect->lpVtbl->EndPass(effect);
+
+    hr = effect->lpVtbl->BeginPass(effect, 1);
+    ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+    todo_wine ok(test_effect_preshader_compare_shader(device, 2), "Incorrect shader selected.\n");
+
+    hr = effect->lpVtbl->EndPass(effect);
+    ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+    hr = IDirect3DDevice9_SetVertexShader(device, NULL);
+    ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+    ivect[2] = -2;
+    hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect));
+    ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+    hr = effect->lpVtbl->BeginPass(effect, 1);
+    todo_wine ok(hr == E_FAIL, "Got result %#x.\n", hr);
+    if (SUCCEEDED(hr))
+        hr = effect->lpVtbl->EndPass(effect);
+
+    hr = IDirect3DDevice9_GetVertexShader(device, &vshader);
+    ok(hr == D3D_OK, "Got result %#x.\n", hr);
+    ok(!vshader, "Got non NULL vshader.\n");
+
+    hr = effect->lpVtbl->BeginPass(effect, 1);
+    ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+    todo_wine ok(test_effect_preshader_compare_shader(device, 2), "Incorrect shader selected.\n");
+
+    hr = effect->lpVtbl->EndPass(effect);
+    ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+    ivect[2] = -1;
+    hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect));
+    ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+    hr = effect->lpVtbl->BeginPass(effect, 1);
+    ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+    todo_wine ok(test_effect_preshader_compare_shader(device, 0), "Incorrect shader selected.\n");
+
+    hr = IDirect3DDevice9_SetVertexShader(device, NULL);
+    ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+    ivect[2] = 3;
+    hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect));
+    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_GetVertexShader(device, &vshader);
+    ok(hr == D3D_OK, "Got result %#x.\n", hr);
+    ok(!vshader, "Got non NULL vshader.\n");
+
+    ivect[2] = -1;
+    hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect));
+    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_GetVertexShader(device, &vshader);
+    ok(hr == D3D_OK, "Got result %#x.\n", hr);
+    ok(!vshader, "Got non NULL vshader.\n");
+
+    ivect[2] = 1;
+    hr = effect->lpVtbl->SetValue(effect, param, ivect, sizeof(ivect));
+    ok(hr == D3D_OK, "Got result %#x.\n", hr);
+    hr = effect->lpVtbl->CommitChanges(effect);
+    ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+    ok(test_effect_preshader_compare_shader(device, 1), "Incorrect shader selected.\n");
+
+    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;
@@ -4327,6 +4449,7 @@ START_TEST(effect)
     test_effect_preshader(device);
     test_effect_preshader_ops(device);
     test_effect_isparameterused(device);
+    test_effect_out_of_bound_selector(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