[PATCH 2/3] d3drm: Implement IDirect3DRMFrame*::GetScene. (v3)

Aaryaman Vasishta jem456.vasishta at gmail.com
Wed Aug 10 10:41:38 CDT 2016


Hi,

Please ignore this and go for v4 of this patch instead.

Cheers,
Aaryaman

On Wed, Aug 10, 2016 at 9:07 PM, Aaryaman Vasishta <
jem456.vasishta at gmail.com> wrote:

> v3: Directly traverse through parent frames instead of using GetParent.
>
> Signed-off-by: Aaryaman Vasishta <jem456.vasishta at gmail.com>
> ---
>  dlls/d3drm/frame.c       | 46 ++++++++++++++++++++++++++++++
> ++++++++++------
>  dlls/d3drm/tests/d3drm.c | 24 ++++++++++++++++++++++++
>  2 files changed, 64 insertions(+), 6 deletions(-)
>
> diff --git a/dlls/d3drm/frame.c b/dlls/d3drm/frame.c
> index 2ff0241..312007b 100644
> --- a/dlls/d3drm/frame.c
> +++ b/dlls/d3drm/frame.c
> @@ -1339,23 +1339,57 @@ static HRESULT WINAPI d3drm_frame1_GetRotation(IDirect3DRMFrame
> *iface,
>
>  static HRESULT WINAPI d3drm_frame3_GetScene(IDirect3DRMFrame3 *iface,
> IDirect3DRMFrame3 **scene)
>  {
> -    FIXME("iface %p, scene %p stub!\n", iface, scene);
> +    struct d3drm_frame *frame = impl_from_IDirect3DRMFrame3(iface);
>
> -    return E_NOTIMPL;
> +    TRACE("iface %p, scene %p.\n", iface, scene);
> +
> +    if (!scene)
> +        return D3DRMERR_BADVALUE;
> +
> +    *scene = &frame->IDirect3DRMFrame3_iface;
> +
> +    while (frame->parent)
> +    {
> +        frame = frame->parent;
> +        *scene = &frame->IDirect3DRMFrame3_iface;
> +    }
> +
> +    IDirect3DRMFrame3_AddRef(*scene);
> +
> +    return D3DRM_OK;
>  }
>
>  static HRESULT WINAPI d3drm_frame2_GetScene(IDirect3DRMFrame2 *iface,
> IDirect3DRMFrame **scene)
>  {
> -    FIXME("iface %p, scene %p stub!\n", iface, scene);
> +    struct d3drm_frame *frame = impl_from_IDirect3DRMFrame2(iface);
> +    IDirect3DRMFrame3 *frame3;
> +    HRESULT hr;
>
> -    return E_NOTIMPL;
> +    TRACE("iface %p, scene %p.\n", iface, scene);
> +
> +    if (!scene)
> +        return D3DRMERR_BADVALUE;
> +
> +    hr = IDirect3DRMFrame3_GetScene(&frame->IDirect3DRMFrame3_iface,
> &frame3);
> +    if (FAILED(hr) || !frame3)
> +    {
> +        *scene = NULL;
> +        return hr;
> +    }
> +
> +    hr = IDirect3DRMFrame3_QueryInterface(frame3, &IID_IDirect3DRMFrame,
> (void **)scene);
> +    IDirect3DRMFrame3_Release(frame3);
> +
> +    return hr;
>  }
>
>  static HRESULT WINAPI d3drm_frame1_GetScene(IDirect3DRMFrame *iface,
> IDirect3DRMFrame **scene)
>  {
> -    FIXME("iface %p, scene %p stub!\n", iface, scene);
> +    struct d3drm_frame *frame = impl_from_IDirect3DRMFrame(iface);
>
> -    return E_NOTIMPL;
> +    TRACE("iface %p, scene %p.\n", iface, scene);
> +
> +    return d3drm_frame2_GetScene(&frame->IDirect3DRMFrame2_iface, scene);
>  }
>
>  static D3DRMSORTMODE WINAPI d3drm_frame3_GetSortMode(IDirect3DRMFrame3
> *iface)
> diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c
> index 1abaed5..d86477d 100644
> --- a/dlls/d3drm/tests/d3drm.c
> +++ b/dlls/d3drm/tests/d3drm.c
> @@ -885,6 +885,7 @@ static void test_Frame(void)
>      IDirect3DRMFrame *pFrameP1;
>      IDirect3DRMFrame *pFrameP2;
>      IDirect3DRMFrame *pFrameTmp;
> +    IDirect3DRMFrame *scene_frame;
>      IDirect3DRMFrameArray *frame_array;
>      IDirect3DRMMeshBuilder *mesh_builder;
>      IDirect3DRMVisual *visual1;
> @@ -967,6 +968,19 @@ static void test_Frame(void)
>      CHECK_REFCOUNT(pFrameP1, 1);
>      CHECK_REFCOUNT(pFrameC, 2);
>
> +    hr = IDirect3DRMFrame_GetScene(pFrameC, NULL);
> +    ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got
> %#x.\n", hr);
> +    hr = IDirect3DRMFrame_GetScene(pFrameC, &scene_frame);
> +    ok(SUCCEEDED(hr), "Cannot get scene (hr == %#x).\n", hr);
> +    ok(scene_frame == pFrameP1, "Expected scene frame == %p, got %p.\n",
> pFrameP1, scene_frame);
> +    CHECK_REFCOUNT(pFrameP1, 2);
> +    IDirect3DRMFrame_Release(scene_frame);
> +    hr = IDirect3DRMFrame_GetScene(pFrameP1, &scene_frame);
> +    ok(SUCCEEDED(hr), "Cannot get scene (hr == %#x).\n", hr);
> +    ok(scene_frame == pFrameP1, "Expected scene frame == %p, got %p.\n",
> pFrameP1, scene_frame);
> +    CHECK_REFCOUNT(pFrameP1, 2);
> +    IDirect3DRMFrame_Release(scene_frame);
> +
>      frame_array = NULL;
>      hr = IDirect3DRMFrame_GetChildren(pFrameP1, &frame_array);
>      ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
> @@ -1032,6 +1046,16 @@ static void test_Frame(void)
>          ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
>          IDirect3DRMFrameArray_Release(frame_array);
>      }
> +    hr = IDirect3DRMFrame_GetScene(pFrameC, &scene_frame);
> +    ok(SUCCEEDED(hr), "Cannot get scene (hr == %#x).\n", hr);
> +    ok(scene_frame == pFrameP2, "Expected scene frame == %p, got %p.\n",
> pFrameP2, scene_frame);
> +    CHECK_REFCOUNT(pFrameP2, 2);
> +    IDirect3DRMFrame_Release(scene_frame);
> +    hr = IDirect3DRMFrame_GetScene(pFrameP2, &scene_frame);
> +    ok(SUCCEEDED(hr), "Cannot get scene (hr == %#x).\n", hr);
> +    ok(scene_frame == pFrameP2, "Expected scene frame == %p, got %p.\n",
> pFrameP2, scene_frame);
> +    CHECK_REFCOUNT(pFrameP2, 2);
> +    IDirect3DRMFrame_Release(scene_frame);
>
>      pFrameTmp = (void*)0xdeadbeef;
>      hr = IDirect3DRMFrame_GetParent(pFrameC, &pFrameTmp);
> --
> 2.3.2 (Apple Git-55)
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20160810/71d73cf1/attachment.html>


More information about the wine-devel mailing list