On Thu, Nov 7, 2019 at 10:18 PM Paul Gofman gofmanp@gmail.com wrote:
- /* Child parameters and array members are recorded separately (the whole parameter is not
* updated when parameter block is applied).
* Setting the same float value does not affect dirty state, but parameter is still
* recorded to parameter block.
* Setting shared parameter through effect2 is not recorded to effect parameter block. */
- hr = effect->lpVtbl->SetFloat(effect, "arr2[0]", 92.0f);
- ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
- hr = effect->lpVtbl->SetFloat(effect, "ts1[0].fv", 28.0f);
- ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
- float_array[0] = -29.0f;
- hr = effect->lpVtbl->SetFloatArray(effect, "ts1[0].v2", float_array, 1);
- ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
That reminds me of something maybe worth testing: I couldn't manage to have SetArrayRange() ever do anything. Maybe it actually does something with parameter blocks? Not holding my breath for that...
- /* Object reference is not increased when object gets to parameter block
* but is also not lost when object is reset in effect parameter.
* Maybe native d3dx is using some copy on write strategy. */
- IDirect3DTexture9_AddRef(texture);
- refcount = IDirect3DTexture9_Release(texture);
- ok(refcount == 2, "Got unexpected refcount %u.\n", refcount);
Or stuff might just break if the texture is released while still in a parameter block. It should be possible to test it.
- hr = effect->lpVtbl->SetFloat(effect, "arr2[0]", 0.0f);
- ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
- hr = effect->lpVtbl->SetFloat(effect, "arr2[1]", 0.0f);
- ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
- hr = effect->lpVtbl->SetFloatArray(effect, "ts1[0].v1", float_array_zero, 3);
- ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
- hr = effect->lpVtbl->SetFloat(effect, "ts1[0].fv", 0.0f);
- ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
- hr = effect->lpVtbl->SetFloatArray(effect, "ts1[0].v2", float_array_zero, 4);
- ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
- memset(&mat, 0, sizeof(mat));
- hr = effect->lpVtbl->SetMatrix(effect, "m3x2row", &mat);
- ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
- hr = effect->lpVtbl->SetMatrix(effect, "m3x2column", &mat);
- ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
The double blank line here seems unnecessary (but I don't mind).
- hr = effect->lpVtbl->ApplyParameterBlock(effect, block);
- todo_wine ok(hr == D3D_OK, "Got result %#x.\n", hr);
- IDirect3DTexture9_AddRef(texture);
- refcount = IDirect3DTexture9_Release(texture);
- todo_wine ok(refcount == 3, "Got unexpected refcount %u.\n", refcount);
- hr = effect->lpVtbl->GetFloat(effect, "arr2[0]", &float_value);
- todo_wine ok(hr == D3D_OK && float_value == 92.0f, "Got unexpected hr %#x, float_value %g.\n", hr, float_value);
- hr = effect->lpVtbl->GetFloat(effect, "arr2[1]", &float_value);
- ok(hr == D3D_OK && float_value == 0.0f, "Got unexpected hr %#x, float_value %g.\n", hr, float_value);
- hr = effect->lpVtbl->GetFloatArray(effect, "ts1[0].v1", float_array, 3);
- ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
- ok(hr == D3D_OK && !memcmp(float_array, float_array_zero, 3 * sizeof(*float_array)),
"Got unexpected hr %#x, ts1[0].v1 (%g, %g, %g).\n", hr,
float_array[0], float_array[1], float_array[2]);
Here you're checking hr twice.
- hr = effect->lpVtbl->GetFloat(effect, "ts1[0].fv", &float_value);
- hr = effect->lpVtbl->GetMatrix(effect, "m3x2row", &mat);
- ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
I guess one was supposed to go after GetFloat(). There are more of those below.
- todo_wine ok(!memcmp(&mat, &test_mat, sizeof(mat)), "Got unexpected matrix.\n");
- hr = effect->lpVtbl->GetMatrix(effect, "m3x2column", &mat);
- ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
- todo_wine ok(!memcmp(&mat, &test_mat, sizeof(mat)), "Got unexpected matrix.\n");
- todo_wine ok(hr == D3D_OK && float_value == 28.0f, "Got unexpected hr %#x, float_value %g.\n", hr, float_value);
- hr = effect->lpVtbl->GetFloatArray(effect, "ts1[0].v2", float_array, 4);
- ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
- todo_wine ok(hr == D3D_OK && float_array[0] == -29.0f
&& !memcmp(float_array + 1, float_array_zero, 3 * sizeof(*float_array)),
"Got unexpected hr %#x, ts1[0].v2 (%g, %g, %g, %g).\n", hr,
float_array[0], float_array[1], float_array[2], float_array[3]);
- hr = effect->lpVtbl->DeleteParameterBlock(effect, block);
- todo_wine ok(hr == D3D_OK, "Got result %#x.\n", hr);
- IDirect3DTexture9_AddRef(texture);
- hr = effect->lpVtbl->SetTexture(effect, "tex1", NULL);
- ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
- refcount = IDirect3DTexture9_Release(texture);
- ok(refcount == 1, "Got unexpected refcount %u.\n", refcount);
- if (refcount)
IDirect3DTexture9_Release(texture);
Here either a todo_wine is missing or the if is unnecessary.