On 2016-07-19 19:08, Aaryaman Vasishta wrote:
- memset(&mat, 0, sizeof(mat));
- mat.dwSize = sizeof(mat);
- mat.diffuse.r = RGBA_GETRED(color) / 255.0f;
- mat.diffuse.g = RGBA_GETGREEN(color) / 255.0f;
- mat.diffuse.b = RGBA_GETBLUE(color) / 255.0f;
- mat.diffuse.a = RGBA_GETALPHA(color) / 255.0f;
Doing this here seems questionable. What happens if the camera's background is changed after the viewport is created? You'll probably want to update the material property in viewport::clear(), or maybe in camera::SetSceneBackground.
- if (material)
IDirect3DMaterial_Release(material);
This will destroy the material, viewport::SetBackground doesn't addref it.
- hr = IDirect3DRMViewport_Init(viewport, device1, frame, rc.left, rc.top, rc.right + 1, rc.bottom + 1);
- ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr);
- hr = IDirect3DRMViewport_Init(viewport, device1, frame, rc.left, rc.top, rc.right + 1, rc.bottom);
- ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr);
- hr = IDirect3DRMViewport_Init(viewport, device1, frame, rc.left, rc.top, rc.right + 1, rc.bottom + 1);
- ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr);
The first and third test are identical.
- IDirect3DRMDevice3_Release(device3);
- IDirect3DRMDevice_Release(device1);
- ref4 = get_refcount((IUnknown *)d3drm1);
- todo_wine ok(ref4 > initial_ref1, "Expected ref4 > initial_ref1, got initial_ref1 = %u, ref4 = %u.\n", initial_ref1, ref4);
The ref4 > inital_ref1 check isn't all too surprising because frame3 still holds a reference to its d3drm parent. Though it seems the leaked reference added by the second Viewport::Init call gets released somewhere. The test doesn't exactly show where. It is possible that releasing the device frees it, or releasing the frame does it.