Nikolay Sivov : d3drm: Store frame traversal options.

Alexandre Julliard julliard at winehq.org
Tue Jul 4 15:25:57 CDT 2017


Module: wine
Branch: master
Commit: 3276e7eebe83c55846a6769c48c01be2b6d97e33
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3276e7eebe83c55846a6769c48c01be2b6d97e33

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Tue Jul  4 10:43:11 2017 +0300

d3drm: Store frame traversal options.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/d3drm/d3drm_private.h |  1 +
 dlls/d3drm/frame.c         | 28 ++++++++++++++++++++++------
 dlls/d3drm/tests/d3drm.c   | 39 ++++++++++++++++++++++++++++++++++++++-
 3 files changed, 61 insertions(+), 7 deletions(-)

diff --git a/dlls/d3drm/d3drm_private.h b/dlls/d3drm/d3drm_private.h
index e4ffd2b..e3ee75a 100644
--- a/dlls/d3drm/d3drm_private.h
+++ b/dlls/d3drm/d3drm_private.h
@@ -76,6 +76,7 @@ struct d3drm_frame
     IDirect3DRMLight **lights;
     D3DRMMATRIX4D transform;
     D3DCOLOR scenebackground;
+    DWORD traversal_options;
 };
 
 struct d3drm_viewport
diff --git a/dlls/d3drm/frame.c b/dlls/d3drm/frame.c
index a2643fb..f6b0a1f 100644
--- a/dlls/d3drm/frame.c
+++ b/dlls/d3drm/frame.c
@@ -2666,18 +2666,33 @@ static HRESULT WINAPI d3drm_frame3_InverseTransformVectors(IDirect3DRMFrame3 *if
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI d3drm_frame3_SetTraversalOptions(IDirect3DRMFrame3 *iface, DWORD flags)
+static HRESULT WINAPI d3drm_frame3_SetTraversalOptions(IDirect3DRMFrame3 *iface, DWORD options)
 {
-    FIXME("iface %p, flags %#x stub!\n", iface, flags);
+    static const DWORD supported_options = D3DRMFRAME_RENDERENABLE | D3DRMFRAME_PICKENABLE;
+    struct d3drm_frame *frame = impl_from_IDirect3DRMFrame3(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, options %#x.\n", iface, options);
+
+    if (options & ~supported_options)
+        return D3DRMERR_BADVALUE;
+
+    frame->traversal_options = options;
+
+    return D3DRM_OK;
 }
 
-static HRESULT WINAPI d3drm_frame3_GetTraversalOptions(IDirect3DRMFrame3 *iface, DWORD *flags)
+static HRESULT WINAPI d3drm_frame3_GetTraversalOptions(IDirect3DRMFrame3 *iface, DWORD *options)
 {
-    FIXME("iface %p, flags %p stub!\n", iface, flags);
+    struct d3drm_frame *frame = impl_from_IDirect3DRMFrame3(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, options %p.\n", iface, options);
+
+    if (!options)
+        return D3DRMERR_BADVALUE;
+
+    *options = frame->traversal_options;
+
+    return D3DRM_OK;
 }
 
 static HRESULT WINAPI d3drm_frame3_SetSceneFogMethod(IDirect3DRMFrame3 *iface, DWORD flags)
@@ -2991,6 +3006,7 @@ HRESULT d3drm_frame_create(struct d3drm_frame **frame, IUnknown *parent_frame, I
     object->d3drm = d3drm;
     object->ref = 1;
     d3drm_set_color(&object->scenebackground, 0.0f, 0.0f, 0.0f, 1.0f);
+    object->traversal_options = D3DRMFRAME_RENDERENABLE | D3DRMFRAME_PICKENABLE;
 
     d3drm_object_init(&object->obj, classname);
 
diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c
index 3613b57..5cccb43 100644
--- a/dlls/d3drm/tests/d3drm.c
+++ b/dlls/d3drm/tests/d3drm.c
@@ -987,9 +987,10 @@ static void test_Frame(void)
     IDirect3DRMLight *light1;
     IDirect3DRMLight *light_tmp;
     IDirect3DRMLightArray *light_array;
+    IDirect3DRMFrame3 *frame3;
+    DWORD count, options;
     ULONG ref, ref2;
     D3DCOLOR color;
-    DWORD count;
 
     hr = Direct3DRMCreate(&d3drm);
     ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
@@ -1315,6 +1316,42 @@ static void test_Frame(void)
     color = IDirect3DRMFrame_GetSceneBackground(pFrameP1);
     ok(color == 0xff7f7f7f, "wrong color (%x)\n", color);
 
+    /* Traversal options. */
+    hr = IDirect3DRMFrame_QueryInterface(pFrameP2, &IID_IDirect3DRMFrame3, (void **)&frame3);
+    ok(SUCCEEDED(hr), "Failed to get IDirect3DRMFrame3 interface, hr %#x.\n", hr);
+
+    hr = IDirect3DRMFrame3_GetTraversalOptions(frame3, NULL);
+    ok(hr == D3DRMERR_BADVALUE, "Unexpected hr %#x.\n", hr);
+
+    options = 0;
+    hr = IDirect3DRMFrame3_GetTraversalOptions(frame3, &options);
+    ok(SUCCEEDED(hr), "Failed to get traversal options, hr %#x.\n", hr);
+    ok(options == (D3DRMFRAME_RENDERENABLE | D3DRMFRAME_PICKENABLE), "Unexpected default options %#x.\n", options);
+
+    hr = IDirect3DRMFrame3_SetTraversalOptions(frame3, 0);
+    ok(SUCCEEDED(hr), "Unexpected hr %#x.\n", hr);
+
+    hr = IDirect3DRMFrame3_SetTraversalOptions(frame3, 0xf0000000);
+    ok(hr == D3DRMERR_BADVALUE, "Unexpected hr %#x.\n", hr);
+
+    hr = IDirect3DRMFrame3_SetTraversalOptions(frame3, 0xf0000000 | D3DRMFRAME_PICKENABLE);
+    ok(hr == D3DRMERR_BADVALUE, "Unexpected hr %#x.\n", hr);
+
+    options = 0xf;
+    hr = IDirect3DRMFrame3_GetTraversalOptions(frame3, &options);
+    ok(SUCCEEDED(hr), "Failed to get traversal options, hr %#x.\n", hr);
+    ok(options == 0, "Unexpected traversal options %#x.\n", options);
+
+    hr = IDirect3DRMFrame3_SetTraversalOptions(frame3, D3DRMFRAME_PICKENABLE);
+    ok(SUCCEEDED(hr), "Failed to set traversal options, hr %#x.\n", hr);
+
+    options = 0;
+    hr = IDirect3DRMFrame3_GetTraversalOptions(frame3, &options);
+    ok(SUCCEEDED(hr), "Failed to get traversal options, hr %#x.\n", hr);
+    ok(options == D3DRMFRAME_PICKENABLE, "Unexpected traversal options %#x.\n", options);
+
+    IDirect3DRMFrame3_Release(frame3);
+
     /* Cleanup */
     IDirect3DRMFrame_Release(pFrameP2);
     CHECK_REFCOUNT(pFrameC, 1);




More information about the wine-cvs mailing list