[PATCH 1/3] d3dx9/tests: Add tests for cross effect handles usage.
Paul Gofman
gofmanp at gmail.com
Tue Apr 11 08:22:33 CDT 2017
Signed-off-by: Paul Gofman <gofmanp at gmail.com>
---
dlls/d3dx9_36/tests/effect.c | 75 ++++++++++++++++++++++++++++++++++++++++----
1 file changed, 69 insertions(+), 6 deletions(-)
diff --git a/dlls/d3dx9_36/tests/effect.c b/dlls/d3dx9_36/tests/effect.c
index de5ae69..62da636 100644
--- a/dlls/d3dx9_36/tests/effect.c
+++ b/dlls/d3dx9_36/tests/effect.c
@@ -4515,18 +4515,26 @@ static void test_isparameterused_children(ID3DXEffect *effect, D3DXHANDLE tech,
}
}
-static void test_isparameterused_param_with_children(ID3DXEffect *effect, D3DXHANDLE tech, const char *name,
- BOOL expected_result)
+static void test_isparameterused_param_with_children(ID3DXEffect *effect, ID3DXEffect *effect2, D3DXHANDLE tech,
+ const char *name, BOOL expected_result)
{
D3DXHANDLE param;
- param = effect->lpVtbl->GetParameterByName(effect, NULL, name);
+ ok(!effect->lpVtbl->IsParameterUsed(effect, (D3DXHANDLE)name, tech) == !expected_result,
+ "Unexpected IsParameterUsed() result for %s.\n", name);
+
+ if (effect2)
+ param = effect2->lpVtbl->GetParameterByName(effect2, NULL, name);
+ else
+ param = effect->lpVtbl->GetParameterByName(effect, NULL, name);
ok(!!param, "GetParameterByName failed for %s.\n", name);
+ todo_wine_if(!!effect2 && expected_result)
ok(!effect->lpVtbl->IsParameterUsed(effect, param, tech) == !expected_result,
"Unexpected IsParameterUsed() result for %s.\n", name);
- test_isparameterused_children(effect, tech, param);
+ if (!effect2)
+ test_isparameterused_children(effect, tech, param);
}
static void test_effect_isparameterused(IDirect3DDevice9 *device)
@@ -4555,11 +4563,13 @@ static void test_effect_isparameterused(IDirect3DDevice9 *device)
{"ts2", TRUE},
{"ts3", TRUE},
};
- ID3DXEffect *effect;
+ ID3DXEffect *effect, *effect2;
HRESULT hr;
D3DXHANDLE tech;
unsigned int i;
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
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);
@@ -4568,9 +4578,26 @@ static void test_effect_isparameterused(IDirect3DDevice9 *device)
ok(!!tech, "GetTechniqueByName failed.\n");
for (i = 0; i < ARRAY_SIZE(check_parameters); ++i)
- test_isparameterused_param_with_children(effect, tech, check_parameters[i].name,
+ test_isparameterused_param_with_children(effect, NULL, tech, check_parameters[i].name,
+ check_parameters[i].expected_result);
+
+ hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob),
+ NULL, NULL, 0, NULL, &effect2, NULL);
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+ for (i = 0; i < ARRAY_SIZE(check_parameters); ++i)
+ test_isparameterused_param_with_children(effect, effect2, tech, check_parameters[i].name,
check_parameters[i].expected_result);
+ effect2->lpVtbl->Release(effect2);
+
+ hr = D3DXCreateEffect(device, test_effect_states_effect_blob, sizeof(test_effect_states_effect_blob),
+ NULL, NULL, 0, NULL, &effect2, NULL);
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+ test_isparameterused_param_with_children(effect, effect2, tech, "sampler1", TRUE);
+ effect2->lpVtbl->Release(effect2);
+
effect->lpVtbl->Release(effect);
}
@@ -5681,6 +5708,41 @@ static void test_effect_state_manager(IDirect3DDevice9 *device)
ok(!refcount, "State manager was not properly freed, refcount %u.\n", refcount);
}
+static void test_cross_effect_handle(IDirect3DDevice9 *device)
+{
+ ID3DXEffect *effect1, *effect2;
+ D3DXHANDLE param1, param2;
+ static int expected_ivect[4] = {28, 29, 30, 31};
+ int ivect[4];
+ HRESULT hr;
+
+ hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob),
+ NULL, NULL, 0, NULL, &effect1, NULL);
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+ hr = D3DXCreateEffect(device, test_effect_preshader_effect_blob, sizeof(test_effect_preshader_effect_blob),
+ NULL, NULL, 0, NULL, &effect2, NULL);
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+ param1 = effect1->lpVtbl->GetParameterByName(effect1, NULL, "g_iVect");
+ ok(!!param1, "GetParameterByName failed.\n");
+
+ param2 = effect2->lpVtbl->GetParameterByName(effect2, NULL, "g_iVect");
+ ok(!!param2, "GetParameterByName failed.\n");
+
+ hr = effect2->lpVtbl->SetValue(effect2, param1, expected_ivect, sizeof(expected_ivect));
+ todo_wine
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+ hr = effect1->lpVtbl->GetValue(effect1, param1, ivect, sizeof(ivect));
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+ todo_wine
+ ok(!memcmp(ivect, expected_ivect, sizeof(expected_ivect)), "Vector value mismatch.\n");
+
+ effect2->lpVtbl->Release(effect2);
+ effect1->lpVtbl->Release(effect1);
+}
+
START_TEST(effect)
{
HWND wnd;
@@ -5728,6 +5790,7 @@ START_TEST(effect)
test_effect_commitchanges(device);
test_effect_preshader_relative_addressing(device);
test_effect_state_manager(device);
+ test_cross_effect_handle(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