From b56227cbf1e1686a8d3b7d57ca0d28b7a24fe699 Mon Sep 17 00:00:00 2001 From: Nozomi Kodama Date: Wed, 27 Jun 2012 14:50:07 +0800 Subject: [PATCH] d3dx9_36: Implementation of D3DXSHDot. --- dlls/d3dx9_36/d3dx9_36.spec | 2 +- dlls/d3dx9_36/math.c | 14 ++++++++++++++ dlls/d3dx9_36/tests/math.c | 24 ++++++++++++++++++++++++ include/d3dx9math.h | 1 + 4 files changed, 40 insertions(+), 1 deletion(-) diff --git a/dlls/d3dx9_36/d3dx9_36.spec b/dlls/d3dx9_36/d3dx9_36.spec index 338585abd71..2ed971c5ee0 100644 --- a/dlls/d3dx9_36/d3dx9_36.spec +++ b/dlls/d3dx9_36/d3dx9_36.spec @@ -273,7 +273,7 @@ @ stub D3DXSaveVolumeToFileInMemory(ptr long ptr ptr ptr) @ stub D3DXSaveVolumeToFileW(ptr long ptr ptr ptr) @ stdcall D3DXSHAdd(ptr long ptr ptr) -@ stub D3DXSHDot(long ptr ptr) +@ stdcall D3DXSHDot(long ptr ptr) @ stub D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) @ stub D3DXSHEvalDirection(ptr long ptr) @ stub D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) diff --git a/dlls/d3dx9_36/math.c b/dlls/d3dx9_36/math.c index 529665b63a3..28958ae1d0c 100644 --- a/dlls/d3dx9_36/math.c +++ b/dlls/d3dx9_36/math.c @@ -1981,6 +1981,20 @@ FLOAT* WINAPI D3DXSHAdd(FLOAT *out, UINT order, const FLOAT *a, const FLOAT *b) return out; } +FLOAT WINAPI D3DXSHDot(UINT order, CONST FLOAT *a, CONST FLOAT *b) +{ + FLOAT s; + UINT i; + + TRACE("order %u, a %p, b %p\n", order, a, b); + + s = a[0] * b[0]; + for (i = 1; i < order * order; i++) + s += a[i] * b[i]; + + return s; +} + FLOAT* WINAPI D3DXSHMultiply3(FLOAT *out, CONST FLOAT *a, CONST FLOAT *b) { FLOAT t, ta, tb; diff --git a/dlls/d3dx9_36/tests/math.c b/dlls/d3dx9_36/tests/math.c index 70290bf7ae0..cc6170f8ac2 100644 --- a/dlls/d3dx9_36/tests/math.c +++ b/dlls/d3dx9_36/tests/math.c @@ -2399,6 +2399,29 @@ static void test_D3DXSHAdd(void) } } +static void test_D3DXSHDot(void) +{ + unsigned int i; + FLOAT a[64], b[64], got; + CONST FLOAT expected[] = + { 0.5f, 0.5f, 25.0f, 262.5f, 1428.0f, 5362.0f, 15873.0f, 39812.0f, 88400.0f, }; + + for (i = 0; i < 64; i++) + { + a[i] = (FLOAT)i + 1.0f; + b[i] = (FLOAT)i + 0.5f; + } + + /* D3DXSHDot computes by using order * order elements */ + for (i = 0; i < 9; i++) + { + got = D3DXSHDot(i, a, b); + ok(relative_error(got, expected[i]) < admitted_error, "order %d: expected %f, received %f\n", i, expected[i], got); + } + + return; +} + static void test_D3DXSHMultiply3(void) { unsigned int i; @@ -2438,5 +2461,6 @@ START_TEST(math) test_D3DXVec_Array(); test_D3DXFloat_Array(); test_D3DXSHAdd(); + test_D3DXSHDot(); test_D3DXSHMultiply3(); } diff --git a/include/d3dx9math.h b/include/d3dx9math.h index b650b48104b..0cffad45ba0 100644 --- a/include/d3dx9math.h +++ b/include/d3dx9math.h @@ -378,6 +378,7 @@ D3DXFLOAT16 *WINAPI D3DXFloat32To16Array(D3DXFLOAT16 *pout, CONST FLOAT *pin, UI FLOAT *WINAPI D3DXFloat16To32Array(FLOAT *pout, CONST D3DXFLOAT16 *pin, UINT n); FLOAT* WINAPI D3DXSHAdd(FLOAT *out, UINT order, CONST FLOAT *a, CONST FLOAT *b); +FLOAT WINAPI D3DXSHDot(UINT order, CONST FLOAT *a, CONST FLOAT *b); FLOAT* WINAPI D3DXSHMultiply3(FLOAT *out, CONST FLOAT *a, CONST FLOAT *b); #ifdef __cplusplus