diff --git a/libs/rs/java/tests/src/com/android/rs/test/RSTestCore.java b/libs/rs/java/tests/src/com/android/rs/test/RSTestCore.java index fc3a0659912f5..541bf2234f760 100644 --- a/libs/rs/java/tests/src/com/android/rs/test/RSTestCore.java +++ b/libs/rs/java/tests/src/com/android/rs/test/RSTestCore.java @@ -68,6 +68,7 @@ public class RSTestCore { unitTests.add(new UT_rsdebug(this, mRes, mCtx)); unitTests.add(new UT_rstime(this, mRes, mCtx)); unitTests.add(new UT_rstypes(this, mRes, mCtx)); + unitTests.add(new UT_math(this, mRes, mCtx)); unitTests.add(new UT_fp_mad(this, mRes, mCtx)); /* unitTests.add(new UnitTest(null, "", 1)); diff --git a/libs/rs/java/tests/src/com/android/rs/test/UT_math.java b/libs/rs/java/tests/src/com/android/rs/test/UT_math.java new file mode 100644 index 0000000000000..bf133be076192 --- /dev/null +++ b/libs/rs/java/tests/src/com/android/rs/test/UT_math.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.rs.test; + +import android.content.Context; +import android.content.res.Resources; +import android.renderscript.*; + +public class UT_math extends UnitTest { + private Resources mRes; + + protected UT_math(RSTestCore rstc, Resources res, Context ctx) { + super(rstc, "Math", ctx); + mRes = res; + } + + public void run() { + RenderScript pRS = RenderScript.create(mCtx); + ScriptC_math s = new ScriptC_math(pRS, mRes, R.raw.math); + pRS.setMessageHandler(mRsMessage); + s.invoke_math_test(0, 0); + pRS.finish(); + waitForMessage(); + pRS.destroy(); + } +} diff --git a/libs/rs/java/tests/src/com/android/rs/test/math.rs b/libs/rs/java/tests/src/com/android/rs/test/math.rs new file mode 100644 index 0000000000000..5b1ad15c0cb6b --- /dev/null +++ b/libs/rs/java/tests/src/com/android/rs/test/math.rs @@ -0,0 +1,65 @@ +#include "shared.rsh" + +// Testing math library + +volatile float f1; +volatile float2 f2; +volatile float3 f3; +volatile float4 f4; + +#define TEST_F(fnc, var) \ + rsDebug("Testing " #fnc, 0); \ + var##1 = fnc(var##1); \ + var##2 = fnc(var##2); \ + var##3 = fnc(var##3); \ + var##4 = fnc(var##4); + +#define TEST_FP(fnc, var) \ + rsDebug("Testing " #fnc, 0); \ + var##1 = fnc(var##1, (float*) &f1); \ + var##2 = fnc(var##2, (float2*) &f2); \ + var##3 = fnc(var##3, (float3*) &f3); \ + var##4 = fnc(var##4, (float4*) &f4); + +#define TEST_F2(fnc, var) \ + rsDebug("Testing " #fnc, 0); \ + var##1 = fnc(var##1, var##1); \ + var##2 = fnc(var##2, var##2); \ + var##3 = fnc(var##3, var##3); \ + var##4 = fnc(var##4, var##4); + +static bool test_math(uint32_t index) { + bool failed = false; + start(); + + TEST_F(cos, f); + TEST_FP(modf, f); + TEST_F2(pow, f); + TEST_F(sin, f); + TEST_F(sqrt, f); + + + float time = end(index); + + if (failed) { + rsDebug("test_math FAILED", time); + } + else { + rsDebug("test_math PASSED", time); + } + + return failed; +} + +void math_test(uint32_t index, int test_num) { + bool failed = false; + failed |= test_math(index); + + if (failed) { + rsSendToClientBlocking(RS_MSG_TEST_FAILED); + } + else { + rsSendToClientBlocking(RS_MSG_TEST_PASSED); + } +} + diff --git a/libs/rs/rsScriptC_LibCL.cpp b/libs/rs/rsScriptC_LibCL.cpp index 6c0e164f68940..28c558d9120e0 100644 --- a/libs/rs/rsScriptC_LibCL.cpp +++ b/libs/rs/rsScriptC_LibCL.cpp @@ -221,7 +221,7 @@ static ScriptCState::SymbolTable_t gSyms[] = { { "_Z5log1pf", (void *)&log1pf, true }, //{ "logb", (void *)&, true }, //{ "mad", (void *)&, true }, - { "modf", (void *)&modff, true }, + { "_Z4modffPf", (void *)&modff, true }, //{ "nan", (void *)&, true }, { "_Z9nextafterff", (void *)&nextafterf, true }, { "_Z3powff", (void *)&powf, true }, diff --git a/libs/rs/scriptc/rs_cl.rsh b/libs/rs/scriptc/rs_cl.rsh index 4384ec682092f..1ca093fdf4c0e 100644 --- a/libs/rs/scriptc/rs_cl.rsh +++ b/libs/rs/scriptc/rs_cl.rsh @@ -109,7 +109,7 @@ _RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, float4 v2) { \ r.x = fnc(v1.x, v2.x); \ r.y = fnc(v1.y, v2.y); \ r.z = fnc(v1.z, v2.z); \ - r.w = fnc(v1.w, v2.z); \ + r.w = fnc(v1.w, v2.w); \ return r; \ } @@ -136,6 +136,40 @@ _RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, float v2) { \ return r; \ } +#define DEF_FUNC_2P(fnc) \ +_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, float2 *v2) { \ + float2 r; \ + float q; \ + r.x = fnc(v1.x, &q); \ + v2->x = q; \ + r.y = fnc(v1.y, &q); \ + v2->y = q; \ + return r; \ +} \ +_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, float3 *v2) { \ + float3 r; \ + float q; \ + r.x = fnc(v1.x, &q); \ + v2->x = q; \ + r.y = fnc(v1.y, &q); \ + v2->y = q; \ + r.z = fnc(v1.z, &q); \ + v2->z = q; \ + return r; \ +} \ +_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, float4 *v2) { \ + float4 r; \ + float q; \ + r.x = fnc(v1.x, &q); \ + v2->x = q; \ + r.y = fnc(v1.y, &q); \ + v2->y = q; \ + r.z = fnc(v1.z, &q); \ + v2->z = q; \ + r.w = fnc(v1.w, &q); \ + v2->w = q; \ + return r; \ +} extern float __attribute__((overloadable)) acos(float); DEF_FUNC_1(acos) @@ -333,9 +367,7 @@ extern float3 __attribute__((overloadable)) mad(float3, float3, float3); extern float4 __attribute__((overloadable)) mad(float4, float4, float4); extern float __attribute__((overloadable)) modf(float, float *); -extern float2 __attribute__((overloadable)) modf(float2, float2 *); -extern float3 __attribute__((overloadable)) modf(float3, float3 *); -extern float4 __attribute__((overloadable)) modf(float4, float4 *); +DEF_FUNC_2P(modf); //extern float __attribute__((overloadable)) nan(uint);