Henri Verbeet : d3d10: Implement D3D10StateBlockMaskDifference().

Alexandre Julliard julliard at winehq.org
Tue Nov 15 13:17:31 CST 2011


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Mon Nov 14 21:11:41 2011 +0100

d3d10: Implement D3D10StateBlockMaskDifference().

---

 dlls/d3d10/d3d10.spec     |    2 +-
 dlls/d3d10/stateblock.c   |   23 +++++++++++++++++++++++
 dlls/d3d10/tests/device.c |   27 +++++++++++++++++++++++++++
 include/d3d10effect.h     |    3 +++
 4 files changed, 54 insertions(+), 1 deletions(-)

diff --git a/dlls/d3d10/d3d10.spec b/dlls/d3d10/d3d10.spec
index 16d2d5f..baa0c10 100644
--- a/dlls/d3d10/d3d10.spec
+++ b/dlls/d3d10/d3d10.spec
@@ -19,7 +19,7 @@
 @ stub D3D10PreprocessShader
 @ stdcall D3D10ReflectShader(ptr long ptr)
 @ stub D3D10RegisterLayers
-@ stub D3D10StateBlockMaskDifference
+@ stdcall D3D10StateBlockMaskDifference(ptr ptr ptr)
 @ stub D3D10StateBlockMaskDisableAll
 @ stub D3D10StateBlockMaskDisableCapture
 @ stub D3D10StateBlockMaskEnableAll
diff --git a/dlls/d3d10/stateblock.c b/dlls/d3d10/stateblock.c
index a254704..f121a5c 100644
--- a/dlls/d3d10/stateblock.c
+++ b/dlls/d3d10/stateblock.c
@@ -143,3 +143,26 @@ HRESULT WINAPI D3D10CreateStateBlock(ID3D10Device *device,
 
     return S_OK;
 }
+
+HRESULT WINAPI D3D10StateBlockMaskDifference(D3D10_STATE_BLOCK_MASK *mask_x,
+        D3D10_STATE_BLOCK_MASK *mask_y, D3D10_STATE_BLOCK_MASK *result)
+{
+    UINT count = sizeof(*result) / sizeof(DWORD);
+    UINT i;
+
+    TRACE("mask_x %p, mask_y %p, result %p.\n", mask_x, mask_y, result);
+
+    if (!mask_x || !mask_y || !result)
+        return E_INVALIDARG;
+
+    for (i = 0; i < count; ++i)
+    {
+        ((DWORD *)result)[i] = ((DWORD *)mask_x)[i] ^ ((DWORD *)mask_y)[i];
+    }
+    for (i = count * sizeof(DWORD); i < sizeof(*result); ++i)
+    {
+        ((BYTE *)result)[i] = ((BYTE *)mask_x)[i] ^ ((BYTE *)mask_y)[i];
+    }
+
+    return S_OK;
+}
diff --git a/dlls/d3d10/tests/device.c b/dlls/d3d10/tests/device.c
index 8399cdb..1fc3a3b 100644
--- a/dlls/d3d10/tests/device.c
+++ b/dlls/d3d10/tests/device.c
@@ -64,6 +64,32 @@ static void test_device_interfaces(ID3D10Device *device)
     ok(SUCCEEDED(hr), "ID3D10Device does not implement IDXGIDevice (%#x)\n", hr);
 }
 
+static void test_stateblock_mask(void)
+{
+    D3D10_STATE_BLOCK_MASK mask_x, mask_y, result;
+    HRESULT hr;
+
+    memset(&mask_x, 0, sizeof(mask_x));
+    memset(&mask_y, 0, sizeof(mask_y));
+    memset(&result, 0, sizeof(result));
+
+    mask_x.VS = 0x33;
+    mask_y.VS = 0x55;
+    mask_x.Predication = 0x99;
+    mask_y.Predication = 0xaa;
+
+    hr = D3D10StateBlockMaskDifference(&mask_x, &mask_y, &result);
+    ok(SUCCEEDED(hr), "D3D10StateBlockMaskDifference failed, hr %#x.\n", hr);
+    ok(result.VS == 0x66, "Got unexpected result.VS %#x.\n", result.VS);
+    ok(result.Predication == 0x33, "Got unexpected result.Predication %#x.\n", result.Predication);
+    hr = D3D10StateBlockMaskDifference(NULL, &mask_y, &result);
+    ok(hr == E_INVALIDARG, "Got unexpect hr %#x.\n", hr);
+    hr = D3D10StateBlockMaskDifference(&mask_x, NULL, &result);
+    ok(hr == E_INVALIDARG, "Got unexpect hr %#x.\n", hr);
+    hr = D3D10StateBlockMaskDifference(&mask_x, &mask_y, NULL);
+    ok(hr == E_INVALIDARG, "Got unexpect hr %#x.\n", hr);
+}
+
 START_TEST(device)
 {
     ID3D10Device *device;
@@ -77,6 +103,7 @@ START_TEST(device)
     }
 
     test_device_interfaces(device);
+    test_stateblock_mask();
 
     refcount = ID3D10Device_Release(device);
     ok(!refcount, "Device has %u references left\n", refcount);
diff --git a/include/d3d10effect.h b/include/d3d10effect.h
index 8c5cc63..d36c3da 100644
--- a/include/d3d10effect.h
+++ b/include/d3d10effect.h
@@ -804,6 +804,9 @@ HRESULT WINAPI D3D10CreateEffectFromMemory(void *data, SIZE_T data_size, UINT fl
 HRESULT WINAPI D3D10CreateStateBlock(ID3D10Device *device,
         D3D10_STATE_BLOCK_MASK *mask, ID3D10StateBlock **stateblock);
 
+HRESULT WINAPI D3D10StateBlockMaskDifference(D3D10_STATE_BLOCK_MASK *mask_x,
+        D3D10_STATE_BLOCK_MASK *mask_y, D3D10_STATE_BLOCK_MASK *result);
+
 #ifdef __cplusplus
 }
 #endif




More information about the wine-cvs mailing list