Merge "Move RSTest to compatibility library."
This commit is contained in:
35
tests/RenderScriptTests/RSTest_CompatLib/Android.mk
Normal file
35
tests/RenderScriptTests/RSTest_CompatLib/Android.mk
Normal file
@@ -0,0 +1,35 @@
|
||||
#
|
||||
# Copyright (C) 2013 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.
|
||||
#
|
||||
|
||||
LOCAL_PATH := $(call my-dir)
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_MODULE_TAGS := tests
|
||||
|
||||
LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src)
|
||||
|
||||
LOCAL_PACKAGE_NAME := RSTest_Compat
|
||||
|
||||
LOCAL_STATIC_JAVA_LIBRARIES := android.support.v8.renderscript
|
||||
|
||||
LOCAL_SDK_VERSION := 8
|
||||
LOCAL_RENDERSCRIPT_TARGET_API := 18
|
||||
LOCAL_RENDERSCRIPT_COMPATIBILITY := 18
|
||||
|
||||
LOCAL_RENDERSCRIPT_FLAGS := -rs-package-name=android.support.v8.renderscript
|
||||
LOCAL_REQUIRED_MODULES := librsjni
|
||||
|
||||
include $(BUILD_PACKAGE)
|
||||
17
tests/RenderScriptTests/RSTest_CompatLib/AndroidManifest.xml
Normal file
17
tests/RenderScriptTests/RSTest_CompatLib/AndroidManifest.xml
Normal file
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.android.rs.test">
|
||||
<uses-sdk android:minSdkVersion="8" />
|
||||
<uses-sdk android:targetSdkVersion="8" />
|
||||
<application
|
||||
android:label="_RS_Test_Compat"
|
||||
android:icon="@drawable/test_pattern">
|
||||
<activity android:name="RSTest"
|
||||
android:screenOrientation="portrait">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
</application>
|
||||
</manifest>
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 307 B |
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.RenderScript;
|
||||
|
||||
import android.app.ListActivity;
|
||||
import android.content.res.Configuration;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.os.Message;
|
||||
import android.provider.Settings.System;
|
||||
import android.util.Log;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.Window;
|
||||
import android.widget.Button;
|
||||
import android.widget.ListView;
|
||||
import android.widget.ArrayAdapter;
|
||||
|
||||
import java.lang.Runtime;
|
||||
|
||||
public class RSTest extends ListActivity {
|
||||
|
||||
private static final String LOG_TAG = "RSTest_Compat";
|
||||
private static final boolean DEBUG = false;
|
||||
private static final boolean LOG_ENABLED = false;
|
||||
|
||||
private RenderScript mRS;
|
||||
private RSTestCore RSTC;
|
||||
|
||||
String mTestNames[];
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle icicle) {
|
||||
super.onCreate(icicle);
|
||||
mRS = RenderScript.create(this);
|
||||
|
||||
RSTC = new RSTestCore(this);
|
||||
RSTC.init(mRS, getResources());
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
static void log(String message) {
|
||||
if (LOG_ENABLED) {
|
||||
Log.v(LOG_TAG, message);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,199 @@
|
||||
/*
|
||||
* Copyright (C) 2008-2013 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.support.v8.renderscript.*;
|
||||
import android.util.Log;
|
||||
import java.util.ArrayList;
|
||||
import java.util.ListIterator;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
import android.app.ListActivity;
|
||||
import android.widget.ArrayAdapter;
|
||||
|
||||
public class RSTestCore {
|
||||
ListActivity mCtx;
|
||||
|
||||
public RSTestCore(ListActivity ctx) {
|
||||
mCtx = ctx;
|
||||
}
|
||||
|
||||
private Resources mRes;
|
||||
private RenderScript mRS;
|
||||
|
||||
private ArrayList<UnitTest> unitTests;
|
||||
private ListIterator<UnitTest> test_iter;
|
||||
private UnitTest activeTest;
|
||||
private boolean stopTesting;
|
||||
|
||||
private ScriptField_ListAllocs_s mListAllocs;
|
||||
|
||||
private ArrayAdapter<UnitTest> testAdapter;
|
||||
|
||||
/* Periodic timer for ensuring future tests get scheduled */
|
||||
private Timer mTimer;
|
||||
public static final int RS_TIMER_PERIOD = 100;
|
||||
|
||||
public void init(RenderScript rs, Resources res) {
|
||||
mRS = rs;
|
||||
mRes = res;
|
||||
stopTesting = false;
|
||||
|
||||
unitTests = new ArrayList<UnitTest>();
|
||||
|
||||
unitTests.add(new UT_primitives(this, mRes, mCtx));
|
||||
unitTests.add(new UT_constant(this, mRes, mCtx));
|
||||
unitTests.add(new UT_vector(this, mRes, mCtx));
|
||||
unitTests.add(new UT_unsigned(this, mRes, mCtx));
|
||||
unitTests.add(new UT_array_init(this, mRes, mCtx));
|
||||
unitTests.add(new UT_array_alloc(this, mRes, mCtx));
|
||||
unitTests.add(new UT_kernel(this, mRes, mCtx));
|
||||
unitTests.add(new UT_kernel_struct(this, mRes, mCtx));
|
||||
unitTests.add(new UT_bug_char(this, mRes, mCtx));
|
||||
unitTests.add(new UT_clamp(this, mRes, mCtx));
|
||||
unitTests.add(new UT_clamp_relaxed(this, mRes, mCtx));
|
||||
unitTests.add(new UT_convert(this, mRes, mCtx));
|
||||
unitTests.add(new UT_convert_relaxed(this, mRes, mCtx));
|
||||
unitTests.add(new UT_copy_test(this, mRes, mCtx));
|
||||
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_alloc(this, mRes, mCtx));
|
||||
unitTests.add(new UT_refcount(this, mRes, mCtx));
|
||||
unitTests.add(new UT_foreach(this, mRes, mCtx));
|
||||
unitTests.add(new UT_foreach_bounds(this, mRes, mCtx));
|
||||
unitTests.add(new UT_noroot(this, mRes, mCtx));
|
||||
unitTests.add(new UT_atomic(this, mRes, mCtx));
|
||||
unitTests.add(new UT_struct(this, mRes, mCtx));
|
||||
unitTests.add(new UT_math(this, mRes, mCtx));
|
||||
unitTests.add(new UT_math_conformance(this, mRes, mCtx));
|
||||
unitTests.add(new UT_math_agree(this, mRes, mCtx));
|
||||
unitTests.add(new UT_min(this, mRes, mCtx));
|
||||
unitTests.add(new UT_int4(this, mRes, mCtx));
|
||||
unitTests.add(new UT_element(this, mRes, mCtx));
|
||||
unitTests.add(new UT_sampler(this, mRes, mCtx));
|
||||
unitTests.add(new UT_fp_mad(this, mRes, mCtx));
|
||||
|
||||
/*
|
||||
unitTests.add(new UnitTest(null, "<Pass>", 1));
|
||||
unitTests.add(new UnitTest());
|
||||
unitTests.add(new UnitTest(null, "<Fail>", -1));
|
||||
|
||||
for (int i = 0; i < 20; i++) {
|
||||
unitTests.add(new UnitTest(null, "<Pass>", 1));
|
||||
}
|
||||
*/
|
||||
|
||||
UnitTest [] uta = new UnitTest[unitTests.size()];
|
||||
uta = unitTests.toArray(uta);
|
||||
|
||||
mListAllocs = new ScriptField_ListAllocs_s(mRS, uta.length);
|
||||
for (int i = 0; i < uta.length; i++) {
|
||||
|
||||
ScriptField_ListAllocs_s.Item listElem = new ScriptField_ListAllocs_s.Item();
|
||||
listElem.text = Allocation.createFromString(mRS, uta[i].name, Allocation.USAGE_SCRIPT);
|
||||
listElem.result = uta[i].getResult();
|
||||
mListAllocs.set(listElem, i, false);
|
||||
uta[i].setItem(listElem);
|
||||
}
|
||||
|
||||
mListAllocs.copyAll();
|
||||
|
||||
testAdapter = new ArrayAdapter<UnitTest>(mCtx, android.R.layout.simple_list_item_1, unitTests);
|
||||
mCtx.setListAdapter(testAdapter);
|
||||
|
||||
test_iter = unitTests.listIterator();
|
||||
refreshTestResults(); /* Kick off the first test */
|
||||
|
||||
TimerTask pTask = new TimerTask() {
|
||||
public void run() {
|
||||
refreshTestResults();
|
||||
}
|
||||
};
|
||||
|
||||
mTimer = new Timer();
|
||||
mTimer.schedule(pTask, RS_TIMER_PERIOD, RS_TIMER_PERIOD);
|
||||
}
|
||||
|
||||
public void checkAndRunNextTest() {
|
||||
mCtx.runOnUiThread(new Runnable() {
|
||||
public void run() {
|
||||
if (testAdapter != null)
|
||||
testAdapter.notifyDataSetChanged();
|
||||
}
|
||||
});
|
||||
|
||||
if (activeTest != null) {
|
||||
if (!activeTest.isAlive()) {
|
||||
/* Properly clean up on our last test */
|
||||
try {
|
||||
activeTest.join();
|
||||
}
|
||||
catch (InterruptedException e) {
|
||||
}
|
||||
activeTest = null;
|
||||
}
|
||||
}
|
||||
|
||||
if (!stopTesting && activeTest == null) {
|
||||
if (test_iter.hasNext()) {
|
||||
activeTest = test_iter.next();
|
||||
activeTest.start();
|
||||
/* This routine will only get called once when a new test
|
||||
* should start running. The message handler in UnitTest.java
|
||||
* ensures this. */
|
||||
}
|
||||
else {
|
||||
if (mTimer != null) {
|
||||
mTimer.cancel();
|
||||
mTimer.purge();
|
||||
mTimer = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void refreshTestResults() {
|
||||
checkAndRunNextTest();
|
||||
}
|
||||
|
||||
public void cleanup() {
|
||||
stopTesting = true;
|
||||
UnitTest t = activeTest;
|
||||
|
||||
/* Stop periodic refresh of testing */
|
||||
if (mTimer != null) {
|
||||
mTimer.cancel();
|
||||
mTimer.purge();
|
||||
mTimer = null;
|
||||
}
|
||||
|
||||
/* Wait to exit until we finish the current test */
|
||||
if (t != null) {
|
||||
try {
|
||||
t.join();
|
||||
}
|
||||
catch (InterruptedException e) {
|
||||
}
|
||||
t = null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
|
||||
public class UT_alloc extends UnitTest {
|
||||
private Resources mRes;
|
||||
|
||||
protected UT_alloc(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "Alloc", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
private void initializeGlobals(RenderScript RS, ScriptC_alloc s) {
|
||||
Type.Builder typeBuilder = new Type.Builder(RS, Element.I32(RS));
|
||||
int X = 5;
|
||||
int Y = 7;
|
||||
int Z = 0;
|
||||
s.set_dimX(X);
|
||||
s.set_dimY(Y);
|
||||
s.set_dimZ(Z);
|
||||
typeBuilder.setX(X).setY(Y);
|
||||
Allocation A = Allocation.createTyped(RS, typeBuilder.create());
|
||||
s.bind_a(A);
|
||||
|
||||
typeBuilder = new Type.Builder(RS, Element.I32(RS));
|
||||
typeBuilder.setX(X).setY(Y).setFaces(true);
|
||||
Allocation AFaces = Allocation.createTyped(RS, typeBuilder.create());
|
||||
s.set_aFaces(AFaces);
|
||||
typeBuilder.setFaces(false).setMipmaps(true);
|
||||
Allocation ALOD = Allocation.createTyped(RS, typeBuilder.create());
|
||||
s.set_aLOD(ALOD);
|
||||
typeBuilder.setFaces(true).setMipmaps(true);
|
||||
Allocation AFacesLOD = Allocation.createTyped(RS, typeBuilder.create());
|
||||
s.set_aFacesLOD(AFacesLOD);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
ScriptC_alloc s = new ScriptC_alloc(pRS);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
initializeGlobals(pRS, s);
|
||||
s.invoke_alloc_test();
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
|
||||
public class UT_array_alloc extends UnitTest {
|
||||
private Resources mRes;
|
||||
|
||||
protected UT_array_alloc(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "Array Allocation", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
ScriptC_array_alloc s = new ScriptC_array_alloc(pRS);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
|
||||
int dimX = s.get_dimX();
|
||||
Allocation[] Arr = new Allocation[dimX];
|
||||
Type.Builder typeBuilder = new Type.Builder(pRS, Element.I32(pRS));
|
||||
Type T = typeBuilder.setX(1).create();
|
||||
for (int i = 0; i < dimX; i++) {
|
||||
Allocation A = Allocation.createTyped(pRS, T);
|
||||
Arr[i] = A;
|
||||
}
|
||||
s.set_a(Arr);
|
||||
|
||||
s.invoke_array_alloc_test();
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
passTest();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
|
||||
public class UT_array_init extends UnitTest {
|
||||
private Resources mRes;
|
||||
|
||||
protected UT_array_init(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "Array Init", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
private void checkInit(ScriptC_array_init s) {
|
||||
float[] fa = s.get_fa();
|
||||
_RS_ASSERT("fa[0] == 1.0", fa[0] == 1.0);
|
||||
_RS_ASSERT("fa[1] == 9.9999f", fa[1] == 9.9999f);
|
||||
_RS_ASSERT("fa[2] == 0", fa[2] == 0);
|
||||
_RS_ASSERT("fa[3] == 0", fa[3] == 0);
|
||||
_RS_ASSERT("fa.length == 4", fa.length == 4);
|
||||
|
||||
double[] da = s.get_da();
|
||||
_RS_ASSERT("da[0] == 7.0", da[0] == 7.0);
|
||||
_RS_ASSERT("da[1] == 8.88888", da[1] == 8.88888);
|
||||
_RS_ASSERT("da.length == 2", da.length == 2);
|
||||
|
||||
byte[] ca = s.get_ca();
|
||||
_RS_ASSERT("ca[0] == 'a'", ca[0] == 'a');
|
||||
_RS_ASSERT("ca[1] == 7", ca[1] == 7);
|
||||
_RS_ASSERT("ca[2] == 'b'", ca[2] == 'b');
|
||||
_RS_ASSERT("ca[3] == 'c'", ca[3] == 'c');
|
||||
_RS_ASSERT("ca.length == 4", ca.length == 4);
|
||||
|
||||
short[] sa = s.get_sa();
|
||||
_RS_ASSERT("sa[0] == 1", sa[0] == 1);
|
||||
_RS_ASSERT("sa[1] == 1", sa[1] == 1);
|
||||
_RS_ASSERT("sa[2] == 2", sa[2] == 2);
|
||||
_RS_ASSERT("sa[3] == 3", sa[3] == 3);
|
||||
_RS_ASSERT("sa.length == 4", sa.length == 4);
|
||||
|
||||
int[] ia = s.get_ia();
|
||||
_RS_ASSERT("ia[0] == 5", ia[0] == 5);
|
||||
_RS_ASSERT("ia[1] == 8", ia[1] == 8);
|
||||
_RS_ASSERT("ia[2] == 0", ia[2] == 0);
|
||||
_RS_ASSERT("ia[3] == 0", ia[3] == 0);
|
||||
_RS_ASSERT("ia.length == 4", ia.length == 4);
|
||||
|
||||
long[] la = s.get_la();
|
||||
_RS_ASSERT("la[0] == 13", la[0] == 13);
|
||||
_RS_ASSERT("la[1] == 21", la[1] == 21);
|
||||
_RS_ASSERT("la.length == 4", la.length == 2);
|
||||
|
||||
long[] lla = s.get_lla();
|
||||
_RS_ASSERT("lla[0] == 34", lla[0] == 34);
|
||||
_RS_ASSERT("lla[1] == 0", lla[1] == 0);
|
||||
_RS_ASSERT("lla[2] == 0", lla[2] == 0);
|
||||
_RS_ASSERT("lla[3] == 0", lla[3] == 0);
|
||||
_RS_ASSERT("lla.length == 4", lla.length == 4);
|
||||
|
||||
boolean[] ba = s.get_ba();
|
||||
_RS_ASSERT("ba[0] == true", ba[0] == true);
|
||||
_RS_ASSERT("ba[1] == false", ba[1] == false);
|
||||
_RS_ASSERT("ba[2] == false", ba[2] == false);
|
||||
_RS_ASSERT("ba.length == 3", ba.length == 3);
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
ScriptC_array_init s = new ScriptC_array_init(pRS);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
checkInit(s);
|
||||
s.invoke_array_init_test();
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
passTest();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
|
||||
public class UT_atomic extends UnitTest {
|
||||
private Resources mRes;
|
||||
|
||||
protected UT_atomic(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "Atomics", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
ScriptC_atomic s = new ScriptC_atomic(pRS);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
s.invoke_atomic_test();
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
import android.util.Log;
|
||||
import java.util.Arrays;
|
||||
|
||||
public class UT_bug_char extends UnitTest {
|
||||
private Resources mRes;
|
||||
|
||||
protected UT_bug_char(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "Bug Char", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
// packing functions
|
||||
private Byte2 pack_b2(byte[] val) {
|
||||
assert val.length == 2;
|
||||
Log.i("bug_char", "pack_b2 " + val[0] + " " + val[1]);
|
||||
return new Byte2(val[0], val[1]);
|
||||
}
|
||||
|
||||
private byte min(byte v1, byte v2) {
|
||||
return v1 < v2 ? v1 : v2;
|
||||
}
|
||||
private byte[] min(byte[] v1, byte[] v2) {
|
||||
assert v1.length == v2.length;
|
||||
byte[] rv = new byte[v1.length];
|
||||
for (int i = 0; i < v1.length; ++i)
|
||||
rv[i] = min(v1[i], v2[i]);
|
||||
return rv;
|
||||
}
|
||||
|
||||
private void initializeValues(ScriptC_bug_char s) {
|
||||
byte rand_sc1_0 = (byte)7;
|
||||
byte[] rand_sc2_0 = new byte[2];
|
||||
rand_sc2_0[0] = 11;
|
||||
rand_sc2_0[1] = 21;
|
||||
Log.i("bug_char", "Generated sc2_0 to " + Arrays.toString(rand_sc2_0));
|
||||
byte rand_sc1_1 = (byte)10;
|
||||
byte[] rand_sc2_1 = new byte[2];
|
||||
rand_sc2_1[0] = 13;
|
||||
rand_sc2_1[1] = 15;
|
||||
Log.i("bug_char", "Generated sc2_1 to " + Arrays.toString(rand_sc2_1));
|
||||
|
||||
s.set_rand_sc1_0(rand_sc1_0);
|
||||
s.set_rand_sc2_0(pack_b2(rand_sc2_0));
|
||||
s.set_rand_sc1_1(rand_sc1_1);
|
||||
s.set_rand_sc2_1(pack_b2(rand_sc2_1));
|
||||
// Set results for min
|
||||
s.set_min_rand_sc1_sc1(min(rand_sc1_0, rand_sc1_1));
|
||||
byte[] min_rand_sc2_raw = min(rand_sc2_0, rand_sc2_1);
|
||||
Log.i("bug_char", "Generating min_rand_sc2_sc2 to " +
|
||||
Arrays.toString(min_rand_sc2_raw));
|
||||
Byte2 min_rand_sc2 = pack_b2(min_rand_sc2_raw);
|
||||
Log.i("bug_char", "Setting min_rand_sc2_sc2 to [" + min_rand_sc2.x +
|
||||
", " + min_rand_sc2.y + "]");
|
||||
s.set_min_rand_sc2_sc2(min_rand_sc2);
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
ScriptC_bug_char s = new ScriptC_bug_char(pRS, mRes,
|
||||
R.raw.bug_char);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
initializeValues(s);
|
||||
s.invoke_bug_char_test();
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
|
||||
public class UT_clamp extends UnitTest {
|
||||
private Resources mRes;
|
||||
|
||||
protected UT_clamp(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "Clamp (Full)", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
ScriptC_clamp s = new ScriptC_clamp(pRS);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
s.invoke_clamp_test();
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
|
||||
public class UT_clamp_relaxed extends UnitTest {
|
||||
private Resources mRes;
|
||||
|
||||
protected UT_clamp_relaxed(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "Clamp (Relaxed)", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
ScriptC_clamp_relaxed s =
|
||||
new ScriptC_clamp_relaxed(pRS);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
s.invoke_clamp_test();
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
|
||||
public class UT_constant extends UnitTest {
|
||||
private Resources mRes;
|
||||
|
||||
protected UT_constant(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "Const", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
private void Assert(boolean b) {
|
||||
if (!b) {
|
||||
failTest();
|
||||
}
|
||||
}
|
||||
|
||||
public void run() {
|
||||
Assert(ScriptC_constant.const_floatTest == 1.99f);
|
||||
Assert(ScriptC_constant.const_doubleTest == 2.05);
|
||||
Assert(ScriptC_constant.const_charTest == -8);
|
||||
Assert(ScriptC_constant.const_shortTest == -16);
|
||||
Assert(ScriptC_constant.const_intTest == -32);
|
||||
Assert(ScriptC_constant.const_longTest == 17179869184l);
|
||||
Assert(ScriptC_constant.const_longlongTest == 68719476736l);
|
||||
|
||||
Assert(ScriptC_constant.const_ucharTest == 8);
|
||||
Assert(ScriptC_constant.const_ushortTest == 16);
|
||||
Assert(ScriptC_constant.const_uintTest == 32);
|
||||
Assert(ScriptC_constant.const_ulongTest == 4611686018427387904L);
|
||||
Assert(ScriptC_constant.const_int64_tTest == -17179869184l);
|
||||
Assert(ScriptC_constant.const_uint64_tTest == 117179869184l);
|
||||
|
||||
Assert(ScriptC_constant.const_boolTest == true);
|
||||
|
||||
passTest();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
|
||||
public class UT_convert extends UnitTest {
|
||||
private Resources mRes;
|
||||
|
||||
protected UT_convert(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "Convert", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
ScriptC_convert s = new ScriptC_convert(pRS);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
s.invoke_convert_test();
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
|
||||
public class UT_convert_relaxed extends UnitTest {
|
||||
private Resources mRes;
|
||||
|
||||
protected UT_convert_relaxed(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "Convert (Relaxed)", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
ScriptC_convert_relaxed s =
|
||||
new ScriptC_convert_relaxed(pRS);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
s.invoke_convert_test();
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
import android.util.Log;
|
||||
|
||||
public class UT_copy_test extends UnitTest {
|
||||
private Resources mRes;
|
||||
boolean pass = true;
|
||||
|
||||
protected UT_copy_test(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "Copy", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
void testFloat2(RenderScript rs, ScriptC_copy_test s) {
|
||||
Allocation a1 = Allocation.createSized(rs, Element.F32_2(rs), 1024);
|
||||
Allocation a2 = Allocation.createSized(rs, Element.F32_2(rs), 1024);
|
||||
|
||||
float[] f1 = new float[1024 * 2];
|
||||
float[] f2 = new float[1024 * 2];
|
||||
for (int ct=0; ct < f1.length; ct++) {
|
||||
f1[ct] = (float)ct;
|
||||
}
|
||||
a1.copyFrom(f1);
|
||||
|
||||
s.forEach_copyFloat2(a1, a2);
|
||||
|
||||
a2.copyTo(f2);
|
||||
for (int ct=0; ct < f1.length; ct++) {
|
||||
if (f1[ct] != f2[ct]) {
|
||||
failTest();
|
||||
Log.v("RS Test", "Compare failed at " + ct + ", " + f1[ct] + ", " + f2[ct]);
|
||||
}
|
||||
}
|
||||
a1.destroy();
|
||||
a2.destroy();
|
||||
}
|
||||
|
||||
void testFloat3(RenderScript rs, ScriptC_copy_test s) {
|
||||
Allocation a1 = Allocation.createSized(rs, Element.F32_3(rs), 1024);
|
||||
Allocation a2 = Allocation.createSized(rs, Element.F32_3(rs), 1024);
|
||||
|
||||
float[] f1 = new float[1024 * 4];
|
||||
float[] f2 = new float[1024 * 4];
|
||||
for (int ct=0; ct < f1.length; ct++) {
|
||||
f1[ct] = (float)ct;
|
||||
}
|
||||
a1.copyFrom(f1);
|
||||
|
||||
s.forEach_copyFloat3(a1, a2);
|
||||
|
||||
a2.copyTo(f2);
|
||||
for (int ct=0; ct < f1.length; ct++) {
|
||||
if ((f1[ct] != f2[ct]) && ((ct&3) != 3)) {
|
||||
failTest();
|
||||
Log.v("RS Test", "Compare failed at " + ct + ", " + f1[ct] + ", " + f2[ct]);
|
||||
}
|
||||
}
|
||||
a1.destroy();
|
||||
a2.destroy();
|
||||
}
|
||||
|
||||
void testFloat4(RenderScript rs, ScriptC_copy_test s) {
|
||||
Allocation a1 = Allocation.createSized(rs, Element.F32_4(rs), 1024);
|
||||
Allocation a2 = Allocation.createSized(rs, Element.F32_4(rs), 1024);
|
||||
|
||||
float[] f1 = new float[1024 * 4];
|
||||
float[] f2 = new float[1024 * 4];
|
||||
for (int ct=0; ct < f1.length; ct++) {
|
||||
f1[ct] = (float)ct;
|
||||
}
|
||||
a1.copyFrom(f1);
|
||||
|
||||
s.forEach_copyFloat4(a1, a2);
|
||||
|
||||
a2.copyTo(f2);
|
||||
for (int ct=0; ct < f1.length; ct++) {
|
||||
if (f1[ct] != f2[ct]) {
|
||||
failTest();
|
||||
Log.v("RS Test", "Compare failed at " + ct + ", " + f1[ct] + ", " + f2[ct]);
|
||||
}
|
||||
}
|
||||
a1.destroy();
|
||||
a2.destroy();
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
ScriptC_copy_test s = new ScriptC_copy_test(pRS);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
|
||||
testFloat2(pRS, s);
|
||||
testFloat3(pRS, s);
|
||||
testFloat4(pRS, s);
|
||||
s.invoke_sendResult(true);
|
||||
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,121 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
|
||||
public class UT_element extends UnitTest {
|
||||
private Resources mRes;
|
||||
|
||||
Element simpleElem;
|
||||
Element complexElem;
|
||||
|
||||
final String subElemNames[] = {
|
||||
"subElem0",
|
||||
"subElem1",
|
||||
"subElem2",
|
||||
"arrayElem0",
|
||||
"arrayElem1",
|
||||
"subElem3",
|
||||
"subElem4",
|
||||
"subElem5",
|
||||
"subElem6",
|
||||
"subElem_7",
|
||||
};
|
||||
|
||||
final int subElemArraySizes[] = {
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
2,
|
||||
5,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
};
|
||||
|
||||
final int subElemOffsets[] = {
|
||||
0,
|
||||
4,
|
||||
8,
|
||||
12,
|
||||
20,
|
||||
40,
|
||||
44,
|
||||
48,
|
||||
64,
|
||||
80,
|
||||
};
|
||||
|
||||
protected UT_element(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "Element", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
private void initializeGlobals(RenderScript RS, ScriptC_element s) {
|
||||
simpleElem = Element.F32_3(RS);
|
||||
complexElem = ScriptField_ComplexStruct.createElement(RS);
|
||||
s.set_simpleElem(simpleElem);
|
||||
s.set_complexElem(complexElem);
|
||||
|
||||
ScriptField_ComplexStruct data = new ScriptField_ComplexStruct(RS, 1);
|
||||
s.bind_complexStruct(data);
|
||||
}
|
||||
|
||||
private void testScriptSide(RenderScript pRS) {
|
||||
ScriptC_element s = new ScriptC_element(pRS);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
initializeGlobals(pRS, s);
|
||||
s.invoke_element_test();
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
}
|
||||
|
||||
private void testJavaSide(RenderScript RS) {
|
||||
|
||||
int subElemCount = simpleElem.getSubElementCount();
|
||||
_RS_ASSERT("subElemCount == 0", subElemCount == 0);
|
||||
|
||||
subElemCount = complexElem.getSubElementCount();
|
||||
_RS_ASSERT("subElemCount == 10", subElemCount == 10);
|
||||
_RS_ASSERT("complexElem.getSizeBytes() == ScriptField_ComplexStruct.Item.sizeof",
|
||||
complexElem.getBytesSize() == ScriptField_ComplexStruct.Item.sizeof);
|
||||
|
||||
for (int i = 0; i < subElemCount; i ++) {
|
||||
_RS_ASSERT("complexElem.getSubElement(i) != null",
|
||||
complexElem.getSubElement(i) != null);
|
||||
_RS_ASSERT("complexElem.getSubElementName(i).equals(subElemNames[i])",
|
||||
complexElem.getSubElementName(i).equals(subElemNames[i]));
|
||||
_RS_ASSERT("complexElem.getSubElementArraySize(i) == subElemArraySizes[i]",
|
||||
complexElem.getSubElementArraySize(i) == subElemArraySizes[i]);
|
||||
_RS_ASSERT("complexElem.getSubElementOffsetBytes(i) == subElemOffsets[i]",
|
||||
complexElem.getSubElementOffsetBytes(i) == subElemOffsets[i]);
|
||||
}
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
testScriptSide(pRS);
|
||||
testJavaSide(pRS);
|
||||
passTest();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* Copyright (C) 2011-2013 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.support.v8.renderscript.*;
|
||||
|
||||
public class UT_foreach extends UnitTest {
|
||||
private Resources mRes;
|
||||
private Allocation A;
|
||||
|
||||
protected UT_foreach(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "ForEach", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
private void initializeGlobals(RenderScript RS, ScriptC_foreach s) {
|
||||
Type.Builder typeBuilder = new Type.Builder(RS, Element.I32(RS));
|
||||
int X = 5;
|
||||
int Y = 7;
|
||||
s.set_dimX(X);
|
||||
s.set_dimY(Y);
|
||||
typeBuilder.setX(X).setY(Y);
|
||||
A = Allocation.createTyped(RS, typeBuilder.create());
|
||||
s.bind_a(A);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
ScriptC_foreach s = new ScriptC_foreach(pRS);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
initializeGlobals(pRS, s);
|
||||
s.forEach_root(A);
|
||||
s.invoke_verify_root();
|
||||
s.forEach_foo(A, A);
|
||||
s.invoke_verify_foo();
|
||||
s.invoke_foreach_test();
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
|
||||
public class UT_foreach_bounds extends UnitTest {
|
||||
private Resources mRes;
|
||||
private Allocation A;
|
||||
|
||||
protected UT_foreach_bounds(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "ForEach (bounds)", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
private void initializeGlobals(RenderScript RS, ScriptC_foreach_bounds s) {
|
||||
Type.Builder typeBuilder = new Type.Builder(RS, Element.I32(RS));
|
||||
int X = 5;
|
||||
int Y = 7;
|
||||
s.set_dimX(X);
|
||||
s.set_dimY(Y);
|
||||
typeBuilder.setX(X).setY(Y);
|
||||
A = Allocation.createTyped(RS, typeBuilder.create());
|
||||
s.bind_a(A);
|
||||
s.set_s(s);
|
||||
s.set_ain(A);
|
||||
s.set_aout(A);
|
||||
s.set_xStart(2);
|
||||
s.set_xEnd(5);
|
||||
s.set_yStart(3);
|
||||
s.set_yEnd(6);
|
||||
s.forEach_zero(A);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
ScriptC_foreach_bounds s = new ScriptC_foreach_bounds(pRS);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
initializeGlobals(pRS, s);
|
||||
s.invoke_foreach_bounds_test();
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
|
||||
public class UT_fp_mad extends UnitTest {
|
||||
private Resources mRes;
|
||||
|
||||
protected UT_fp_mad(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "Fp_Mad", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
ScriptC_fp_mad s = new ScriptC_fp_mad(pRS);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
s.invoke_fp_mad_test(0, 0);
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
|
||||
public class UT_int4 extends UnitTest {
|
||||
private Resources mRes;
|
||||
|
||||
protected UT_int4(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "int4", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
ScriptC_int4 s = new ScriptC_int4(pRS, mRes, R.raw.int4);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
s.invoke_int4_test();
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
import android.util.Log;
|
||||
|
||||
public class UT_kernel extends UnitTest {
|
||||
private Resources mRes;
|
||||
private Allocation A;
|
||||
private Allocation B;
|
||||
|
||||
protected UT_kernel(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "Kernels (pass-by-value)", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
private void initializeGlobals(RenderScript RS, ScriptC_kernel s) {
|
||||
Type.Builder typeBuilder = new Type.Builder(RS, Element.I32(RS));
|
||||
int X = 5;
|
||||
s.set_dimX(X);
|
||||
typeBuilder.setX(X);
|
||||
A = Allocation.createTyped(RS, typeBuilder.create());
|
||||
s.bind_ain(A);
|
||||
B = Allocation.createTyped(RS, typeBuilder.create());
|
||||
s.bind_aout(B);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
ScriptC_kernel s = new ScriptC_kernel(pRS);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
initializeGlobals(pRS, s);
|
||||
s.forEach_init_vars(A);
|
||||
s.forEach_root(A, B);
|
||||
s.invoke_verify_root();
|
||||
s.invoke_kernel_test();
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
import android.util.Log;
|
||||
|
||||
public class UT_kernel_struct extends UnitTest {
|
||||
private Resources mRes;
|
||||
private Allocation A;
|
||||
private Allocation B;
|
||||
|
||||
protected UT_kernel_struct(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "Kernels (struct pass-by-value)", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
private void initializeGlobals(RenderScript RS, ScriptC_kernel_struct s) {
|
||||
int X = 5;
|
||||
s.set_dimX(X);
|
||||
ScriptField_simpleStruct t;
|
||||
t = new ScriptField_simpleStruct(RS, X);
|
||||
s.bind_ain(t);
|
||||
A = t.getAllocation();
|
||||
t = new ScriptField_simpleStruct(RS, X);
|
||||
s.bind_aout(t);
|
||||
B = t.getAllocation();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
ScriptC_kernel_struct s = new ScriptC_kernel_struct(pRS);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
initializeGlobals(pRS, s);
|
||||
s.forEach_init_vars(A);
|
||||
s.forEach_root(A, B);
|
||||
s.invoke_verify_root();
|
||||
s.invoke_kernel_struct_test();
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.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);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
s.invoke_math_test(0, 0);
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,527 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
import android.util.Log;
|
||||
import java.util.Arrays;
|
||||
import java.util.Random;
|
||||
|
||||
public class UT_math_agree extends UnitTest {
|
||||
private Resources mRes;
|
||||
private Random rand;
|
||||
|
||||
protected UT_math_agree(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "Math Agreement", ctx);
|
||||
mRes = res;
|
||||
rand = new Random();
|
||||
}
|
||||
|
||||
// packing functions
|
||||
private Float2 pack_f2(float[] val) {
|
||||
assert val.length == 2;
|
||||
return new Float2(val[0], val[1]);
|
||||
}
|
||||
private Float3 pack_f3(float[] val) {
|
||||
assert val.length == 3;
|
||||
return new Float3(val[0], val[1], val[2]);
|
||||
}
|
||||
private Float4 pack_f4(float[] val) {
|
||||
assert val.length == 4;
|
||||
return new Float4(val[0], val[1], val[2], val[3]);
|
||||
}
|
||||
private Byte2 pack_b2(byte[] val) {
|
||||
assert val.length == 2;
|
||||
return new Byte2(val[0], val[1]);
|
||||
}
|
||||
private Byte3 pack_b3(byte[] val) {
|
||||
assert val.length == 3;
|
||||
return new Byte3(val[0], val[1], val[2]);
|
||||
}
|
||||
private Byte4 pack_b4(byte[] val) {
|
||||
assert val.length == 4;
|
||||
return new Byte4(val[0], val[1], val[2], val[3]);
|
||||
}
|
||||
private Short2 pack_s2(short[] val) {
|
||||
assert val.length == 2;
|
||||
return new Short2(val[0], val[1]);
|
||||
}
|
||||
private Short3 pack_s3(short[] val) {
|
||||
assert val.length == 3;
|
||||
return new Short3(val[0], val[1], val[2]);
|
||||
}
|
||||
private Short4 pack_s4(short[] val) {
|
||||
assert val.length == 4;
|
||||
return new Short4(val[0], val[1], val[2], val[3]);
|
||||
}
|
||||
private Int2 pack_i2(int[] val) {
|
||||
assert val.length == 2;
|
||||
return new Int2(val[0], val[1]);
|
||||
}
|
||||
private Int3 pack_i3(int[] val) {
|
||||
assert val.length == 3;
|
||||
return new Int3(val[0], val[1], val[2]);
|
||||
}
|
||||
private Int4 pack_i4(int[] val) {
|
||||
assert val.length == 4;
|
||||
return new Int4(val[0], val[1], val[2], val[3]);
|
||||
}
|
||||
private Long2 pack_l2(long[] val) {
|
||||
assert val.length == 2;
|
||||
return new Long2(val[0], val[1]);
|
||||
}
|
||||
private Long3 pack_l3(long[] val) {
|
||||
assert val.length == 3;
|
||||
return new Long3(val[0], val[1], val[2]);
|
||||
}
|
||||
private Long4 pack_l4(long[] val) {
|
||||
assert val.length == 4;
|
||||
return new Long4(val[0], val[1], val[2], val[3]);
|
||||
}
|
||||
|
||||
// random vector generation functions
|
||||
private float[] randvec_float(int dim) {
|
||||
float[] fv = new float[dim];
|
||||
for (int i = 0; i < dim; ++i)
|
||||
fv[i] = rand.nextFloat();
|
||||
return fv;
|
||||
}
|
||||
private byte[] randvec_char(int dim) {
|
||||
byte[] cv = new byte[dim];
|
||||
rand.nextBytes(cv);
|
||||
return cv;
|
||||
}
|
||||
private short[] randvec_uchar(int dim) {
|
||||
short[] ucv = new short[dim];
|
||||
for (int i = 0; i < dim; ++i)
|
||||
ucv[i] = (short)rand.nextInt(0x1 << 8);
|
||||
return ucv;
|
||||
}
|
||||
private short[] randvec_short(int dim) {
|
||||
short[] sv = new short[dim];
|
||||
for (int i = 0; i < dim; ++i)
|
||||
sv[i] = (short)rand.nextInt(0x1 << 16);
|
||||
return sv;
|
||||
}
|
||||
private int[] randvec_ushort(int dim) {
|
||||
int[] usv = new int[dim];
|
||||
for (int i = 0; i < dim; ++i)
|
||||
usv[i] = rand.nextInt(0x1 << 16);
|
||||
return usv;
|
||||
}
|
||||
private int[] randvec_int(int dim) {
|
||||
int[] iv = new int[dim];
|
||||
for (int i = 0; i < dim; ++i)
|
||||
iv[i] = rand.nextInt();
|
||||
return iv;
|
||||
}
|
||||
private long[] randvec_uint(int dim) {
|
||||
long[] uiv = new long[dim];
|
||||
for (int i = 0; i < dim; ++i)
|
||||
uiv[i] = (long)rand.nextInt() - (long)Integer.MIN_VALUE;
|
||||
return uiv;
|
||||
}
|
||||
private long[] randvec_long(int dim) {
|
||||
long[] lv = new long[dim];
|
||||
for (int i = 0; i < dim; ++i)
|
||||
lv[i] = rand.nextLong();
|
||||
return lv;
|
||||
}
|
||||
// TODO: unsigned long generator
|
||||
|
||||
// min reference functions
|
||||
private float min(float v1, float v2) {
|
||||
return v1 < v2 ? v1 : v2;
|
||||
}
|
||||
private float[] min(float[] v1, float[] v2) {
|
||||
assert v1.length == v2.length;
|
||||
float[] rv = new float[v1.length];
|
||||
for (int i = 0; i < v1.length; ++i)
|
||||
rv[i] = min(v1[i], v2[i]);
|
||||
return rv;
|
||||
}
|
||||
private byte min(byte v1, byte v2) {
|
||||
return v1 < v2 ? v1 : v2;
|
||||
}
|
||||
private byte[] min(byte[] v1, byte[] v2) {
|
||||
assert v1.length == v2.length;
|
||||
byte[] rv = new byte[v1.length];
|
||||
for (int i = 0; i < v1.length; ++i)
|
||||
rv[i] = min(v1[i], v2[i]);
|
||||
return rv;
|
||||
}
|
||||
private short min(short v1, short v2) {
|
||||
return v1 < v2 ? v1 : v2;
|
||||
}
|
||||
private short[] min(short[] v1, short[] v2) {
|
||||
assert v1.length == v2.length;
|
||||
short[] rv = new short[v1.length];
|
||||
for (int i = 0; i < v1.length; ++i)
|
||||
rv[i] = min(v1[i], v2[i]);
|
||||
return rv;
|
||||
}
|
||||
private int min(int v1, int v2) {
|
||||
return v1 < v2 ? v1 : v2;
|
||||
}
|
||||
private int[] min(int[] v1, int[] v2) {
|
||||
assert v1.length == v2.length;
|
||||
int[] rv = new int[v1.length];
|
||||
for (int i = 0; i < v1.length; ++i)
|
||||
rv[i] = min(v1[i], v2[i]);
|
||||
return rv;
|
||||
}
|
||||
private long min(long v1, long v2) {
|
||||
return v1 < v2 ? v1 : v2;
|
||||
}
|
||||
private long[] min(long[] v1, long[] v2) {
|
||||
assert v1.length == v2.length;
|
||||
long[] rv = new long[v1.length];
|
||||
for (int i = 0; i < v1.length; ++i)
|
||||
rv[i] = min(v1[i], v2[i]);
|
||||
return rv;
|
||||
}
|
||||
// TODO: unsigned long version of min
|
||||
|
||||
// max reference functions
|
||||
private float max(float v1, float v2) {
|
||||
return v1 > v2 ? v1 : v2;
|
||||
}
|
||||
private float[] max(float[] v1, float[] v2) {
|
||||
assert v1.length == v2.length;
|
||||
float[] rv = new float[v1.length];
|
||||
for (int i = 0; i < v1.length; ++i)
|
||||
rv[i] = max(v1[i], v2[i]);
|
||||
return rv;
|
||||
}
|
||||
private byte max(byte v1, byte v2) {
|
||||
return v1 > v2 ? v1 : v2;
|
||||
}
|
||||
private byte[] max(byte[] v1, byte[] v2) {
|
||||
assert v1.length == v2.length;
|
||||
byte[] rv = new byte[v1.length];
|
||||
for (int i = 0; i < v1.length; ++i)
|
||||
rv[i] = max(v1[i], v2[i]);
|
||||
return rv;
|
||||
}
|
||||
private short max(short v1, short v2) {
|
||||
return v1 > v2 ? v1 : v2;
|
||||
}
|
||||
private short[] max(short[] v1, short[] v2) {
|
||||
assert v1.length == v2.length;
|
||||
short[] rv = new short[v1.length];
|
||||
for (int i = 0; i < v1.length; ++i)
|
||||
rv[i] = max(v1[i], v2[i]);
|
||||
return rv;
|
||||
}
|
||||
private int max(int v1, int v2) {
|
||||
return v1 > v2 ? v1 : v2;
|
||||
}
|
||||
private int[] max(int[] v1, int[] v2) {
|
||||
assert v1.length == v2.length;
|
||||
int[] rv = new int[v1.length];
|
||||
for (int i = 0; i < v1.length; ++i)
|
||||
rv[i] = max(v1[i], v2[i]);
|
||||
return rv;
|
||||
}
|
||||
private long max(long v1, long v2) {
|
||||
return v1 > v2 ? v1 : v2;
|
||||
}
|
||||
private long[] max(long[] v1, long[] v2) {
|
||||
assert v1.length == v2.length;
|
||||
long[] rv = new long[v1.length];
|
||||
for (int i = 0; i < v1.length; ++i)
|
||||
rv[i] = max(v1[i], v2[i]);
|
||||
return rv;
|
||||
}
|
||||
// TODO: unsigned long version of max
|
||||
|
||||
// fmin reference functions
|
||||
private float fmin(float v1, float v2) {
|
||||
return min(v1, v2);
|
||||
}
|
||||
private float[] fmin(float[] v1, float[] v2) {
|
||||
return min(v1, v2);
|
||||
}
|
||||
private float[] fmin(float[] v1, float v2) {
|
||||
float[] rv = new float[v1.length];
|
||||
for (int i = 0; i < v1.length; ++i)
|
||||
rv[i] = min(v1[i], v2);
|
||||
return rv;
|
||||
}
|
||||
|
||||
// fmax reference functions
|
||||
private float fmax(float v1, float v2) {
|
||||
return max(v1, v2);
|
||||
}
|
||||
private float[] fmax(float[] v1, float[] v2) {
|
||||
return max(v1, v2);
|
||||
}
|
||||
private float[] fmax(float[] v1, float v2) {
|
||||
float[] rv = new float[v1.length];
|
||||
for (int i = 0; i < v1.length; ++i)
|
||||
rv[i] = max(v1[i], v2);
|
||||
return rv;
|
||||
}
|
||||
|
||||
private void initializeValues(ScriptC_math_agree s) {
|
||||
float x = rand.nextFloat();
|
||||
float y = rand.nextFloat();
|
||||
|
||||
s.set_x(x);
|
||||
s.set_y(y);
|
||||
s.set_result_add(x + y);
|
||||
s.set_result_sub(x - y);
|
||||
s.set_result_mul(x * y);
|
||||
s.set_result_div(x / y);
|
||||
|
||||
// Generate random vectors of all types
|
||||
float rand_f1_0 = rand.nextFloat();
|
||||
float[] rand_f2_0 = randvec_float(2);
|
||||
float[] rand_f3_0 = randvec_float(3);
|
||||
float[] rand_f4_0 = randvec_float(4);
|
||||
float rand_f1_1 = rand.nextFloat();
|
||||
float[] rand_f2_1 = randvec_float(2);
|
||||
float[] rand_f3_1 = randvec_float(3);
|
||||
float[] rand_f4_1 = randvec_float(4);
|
||||
short rand_uc1_0 = (short)rand.nextInt(0x1 << 8);
|
||||
short[] rand_uc2_0 = randvec_uchar(2);
|
||||
short[] rand_uc3_0 = randvec_uchar(3);
|
||||
short[] rand_uc4_0 = randvec_uchar(4);
|
||||
short rand_uc1_1 = (short)rand.nextInt(0x1 << 8);
|
||||
short[] rand_uc2_1 = randvec_uchar(2);
|
||||
short[] rand_uc3_1 = randvec_uchar(3);
|
||||
short[] rand_uc4_1 = randvec_uchar(4);
|
||||
short rand_ss1_0 = (short)rand.nextInt(0x1 << 16);
|
||||
short[] rand_ss2_0 = randvec_short(2);
|
||||
short[] rand_ss3_0 = randvec_short(3);
|
||||
short[] rand_ss4_0 = randvec_short(4);
|
||||
short rand_ss1_1 = (short)rand.nextInt(0x1 << 16);
|
||||
short[] rand_ss2_1 = randvec_short(2);
|
||||
short[] rand_ss3_1 = randvec_short(3);
|
||||
short[] rand_ss4_1 = randvec_short(4);
|
||||
int rand_us1_0 = rand.nextInt(0x1 << 16);
|
||||
int[] rand_us2_0 = randvec_ushort(2);
|
||||
int[] rand_us3_0 = randvec_ushort(3);
|
||||
int[] rand_us4_0 = randvec_ushort(4);
|
||||
int rand_us1_1 = rand.nextInt(0x1 << 16);
|
||||
int[] rand_us2_1 = randvec_ushort(2);
|
||||
int[] rand_us3_1 = randvec_ushort(3);
|
||||
int[] rand_us4_1 = randvec_ushort(4);
|
||||
int rand_si1_0 = rand.nextInt();
|
||||
int[] rand_si2_0 = randvec_int(2);
|
||||
int[] rand_si3_0 = randvec_int(3);
|
||||
int[] rand_si4_0 = randvec_int(4);
|
||||
int rand_si1_1 = rand.nextInt();
|
||||
int[] rand_si2_1 = randvec_int(2);
|
||||
int[] rand_si3_1 = randvec_int(3);
|
||||
int[] rand_si4_1 = randvec_int(4);
|
||||
long rand_ui1_0 = (long)rand.nextInt() - (long)Integer.MIN_VALUE;
|
||||
long[] rand_ui2_0 = randvec_uint(2);
|
||||
long[] rand_ui3_0 = randvec_uint(3);
|
||||
long[] rand_ui4_0 = randvec_uint(4);
|
||||
long rand_ui1_1 = (long)rand.nextInt() - (long)Integer.MIN_VALUE;
|
||||
long[] rand_ui2_1 = randvec_uint(2);
|
||||
long[] rand_ui3_1 = randvec_uint(3);
|
||||
long[] rand_ui4_1 = randvec_uint(4);
|
||||
long rand_sl1_0 = rand.nextLong();
|
||||
long[] rand_sl2_0 = randvec_long(2);
|
||||
long[] rand_sl3_0 = randvec_long(3);
|
||||
long[] rand_sl4_0 = randvec_long(4);
|
||||
long rand_sl1_1 = rand.nextLong();
|
||||
long[] rand_sl2_1 = randvec_long(2);
|
||||
long[] rand_sl3_1 = randvec_long(3);
|
||||
long[] rand_sl4_1 = randvec_long(4);
|
||||
byte rand_sc1_0 = (byte)rand.nextInt(0x1 << 8);
|
||||
byte[] rand_sc2_0 = randvec_char(2);
|
||||
byte[] rand_sc3_0 = randvec_char(3);
|
||||
byte[] rand_sc4_0 = randvec_char(4);
|
||||
byte rand_sc1_1 = (byte)rand.nextInt(0x1 << 8);
|
||||
byte[] rand_sc2_1 = randvec_char(2);
|
||||
byte[] rand_sc3_1 = randvec_char(3);
|
||||
byte[] rand_sc4_1 = randvec_char(4);
|
||||
// TODO: generate unsigned long vectors
|
||||
|
||||
// Set random vectors in renderscript code
|
||||
s.set_rand_f1_0(rand_f1_0);
|
||||
s.set_rand_f2_0(pack_f2(rand_f2_0));
|
||||
s.set_rand_f3_0(pack_f3(rand_f3_0));
|
||||
s.set_rand_f4_0(pack_f4(rand_f4_0));
|
||||
s.set_rand_f1_1(rand_f1_1);
|
||||
s.set_rand_f2_1(pack_f2(rand_f2_1));
|
||||
s.set_rand_f3_1(pack_f3(rand_f3_1));
|
||||
s.set_rand_f4_1(pack_f4(rand_f4_1));
|
||||
s.set_rand_uc1_1(rand_uc1_1);
|
||||
s.set_rand_uc2_1(pack_s2(rand_uc2_1));
|
||||
s.set_rand_uc3_1(pack_s3(rand_uc3_1));
|
||||
s.set_rand_uc4_1(pack_s4(rand_uc4_1));
|
||||
s.set_rand_ss1_0(rand_ss1_0);
|
||||
s.set_rand_ss2_0(pack_s2(rand_ss2_0));
|
||||
s.set_rand_ss3_0(pack_s3(rand_ss3_0));
|
||||
s.set_rand_ss4_0(pack_s4(rand_ss4_0));
|
||||
s.set_rand_ss1_1(rand_ss1_1);
|
||||
s.set_rand_ss2_1(pack_s2(rand_ss2_1));
|
||||
s.set_rand_ss3_1(pack_s3(rand_ss3_1));
|
||||
s.set_rand_ss4_1(pack_s4(rand_ss4_1));
|
||||
s.set_rand_us1_0(rand_us1_0);
|
||||
s.set_rand_us2_0(pack_i2(rand_us2_0));
|
||||
s.set_rand_us3_0(pack_i3(rand_us3_0));
|
||||
s.set_rand_us4_0(pack_i4(rand_us4_0));
|
||||
s.set_rand_us1_1(rand_us1_1);
|
||||
s.set_rand_us2_1(pack_i2(rand_us2_1));
|
||||
s.set_rand_us3_1(pack_i3(rand_us3_1));
|
||||
s.set_rand_us4_1(pack_i4(rand_us4_1));
|
||||
s.set_rand_si1_0(rand_si1_0);
|
||||
s.set_rand_si2_0(pack_i2(rand_si2_0));
|
||||
s.set_rand_si3_0(pack_i3(rand_si3_0));
|
||||
s.set_rand_si4_0(pack_i4(rand_si4_0));
|
||||
s.set_rand_si1_1(rand_si1_1);
|
||||
s.set_rand_si2_1(pack_i2(rand_si2_1));
|
||||
s.set_rand_si3_1(pack_i3(rand_si3_1));
|
||||
s.set_rand_si4_1(pack_i4(rand_si4_1));
|
||||
s.set_rand_ui1_0(rand_ui1_0);
|
||||
s.set_rand_ui2_0(pack_l2(rand_ui2_0));
|
||||
s.set_rand_ui3_0(pack_l3(rand_ui3_0));
|
||||
s.set_rand_ui4_0(pack_l4(rand_ui4_0));
|
||||
s.set_rand_ui1_1(rand_ui1_1);
|
||||
s.set_rand_ui2_1(pack_l2(rand_ui2_1));
|
||||
s.set_rand_ui3_1(pack_l3(rand_ui3_1));
|
||||
s.set_rand_ui4_1(pack_l4(rand_ui4_1));
|
||||
s.set_rand_sl1_0(rand_sl1_0);
|
||||
s.set_rand_sl2_0(pack_l2(rand_sl2_0));
|
||||
s.set_rand_sl3_0(pack_l3(rand_sl3_0));
|
||||
s.set_rand_sl4_0(pack_l4(rand_sl4_0));
|
||||
s.set_rand_sl1_1(rand_sl1_1);
|
||||
s.set_rand_sl2_1(pack_l2(rand_sl2_1));
|
||||
s.set_rand_sl3_1(pack_l3(rand_sl3_1));
|
||||
s.set_rand_sl4_1(pack_l4(rand_sl4_1));
|
||||
s.set_rand_uc1_0(rand_uc1_0);
|
||||
s.set_rand_uc2_0(pack_s2(rand_uc2_0));
|
||||
s.set_rand_uc3_0(pack_s3(rand_uc3_0));
|
||||
s.set_rand_uc4_0(pack_s4(rand_uc4_0));
|
||||
s.set_rand_sc1_0(rand_sc1_0);
|
||||
s.set_rand_sc2_0(pack_b2(rand_sc2_0));
|
||||
s.set_rand_sc3_0(pack_b3(rand_sc3_0));
|
||||
s.set_rand_sc4_0(pack_b4(rand_sc4_0));
|
||||
s.set_rand_sc1_1(rand_sc1_1);
|
||||
s.set_rand_sc2_1(pack_b2(rand_sc2_1));
|
||||
s.set_rand_sc3_1(pack_b3(rand_sc3_1));
|
||||
s.set_rand_sc4_1(pack_b4(rand_sc4_1));
|
||||
// TODO: set unsigned long vectors
|
||||
|
||||
// Set results for min
|
||||
s.set_min_rand_f1_f1(min(rand_f1_0, rand_f1_1));
|
||||
s.set_min_rand_f2_f2(pack_f2(min(rand_f2_0, rand_f2_1)));
|
||||
s.set_min_rand_f3_f3(pack_f3(min(rand_f3_0, rand_f3_1)));
|
||||
s.set_min_rand_f4_f4(pack_f4(min(rand_f4_0, rand_f4_1)));
|
||||
s.set_min_rand_uc1_uc1(min(rand_uc1_0, rand_uc1_1));
|
||||
s.set_min_rand_uc2_uc2(pack_s2(min(rand_uc2_0, rand_uc2_1)));
|
||||
s.set_min_rand_uc3_uc3(pack_s3(min(rand_uc3_0, rand_uc3_1)));
|
||||
s.set_min_rand_uc4_uc4(pack_s4(min(rand_uc4_0, rand_uc4_1)));
|
||||
s.set_min_rand_ss1_ss1(min(rand_ss1_0, rand_ss1_1));
|
||||
s.set_min_rand_ss2_ss2(pack_s2(min(rand_ss2_0, rand_ss2_1)));
|
||||
s.set_min_rand_ss3_ss3(pack_s3(min(rand_ss3_0, rand_ss3_1)));
|
||||
s.set_min_rand_ss4_ss4(pack_s4(min(rand_ss4_0, rand_ss4_1)));
|
||||
s.set_min_rand_us1_us1(min(rand_us1_0, rand_us1_1));
|
||||
s.set_min_rand_us2_us2(pack_i2(min(rand_us2_0, rand_us2_1)));
|
||||
s.set_min_rand_us3_us3(pack_i3(min(rand_us3_0, rand_us3_1)));
|
||||
s.set_min_rand_us4_us4(pack_i4(min(rand_us4_0, rand_us4_1)));
|
||||
s.set_min_rand_si1_si1(min(rand_si1_0, rand_si1_1));
|
||||
s.set_min_rand_si2_si2(pack_i2(min(rand_si2_0, rand_si2_1)));
|
||||
s.set_min_rand_si3_si3(pack_i3(min(rand_si3_0, rand_si3_1)));
|
||||
s.set_min_rand_si4_si4(pack_i4(min(rand_si4_0, rand_si4_1)));
|
||||
s.set_min_rand_ui1_ui1(min(rand_ui1_0, rand_ui1_1));
|
||||
s.set_min_rand_ui2_ui2(pack_l2(min(rand_ui2_0, rand_ui2_1)));
|
||||
s.set_min_rand_ui3_ui3(pack_l3(min(rand_ui3_0, rand_ui3_1)));
|
||||
s.set_min_rand_ui4_ui4(pack_l4(min(rand_ui4_0, rand_ui4_1)));
|
||||
s.set_min_rand_sl1_sl1(min(rand_sl1_0, rand_sl1_1));
|
||||
s.set_min_rand_sl2_sl2(pack_l2(min(rand_sl2_0, rand_sl2_1)));
|
||||
s.set_min_rand_sl3_sl3(pack_l3(min(rand_sl3_0, rand_sl3_1)));
|
||||
s.set_min_rand_sl4_sl4(pack_l4(min(rand_sl4_0, rand_sl4_1)));
|
||||
s.set_min_rand_sc1_sc1(min(rand_sc1_0, rand_sc1_1));
|
||||
s.set_min_rand_sc2_sc2(pack_b2(min(rand_sc2_0, rand_sc2_1)));
|
||||
s.set_min_rand_sc3_sc3(pack_b3(min(rand_sc3_0, rand_sc3_1)));
|
||||
s.set_min_rand_sc4_sc4(pack_b4(min(rand_sc4_0, rand_sc4_1)));
|
||||
// TODO: set results for unsigned long min
|
||||
|
||||
// Set results for max
|
||||
s.set_max_rand_f1_f1(max(rand_f1_0, rand_f1_1));
|
||||
s.set_max_rand_f2_f2(pack_f2(max(rand_f2_0, rand_f2_1)));
|
||||
s.set_max_rand_f3_f3(pack_f3(max(rand_f3_0, rand_f3_1)));
|
||||
s.set_max_rand_f4_f4(pack_f4(max(rand_f4_0, rand_f4_1)));
|
||||
s.set_max_rand_uc1_uc1(max(rand_uc1_0, rand_uc1_1));
|
||||
s.set_max_rand_uc2_uc2(pack_s2(max(rand_uc2_0, rand_uc2_1)));
|
||||
s.set_max_rand_uc3_uc3(pack_s3(max(rand_uc3_0, rand_uc3_1)));
|
||||
s.set_max_rand_uc4_uc4(pack_s4(max(rand_uc4_0, rand_uc4_1)));
|
||||
s.set_max_rand_ss1_ss1(max(rand_ss1_0, rand_ss1_1));
|
||||
s.set_max_rand_ss2_ss2(pack_s2(max(rand_ss2_0, rand_ss2_1)));
|
||||
s.set_max_rand_ss3_ss3(pack_s3(max(rand_ss3_0, rand_ss3_1)));
|
||||
s.set_max_rand_ss4_ss4(pack_s4(max(rand_ss4_0, rand_ss4_1)));
|
||||
s.set_max_rand_us1_us1(max(rand_us1_0, rand_us1_1));
|
||||
s.set_max_rand_us2_us2(pack_i2(max(rand_us2_0, rand_us2_1)));
|
||||
s.set_max_rand_us3_us3(pack_i3(max(rand_us3_0, rand_us3_1)));
|
||||
s.set_max_rand_us4_us4(pack_i4(max(rand_us4_0, rand_us4_1)));
|
||||
s.set_max_rand_si1_si1(max(rand_si1_0, rand_si1_1));
|
||||
s.set_max_rand_si2_si2(pack_i2(max(rand_si2_0, rand_si2_1)));
|
||||
s.set_max_rand_si3_si3(pack_i3(max(rand_si3_0, rand_si3_1)));
|
||||
s.set_max_rand_si4_si4(pack_i4(max(rand_si4_0, rand_si4_1)));
|
||||
s.set_max_rand_ui1_ui1(max(rand_ui1_0, rand_ui1_1));
|
||||
s.set_max_rand_ui2_ui2(pack_l2(max(rand_ui2_0, rand_ui2_1)));
|
||||
s.set_max_rand_ui3_ui3(pack_l3(max(rand_ui3_0, rand_ui3_1)));
|
||||
s.set_max_rand_ui4_ui4(pack_l4(max(rand_ui4_0, rand_ui4_1)));
|
||||
s.set_max_rand_sl1_sl1(max(rand_sl1_0, rand_sl1_1));
|
||||
s.set_max_rand_sl2_sl2(pack_l2(max(rand_sl2_0, rand_sl2_1)));
|
||||
s.set_max_rand_sl3_sl3(pack_l3(max(rand_sl3_0, rand_sl3_1)));
|
||||
s.set_max_rand_sl4_sl4(pack_l4(max(rand_sl4_0, rand_sl4_1)));
|
||||
s.set_max_rand_sc1_sc1(max(rand_sc1_0, rand_sc1_1));
|
||||
s.set_max_rand_sc2_sc2(pack_b2(max(rand_sc2_0, rand_sc2_1)));
|
||||
s.set_max_rand_sc3_sc3(pack_b3(max(rand_sc3_0, rand_sc3_1)));
|
||||
s.set_max_rand_sc4_sc4(pack_b4(max(rand_sc4_0, rand_sc4_1)));
|
||||
|
||||
// TODO: set results for unsigned long max
|
||||
|
||||
// Set results for fmin
|
||||
s.set_fmin_rand_f1_f1(fmin(rand_f1_0, rand_f1_1));
|
||||
s.set_fmin_rand_f2_f2(pack_f2(fmin(rand_f2_0, rand_f2_1)));
|
||||
s.set_fmin_rand_f3_f3(pack_f3(fmin(rand_f3_0, rand_f3_1)));
|
||||
s.set_fmin_rand_f4_f4(pack_f4(fmin(rand_f4_0, rand_f4_1)));
|
||||
s.set_fmin_rand_f2_f1(pack_f2(fmin(rand_f2_0, rand_f1_1)));
|
||||
s.set_fmin_rand_f3_f1(pack_f3(fmin(rand_f3_0, rand_f1_1)));
|
||||
s.set_fmin_rand_f4_f1(pack_f4(fmin(rand_f4_0, rand_f1_1)));
|
||||
|
||||
// Set results for fmax
|
||||
s.set_fmax_rand_f1_f1(fmax(rand_f1_0, rand_f1_1));
|
||||
s.set_fmax_rand_f2_f2(pack_f2(fmax(rand_f2_0, rand_f2_1)));
|
||||
s.set_fmax_rand_f3_f3(pack_f3(fmax(rand_f3_0, rand_f3_1)));
|
||||
s.set_fmax_rand_f4_f4(pack_f4(fmax(rand_f4_0, rand_f4_1)));
|
||||
s.set_fmax_rand_f2_f1(pack_f2(fmax(rand_f2_0, rand_f1_1)));
|
||||
s.set_fmax_rand_f3_f1(pack_f3(fmax(rand_f3_0, rand_f1_1)));
|
||||
s.set_fmax_rand_f4_f1(pack_f4(fmax(rand_f4_0, rand_f1_1)));
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
ScriptC_math_agree s = new ScriptC_math_agree(pRS);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
initializeValues(s);
|
||||
s.invoke_math_agree_test();
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
|
||||
public class UT_math_conformance extends UnitTest {
|
||||
private Resources mRes;
|
||||
|
||||
protected UT_math_conformance(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "Math Conformance", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
ScriptC_math_conformance s =
|
||||
new ScriptC_math_conformance(pRS);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
s.invoke_math_conformance_test();
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
passTest();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
|
||||
public class UT_min extends UnitTest {
|
||||
private Resources mRes;
|
||||
|
||||
protected UT_min(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "Min (relaxed)", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
ScriptC_min s = new ScriptC_min(pRS);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
s.invoke_min_test();
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Copyright (C) 2011-2013 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.support.v8.renderscript.*;
|
||||
|
||||
public class UT_noroot extends UnitTest {
|
||||
private Resources mRes;
|
||||
private Allocation A;
|
||||
|
||||
protected UT_noroot(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "ForEach (no root)", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
private void initializeGlobals(RenderScript RS, ScriptC_noroot s) {
|
||||
Type.Builder typeBuilder = new Type.Builder(RS, Element.I32(RS));
|
||||
int X = 5;
|
||||
int Y = 7;
|
||||
s.set_dimX(X);
|
||||
s.set_dimY(Y);
|
||||
typeBuilder.setX(X).setY(Y);
|
||||
A = Allocation.createTyped(RS, typeBuilder.create());
|
||||
s.bind_a(A);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
ScriptC_noroot s = new ScriptC_noroot(pRS);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
initializeGlobals(pRS, s);
|
||||
s.forEach_foo(A, A);
|
||||
s.invoke_verify_foo();
|
||||
s.invoke_noroot_test();
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
|
||||
public class UT_primitives extends UnitTest {
|
||||
private Resources mRes;
|
||||
|
||||
protected UT_primitives(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "Primitives", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
private boolean initializeGlobals(ScriptC_primitives s) {
|
||||
float pF = s.get_floatTest();
|
||||
if (pF != 1.99f) {
|
||||
return false;
|
||||
}
|
||||
s.set_floatTest(2.99f);
|
||||
|
||||
double pD = s.get_doubleTest();
|
||||
if (pD != 2.05) {
|
||||
return false;
|
||||
}
|
||||
s.set_doubleTest(3.05);
|
||||
|
||||
byte pC = s.get_charTest();
|
||||
if (pC != -8) {
|
||||
return false;
|
||||
}
|
||||
s.set_charTest((byte)-16);
|
||||
|
||||
short pS = s.get_shortTest();
|
||||
if (pS != -16) {
|
||||
return false;
|
||||
}
|
||||
s.set_shortTest((short)-32);
|
||||
|
||||
int pI = s.get_intTest();
|
||||
if (pI != -32) {
|
||||
return false;
|
||||
}
|
||||
s.set_intTest(-64);
|
||||
|
||||
long pL = s.get_longTest();
|
||||
if (pL != 17179869184l) {
|
||||
return false;
|
||||
}
|
||||
s.set_longTest(17179869185l);
|
||||
|
||||
long puL = s.get_ulongTest();
|
||||
if (puL != 4611686018427387904L) {
|
||||
return false;
|
||||
}
|
||||
s.set_ulongTest(4611686018427387903L);
|
||||
|
||||
|
||||
long pLL = s.get_longlongTest();
|
||||
if (pLL != 68719476736L) {
|
||||
return false;
|
||||
}
|
||||
s.set_longlongTest(68719476735L);
|
||||
|
||||
long pu64 = s.get_uint64_tTest();
|
||||
if (pu64 != 117179869184l) {
|
||||
return false;
|
||||
}
|
||||
s.set_uint64_tTest(117179869185l);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
ScriptC_primitives s = new ScriptC_primitives(pRS);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
if (!initializeGlobals(s)) {
|
||||
failTest();
|
||||
} else {
|
||||
s.invoke_primitives_test(0, 0);
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
}
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
|
||||
public class UT_refcount extends UnitTest {
|
||||
private Resources mRes;
|
||||
|
||||
protected UT_refcount(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "Refcount", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
private void initializeGlobals(RenderScript RS, ScriptC_refcount s) {
|
||||
Type.Builder typeBuilder = new Type.Builder(RS, Element.I32(RS));
|
||||
int X = 500;
|
||||
int Y = 700;
|
||||
typeBuilder.setX(X).setY(Y);
|
||||
Allocation A = Allocation.createTyped(RS, typeBuilder.create());
|
||||
s.set_globalA(A);
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
ScriptC_refcount s = new ScriptC_refcount(pRS);
|
||||
initializeGlobals(pRS, s);
|
||||
s.invoke_refcount_test();
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
|
||||
public class UT_rsdebug extends UnitTest {
|
||||
private Resources mRes;
|
||||
|
||||
protected UT_rsdebug(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "rsDebug", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
ScriptC_rsdebug s = new ScriptC_rsdebug(pRS);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
s.invoke_test_rsdebug(0, 0);
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
|
||||
public class UT_rstime extends UnitTest {
|
||||
private Resources mRes;
|
||||
|
||||
protected UT_rstime(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "rsTime", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
ScriptC_rstime s = new ScriptC_rstime(pRS);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
s.setTimeZone("America/Los_Angeles");
|
||||
s.invoke_test_rstime(0, 0);
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
|
||||
public class UT_rstypes extends UnitTest {
|
||||
private Resources mRes;
|
||||
|
||||
protected UT_rstypes(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "rsTypes", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
ScriptC_rstypes s = new ScriptC_rstypes(pRS);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
s.invoke_test_rstypes(0, 0);
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,148 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
|
||||
public class UT_sampler extends UnitTest {
|
||||
private Resources mRes;
|
||||
|
||||
Sampler minification;
|
||||
Sampler magnification;
|
||||
Sampler wrapS;
|
||||
Sampler wrapT;
|
||||
Sampler anisotropy;
|
||||
|
||||
protected UT_sampler(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "Sampler", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
private Sampler.Builder getDefaultBuilder(RenderScript RS) {
|
||||
Sampler.Builder b = new Sampler.Builder(RS);
|
||||
b.setMinification(Sampler.Value.NEAREST);
|
||||
b.setMagnification(Sampler.Value.NEAREST);
|
||||
b.setWrapS(Sampler.Value.CLAMP);
|
||||
b.setWrapT(Sampler.Value.CLAMP);
|
||||
b.setAnisotropy(1.0f);
|
||||
return b;
|
||||
}
|
||||
|
||||
private void initializeGlobals(RenderScript RS, ScriptC_sampler s) {
|
||||
Sampler.Builder b = getDefaultBuilder(RS);
|
||||
b.setMinification(Sampler.Value.LINEAR_MIP_LINEAR);
|
||||
minification = b.create();
|
||||
|
||||
b = getDefaultBuilder(RS);
|
||||
b.setMagnification(Sampler.Value.LINEAR);
|
||||
magnification = b.create();
|
||||
|
||||
b = getDefaultBuilder(RS);
|
||||
b.setWrapS(Sampler.Value.WRAP);
|
||||
wrapS = b.create();
|
||||
|
||||
b = getDefaultBuilder(RS);
|
||||
b.setWrapT(Sampler.Value.WRAP);
|
||||
wrapT = b.create();
|
||||
|
||||
b = getDefaultBuilder(RS);
|
||||
b.setAnisotropy(8.0f);
|
||||
anisotropy = b.create();
|
||||
|
||||
s.set_minification(minification);
|
||||
s.set_magnification(magnification);
|
||||
s.set_wrapS(wrapS);
|
||||
s.set_wrapT(wrapT);
|
||||
s.set_anisotropy(anisotropy);
|
||||
}
|
||||
|
||||
private void testScriptSide(RenderScript pRS) {
|
||||
ScriptC_sampler s = new ScriptC_sampler(pRS);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
initializeGlobals(pRS, s);
|
||||
s.invoke_sampler_test();
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
}
|
||||
|
||||
private void testJavaSide(RenderScript RS) {
|
||||
_RS_ASSERT("minification.getMagnification() == Sampler.Value.NEAREST",
|
||||
minification.getMagnification() == Sampler.Value.NEAREST);
|
||||
_RS_ASSERT("minification.getMinification() == Sampler.Value.LINEAR_MIP_LINEAR",
|
||||
minification.getMinification() == Sampler.Value.LINEAR_MIP_LINEAR);
|
||||
_RS_ASSERT("minification.getWrapS() == Sampler.Value.CLAMP",
|
||||
minification.getWrapS() == Sampler.Value.CLAMP);
|
||||
_RS_ASSERT("minification.getWrapT() == Sampler.Value.CLAMP",
|
||||
minification.getWrapT() == Sampler.Value.CLAMP);
|
||||
_RS_ASSERT("minification.getAnisotropy() == 1.0f",
|
||||
minification.getAnisotropy() == 1.0f);
|
||||
|
||||
_RS_ASSERT("magnification.getMagnification() == Sampler.Value.LINEAR",
|
||||
magnification.getMagnification() == Sampler.Value.LINEAR);
|
||||
_RS_ASSERT("magnification.getMinification() == Sampler.Value.NEAREST",
|
||||
magnification.getMinification() == Sampler.Value.NEAREST);
|
||||
_RS_ASSERT("magnification.getWrapS() == Sampler.Value.CLAMP",
|
||||
magnification.getWrapS() == Sampler.Value.CLAMP);
|
||||
_RS_ASSERT("magnification.getWrapT() == Sampler.Value.CLAMP",
|
||||
magnification.getWrapT() == Sampler.Value.CLAMP);
|
||||
_RS_ASSERT("magnification.getAnisotropy() == 1.0f",
|
||||
magnification.getAnisotropy() == 1.0f);
|
||||
|
||||
_RS_ASSERT("wrapS.getMagnification() == Sampler.Value.NEAREST",
|
||||
wrapS.getMagnification() == Sampler.Value.NEAREST);
|
||||
_RS_ASSERT("wrapS.getMinification() == Sampler.Value.NEAREST",
|
||||
wrapS.getMinification() == Sampler.Value.NEAREST);
|
||||
_RS_ASSERT("wrapS.getWrapS() == Sampler.Value.WRAP",
|
||||
wrapS.getWrapS() == Sampler.Value.WRAP);
|
||||
_RS_ASSERT("wrapS.getWrapT() == Sampler.Value.CLAMP",
|
||||
wrapS.getWrapT() == Sampler.Value.CLAMP);
|
||||
_RS_ASSERT("wrapS.getAnisotropy() == 1.0f",
|
||||
wrapS.getAnisotropy() == 1.0f);
|
||||
|
||||
_RS_ASSERT("wrapT.getMagnification() == Sampler.Value.NEAREST",
|
||||
wrapT.getMagnification() == Sampler.Value.NEAREST);
|
||||
_RS_ASSERT("wrapT.getMinification() == Sampler.Value.NEAREST",
|
||||
wrapT.getMinification() == Sampler.Value.NEAREST);
|
||||
_RS_ASSERT("wrapT.getWrapS() == Sampler.Value.CLAMP",
|
||||
wrapT.getWrapS() == Sampler.Value.CLAMP);
|
||||
_RS_ASSERT("wrapT.getWrapT() == Sampler.Value.WRAP",
|
||||
wrapT.getWrapT() == Sampler.Value.WRAP);
|
||||
_RS_ASSERT("wrapT.getAnisotropy() == 1.0f",
|
||||
wrapT.getAnisotropy() == 1.0f);
|
||||
|
||||
_RS_ASSERT("anisotropy.getMagnification() == Sampler.Value.NEAREST",
|
||||
anisotropy.getMagnification() == Sampler.Value.NEAREST);
|
||||
_RS_ASSERT("anisotropy.getMinification() == Sampler.Value.NEAREST",
|
||||
anisotropy.getMinification() == Sampler.Value.NEAREST);
|
||||
_RS_ASSERT("anisotropy.getWrapS() == Sampler.Value.CLAMP",
|
||||
anisotropy.getWrapS() == Sampler.Value.CLAMP);
|
||||
_RS_ASSERT("anisotropy.getWrapT() == Sampler.Value.CLAMP",
|
||||
anisotropy.getWrapT() == Sampler.Value.CLAMP);
|
||||
_RS_ASSERT("anisotropy.getAnisotropy() == 1.0f",
|
||||
anisotropy.getAnisotropy() == 8.0f);
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
testScriptSide(pRS);
|
||||
testJavaSide(pRS);
|
||||
passTest();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
|
||||
public class UT_struct extends UnitTest {
|
||||
private Resources mRes;
|
||||
|
||||
protected UT_struct(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "Struct", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
ScriptC_struct s = new ScriptC_struct(pRS);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
|
||||
ScriptField_Point2 p = new ScriptField_Point2(pRS, 1);
|
||||
ScriptField_Point2.Item i = new ScriptField_Point2.Item();
|
||||
int val = 100;
|
||||
i.x = val;
|
||||
i.y = val;
|
||||
p.set(i, 0, true);
|
||||
s.bind_point2(p);
|
||||
s.invoke_struct_test(val);
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
|
||||
val = 200;
|
||||
p.set_x(0, val, true);
|
||||
p.set_y(0, val, true);
|
||||
s.invoke_struct_test(val);
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
|
||||
public class UT_unsigned extends UnitTest {
|
||||
private Resources mRes;
|
||||
|
||||
protected UT_unsigned(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "Unsigned", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
private boolean initializeGlobals(ScriptC_unsigned s) {
|
||||
short pUC = s.get_uc();
|
||||
if (pUC != 5) {
|
||||
return false;
|
||||
}
|
||||
s.set_uc((short)129);
|
||||
|
||||
long pUI = s.get_ui();
|
||||
if (pUI != 37) {
|
||||
return false;
|
||||
}
|
||||
s.set_ui(0x7fffffff);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
ScriptC_unsigned s = new ScriptC_unsigned(pRS);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
if (!initializeGlobals(s)) {
|
||||
failTest();
|
||||
} else {
|
||||
s.invoke_unsigned_test();
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
}
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,318 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.support.v8.renderscript.*;
|
||||
|
||||
public class UT_vector extends UnitTest {
|
||||
private Resources mRes;
|
||||
|
||||
protected UT_vector(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "Vector", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
private boolean initializeGlobals(ScriptC_vector s) {
|
||||
Float2 F2 = s.get_f2();
|
||||
if (F2.x != 1.0f || F2.y != 2.0f) {
|
||||
return false;
|
||||
}
|
||||
F2.x = 2.99f;
|
||||
F2.y = 3.99f;
|
||||
s.set_f2(F2);
|
||||
|
||||
Float3 F3 = s.get_f3();
|
||||
if (F3.x != 1.0f || F3.y != 2.0f || F3.z != 3.0f) {
|
||||
return false;
|
||||
}
|
||||
F3.x = 2.99f;
|
||||
F3.y = 3.99f;
|
||||
F3.z = 4.99f;
|
||||
s.set_f3(F3);
|
||||
|
||||
Float4 F4 = s.get_f4();
|
||||
if (F4.x != 1.0f || F4.y != 2.0f || F4.z != 3.0f || F4.w != 4.0f) {
|
||||
return false;
|
||||
}
|
||||
F4.x = 2.99f;
|
||||
F4.y = 3.99f;
|
||||
F4.z = 4.99f;
|
||||
F4.w = 5.99f;
|
||||
s.set_f4(F4);
|
||||
|
||||
Double2 D2 = s.get_d2();
|
||||
if (D2.x != 1.0 || D2.y != 2.0) {
|
||||
return false;
|
||||
}
|
||||
D2.x = 2.99;
|
||||
D2.y = 3.99;
|
||||
s.set_d2(D2);
|
||||
|
||||
Double3 D3 = s.get_d3();
|
||||
if (D3.x != 1.0 || D3.y != 2.0 || D3.z != 3.0) {
|
||||
return false;
|
||||
}
|
||||
D3.x = 2.99;
|
||||
D3.y = 3.99;
|
||||
D3.z = 4.99;
|
||||
s.set_d3(D3);
|
||||
|
||||
Double4 D4 = s.get_d4();
|
||||
if (D4.x != 1.0 || D4.y != 2.0 || D4.z != 3.0 || D4.w != 4.0) {
|
||||
return false;
|
||||
}
|
||||
D4.x = 2.99;
|
||||
D4.y = 3.99;
|
||||
D4.z = 4.99;
|
||||
D4.w = 5.99;
|
||||
s.set_d4(D4);
|
||||
|
||||
Byte2 B2 = s.get_i8_2();
|
||||
if (B2.x != 1 || B2.y != 2) {
|
||||
return false;
|
||||
}
|
||||
B2.x = 2;
|
||||
B2.y = 3;
|
||||
s.set_i8_2(B2);
|
||||
|
||||
Byte3 B3 = s.get_i8_3();
|
||||
if (B3.x != 1 || B3.y != 2 || B3.z != 3) {
|
||||
return false;
|
||||
}
|
||||
B3.x = 2;
|
||||
B3.y = 3;
|
||||
B3.z = 4;
|
||||
s.set_i8_3(B3);
|
||||
|
||||
Byte4 B4 = s.get_i8_4();
|
||||
if (B4.x != 1 || B4.y != 2 || B4.z != 3 || B4.w != 4) {
|
||||
return false;
|
||||
}
|
||||
B4.x = 2;
|
||||
B4.y = 3;
|
||||
B4.z = 4;
|
||||
B4.w = 5;
|
||||
s.set_i8_4(B4);
|
||||
|
||||
Short2 S2 = s.get_u8_2();
|
||||
if (S2.x != 1 || S2.y != 2) {
|
||||
return false;
|
||||
}
|
||||
S2.x = 2;
|
||||
S2.y = 3;
|
||||
s.set_u8_2(S2);
|
||||
|
||||
Short3 S3 = s.get_u8_3();
|
||||
if (S3.x != 1 || S3.y != 2 || S3.z != 3) {
|
||||
return false;
|
||||
}
|
||||
S3.x = 2;
|
||||
S3.y = 3;
|
||||
S3.z = 4;
|
||||
s.set_u8_3(S3);
|
||||
|
||||
Short4 S4 = s.get_u8_4();
|
||||
if (S4.x != 1 || S4.y != 2 || S4.z != 3 || S4.w != 4) {
|
||||
return false;
|
||||
}
|
||||
S4.x = 2;
|
||||
S4.y = 3;
|
||||
S4.z = 4;
|
||||
S4.w = 5;
|
||||
s.set_u8_4(S4);
|
||||
|
||||
S2 = s.get_i16_2();
|
||||
if (S2.x != 1 || S2.y != 2) {
|
||||
return false;
|
||||
}
|
||||
S2.x = 2;
|
||||
S2.y = 3;
|
||||
s.set_i16_2(S2);
|
||||
|
||||
S3 = s.get_i16_3();
|
||||
if (S3.x != 1 || S3.y != 2 || S3.z != 3) {
|
||||
return false;
|
||||
}
|
||||
S3.x = 2;
|
||||
S3.y = 3;
|
||||
S3.z = 4;
|
||||
s.set_i16_3(S3);
|
||||
|
||||
S4 = s.get_i16_4();
|
||||
if (S4.x != 1 || S4.y != 2 || S4.z != 3 || S4.w != 4) {
|
||||
return false;
|
||||
}
|
||||
S4.x = 2;
|
||||
S4.y = 3;
|
||||
S4.z = 4;
|
||||
S4.w = 5;
|
||||
s.set_i16_4(S4);
|
||||
|
||||
Int2 I2 = s.get_u16_2();
|
||||
if (I2.x != 1 || I2.y != 2) {
|
||||
return false;
|
||||
}
|
||||
I2.x = 2;
|
||||
I2.y = 3;
|
||||
s.set_u16_2(I2);
|
||||
|
||||
Int3 I3 = s.get_u16_3();
|
||||
if (I3.x != 1 || I3.y != 2 || I3.z != 3) {
|
||||
return false;
|
||||
}
|
||||
I3.x = 2;
|
||||
I3.y = 3;
|
||||
I3.z = 4;
|
||||
s.set_u16_3(I3);
|
||||
|
||||
Int4 I4 = s.get_u16_4();
|
||||
if (I4.x != 1 || I4.y != 2 || I4.z != 3 || I4.w != 4) {
|
||||
return false;
|
||||
}
|
||||
I4.x = 2;
|
||||
I4.y = 3;
|
||||
I4.z = 4;
|
||||
I4.w = 5;
|
||||
s.set_u16_4(I4);
|
||||
|
||||
I2 = s.get_i32_2();
|
||||
if (I2.x != 1 || I2.y != 2) {
|
||||
return false;
|
||||
}
|
||||
I2.x = 2;
|
||||
I2.y = 3;
|
||||
s.set_i32_2(I2);
|
||||
|
||||
I3 = s.get_i32_3();
|
||||
if (I3.x != 1 || I3.y != 2 || I3.z != 3) {
|
||||
return false;
|
||||
}
|
||||
I3.x = 2;
|
||||
I3.y = 3;
|
||||
I3.z = 4;
|
||||
s.set_i32_3(I3);
|
||||
|
||||
I4 = s.get_i32_4();
|
||||
if (I4.x != 1 || I4.y != 2 || I4.z != 3 || I4.w != 4) {
|
||||
return false;
|
||||
}
|
||||
I4.x = 2;
|
||||
I4.y = 3;
|
||||
I4.z = 4;
|
||||
I4.w = 5;
|
||||
s.set_i32_4(I4);
|
||||
|
||||
Long2 L2 = s.get_u32_2();
|
||||
if (L2.x != 1 || L2.y != 2) {
|
||||
return false;
|
||||
}
|
||||
L2.x = 2;
|
||||
L2.y = 3;
|
||||
s.set_u32_2(L2);
|
||||
|
||||
Long3 L3 = s.get_u32_3();
|
||||
if (L3.x != 1 || L3.y != 2 || L3.z != 3) {
|
||||
return false;
|
||||
}
|
||||
L3.x = 2;
|
||||
L3.y = 3;
|
||||
L3.z = 4;
|
||||
s.set_u32_3(L3);
|
||||
|
||||
Long4 L4 = s.get_u32_4();
|
||||
if (L4.x != 1 || L4.y != 2 || L4.z != 3 || L4.w != 4) {
|
||||
return false;
|
||||
}
|
||||
L4.x = 2;
|
||||
L4.y = 3;
|
||||
L4.z = 4;
|
||||
L4.w = 5;
|
||||
s.set_u32_4(L4);
|
||||
|
||||
L2 = s.get_i64_2();
|
||||
if (L2.x != 1 || L2.y != 2) {
|
||||
return false;
|
||||
}
|
||||
L2.x = 2;
|
||||
L2.y = 3;
|
||||
s.set_i64_2(L2);
|
||||
|
||||
L3 = s.get_i64_3();
|
||||
if (L3.x != 1 || L3.y != 2 || L3.z != 3) {
|
||||
return false;
|
||||
}
|
||||
L3.x = 2;
|
||||
L3.y = 3;
|
||||
L3.z = 4;
|
||||
s.set_i64_3(L3);
|
||||
|
||||
L4 = s.get_i64_4();
|
||||
if (L4.x != 1 || L4.y != 2 || L4.z != 3 || L4.w != 4) {
|
||||
return false;
|
||||
}
|
||||
L4.x = 2;
|
||||
L4.y = 3;
|
||||
L4.z = 4;
|
||||
L4.w = 5;
|
||||
s.set_i64_4(L4);
|
||||
|
||||
L2 = s.get_u64_2();
|
||||
if (L2.x != 1 || L2.y != 2) {
|
||||
return false;
|
||||
}
|
||||
L2.x = 2;
|
||||
L2.y = 3;
|
||||
s.set_u64_2(L2);
|
||||
|
||||
L3 = s.get_u64_3();
|
||||
if (L3.x != 1 || L3.y != 2 || L3.z != 3) {
|
||||
return false;
|
||||
}
|
||||
L3.x = 2;
|
||||
L3.y = 3;
|
||||
L3.z = 4;
|
||||
s.set_u64_3(L3);
|
||||
|
||||
L4 = s.get_u64_4();
|
||||
if (L4.x != 1 || L4.y != 2 || L4.z != 3 || L4.w != 4) {
|
||||
return false;
|
||||
}
|
||||
L4.x = 2;
|
||||
L4.y = 3;
|
||||
L4.z = 4;
|
||||
L4.w = 5;
|
||||
s.set_u64_4(L4);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
ScriptC_vector s = new ScriptC_vector(pRS);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
if (!initializeGlobals(s)) {
|
||||
failTest();
|
||||
} else {
|
||||
s.invoke_vector_test();
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
}
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,144 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.util.Log;
|
||||
import android.support.v8.renderscript.RenderScript.RSMessageHandler;
|
||||
|
||||
public class UnitTest extends Thread {
|
||||
public String name;
|
||||
private int result;
|
||||
private ScriptField_ListAllocs_s.Item mItem;
|
||||
private RSTestCore mRSTC;
|
||||
private boolean msgHandled;
|
||||
protected Context mCtx;
|
||||
|
||||
/* These constants must match those in shared.rsh */
|
||||
public static final int RS_MSG_TEST_PASSED = 100;
|
||||
public static final int RS_MSG_TEST_FAILED = 101;
|
||||
|
||||
private static int numTests = 0;
|
||||
public int testID;
|
||||
|
||||
protected UnitTest(RSTestCore rstc, String n, int initResult, Context ctx) {
|
||||
super();
|
||||
mRSTC = rstc;
|
||||
name = n;
|
||||
msgHandled = false;
|
||||
mCtx = ctx;
|
||||
result = initResult;
|
||||
testID = numTests++;
|
||||
}
|
||||
|
||||
protected UnitTest(RSTestCore rstc, String n, Context ctx) {
|
||||
this(rstc, n, 0, ctx);
|
||||
}
|
||||
|
||||
protected UnitTest(RSTestCore rstc, Context ctx) {
|
||||
this (rstc, "<Unknown>", ctx);
|
||||
}
|
||||
|
||||
protected UnitTest(Context ctx) {
|
||||
this (null, ctx);
|
||||
}
|
||||
|
||||
protected void _RS_ASSERT(String message, boolean b) {
|
||||
if(b == false) {
|
||||
Log.e(name, message + " FAILED");
|
||||
failTest();
|
||||
}
|
||||
}
|
||||
|
||||
private void updateUI() {
|
||||
if (mItem != null) {
|
||||
mItem.result = result;
|
||||
msgHandled = true;
|
||||
try {
|
||||
mRSTC.refreshTestResults();
|
||||
}
|
||||
catch (IllegalStateException e) {
|
||||
/* Ignore the case where our message receiver has been
|
||||
disconnected. This happens when we leave the application
|
||||
before it finishes running all of the unit tests. */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected RSMessageHandler mRsMessage = new RSMessageHandler() {
|
||||
public void run() {
|
||||
if (result == 0) {
|
||||
switch (mID) {
|
||||
case RS_MSG_TEST_PASSED:
|
||||
result = 1;
|
||||
break;
|
||||
case RS_MSG_TEST_FAILED:
|
||||
result = -1;
|
||||
break;
|
||||
default:
|
||||
RSTest.log("Unit test got unexpected message");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
updateUI();
|
||||
}
|
||||
};
|
||||
|
||||
public void waitForMessage() {
|
||||
while (!msgHandled) {
|
||||
yield();
|
||||
}
|
||||
}
|
||||
|
||||
public int getResult() {
|
||||
return result;
|
||||
}
|
||||
|
||||
public void failTest() {
|
||||
result = -1;
|
||||
updateUI();
|
||||
}
|
||||
|
||||
public void passTest() {
|
||||
if (result != -1) {
|
||||
result = 1;
|
||||
}
|
||||
updateUI();
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
String out = name;
|
||||
if (result == 1) {
|
||||
out += " - PASSED";
|
||||
}
|
||||
else if (result == -1) {
|
||||
out += " - FAILED";
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
public void setItem(ScriptField_ListAllocs_s.Item item) {
|
||||
mItem = item;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
/* This method needs to be implemented for each subclass */
|
||||
if (mRSTC != null) {
|
||||
mRSTC.refreshTestResults();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
#include "shared.rsh"
|
||||
|
||||
int *a;
|
||||
int dimX;
|
||||
int dimY;
|
||||
int dimZ;
|
||||
|
||||
rs_allocation aFaces;
|
||||
rs_allocation aLOD;
|
||||
rs_allocation aFacesLOD;
|
||||
|
||||
static bool test_alloc_dims() {
|
||||
bool failed = false;
|
||||
int i, j;
|
||||
|
||||
for (j = 0; j < dimY; j++) {
|
||||
for (i = 0; i < dimX; i++) {
|
||||
a[i + j * dimX] = i + j * dimX;
|
||||
}
|
||||
}
|
||||
|
||||
rs_allocation alloc = rsGetAllocation(a);
|
||||
_RS_ASSERT(rsAllocationGetDimX(alloc) == dimX);
|
||||
_RS_ASSERT(rsAllocationGetDimY(alloc) == dimY);
|
||||
_RS_ASSERT(rsAllocationGetDimZ(alloc) == dimZ);
|
||||
|
||||
// Test 2D addressing
|
||||
for (j = 0; j < dimY; j++) {
|
||||
for (i = 0; i < dimX; i++) {
|
||||
rsDebug("Verifying ", i + j * dimX);
|
||||
const void *p = rsGetElementAt(alloc, i, j);
|
||||
int val = *(const int *)p;
|
||||
_RS_ASSERT(val == (i + j * dimX));
|
||||
}
|
||||
}
|
||||
|
||||
// Test 1D addressing
|
||||
for (i = 0; i < dimX * dimY; i++) {
|
||||
rsDebug("Verifying ", i);
|
||||
const void *p = rsGetElementAt(alloc, i);
|
||||
int val = *(const int *)p;
|
||||
_RS_ASSERT(val == i);
|
||||
}
|
||||
|
||||
// Test 3D addressing
|
||||
for (j = 0; j < dimY; j++) {
|
||||
for (i = 0; i < dimX; i++) {
|
||||
rsDebug("Verifying ", i + j * dimX);
|
||||
const void *p = rsGetElementAt(alloc, i, j, 0);
|
||||
int val = *(const int *)p;
|
||||
_RS_ASSERT(val == (i + j * dimX));
|
||||
}
|
||||
}
|
||||
|
||||
_RS_ASSERT(rsAllocationGetDimX(aFaces) == dimX);
|
||||
_RS_ASSERT(rsAllocationGetDimY(aFaces) == dimY);
|
||||
_RS_ASSERT(rsAllocationGetDimZ(aFaces) == dimZ);
|
||||
_RS_ASSERT(rsAllocationGetDimFaces(aFaces) != 0);
|
||||
_RS_ASSERT(rsAllocationGetDimLOD(aFaces) == 0);
|
||||
|
||||
_RS_ASSERT(rsAllocationGetDimX(aLOD) == dimX);
|
||||
_RS_ASSERT(rsAllocationGetDimY(aLOD) == dimY);
|
||||
_RS_ASSERT(rsAllocationGetDimZ(aLOD) == dimZ);
|
||||
_RS_ASSERT(rsAllocationGetDimFaces(aLOD) == 0);
|
||||
_RS_ASSERT(rsAllocationGetDimLOD(aLOD) != 0);
|
||||
|
||||
_RS_ASSERT(rsAllocationGetDimX(aFacesLOD) == dimX);
|
||||
_RS_ASSERT(rsAllocationGetDimY(aFacesLOD) == dimY);
|
||||
_RS_ASSERT(rsAllocationGetDimZ(aFacesLOD) == dimZ);
|
||||
_RS_ASSERT(rsAllocationGetDimFaces(aFacesLOD) != 0);
|
||||
_RS_ASSERT(rsAllocationGetDimLOD(aFacesLOD) != 0);
|
||||
|
||||
if (failed) {
|
||||
rsDebug("test_alloc_dims FAILED", 0);
|
||||
}
|
||||
else {
|
||||
rsDebug("test_alloc_dims PASSED", 0);
|
||||
}
|
||||
|
||||
return failed;
|
||||
}
|
||||
|
||||
void alloc_test() {
|
||||
bool failed = false;
|
||||
failed |= test_alloc_dims();
|
||||
|
||||
if (failed) {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||
}
|
||||
else {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
#include "shared.rsh"
|
||||
|
||||
const int dimX = 20;
|
||||
rs_allocation a[dimX];
|
||||
|
||||
void array_alloc_test() {
|
||||
bool failed = false;
|
||||
|
||||
for (int i = 0; i < dimX; i++) {
|
||||
rsDebug("i: ", i);
|
||||
_RS_ASSERT(rsAllocationGetDimX(a[i]) == 1);
|
||||
}
|
||||
|
||||
if (failed) {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||
}
|
||||
else {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
#include "shared.rsh"
|
||||
|
||||
// Testing constant array initialization
|
||||
float fa[4] = {1.0, 9.9999f};
|
||||
double da[2] = {7.0, 8.88888};
|
||||
char ca[4] = {'a', 7, 'b', 'c'};
|
||||
short sa[4] = {1, 1, 2, 3};
|
||||
int ia[4] = {5, 8};
|
||||
long la[2] = {13, 21};
|
||||
long long lla[4] = {34};
|
||||
bool ba[3] = {true, false};
|
||||
|
||||
void array_init_test() {
|
||||
bool failed = false;
|
||||
|
||||
_RS_ASSERT(fa[0] == 1.0);
|
||||
_RS_ASSERT(fa[1] == 9.9999f);
|
||||
_RS_ASSERT(fa[2] == 0);
|
||||
_RS_ASSERT(fa[3] == 0);
|
||||
|
||||
_RS_ASSERT(da[0] == 7.0);
|
||||
_RS_ASSERT(da[1] == 8.88888);
|
||||
|
||||
_RS_ASSERT(ca[0] == 'a');
|
||||
_RS_ASSERT(ca[1] == 7);
|
||||
_RS_ASSERT(ca[2] == 'b');
|
||||
_RS_ASSERT(ca[3] == 'c');
|
||||
|
||||
_RS_ASSERT(sa[0] == 1);
|
||||
_RS_ASSERT(sa[1] == 1);
|
||||
_RS_ASSERT(sa[2] == 2);
|
||||
_RS_ASSERT(sa[3] == 3);
|
||||
|
||||
_RS_ASSERT(ia[0] == 5);
|
||||
_RS_ASSERT(ia[1] == 8);
|
||||
_RS_ASSERT(ia[2] == 0);
|
||||
_RS_ASSERT(ia[3] == 0);
|
||||
|
||||
_RS_ASSERT(la[0] == 13);
|
||||
_RS_ASSERT(la[1] == 21);
|
||||
|
||||
_RS_ASSERT(lla[0] == 34);
|
||||
_RS_ASSERT(lla[1] == 0);
|
||||
_RS_ASSERT(lla[2] == 0);
|
||||
_RS_ASSERT(lla[3] == 0);
|
||||
|
||||
_RS_ASSERT(ba[0] == true);
|
||||
_RS_ASSERT(ba[1] == false);
|
||||
_RS_ASSERT(ba[2] == false);
|
||||
|
||||
if (failed) {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||
}
|
||||
else {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
#include "shared.rsh"
|
||||
|
||||
// Testing atomic operations
|
||||
static bool testUMax(uint32_t dst, uint32_t src) {
|
||||
bool failed = false;
|
||||
uint32_t old = dst;
|
||||
uint32_t expect = (dst > src ? dst : src);
|
||||
uint32_t ret = rsAtomicMax(&dst, src);
|
||||
_RS_ASSERT(old == ret);
|
||||
_RS_ASSERT(dst == expect);
|
||||
return failed;
|
||||
}
|
||||
|
||||
static bool testUMin(uint32_t dst, uint32_t src) {
|
||||
bool failed = false;
|
||||
uint32_t old = dst;
|
||||
uint32_t expect = (dst < src ? dst : src);
|
||||
uint32_t ret = rsAtomicMin(&dst, src);
|
||||
_RS_ASSERT(old == ret);
|
||||
_RS_ASSERT(dst == expect);
|
||||
return failed;
|
||||
}
|
||||
|
||||
static bool testUCas(uint32_t dst, uint32_t cmp, uint32_t swp) {
|
||||
bool failed = false;
|
||||
uint32_t old = dst;
|
||||
uint32_t expect = (dst == cmp ? swp : dst);
|
||||
uint32_t ret = rsAtomicCas(&dst, cmp, swp);
|
||||
_RS_ASSERT(old == ret);
|
||||
_RS_ASSERT(dst == expect);
|
||||
return failed;
|
||||
}
|
||||
|
||||
static bool test_atomics() {
|
||||
bool failed = false;
|
||||
|
||||
failed |= testUMax(5, 6);
|
||||
failed |= testUMax(6, 5);
|
||||
failed |= testUMax(5, 0xf0000006);
|
||||
failed |= testUMax(0xf0000006, 5);
|
||||
|
||||
failed |= testUMin(5, 6);
|
||||
failed |= testUMin(6, 5);
|
||||
failed |= testUMin(5, 0xf0000006);
|
||||
failed |= testUMin(0xf0000006, 5);
|
||||
|
||||
failed |= testUCas(4, 4, 5);
|
||||
failed |= testUCas(4, 5, 5);
|
||||
failed |= testUCas(5, 5, 4);
|
||||
failed |= testUCas(5, 4, 4);
|
||||
failed |= testUCas(0xf0000004, 0xf0000004, 0xf0000005);
|
||||
failed |= testUCas(0xf0000004, 0xf0000005, 0xf0000005);
|
||||
failed |= testUCas(0xf0000005, 0xf0000005, 0xf0000004);
|
||||
failed |= testUCas(0xf0000005, 0xf0000004, 0xf0000004);
|
||||
|
||||
if (failed) {
|
||||
rsDebug("test_atomics FAILED", 0);
|
||||
}
|
||||
else {
|
||||
rsDebug("test_atomics PASSED", 0);
|
||||
}
|
||||
|
||||
return failed;
|
||||
}
|
||||
|
||||
void atomic_test() {
|
||||
bool failed = false;
|
||||
failed |= test_atomics();
|
||||
|
||||
if (failed) {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||
}
|
||||
else {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
#include "shared.rsh"
|
||||
|
||||
char rand_sc1_0, rand_sc1_1;
|
||||
char2 rand_sc2_0, rand_sc2_1;
|
||||
|
||||
char min_rand_sc1_sc1;
|
||||
char2 min_rand_sc2_sc2;
|
||||
|
||||
static bool test_bug_char() {
|
||||
bool failed = false;
|
||||
|
||||
rsDebug("rand_sc2_0.x: ", rand_sc2_0.x);
|
||||
rsDebug("rand_sc2_0.y: ", rand_sc2_0.y);
|
||||
rsDebug("rand_sc2_1.x: ", rand_sc2_1.x);
|
||||
rsDebug("rand_sc2_1.y: ", rand_sc2_1.y);
|
||||
char temp_sc1;
|
||||
char2 temp_sc2;
|
||||
|
||||
temp_sc1 = min( rand_sc1_0, rand_sc1_1 );
|
||||
if (temp_sc1 != min_rand_sc1_sc1) {
|
||||
rsDebug("temp_sc1", temp_sc1);
|
||||
failed = true;
|
||||
}
|
||||
rsDebug("broken", 'y');
|
||||
|
||||
temp_sc2 = min( rand_sc2_0, rand_sc2_1 );
|
||||
if (temp_sc2.x != min_rand_sc2_sc2.x
|
||||
|| temp_sc2.y != min_rand_sc2_sc2.y) {
|
||||
failed = true;
|
||||
}
|
||||
|
||||
|
||||
return failed;
|
||||
}
|
||||
|
||||
void bug_char_test() {
|
||||
bool failed = false;
|
||||
failed |= test_bug_char();
|
||||
|
||||
if (failed) {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||
}
|
||||
else {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
#include "shared.rsh"
|
||||
|
||||
static bool test_clamp_vector() {
|
||||
bool failed = false;
|
||||
|
||||
float2 src2 = { 2.0f, 2.0f};
|
||||
float2 min2 = { 0.5f, -3.0f};
|
||||
float2 max2 = { 1.0f, 9.0f};
|
||||
|
||||
float2 res2 = clamp(src2, min2, max2);
|
||||
_RS_ASSERT(res2.x == 1.0f);
|
||||
_RS_ASSERT(res2.y == 2.0f);
|
||||
|
||||
|
||||
float3 src3 = { 2.0f, 2.0f, 1.0f};
|
||||
float3 min3 = { 0.5f, -3.0f, 3.0f};
|
||||
float3 max3 = { 1.0f, 9.0f, 4.0f};
|
||||
|
||||
float3 res3 = clamp(src3, min3, max3);
|
||||
_RS_ASSERT(res3.x == 1.0f);
|
||||
_RS_ASSERT(res3.y == 2.0f);
|
||||
_RS_ASSERT(res3.z == 3.0f);
|
||||
|
||||
|
||||
float4 src4 = { 2.0f, 2.0f, 1.0f, 4.0f };
|
||||
float4 min4 = { 0.5f, -3.0f, 3.0f, 4.0f };
|
||||
float4 max4 = { 1.0f, 9.0f, 4.0f, 4.0f };
|
||||
|
||||
float4 res4 = clamp(src4, min4, max4);
|
||||
_RS_ASSERT(res4.x == 1.0f);
|
||||
_RS_ASSERT(res4.y == 2.0f);
|
||||
_RS_ASSERT(res4.z == 3.0f);
|
||||
_RS_ASSERT(res4.w == 4.0f);
|
||||
|
||||
if (failed) {
|
||||
rsDebug("test_clamp_vector FAILED", 0);
|
||||
}
|
||||
else {
|
||||
rsDebug("test_clamp_vector PASSED", 0);
|
||||
}
|
||||
|
||||
return failed;
|
||||
}
|
||||
|
||||
void clamp_test() {
|
||||
bool failed = false;
|
||||
failed |= test_clamp_vector();
|
||||
|
||||
if (failed) {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||
}
|
||||
else {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
#include "clamp.rs"
|
||||
#pragma rs_fp_relaxed
|
||||
@@ -0,0 +1,19 @@
|
||||
#include "shared.rsh"
|
||||
|
||||
const float floatTest = 1.99f;
|
||||
const double doubleTest = 2.05;
|
||||
const char charTest = -8;
|
||||
const short shortTest = -16;
|
||||
const int intTest = -32;
|
||||
const long longTest = 17179869184l; // 1 << 34
|
||||
const long long longlongTest = 68719476736l; // 1 << 36
|
||||
|
||||
const uchar ucharTest = 8;
|
||||
const ushort ushortTest = 16;
|
||||
const uint uintTest = 32;
|
||||
const ulong ulongTest = 4611686018427387904L;
|
||||
const int64_t int64_tTest = -17179869184l; // - 1 << 34
|
||||
const uint64_t uint64_tTest = 117179869184l;
|
||||
|
||||
const bool boolTest = true;
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
#include "shared.rsh"
|
||||
|
||||
float4 f4 = { 2.0f, 4.0f, 6.0f, 8.0f };
|
||||
|
||||
char4 i8_4 = { -1, -2, -3, 4 };
|
||||
|
||||
static bool test_convert() {
|
||||
bool failed = false;
|
||||
|
||||
f4 = convert_float4(i8_4);
|
||||
_RS_ASSERT(f4.x == -1.0f);
|
||||
_RS_ASSERT(f4.y == -2.0f);
|
||||
_RS_ASSERT(f4.z == -3.0f);
|
||||
_RS_ASSERT(f4.w == 4.0f);
|
||||
|
||||
if (failed) {
|
||||
rsDebug("test_convert FAILED", 0);
|
||||
}
|
||||
else {
|
||||
rsDebug("test_convert PASSED", 0);
|
||||
}
|
||||
|
||||
return failed;
|
||||
}
|
||||
|
||||
void convert_test() {
|
||||
bool failed = false;
|
||||
failed |= test_convert();
|
||||
|
||||
if (failed) {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||
}
|
||||
else {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
#include "convert.rs"
|
||||
#pragma rs_fp_relaxed
|
||||
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright (C) 2012 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.
|
||||
*/
|
||||
|
||||
#include "shared.rsh"
|
||||
|
||||
void sendResult(bool pass) {
|
||||
if (pass) {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
}
|
||||
else {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
float2 __attribute((kernel)) copyFloat2(float2 i) {
|
||||
return i;
|
||||
}
|
||||
|
||||
float3 __attribute((kernel)) copyFloat3(float3 i) {
|
||||
return i;
|
||||
}
|
||||
|
||||
float4 __attribute((kernel)) copyFloat4(float4 i) {
|
||||
return i;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,156 @@
|
||||
#include "shared.rsh"
|
||||
#include "rs_graphics.rsh"
|
||||
|
||||
rs_element simpleElem;
|
||||
rs_element complexElem;
|
||||
typedef struct ComplexStruct {
|
||||
float subElem0;
|
||||
float subElem1;
|
||||
int subElem2;
|
||||
float arrayElem0[2];
|
||||
int arrayElem1[5];
|
||||
char subElem3;
|
||||
float subElem4;
|
||||
float2 subElem5;
|
||||
float3 subElem6;
|
||||
float4 subElem_7;
|
||||
} ComplexStruct_t;
|
||||
|
||||
ComplexStruct_t *complexStruct;
|
||||
|
||||
static const char *subElemNames[] = {
|
||||
"subElem0",
|
||||
"subElem1",
|
||||
"subElem2",
|
||||
"arrayElem0",
|
||||
"arrayElem1",
|
||||
"subElem3",
|
||||
"subElem4",
|
||||
"subElem5",
|
||||
"subElem6",
|
||||
"subElem_7",
|
||||
};
|
||||
|
||||
static uint32_t subElemNamesSizes[] = {
|
||||
8,
|
||||
8,
|
||||
8,
|
||||
10,
|
||||
10,
|
||||
8,
|
||||
8,
|
||||
8,
|
||||
8,
|
||||
9,
|
||||
};
|
||||
|
||||
static uint32_t subElemArraySizes[] = {
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
2,
|
||||
5,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
};
|
||||
|
||||
static void resetStruct() {
|
||||
uint8_t *bytePtr = (uint8_t*)complexStruct;
|
||||
uint32_t sizeOfStruct = sizeof(*complexStruct);
|
||||
for(uint32_t i = 0; i < sizeOfStruct; i ++) {
|
||||
bytePtr[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static bool equals(const char *name0, const char * name1, uint32_t len) {
|
||||
for (uint32_t i = 0; i < len; i ++) {
|
||||
if (name0[i] != name1[i]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool test_element_getters() {
|
||||
bool failed = false;
|
||||
|
||||
uint32_t subElemOffsets[10];
|
||||
uint32_t index = 0;
|
||||
subElemOffsets[index++] = (uint32_t)&complexStruct->subElem0 - (uint32_t)complexStruct;
|
||||
subElemOffsets[index++] = (uint32_t)&complexStruct->subElem1 - (uint32_t)complexStruct;
|
||||
subElemOffsets[index++] = (uint32_t)&complexStruct->subElem2 - (uint32_t)complexStruct;
|
||||
subElemOffsets[index++] = (uint32_t)&complexStruct->arrayElem0 - (uint32_t)complexStruct;
|
||||
subElemOffsets[index++] = (uint32_t)&complexStruct->arrayElem1 - (uint32_t)complexStruct;
|
||||
subElemOffsets[index++] = (uint32_t)&complexStruct->subElem3 - (uint32_t)complexStruct;
|
||||
subElemOffsets[index++] = (uint32_t)&complexStruct->subElem4 - (uint32_t)complexStruct;
|
||||
subElemOffsets[index++] = (uint32_t)&complexStruct->subElem5 - (uint32_t)complexStruct;
|
||||
subElemOffsets[index++] = (uint32_t)&complexStruct->subElem6 - (uint32_t)complexStruct;
|
||||
subElemOffsets[index++] = (uint32_t)&complexStruct->subElem_7 - (uint32_t)complexStruct;
|
||||
|
||||
uint32_t subElemCount = rsElementGetSubElementCount(simpleElem);
|
||||
_RS_ASSERT(subElemCount == 0);
|
||||
_RS_ASSERT(rsElementGetDataType(simpleElem) == RS_TYPE_FLOAT_32);
|
||||
_RS_ASSERT(rsElementGetVectorSize(simpleElem) == 3);
|
||||
|
||||
subElemCount = rsElementGetSubElementCount(complexElem);
|
||||
_RS_ASSERT(subElemCount == 10);
|
||||
_RS_ASSERT(rsElementGetDataType(complexElem) == RS_TYPE_NONE);
|
||||
_RS_ASSERT(rsElementGetVectorSize(complexElem) == 1);
|
||||
_RS_ASSERT(rsElementGetBytesSize(complexElem) == sizeof(*complexStruct));
|
||||
|
||||
char buffer[64];
|
||||
for (uint32_t i = 0; i < subElemCount; i ++) {
|
||||
rs_element subElem = rsElementGetSubElement(complexElem, i);
|
||||
_RS_ASSERT(rsIsObject(subElem));
|
||||
|
||||
_RS_ASSERT(rsElementGetSubElementNameLength(complexElem, i) == subElemNamesSizes[i] + 1);
|
||||
|
||||
uint32_t written = rsElementGetSubElementName(complexElem, i, buffer, 64);
|
||||
_RS_ASSERT(written == subElemNamesSizes[i]);
|
||||
_RS_ASSERT(equals(buffer, subElemNames[i], written));
|
||||
|
||||
_RS_ASSERT(rsElementGetSubElementArraySize(complexElem, i) == subElemArraySizes[i]);
|
||||
_RS_ASSERT(rsElementGetSubElementOffsetBytes(complexElem, i) == subElemOffsets[i]);
|
||||
}
|
||||
|
||||
// Tests error checking
|
||||
rs_element subElem = rsElementGetSubElement(complexElem, subElemCount);
|
||||
_RS_ASSERT(!rsIsObject(subElem));
|
||||
|
||||
_RS_ASSERT(rsElementGetSubElementNameLength(complexElem, subElemCount) == 0);
|
||||
|
||||
_RS_ASSERT(rsElementGetSubElementName(complexElem, subElemCount, buffer, 64) == 0);
|
||||
_RS_ASSERT(rsElementGetSubElementName(complexElem, 0, NULL, 64) == 0);
|
||||
_RS_ASSERT(rsElementGetSubElementName(complexElem, 0, buffer, 0) == 0);
|
||||
uint32_t written = rsElementGetSubElementName(complexElem, 0, buffer, 5);
|
||||
_RS_ASSERT(written == 4);
|
||||
_RS_ASSERT(buffer[4] == '\0');
|
||||
|
||||
_RS_ASSERT(rsElementGetSubElementArraySize(complexElem, subElemCount) == 0);
|
||||
_RS_ASSERT(rsElementGetSubElementOffsetBytes(complexElem, subElemCount) == 0);
|
||||
|
||||
if (failed) {
|
||||
rsDebug("test_element_getters FAILED", 0);
|
||||
}
|
||||
else {
|
||||
rsDebug("test_element_getters PASSED", 0);
|
||||
}
|
||||
|
||||
return failed;
|
||||
}
|
||||
|
||||
void element_test() {
|
||||
bool failed = false;
|
||||
failed |= test_element_getters();
|
||||
|
||||
if (failed) {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||
}
|
||||
else {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
#include "shared.rsh"
|
||||
|
||||
int *a;
|
||||
int dimX;
|
||||
int dimY;
|
||||
static bool failed = false;
|
||||
|
||||
void root(int *out, uint32_t x, uint32_t y) {
|
||||
*out = x + y * dimX;
|
||||
}
|
||||
|
||||
void foo(const int *in, int *out, uint32_t x, uint32_t y) {
|
||||
_RS_ASSERT(*in == (x + y * dimX));
|
||||
*out = 99 + x + y * dimX;
|
||||
_RS_ASSERT(*out == (99 + x + y * dimX));
|
||||
}
|
||||
|
||||
static bool test_root_output() {
|
||||
bool failed = false;
|
||||
int i, j;
|
||||
|
||||
for (j = 0; j < dimY; j++) {
|
||||
for (i = 0; i < dimX; i++) {
|
||||
_RS_ASSERT(a[i + j * dimX] == (i + j * dimX));
|
||||
}
|
||||
}
|
||||
|
||||
if (failed) {
|
||||
rsDebug("test_root_output FAILED", 0);
|
||||
}
|
||||
else {
|
||||
rsDebug("test_root_output PASSED", 0);
|
||||
}
|
||||
|
||||
return failed;
|
||||
}
|
||||
|
||||
static bool test_foo_output() {
|
||||
bool failed = false;
|
||||
int i, j;
|
||||
|
||||
for (j = 0; j < dimY; j++) {
|
||||
for (i = 0; i < dimX; i++) {
|
||||
_RS_ASSERT(a[i + j * dimX] == (99 + i + j * dimX));
|
||||
}
|
||||
}
|
||||
|
||||
if (failed) {
|
||||
rsDebug("test_foo_output FAILED", 0);
|
||||
}
|
||||
else {
|
||||
rsDebug("test_foo_output PASSED", 0);
|
||||
}
|
||||
|
||||
return failed;
|
||||
}
|
||||
|
||||
void verify_root() {
|
||||
failed |= test_root_output();
|
||||
}
|
||||
|
||||
void verify_foo() {
|
||||
failed |= test_foo_output();
|
||||
}
|
||||
|
||||
void foreach_test() {
|
||||
if (failed) {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||
}
|
||||
else {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
#include "shared.rsh"
|
||||
|
||||
int *a;
|
||||
int dimX;
|
||||
int dimY;
|
||||
int xStart = 0;
|
||||
int xEnd = 0;
|
||||
int yStart = 0;
|
||||
int yEnd = 0;
|
||||
|
||||
rs_script s;
|
||||
rs_allocation ain;
|
||||
rs_allocation aout;
|
||||
|
||||
void root(int *out, uint32_t x, uint32_t y) {
|
||||
*out = x + y * dimX;
|
||||
}
|
||||
|
||||
int __attribute__((kernel)) zero() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool test_root_output() {
|
||||
bool failed = false;
|
||||
int i, j;
|
||||
|
||||
for (j = 0; j < dimY; j++) {
|
||||
for (i = 0; i < dimX; i++) {
|
||||
rsDebug("i: ", i);
|
||||
rsDebug("j: ", j);
|
||||
rsDebug("a[j][i]: ", a[i + j * dimX]);
|
||||
if (i < xStart || i >= xEnd || j < yStart || j >= yEnd) {
|
||||
_RS_ASSERT(a[i + j * dimX] == 0);
|
||||
} else {
|
||||
_RS_ASSERT(a[i + j * dimX] == (i + j * dimX));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (failed) {
|
||||
rsDebug("test_root_output FAILED", 0);
|
||||
}
|
||||
else {
|
||||
rsDebug("test_root_output PASSED", 0);
|
||||
}
|
||||
|
||||
return failed;
|
||||
}
|
||||
|
||||
void foreach_bounds_test() {
|
||||
static bool failed = false;
|
||||
|
||||
rs_script_call_t rssc = {0};
|
||||
rssc.strategy = RS_FOR_EACH_STRATEGY_DONT_CARE;
|
||||
rssc.xStart = xStart;
|
||||
rssc.xEnd = xEnd;
|
||||
rssc.yStart = yStart;
|
||||
rssc.yEnd = yEnd;
|
||||
|
||||
rsForEach(s, ain, aout, NULL, 0, &rssc);
|
||||
|
||||
failed |= test_root_output();
|
||||
|
||||
if (failed) {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||
}
|
||||
else {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,174 @@
|
||||
#include "shared.rsh"
|
||||
|
||||
const int TEST_COUNT = 1;
|
||||
|
||||
static float data_f1[1025];
|
||||
static float4 data_f4[1025];
|
||||
|
||||
static void test_mad4(uint32_t index) {
|
||||
start();
|
||||
|
||||
float total = 0;
|
||||
// Do ~1 billion ops
|
||||
for (int ct=0; ct < 1000 * (1000 / 80); ct++) {
|
||||
for (int i=0; i < (1000); i++) {
|
||||
data_f4[i] = (data_f4[i] * 0.02f +
|
||||
data_f4[i+1] * 0.04f +
|
||||
data_f4[i+2] * 0.05f +
|
||||
data_f4[i+3] * 0.1f +
|
||||
data_f4[i+4] * 0.2f +
|
||||
data_f4[i+5] * 0.2f +
|
||||
data_f4[i+6] * 0.1f +
|
||||
data_f4[i+7] * 0.05f +
|
||||
data_f4[i+8] * 0.04f +
|
||||
data_f4[i+9] * 0.02f + 1.f);
|
||||
}
|
||||
}
|
||||
|
||||
float time = end(index);
|
||||
rsDebug("fp_mad4 M ops", 1000.f / time);
|
||||
}
|
||||
|
||||
static void test_mad(uint32_t index) {
|
||||
start();
|
||||
|
||||
float total = 0;
|
||||
// Do ~1 billion ops
|
||||
for (int ct=0; ct < 1000 * (1000 / 20); ct++) {
|
||||
for (int i=0; i < (1000); i++) {
|
||||
data_f1[i] = (data_f1[i] * 0.02f +
|
||||
data_f1[i+1] * 0.04f +
|
||||
data_f1[i+2] * 0.05f +
|
||||
data_f1[i+3] * 0.1f +
|
||||
data_f1[i+4] * 0.2f +
|
||||
data_f1[i+5] * 0.2f +
|
||||
data_f1[i+6] * 0.1f +
|
||||
data_f1[i+7] * 0.05f +
|
||||
data_f1[i+8] * 0.04f +
|
||||
data_f1[i+9] * 0.02f + 1.f);
|
||||
}
|
||||
}
|
||||
|
||||
float time = end(index);
|
||||
rsDebug("fp_mad M ops", 1000.f / time);
|
||||
}
|
||||
|
||||
static void test_norm(uint32_t index) {
|
||||
start();
|
||||
|
||||
float total = 0;
|
||||
// Do ~10 M ops
|
||||
for (int ct=0; ct < 1000 * 10; ct++) {
|
||||
for (int i=0; i < (1000); i++) {
|
||||
data_f4[i] = normalize(data_f4[i]);
|
||||
}
|
||||
}
|
||||
|
||||
float time = end(index);
|
||||
rsDebug("fp_norm M ops", 10.f / time);
|
||||
}
|
||||
|
||||
static void test_sincos4(uint32_t index) {
|
||||
start();
|
||||
|
||||
float total = 0;
|
||||
// Do ~10 M ops
|
||||
for (int ct=0; ct < 1000 * 10 / 4; ct++) {
|
||||
for (int i=0; i < (1000); i++) {
|
||||
data_f4[i] = sin(data_f4[i]) * cos(data_f4[i]);
|
||||
}
|
||||
}
|
||||
|
||||
float time = end(index);
|
||||
rsDebug("fp_sincos4 M ops", 10.f / time);
|
||||
}
|
||||
|
||||
static void test_sincos(uint32_t index) {
|
||||
start();
|
||||
|
||||
float total = 0;
|
||||
// Do ~10 M ops
|
||||
for (int ct=0; ct < 1000 * 10; ct++) {
|
||||
for (int i=0; i < (1000); i++) {
|
||||
data_f1[i] = sin(data_f1[i]) * cos(data_f1[i]);
|
||||
}
|
||||
}
|
||||
|
||||
float time = end(index);
|
||||
rsDebug("fp_sincos M ops", 10.f / time);
|
||||
}
|
||||
|
||||
static void test_clamp(uint32_t index) {
|
||||
start();
|
||||
|
||||
// Do ~100 M ops
|
||||
for (int ct=0; ct < 1000 * 100; ct++) {
|
||||
for (int i=0; i < (1000); i++) {
|
||||
data_f1[i] = clamp(data_f1[i], -1.f, 1.f);
|
||||
}
|
||||
}
|
||||
|
||||
float time = end(index);
|
||||
rsDebug("fp_clamp M ops", 100.f / time);
|
||||
|
||||
start();
|
||||
// Do ~100 M ops
|
||||
for (int ct=0; ct < 1000 * 100; ct++) {
|
||||
for (int i=0; i < (1000); i++) {
|
||||
if (data_f1[i] < -1.f) data_f1[i] = -1.f;
|
||||
if (data_f1[i] > -1.f) data_f1[i] = 1.f;
|
||||
}
|
||||
}
|
||||
|
||||
time = end(index);
|
||||
rsDebug("fp_clamp ref M ops", 100.f / time);
|
||||
}
|
||||
|
||||
static void test_clamp4(uint32_t index) {
|
||||
start();
|
||||
|
||||
float total = 0;
|
||||
// Do ~100 M ops
|
||||
for (int ct=0; ct < 1000 * 100 /4; ct++) {
|
||||
for (int i=0; i < (1000); i++) {
|
||||
data_f4[i] = clamp(data_f4[i], -1.f, 1.f);
|
||||
}
|
||||
}
|
||||
|
||||
float time = end(index);
|
||||
rsDebug("fp_clamp4 M ops", 100.f / time);
|
||||
}
|
||||
|
||||
void fp_mad_test(uint32_t index, int test_num) {
|
||||
int x;
|
||||
for (x=0; x < 1025; x++) {
|
||||
data_f1[x] = (x & 0xf) * 0.1f;
|
||||
data_f4[x].x = (x & 0xf) * 0.1f;
|
||||
data_f4[x].y = (x & 0xf0) * 0.1f;
|
||||
data_f4[x].z = (x & 0x33) * 0.1f;
|
||||
data_f4[x].w = (x & 0x77) * 0.1f;
|
||||
}
|
||||
|
||||
test_mad4(index);
|
||||
test_mad(index);
|
||||
|
||||
for (x=0; x < 1025; x++) {
|
||||
data_f1[x] = (x & 0xf) * 0.1f + 1.f;
|
||||
data_f4[x].x = (x & 0xf) * 0.1f + 1.f;
|
||||
data_f4[x].y = (x & 0xf0) * 0.1f + 1.f;
|
||||
data_f4[x].z = (x & 0x33) * 0.1f + 1.f;
|
||||
data_f4[x].w = (x & 0x77) * 0.1f + 1.f;
|
||||
}
|
||||
|
||||
test_norm(index);
|
||||
test_sincos4(index);
|
||||
test_sincos(index);
|
||||
test_clamp4(index);
|
||||
test_clamp(index);
|
||||
|
||||
// TODO Actually verify test result accuracy
|
||||
rsDebug("fp_mad_test PASSED", 0);
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
#include "shared.rsh"
|
||||
#pragma rs_fp_relaxed
|
||||
|
||||
uchar4 u4 = 4;
|
||||
int4 gi4 = {2, 2, 2, 2};
|
||||
|
||||
void int4_test() {
|
||||
bool failed = false;
|
||||
int4 i4 = {u4.x, u4.y, u4.z, u4.w};
|
||||
i4 *= gi4;
|
||||
|
||||
rsDebug("i4.x", i4.x);
|
||||
rsDebug("i4.y", i4.y);
|
||||
rsDebug("i4.z", i4.z);
|
||||
rsDebug("i4.w", i4.w);
|
||||
|
||||
_RS_ASSERT(i4.x == 8);
|
||||
_RS_ASSERT(i4.y == 8);
|
||||
_RS_ASSERT(i4.z == 8);
|
||||
_RS_ASSERT(i4.w == 8);
|
||||
|
||||
if (failed) {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||
}
|
||||
else {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
#include "shared.rsh"
|
||||
|
||||
int *ain;
|
||||
int *aout;
|
||||
int dimX;
|
||||
static bool failed = false;
|
||||
|
||||
void init_vars(int *out) {
|
||||
*out = 7;
|
||||
}
|
||||
|
||||
|
||||
int __attribute__((kernel)) root(int ain, uint32_t x) {
|
||||
_RS_ASSERT(ain == 7);
|
||||
return ain + x;
|
||||
}
|
||||
|
||||
static bool test_root_output() {
|
||||
bool failed = false;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < dimX; i++) {
|
||||
_RS_ASSERT(aout[i] == (i + ain[i]));
|
||||
}
|
||||
|
||||
if (failed) {
|
||||
rsDebug("test_root_output FAILED", 0);
|
||||
}
|
||||
else {
|
||||
rsDebug("test_root_output PASSED", 0);
|
||||
}
|
||||
|
||||
return failed;
|
||||
}
|
||||
|
||||
void verify_root() {
|
||||
failed |= test_root_output();
|
||||
}
|
||||
|
||||
void kernel_test() {
|
||||
if (failed) {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||
}
|
||||
else {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
#include "shared.rsh"
|
||||
|
||||
struct simpleStruct {
|
||||
int i1;
|
||||
char ignored1;
|
||||
float f1;
|
||||
int i2;
|
||||
char ignored2;
|
||||
float f2;
|
||||
};
|
||||
|
||||
struct simpleStruct *ain;
|
||||
struct simpleStruct *aout;
|
||||
int dimX;
|
||||
static bool failed = false;
|
||||
|
||||
void init_vars(struct simpleStruct *out, uint32_t x) {
|
||||
out->i1 = 0;
|
||||
out->f1 = 0.f;
|
||||
out->i2 = 1;
|
||||
out->f2 = 1.0f;
|
||||
}
|
||||
|
||||
struct simpleStruct __attribute__((kernel))
|
||||
root(struct simpleStruct in, uint32_t x) {
|
||||
struct simpleStruct s;
|
||||
s.i1 = in.i1 + x;
|
||||
s.f1 = in.f1 + x;
|
||||
s.i2 = in.i2 + x;
|
||||
s.f2 = in.f2 + x;
|
||||
return s;
|
||||
}
|
||||
|
||||
static bool test_root_output() {
|
||||
bool failed = false;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < dimX; i++) {
|
||||
_RS_ASSERT(aout[i].i1 == (i + ain[i].i1));
|
||||
_RS_ASSERT(aout[i].f1 == (i + ain[i].f1));
|
||||
_RS_ASSERT(aout[i].i2 == (i + ain[i].i2));
|
||||
_RS_ASSERT(aout[i].f2 == (i + ain[i].f2));
|
||||
}
|
||||
|
||||
if (failed) {
|
||||
rsDebug("test_root_output FAILED", 0);
|
||||
}
|
||||
else {
|
||||
rsDebug("test_root_output PASSED", 0);
|
||||
}
|
||||
|
||||
return failed;
|
||||
}
|
||||
|
||||
void verify_root() {
|
||||
failed |= test_root_output();
|
||||
}
|
||||
|
||||
void kernel_struct_test() {
|
||||
if (failed) {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||
}
|
||||
else {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,436 @@
|
||||
#include "shared.rsh"
|
||||
|
||||
// Testing math library
|
||||
|
||||
volatile float f1;
|
||||
volatile float2 f2;
|
||||
volatile float3 f3;
|
||||
volatile float4 f4;
|
||||
|
||||
volatile int i1;
|
||||
volatile int2 i2;
|
||||
volatile int3 i3;
|
||||
volatile int4 i4;
|
||||
|
||||
volatile uint ui1;
|
||||
volatile uint2 ui2;
|
||||
volatile uint3 ui3;
|
||||
volatile uint4 ui4;
|
||||
|
||||
volatile short s1;
|
||||
volatile short2 s2;
|
||||
volatile short3 s3;
|
||||
volatile short4 s4;
|
||||
|
||||
volatile ushort us1;
|
||||
volatile ushort2 us2;
|
||||
volatile ushort3 us3;
|
||||
volatile ushort4 us4;
|
||||
|
||||
volatile char c1;
|
||||
volatile char2 c2;
|
||||
volatile char3 c3;
|
||||
volatile char4 c4;
|
||||
|
||||
volatile uchar uc1;
|
||||
volatile uchar2 uc2;
|
||||
volatile uchar3 uc3;
|
||||
volatile uchar4 uc4;
|
||||
|
||||
#define DECL_INT(prefix) \
|
||||
volatile char prefix##_c_1 = 1; \
|
||||
volatile char2 prefix##_c_2 = 1; \
|
||||
volatile char3 prefix##_c_3 = 1; \
|
||||
volatile char4 prefix##_c_4 = 1; \
|
||||
volatile uchar prefix##_uc_1 = 1; \
|
||||
volatile uchar2 prefix##_uc_2 = 1; \
|
||||
volatile uchar3 prefix##_uc_3 = 1; \
|
||||
volatile uchar4 prefix##_uc_4 = 1; \
|
||||
volatile short prefix##_s_1 = 1; \
|
||||
volatile short2 prefix##_s_2 = 1; \
|
||||
volatile short3 prefix##_s_3 = 1; \
|
||||
volatile short4 prefix##_s_4 = 1; \
|
||||
volatile ushort prefix##_us_1 = 1; \
|
||||
volatile ushort2 prefix##_us_2 = 1; \
|
||||
volatile ushort3 prefix##_us_3 = 1; \
|
||||
volatile ushort4 prefix##_us_4 = 1; \
|
||||
volatile int prefix##_i_1 = 1; \
|
||||
volatile int2 prefix##_i_2 = 1; \
|
||||
volatile int3 prefix##_i_3 = 1; \
|
||||
volatile int4 prefix##_i_4 = 1; \
|
||||
volatile uint prefix##_ui_1 = 1; \
|
||||
volatile uint2 prefix##_ui_2 = 1; \
|
||||
volatile uint3 prefix##_ui_3 = 1; \
|
||||
volatile uint4 prefix##_ui_4 = 1; \
|
||||
volatile long prefix##_l_1 = 1; \
|
||||
volatile ulong prefix##_ul_1 = 1;
|
||||
|
||||
DECL_INT(res)
|
||||
DECL_INT(src1)
|
||||
DECL_INT(src2)
|
||||
|
||||
#define TEST_INT_OP_TYPE(op, type) \
|
||||
rsDebug("Testing " #op " for " #type "1", i++); \
|
||||
res_##type##_1 = src1_##type##_1 op src2_##type##_1; \
|
||||
rsDebug("Testing " #op " for " #type "2", i++); \
|
||||
res_##type##_2 = src1_##type##_2 op src2_##type##_2; \
|
||||
rsDebug("Testing " #op " for " #type "3", i++); \
|
||||
res_##type##_3 = src1_##type##_3 op src2_##type##_3; \
|
||||
rsDebug("Testing " #op " for " #type "4", i++); \
|
||||
res_##type##_4 = src1_##type##_4 op src2_##type##_4;
|
||||
|
||||
#define TEST_INT_OP(op) \
|
||||
TEST_INT_OP_TYPE(op, c) \
|
||||
TEST_INT_OP_TYPE(op, uc) \
|
||||
TEST_INT_OP_TYPE(op, s) \
|
||||
TEST_INT_OP_TYPE(op, us) \
|
||||
TEST_INT_OP_TYPE(op, i) \
|
||||
TEST_INT_OP_TYPE(op, ui) \
|
||||
rsDebug("Testing " #op " for l1", i++); \
|
||||
res_l_1 = src1_l_1 op src2_l_1; \
|
||||
rsDebug("Testing " #op " for ul1", i++); \
|
||||
res_ul_1 = src1_ul_1 op src2_ul_1;
|
||||
|
||||
#define TEST_XN_FUNC_YN(typeout, fnc, typein) \
|
||||
res_##typeout##_1 = fnc(src1_##typein##_1); \
|
||||
res_##typeout##_2 = fnc(src1_##typein##_2); \
|
||||
res_##typeout##_3 = fnc(src1_##typein##_3); \
|
||||
res_##typeout##_4 = fnc(src1_##typein##_4);
|
||||
|
||||
#define TEST_XN_FUNC_XN_XN(type, fnc) \
|
||||
res_##type##_1 = fnc(src1_##type##_1, src2_##type##_1); \
|
||||
res_##type##_2 = fnc(src1_##type##_2, src2_##type##_2); \
|
||||
res_##type##_3 = fnc(src1_##type##_3, src2_##type##_3); \
|
||||
res_##type##_4 = fnc(src1_##type##_4, src2_##type##_4);
|
||||
|
||||
#define TEST_X_FUNC_X_X_X(type, fnc) \
|
||||
res_##type##_1 = fnc(src1_##type##_1, src2_##type##_1, src2_##type##_1);
|
||||
|
||||
#define TEST_IN_FUNC_IN(fnc) \
|
||||
rsDebug("Testing " #fnc, 0); \
|
||||
TEST_XN_FUNC_YN(uc, fnc, uc) \
|
||||
TEST_XN_FUNC_YN(c, fnc, c) \
|
||||
TEST_XN_FUNC_YN(us, fnc, us) \
|
||||
TEST_XN_FUNC_YN(s, fnc, s) \
|
||||
TEST_XN_FUNC_YN(ui, fnc, ui) \
|
||||
TEST_XN_FUNC_YN(i, fnc, i)
|
||||
|
||||
#define TEST_UIN_FUNC_IN(fnc) \
|
||||
rsDebug("Testing " #fnc, 0); \
|
||||
TEST_XN_FUNC_YN(uc, fnc, c) \
|
||||
TEST_XN_FUNC_YN(us, fnc, s) \
|
||||
TEST_XN_FUNC_YN(ui, fnc, i) \
|
||||
|
||||
#define TEST_IN_FUNC_IN_IN(fnc) \
|
||||
rsDebug("Testing " #fnc, 0); \
|
||||
TEST_XN_FUNC_XN_XN(uc, fnc) \
|
||||
TEST_XN_FUNC_XN_XN(c, fnc) \
|
||||
TEST_XN_FUNC_XN_XN(us, fnc) \
|
||||
TEST_XN_FUNC_XN_XN(s, fnc) \
|
||||
TEST_XN_FUNC_XN_XN(ui, fnc) \
|
||||
TEST_XN_FUNC_XN_XN(i, fnc)
|
||||
|
||||
#define TEST_I_FUNC_I_I_I(fnc) \
|
||||
rsDebug("Testing " #fnc, 0); \
|
||||
TEST_X_FUNC_X_X_X(uc, fnc) \
|
||||
TEST_X_FUNC_X_X_X(c, fnc) \
|
||||
TEST_X_FUNC_X_X_X(us, fnc) \
|
||||
TEST_X_FUNC_X_X_X(s, fnc) \
|
||||
TEST_X_FUNC_X_X_X(ui, fnc) \
|
||||
TEST_X_FUNC_X_X_X(i, fnc)
|
||||
|
||||
#define TEST_FN_FUNC_FN(fnc) \
|
||||
rsDebug("Testing " #fnc, 0); \
|
||||
f1 = fnc(f1); \
|
||||
f2 = fnc(f2); \
|
||||
f3 = fnc(f3); \
|
||||
f4 = fnc(f4);
|
||||
|
||||
#define TEST_FN_FUNC_FN_PFN(fnc) \
|
||||
rsDebug("Testing " #fnc, 0); \
|
||||
f1 = fnc(f1, (float*) &f1); \
|
||||
f2 = fnc(f2, (float2*) &f2); \
|
||||
f3 = fnc(f3, (float3*) &f3); \
|
||||
f4 = fnc(f4, (float4*) &f4);
|
||||
|
||||
#define TEST_FN_FUNC_FN_FN(fnc) \
|
||||
rsDebug("Testing " #fnc, 0); \
|
||||
f1 = fnc(f1, f1); \
|
||||
f2 = fnc(f2, f2); \
|
||||
f3 = fnc(f3, f3); \
|
||||
f4 = fnc(f4, f4);
|
||||
|
||||
#define TEST_F34_FUNC_F34_F34(fnc) \
|
||||
rsDebug("Testing " #fnc, 0); \
|
||||
f3 = fnc(f3, f3); \
|
||||
f4 = fnc(f4, f4);
|
||||
|
||||
#define TEST_FN_FUNC_FN_F(fnc) \
|
||||
rsDebug("Testing " #fnc, 0); \
|
||||
f1 = fnc(f1, f1); \
|
||||
f2 = fnc(f2, f1); \
|
||||
f3 = fnc(f3, f1); \
|
||||
f4 = fnc(f4, f1);
|
||||
|
||||
#define TEST_F_FUNC_FN(fnc) \
|
||||
rsDebug("Testing " #fnc, 0); \
|
||||
f1 = fnc(f1); \
|
||||
f1 = fnc(f2); \
|
||||
f1 = fnc(f3); \
|
||||
f1 = fnc(f4);
|
||||
|
||||
#define TEST_F_FUNC_FN_FN(fnc) \
|
||||
rsDebug("Testing " #fnc, 0); \
|
||||
f1 = fnc(f1, f1); \
|
||||
f1 = fnc(f2, f2); \
|
||||
f1 = fnc(f3, f3); \
|
||||
f1 = fnc(f4, f4);
|
||||
|
||||
#define TEST_FN_FUNC_FN_IN(fnc) \
|
||||
rsDebug("Testing " #fnc, 0); \
|
||||
f1 = fnc(f1, i1); \
|
||||
f2 = fnc(f2, i2); \
|
||||
f3 = fnc(f3, i3); \
|
||||
f4 = fnc(f4, i4);
|
||||
|
||||
#define TEST_FN_FUNC_FN_I(fnc) \
|
||||
rsDebug("Testing " #fnc, 0); \
|
||||
f1 = fnc(f1, i1); \
|
||||
f2 = fnc(f2, i1); \
|
||||
f3 = fnc(f3, i1); \
|
||||
f4 = fnc(f4, i1);
|
||||
|
||||
#define TEST_FN_FUNC_FN_FN_FN(fnc) \
|
||||
rsDebug("Testing " #fnc, 0); \
|
||||
f1 = fnc(f1, f1, f1); \
|
||||
f2 = fnc(f2, f2, f2); \
|
||||
f3 = fnc(f3, f3, f3); \
|
||||
f4 = fnc(f4, f4, f4);
|
||||
|
||||
#define TEST_FN_FUNC_FN_FN_F(fnc) \
|
||||
rsDebug("Testing " #fnc, 0); \
|
||||
f1 = fnc(f1, f1, f1); \
|
||||
f2 = fnc(f2, f1, f1); \
|
||||
f3 = fnc(f3, f1, f1); \
|
||||
f4 = fnc(f4, f1, f1);
|
||||
|
||||
#define TEST_FN_FUNC_FN_PIN(fnc) \
|
||||
rsDebug("Testing " #fnc, 0); \
|
||||
f1 = fnc(f1, (int*) &i1); \
|
||||
f2 = fnc(f2, (int2*) &i2); \
|
||||
f3 = fnc(f3, (int3*) &i3); \
|
||||
f4 = fnc(f4, (int4*) &i4);
|
||||
|
||||
#define TEST_FN_FUNC_FN_FN_PIN(fnc) \
|
||||
rsDebug("Testing " #fnc, 0); \
|
||||
f1 = fnc(f1, f1, (int*) &i1); \
|
||||
f2 = fnc(f2, f2, (int2*) &i2); \
|
||||
f3 = fnc(f3, f3, (int3*) &i3); \
|
||||
f4 = fnc(f4, f4, (int4*) &i4);
|
||||
|
||||
#define TEST_IN_FUNC_FN(fnc) \
|
||||
rsDebug("Testing " #fnc, 0); \
|
||||
i1 = fnc(f1); \
|
||||
i2 = fnc(f2); \
|
||||
i3 = fnc(f3); \
|
||||
i4 = fnc(f4);
|
||||
|
||||
static bool test_fp_math(uint32_t index) {
|
||||
bool failed = false;
|
||||
start();
|
||||
|
||||
TEST_FN_FUNC_FN(acos);
|
||||
TEST_FN_FUNC_FN(acosh);
|
||||
TEST_FN_FUNC_FN(acospi);
|
||||
TEST_FN_FUNC_FN(asin);
|
||||
TEST_FN_FUNC_FN(asinh);
|
||||
TEST_FN_FUNC_FN(asinpi);
|
||||
TEST_FN_FUNC_FN(atan);
|
||||
TEST_FN_FUNC_FN_FN(atan2);
|
||||
TEST_FN_FUNC_FN(atanh);
|
||||
TEST_FN_FUNC_FN(atanpi);
|
||||
TEST_FN_FUNC_FN_FN(atan2pi);
|
||||
TEST_FN_FUNC_FN(cbrt);
|
||||
TEST_FN_FUNC_FN(ceil);
|
||||
TEST_FN_FUNC_FN_FN_FN(clamp);
|
||||
TEST_FN_FUNC_FN_FN_F(clamp);
|
||||
TEST_FN_FUNC_FN_FN(copysign);
|
||||
TEST_FN_FUNC_FN(cos);
|
||||
TEST_FN_FUNC_FN(cosh);
|
||||
TEST_FN_FUNC_FN(cospi);
|
||||
TEST_F34_FUNC_F34_F34(cross);
|
||||
TEST_FN_FUNC_FN(degrees);
|
||||
TEST_F_FUNC_FN_FN(distance);
|
||||
TEST_F_FUNC_FN_FN(dot);
|
||||
TEST_FN_FUNC_FN(erfc);
|
||||
TEST_FN_FUNC_FN(erf);
|
||||
TEST_FN_FUNC_FN(exp);
|
||||
TEST_FN_FUNC_FN(exp2);
|
||||
TEST_FN_FUNC_FN(exp10);
|
||||
TEST_FN_FUNC_FN(expm1);
|
||||
TEST_FN_FUNC_FN(fabs);
|
||||
TEST_FN_FUNC_FN_FN(fdim);
|
||||
TEST_FN_FUNC_FN(floor);
|
||||
TEST_FN_FUNC_FN_FN_FN(fma);
|
||||
TEST_FN_FUNC_FN_FN(fmax);
|
||||
TEST_FN_FUNC_FN_F(fmax);
|
||||
TEST_FN_FUNC_FN_FN(fmin);
|
||||
TEST_FN_FUNC_FN_F(fmin);
|
||||
TEST_FN_FUNC_FN_FN(fmod);
|
||||
TEST_FN_FUNC_FN_PFN(fract);
|
||||
TEST_FN_FUNC_FN_PIN(frexp);
|
||||
TEST_FN_FUNC_FN_FN(hypot);
|
||||
TEST_IN_FUNC_FN(ilogb);
|
||||
TEST_FN_FUNC_FN_IN(ldexp);
|
||||
TEST_FN_FUNC_FN_I(ldexp);
|
||||
TEST_F_FUNC_FN(length);
|
||||
TEST_FN_FUNC_FN(lgamma);
|
||||
TEST_FN_FUNC_FN_PIN(lgamma);
|
||||
TEST_FN_FUNC_FN(log);
|
||||
TEST_FN_FUNC_FN(log2);
|
||||
TEST_FN_FUNC_FN(log10);
|
||||
TEST_FN_FUNC_FN(log1p);
|
||||
TEST_FN_FUNC_FN(logb);
|
||||
TEST_FN_FUNC_FN_FN_FN(mad);
|
||||
TEST_FN_FUNC_FN_FN(max);
|
||||
TEST_FN_FUNC_FN_F(max);
|
||||
TEST_FN_FUNC_FN_FN(min);
|
||||
TEST_FN_FUNC_FN_F(min);
|
||||
TEST_FN_FUNC_FN_FN_FN(mix);
|
||||
TEST_FN_FUNC_FN_FN_F(mix);
|
||||
TEST_FN_FUNC_FN_PFN(modf);
|
||||
// nan
|
||||
TEST_FN_FUNC_FN_FN(nextafter);
|
||||
TEST_FN_FUNC_FN(normalize);
|
||||
TEST_FN_FUNC_FN_FN(pow);
|
||||
TEST_FN_FUNC_FN_IN(pown);
|
||||
TEST_FN_FUNC_FN_FN(powr);
|
||||
TEST_FN_FUNC_FN(radians);
|
||||
TEST_FN_FUNC_FN_FN(remainder);
|
||||
TEST_FN_FUNC_FN_FN_PIN(remquo);
|
||||
TEST_FN_FUNC_FN(rint);
|
||||
TEST_FN_FUNC_FN_IN(rootn);
|
||||
TEST_FN_FUNC_FN(round);
|
||||
TEST_FN_FUNC_FN(rsqrt);
|
||||
TEST_FN_FUNC_FN(sign);
|
||||
TEST_FN_FUNC_FN(sin);
|
||||
TEST_FN_FUNC_FN_PFN(sincos);
|
||||
TEST_FN_FUNC_FN(sinh);
|
||||
TEST_FN_FUNC_FN(sinpi);
|
||||
TEST_FN_FUNC_FN(sqrt);
|
||||
TEST_FN_FUNC_FN_FN(step);
|
||||
TEST_FN_FUNC_FN_F(step);
|
||||
TEST_FN_FUNC_FN(tan);
|
||||
TEST_FN_FUNC_FN(tanh);
|
||||
TEST_FN_FUNC_FN(tanpi);
|
||||
TEST_FN_FUNC_FN(tgamma);
|
||||
TEST_FN_FUNC_FN(trunc);
|
||||
|
||||
float time = end(index);
|
||||
|
||||
if (failed) {
|
||||
rsDebug("test_fp_math FAILED", time);
|
||||
}
|
||||
else {
|
||||
rsDebug("test_fp_math PASSED", time);
|
||||
}
|
||||
|
||||
return failed;
|
||||
}
|
||||
|
||||
static bool test_int_math(uint32_t index) {
|
||||
bool failed = false;
|
||||
start();
|
||||
|
||||
TEST_UIN_FUNC_IN(abs);
|
||||
TEST_IN_FUNC_IN(clz);
|
||||
TEST_IN_FUNC_IN_IN(min);
|
||||
TEST_IN_FUNC_IN_IN(max);
|
||||
TEST_I_FUNC_I_I_I(rsClamp);
|
||||
|
||||
float time = end(index);
|
||||
|
||||
if (failed) {
|
||||
rsDebug("test_int_math FAILED", time);
|
||||
}
|
||||
else {
|
||||
rsDebug("test_int_math PASSED", time);
|
||||
}
|
||||
|
||||
return failed;
|
||||
}
|
||||
|
||||
static bool test_basic_operators() {
|
||||
bool failed = false;
|
||||
int i = 0;
|
||||
|
||||
TEST_INT_OP(+);
|
||||
TEST_INT_OP(-);
|
||||
TEST_INT_OP(*);
|
||||
TEST_INT_OP(/);
|
||||
TEST_INT_OP(%);
|
||||
TEST_INT_OP(<<);
|
||||
TEST_INT_OP(>>);
|
||||
|
||||
if (failed) {
|
||||
rsDebug("test_basic_operators FAILED", 0);
|
||||
}
|
||||
else {
|
||||
rsDebug("test_basic_operators PASSED", 0);
|
||||
}
|
||||
|
||||
return failed;
|
||||
}
|
||||
|
||||
#define TEST_CVT(to, from, type) \
|
||||
rsDebug("Testing convert from " #from " to " #to, 0); \
|
||||
to##1 = from##1; \
|
||||
to##2 = convert_##type##2(from##2); \
|
||||
to##3 = convert_##type##3(from##3); \
|
||||
to##4 = convert_##type##4(from##4);
|
||||
|
||||
#define TEST_CVT_MATRIX(to, type) \
|
||||
TEST_CVT(to, c, type); \
|
||||
TEST_CVT(to, uc, type); \
|
||||
TEST_CVT(to, s, type); \
|
||||
TEST_CVT(to, us, type); \
|
||||
TEST_CVT(to, i, type); \
|
||||
TEST_CVT(to, ui, type); \
|
||||
TEST_CVT(to, f, type); \
|
||||
|
||||
static bool test_convert() {
|
||||
bool failed = false;
|
||||
|
||||
TEST_CVT_MATRIX(c, char);
|
||||
TEST_CVT_MATRIX(uc, uchar);
|
||||
TEST_CVT_MATRIX(s, short);
|
||||
TEST_CVT_MATRIX(us, ushort);
|
||||
TEST_CVT_MATRIX(i, int);
|
||||
TEST_CVT_MATRIX(ui, uint);
|
||||
TEST_CVT_MATRIX(f, float);
|
||||
|
||||
if (failed) {
|
||||
rsDebug("test_convert FAILED", 0);
|
||||
}
|
||||
else {
|
||||
rsDebug("test_convert PASSED", 0);
|
||||
}
|
||||
|
||||
return failed;
|
||||
}
|
||||
|
||||
void math_test(uint32_t index, int test_num) {
|
||||
bool failed = false;
|
||||
failed |= test_convert();
|
||||
failed |= test_fp_math(index);
|
||||
failed |= test_int_math(index);
|
||||
failed |= test_basic_operators();
|
||||
|
||||
if (failed) {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||
}
|
||||
else {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,409 @@
|
||||
#include "shared.rsh"
|
||||
//#pragma rs_fp_relaxed
|
||||
|
||||
volatile float x = 0.0f;
|
||||
volatile float y = 0.0f;
|
||||
volatile float result_add = 0.0f;
|
||||
volatile float result_sub = 0.0f;
|
||||
volatile float result_mul = 0.0f;
|
||||
volatile float result_div = 0.0f;
|
||||
|
||||
#define DECLARE_INPUT_SET(type, abbrev) \
|
||||
volatile type rand_##abbrev##1_0, rand_##abbrev##1_1; \
|
||||
volatile type##2 rand_##abbrev##2_0, rand_##abbrev##2_1; \
|
||||
volatile type##3 rand_##abbrev##3_0, rand_##abbrev##3_1; \
|
||||
volatile type##4 rand_##abbrev##4_0, rand_##abbrev##4_1;
|
||||
|
||||
#define DECLARE_ALL_INPUT_SETS() \
|
||||
DECLARE_INPUT_SET(float, f); \
|
||||
DECLARE_INPUT_SET(char, sc); \
|
||||
DECLARE_INPUT_SET(uchar, uc); \
|
||||
DECLARE_INPUT_SET(short, ss); \
|
||||
DECLARE_INPUT_SET(ushort, us); \
|
||||
DECLARE_INPUT_SET(int, si); \
|
||||
DECLARE_INPUT_SET(uint, ui); \
|
||||
DECLARE_INPUT_SET(long, sl); \
|
||||
DECLARE_INPUT_SET(ulong, ul);
|
||||
|
||||
DECLARE_ALL_INPUT_SETS();
|
||||
|
||||
#define DECLARE_REFERENCE_SET_VEC_VEC(type, abbrev, func) \
|
||||
volatile type func##_rand_##abbrev##1_##abbrev##1; \
|
||||
volatile type##2 func##_rand_##abbrev##2_##abbrev##2; \
|
||||
volatile type##3 func##_rand_##abbrev##3_##abbrev##3; \
|
||||
volatile type##4 func##_rand_##abbrev##4_##abbrev##4;
|
||||
#define DECLARE_REFERENCE_SET_VEC_SCL(type, abbrev, func) \
|
||||
volatile type##2 func##_rand_##abbrev##2_##abbrev##1; \
|
||||
volatile type##3 func##_rand_##abbrev##3_##abbrev##1; \
|
||||
volatile type##4 func##_rand_##abbrev##4_##abbrev##1;
|
||||
|
||||
#define DECLARE_ALL_REFERENCE_SETS_VEC_VEC(func) \
|
||||
DECLARE_REFERENCE_SET_VEC_VEC(float, f, func); \
|
||||
DECLARE_REFERENCE_SET_VEC_VEC(char, sc, func); \
|
||||
DECLARE_REFERENCE_SET_VEC_VEC(uchar, uc, func); \
|
||||
DECLARE_REFERENCE_SET_VEC_VEC(short, ss, func); \
|
||||
DECLARE_REFERENCE_SET_VEC_VEC(ushort, us, func); \
|
||||
DECLARE_REFERENCE_SET_VEC_VEC(int, si, func); \
|
||||
DECLARE_REFERENCE_SET_VEC_VEC(uint, ui, func); \
|
||||
DECLARE_REFERENCE_SET_VEC_VEC(long, sl, func); \
|
||||
DECLARE_REFERENCE_SET_VEC_VEC(ulong, ul, func);
|
||||
|
||||
DECLARE_ALL_REFERENCE_SETS_VEC_VEC(min);
|
||||
DECLARE_ALL_REFERENCE_SETS_VEC_VEC(max);
|
||||
DECLARE_REFERENCE_SET_VEC_VEC(float, f, fmin);
|
||||
DECLARE_REFERENCE_SET_VEC_SCL(float, f, fmin);
|
||||
DECLARE_REFERENCE_SET_VEC_VEC(float, f, fmax);
|
||||
DECLARE_REFERENCE_SET_VEC_SCL(float, f, fmax);
|
||||
|
||||
static void fail_f1(float v1, float v2, float actual, float expected, char *op_name) {
|
||||
int dist = float_dist(actual, expected);
|
||||
rsDebug("float operation did not match!", op_name);
|
||||
rsDebug("v1", v1);
|
||||
rsDebug("v2", v2);
|
||||
rsDebug("Dalvik result", expected);
|
||||
rsDebug("Renderscript result", actual);
|
||||
rsDebug("ULP difference", dist);
|
||||
}
|
||||
|
||||
static void fail_f2(float2 v1, float2 v2, float2 actual, float2 expected, char *op_name) {
|
||||
int2 dist;
|
||||
dist.x = float_dist(actual.x, expected.x);
|
||||
dist.y = float_dist(actual.y, expected.y);
|
||||
rsDebug("float2 operation did not match!", op_name);
|
||||
rsDebug("v1.x", v1.x);
|
||||
rsDebug("v1.y", v1.y);
|
||||
rsDebug("v2.x", v2.x);
|
||||
rsDebug("v2.y", v2.y);
|
||||
rsDebug("Dalvik result .x", expected.x);
|
||||
rsDebug("Dalvik result .y", expected.y);
|
||||
rsDebug("Renderscript result .x", actual.x);
|
||||
rsDebug("Renderscript result .y", actual.y);
|
||||
rsDebug("ULP difference .x", dist.x);
|
||||
rsDebug("ULP difference .y", dist.y);
|
||||
}
|
||||
|
||||
static void fail_f3(float3 v1, float3 v2, float3 actual, float3 expected, char *op_name) {
|
||||
int3 dist;
|
||||
dist.x = float_dist(actual.x, expected.x);
|
||||
dist.y = float_dist(actual.y, expected.y);
|
||||
dist.z = float_dist(actual.z, expected.z);
|
||||
rsDebug("float3 operation did not match!", op_name);
|
||||
rsDebug("v1.x", v1.x);
|
||||
rsDebug("v1.y", v1.y);
|
||||
rsDebug("v1.z", v1.z);
|
||||
rsDebug("v2.x", v2.x);
|
||||
rsDebug("v2.y", v2.y);
|
||||
rsDebug("v2.z", v2.z);
|
||||
rsDebug("Dalvik result .x", expected.x);
|
||||
rsDebug("Dalvik result .y", expected.y);
|
||||
rsDebug("Dalvik result .z", expected.z);
|
||||
rsDebug("Renderscript result .x", actual.x);
|
||||
rsDebug("Renderscript result .y", actual.y);
|
||||
rsDebug("Renderscript result .z", actual.z);
|
||||
rsDebug("ULP difference .x", dist.x);
|
||||
rsDebug("ULP difference .y", dist.y);
|
||||
rsDebug("ULP difference .z", dist.z);
|
||||
}
|
||||
|
||||
static void fail_f4(float4 v1, float4 v2, float4 actual, float4 expected, char *op_name) {
|
||||
int4 dist;
|
||||
dist.x = float_dist(actual.x, expected.x);
|
||||
dist.y = float_dist(actual.y, expected.y);
|
||||
dist.z = float_dist(actual.z, expected.z);
|
||||
dist.w = float_dist(actual.w, expected.w);
|
||||
rsDebug("float4 operation did not match!", op_name);
|
||||
rsDebug("v1.x", v1.x);
|
||||
rsDebug("v1.y", v1.y);
|
||||
rsDebug("v1.z", v1.z);
|
||||
rsDebug("v1.w", v1.w);
|
||||
rsDebug("v2.x", v2.x);
|
||||
rsDebug("v2.y", v2.y);
|
||||
rsDebug("v2.z", v2.z);
|
||||
rsDebug("v2.w", v2.w);
|
||||
rsDebug("Dalvik result .x", expected.x);
|
||||
rsDebug("Dalvik result .y", expected.y);
|
||||
rsDebug("Dalvik result .z", expected.z);
|
||||
rsDebug("Dalvik result .w", expected.w);
|
||||
rsDebug("Renderscript result .x", actual.x);
|
||||
rsDebug("Renderscript result .y", actual.y);
|
||||
rsDebug("Renderscript result .z", actual.z);
|
||||
rsDebug("Renderscript result .w", actual.w);
|
||||
rsDebug("ULP difference .x", dist.x);
|
||||
rsDebug("ULP difference .y", dist.y);
|
||||
rsDebug("ULP difference .z", dist.z);
|
||||
rsDebug("ULP difference .w", dist.w);
|
||||
}
|
||||
|
||||
static bool f1_almost_equal(float a, float b) {
|
||||
return float_almost_equal(a, b);
|
||||
}
|
||||
|
||||
static bool f2_almost_equal(float2 a, float2 b) {
|
||||
return float_almost_equal(a.x, b.x) && float_almost_equal(a.y, b.y);
|
||||
}
|
||||
|
||||
|
||||
static bool f3_almost_equal(float3 a, float3 b) {
|
||||
return float_almost_equal(a.x, b.x) && float_almost_equal(a.y, b.y)
|
||||
&& float_almost_equal(a.z, b.z);
|
||||
}
|
||||
|
||||
static bool f4_almost_equal(float4 a, float4 b) {
|
||||
return float_almost_equal(a.x, b.x) && float_almost_equal(a.y, b.y)
|
||||
&& float_almost_equal(a.z, b.z) && float_almost_equal(a.w, b.w);
|
||||
}
|
||||
|
||||
#define TEST_BASIC_FLOAT_OP(op, opName) \
|
||||
temp_f1 = x op y; \
|
||||
if (! float_almost_equal(temp_f1, result_##opName)) { \
|
||||
fail_f1(x, y , temp_f1, result_##opName, #opName); \
|
||||
failed = true; \
|
||||
}
|
||||
|
||||
#define TEST_FN_FN(func, size) \
|
||||
temp_f##size = func(rand_f##size##_0, rand_f##size##_1); \
|
||||
if (! f##size##_almost_equal(temp_f##size , func##_rand_f##size##_f##size)) { \
|
||||
fail_f##size (x, y , temp_f##size, func##_rand_f##size##_f##size, #func); \
|
||||
failed = true; \
|
||||
}
|
||||
#define TEST_FN_F(func, size) \
|
||||
temp_f##size = func(rand_f##size##_0, rand_f1_1); \
|
||||
if (! f##size##_almost_equal(temp_f##size , func##_rand_f##size##_f1)) { \
|
||||
fail_f##size (x, y , temp_f##size, func##_rand_f##size##_f1 , #func); \
|
||||
failed = true; \
|
||||
}
|
||||
|
||||
#define TEST_FN_FN_ALL(func) \
|
||||
TEST_FN_FN(func, 1) \
|
||||
TEST_FN_FN(func, 2) \
|
||||
TEST_FN_FN(func, 3) \
|
||||
TEST_FN_FN(func, 4)
|
||||
#define TEST_FN_F_ALL(func) \
|
||||
TEST_FN_F(func, 2) \
|
||||
TEST_FN_F(func, 3) \
|
||||
TEST_FN_F(func, 4)
|
||||
|
||||
#define TEST_VEC1_VEC1(func, type) \
|
||||
temp_##type##1 = func( rand_##type##1_0, rand_##type##1_1 ); \
|
||||
if (temp_##type##1 != func##_rand_##type##1_##type##1) { \
|
||||
rsDebug(#func " " #type "1 operation did not match!", 0); \
|
||||
rsDebug("v1", rand_##type##1_0); \
|
||||
rsDebug("v2", rand_##type##1_1); \
|
||||
rsDebug("Dalvik result", func##_rand_##type##1_##type##1); \
|
||||
rsDebug("Renderscript result", temp_##type##1); \
|
||||
failed = true; \
|
||||
}
|
||||
#define TEST_VEC2_VEC2(func, type) \
|
||||
temp_##type##2 = func( rand_##type##2_0, rand_##type##2_1 ); \
|
||||
if (temp_##type##2 .x != func##_rand_##type##2_##type##2 .x \
|
||||
|| temp_##type##2 .y != func##_rand_##type##2_##type##2 .y) { \
|
||||
rsDebug(#func " " #type "2 operation did not match!", 0); \
|
||||
rsDebug("v1.x", rand_##type##2_0 .x); \
|
||||
rsDebug("v1.y", rand_##type##2_0 .y); \
|
||||
rsDebug("v2.x", rand_##type##2_1 .x); \
|
||||
rsDebug("v2.y", rand_##type##2_1 .y); \
|
||||
rsDebug("Dalvik result .x", func##_rand_##type##2_##type##2 .x); \
|
||||
rsDebug("Dalvik result .y", func##_rand_##type##2_##type##2 .y); \
|
||||
rsDebug("Renderscript result .x", temp_##type##2 .x); \
|
||||
rsDebug("Renderscript result .y", temp_##type##2 .y); \
|
||||
failed = true; \
|
||||
}
|
||||
#define TEST_VEC3_VEC3(func, type) \
|
||||
temp_##type##3 = func( rand_##type##3_0, rand_##type##3_1 ); \
|
||||
if (temp_##type##3 .x != func##_rand_##type##3_##type##3 .x \
|
||||
|| temp_##type##3 .y != func##_rand_##type##3_##type##3 .y \
|
||||
|| temp_##type##3 .z != func##_rand_##type##3_##type##3 .z) { \
|
||||
rsDebug(#func " " #type "3 operation did not match!", 0); \
|
||||
rsDebug("v1.x", rand_##type##3_0 .x); \
|
||||
rsDebug("v1.y", rand_##type##3_0 .y); \
|
||||
rsDebug("v1.z", rand_##type##3_0 .z); \
|
||||
rsDebug("v2.x", rand_##type##3_1 .x); \
|
||||
rsDebug("v2.y", rand_##type##3_1 .y); \
|
||||
rsDebug("v2.z", rand_##type##3_1 .z); \
|
||||
rsDebug("Dalvik result .x", func##_rand_##type##3_##type##3 .x); \
|
||||
rsDebug("Dalvik result .y", func##_rand_##type##3_##type##3 .y); \
|
||||
rsDebug("Dalvik result .z", func##_rand_##type##3_##type##3 .z); \
|
||||
rsDebug("Renderscript result .x", temp_##type##3 .x); \
|
||||
rsDebug("Renderscript result .y", temp_##type##3 .y); \
|
||||
rsDebug("Renderscript result .z", temp_##type##3 .z); \
|
||||
failed = true; \
|
||||
}
|
||||
#define TEST_VEC4_VEC4(func, type) \
|
||||
temp_##type##4 = func( rand_##type##4_0, rand_##type##4_1 ); \
|
||||
if (temp_##type##4 .x != func##_rand_##type##4_##type##4 .x \
|
||||
|| temp_##type##4 .y != func##_rand_##type##4_##type##4 .y \
|
||||
|| temp_##type##4 .z != func##_rand_##type##4_##type##4 .z \
|
||||
|| temp_##type##4 .w != func##_rand_##type##4_##type##4 .w) { \
|
||||
rsDebug(#func " " #type "4 operation did not match!", 0); \
|
||||
rsDebug("v1.x", rand_##type##4_0 .x); \
|
||||
rsDebug("v1.y", rand_##type##4_0 .y); \
|
||||
rsDebug("v1.z", rand_##type##4_0 .z); \
|
||||
rsDebug("v1.w", rand_##type##4_0 .w); \
|
||||
rsDebug("v2.x", rand_##type##4_1 .x); \
|
||||
rsDebug("v2.y", rand_##type##4_1 .y); \
|
||||
rsDebug("v2.z", rand_##type##4_1 .z); \
|
||||
rsDebug("v2.w", rand_##type##4_1 .w); \
|
||||
rsDebug("Dalvik result .x", func##_rand_##type##4_##type##4 .x); \
|
||||
rsDebug("Dalvik result .y", func##_rand_##type##4_##type##4 .y); \
|
||||
rsDebug("Dalvik result .z", func##_rand_##type##4_##type##4 .z); \
|
||||
rsDebug("Dalvik result .w", func##_rand_##type##4_##type##4 .w); \
|
||||
rsDebug("Renderscript result .x", temp_##type##4 .x); \
|
||||
rsDebug("Renderscript result .y", temp_##type##4 .y); \
|
||||
rsDebug("Renderscript result .z", temp_##type##4 .z); \
|
||||
rsDebug("Renderscript result .w", temp_##type##4 .w); \
|
||||
failed = true; \
|
||||
}
|
||||
|
||||
#define TEST_SC1_SC1(func) TEST_VEC1_VEC1(func, sc)
|
||||
#define TEST_SC2_SC2(func) TEST_VEC2_VEC2(func, sc)
|
||||
#define TEST_SC3_SC3(func) TEST_VEC3_VEC3(func, sc)
|
||||
#define TEST_SC4_SC4(func) TEST_VEC4_VEC4(func, sc)
|
||||
|
||||
#define TEST_UC1_UC1(func) TEST_VEC1_VEC1(func, uc)
|
||||
#define TEST_UC2_UC2(func) TEST_VEC2_VEC2(func, uc)
|
||||
#define TEST_UC3_UC3(func) TEST_VEC3_VEC3(func, uc)
|
||||
#define TEST_UC4_UC4(func) TEST_VEC4_VEC4(func, uc)
|
||||
|
||||
#define TEST_SS1_SS1(func) TEST_VEC1_VEC1(func, ss)
|
||||
#define TEST_SS2_SS2(func) TEST_VEC2_VEC2(func, ss)
|
||||
#define TEST_SS3_SS3(func) TEST_VEC3_VEC3(func, ss)
|
||||
#define TEST_SS4_SS4(func) TEST_VEC4_VEC4(func, ss)
|
||||
|
||||
#define TEST_US1_US1(func) TEST_VEC1_VEC1(func, us)
|
||||
#define TEST_US2_US2(func) TEST_VEC2_VEC2(func, us)
|
||||
#define TEST_US3_US3(func) TEST_VEC3_VEC3(func, us)
|
||||
#define TEST_US4_US4(func) TEST_VEC4_VEC4(func, us)
|
||||
|
||||
#define TEST_SI1_SI1(func) TEST_VEC1_VEC1(func, si)
|
||||
#define TEST_SI2_SI2(func) TEST_VEC2_VEC2(func, si)
|
||||
#define TEST_SI3_SI3(func) TEST_VEC3_VEC3(func, si)
|
||||
#define TEST_SI4_SI4(func) TEST_VEC4_VEC4(func, si)
|
||||
|
||||
#define TEST_UI1_UI1(func) TEST_VEC1_VEC1(func, ui)
|
||||
#define TEST_UI2_UI2(func) TEST_VEC2_VEC2(func, ui)
|
||||
#define TEST_UI3_UI3(func) TEST_VEC3_VEC3(func, ui)
|
||||
#define TEST_UI4_UI4(func) TEST_VEC4_VEC4(func, ui)
|
||||
|
||||
#define TEST_SL1_SL1(func) TEST_VEC1_VEC1(func, sl)
|
||||
#define TEST_SL2_SL2(func) TEST_VEC2_VEC2(func, sl)
|
||||
#define TEST_SL3_SL3(func) TEST_VEC3_VEC3(func, sl)
|
||||
#define TEST_SL4_SL4(func) TEST_VEC4_VEC4(func, sl)
|
||||
|
||||
#define TEST_UL1_UL1(func) TEST_VEC1_VEC1(func, ul)
|
||||
#define TEST_UL2_UL2(func) TEST_VEC2_VEC2(func, ul)
|
||||
#define TEST_UL3_UL3(func) TEST_VEC3_VEC3(func, ul)
|
||||
#define TEST_UL4_UL4(func) TEST_VEC4_VEC4(func, ul)
|
||||
|
||||
#define TEST_SC_SC_ALL(func) \
|
||||
TEST_SC1_SC1(func) \
|
||||
TEST_SC2_SC2(func) \
|
||||
TEST_SC3_SC3(func) \
|
||||
TEST_SC4_SC4(func)
|
||||
#define TEST_UC_UC_ALL(func) \
|
||||
TEST_UC1_UC1(func) \
|
||||
TEST_UC2_UC2(func) \
|
||||
TEST_UC3_UC3(func) \
|
||||
TEST_UC4_UC4(func)
|
||||
|
||||
#define TEST_SS_SS_ALL(func) \
|
||||
TEST_SS1_SS1(func) \
|
||||
TEST_SS2_SS2(func) \
|
||||
TEST_SS3_SS3(func) \
|
||||
TEST_SS4_SS4(func)
|
||||
#define TEST_US_US_ALL(func) \
|
||||
TEST_US1_US1(func) \
|
||||
TEST_US2_US2(func) \
|
||||
TEST_US3_US3(func) \
|
||||
TEST_US4_US4(func)
|
||||
#define TEST_SI_SI_ALL(func) \
|
||||
TEST_SI1_SI1(func) \
|
||||
TEST_SI2_SI2(func) \
|
||||
TEST_SI3_SI3(func) \
|
||||
TEST_SI4_SI4(func)
|
||||
#define TEST_UI_UI_ALL(func) \
|
||||
TEST_UI1_UI1(func) \
|
||||
TEST_UI2_UI2(func) \
|
||||
TEST_UI3_UI3(func) \
|
||||
TEST_UI4_UI4(func)
|
||||
#define TEST_SL_SL_ALL(func) \
|
||||
TEST_SL1_SL1(func) \
|
||||
TEST_SL2_SL2(func) \
|
||||
TEST_SL3_SL3(func) \
|
||||
TEST_SL4_SL4(func)
|
||||
#define TEST_UL_UL_ALL(func) \
|
||||
TEST_UL1_UL1(func) \
|
||||
TEST_UL2_UL2(func) \
|
||||
TEST_UL3_UL3(func) \
|
||||
TEST_UL4_UL4(func)
|
||||
|
||||
#define TEST_VEC_VEC_ALL(func) \
|
||||
TEST_FN_FN_ALL(func) \
|
||||
TEST_SC_SC_ALL(func) \
|
||||
TEST_UC_UC_ALL(func) \
|
||||
TEST_SS_SS_ALL(func) \
|
||||
TEST_US_US_ALL(func) \
|
||||
TEST_SI_SI_ALL(func) \
|
||||
TEST_UI_UI_ALL(func)
|
||||
|
||||
// TODO: add long types to ALL macro
|
||||
#if 0
|
||||
TEST_SL_SL_ALL(func) \
|
||||
TEST_UL_UL_ALL(func)
|
||||
#endif
|
||||
|
||||
#define DECLARE_TEMP_SET(type, abbrev) \
|
||||
volatile type temp_##abbrev##1; \
|
||||
volatile type##2 temp_##abbrev##2; \
|
||||
volatile type##3 temp_##abbrev##3; \
|
||||
volatile type##4 temp_##abbrev##4;
|
||||
|
||||
#define DECLARE_ALL_TEMP_SETS() \
|
||||
DECLARE_TEMP_SET(float, f); \
|
||||
DECLARE_TEMP_SET(char, sc); \
|
||||
DECLARE_TEMP_SET(uchar, uc); \
|
||||
DECLARE_TEMP_SET(short, ss); \
|
||||
DECLARE_TEMP_SET(ushort, us); \
|
||||
DECLARE_TEMP_SET(int, si); \
|
||||
DECLARE_TEMP_SET(uint, ui); \
|
||||
DECLARE_TEMP_SET(long, sl); \
|
||||
DECLARE_TEMP_SET(ulong, ul);
|
||||
|
||||
static bool test_math_agree() {
|
||||
bool failed = false;
|
||||
|
||||
DECLARE_ALL_TEMP_SETS();
|
||||
|
||||
TEST_BASIC_FLOAT_OP(+, add);
|
||||
TEST_BASIC_FLOAT_OP(-, sub);
|
||||
TEST_BASIC_FLOAT_OP(*, mul);
|
||||
TEST_BASIC_FLOAT_OP(/, div);
|
||||
|
||||
TEST_VEC_VEC_ALL(min);
|
||||
TEST_VEC_VEC_ALL(max);
|
||||
TEST_FN_FN_ALL(fmin);
|
||||
TEST_FN_F_ALL(fmin);
|
||||
TEST_FN_FN_ALL(fmax);
|
||||
TEST_FN_F_ALL(fmax);
|
||||
|
||||
if (failed) {
|
||||
rsDebug("test_math_agree FAILED", 0);
|
||||
}
|
||||
else {
|
||||
rsDebug("test_math_agree PASSED", 0);
|
||||
}
|
||||
|
||||
return failed;
|
||||
}
|
||||
|
||||
void math_agree_test() {
|
||||
bool failed = false;
|
||||
failed |= test_math_agree();
|
||||
|
||||
if (failed) {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||
}
|
||||
else {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
#include "shared.rsh"
|
||||
|
||||
// Testing math conformance
|
||||
|
||||
static bool test_rootn() {
|
||||
bool failed = false;
|
||||
|
||||
// rootn(x, 0) -> NaN
|
||||
_RS_ASSERT(isnan(rootn(1.0f, 0)));
|
||||
|
||||
// rootn(+/-0, n) -> +/-inf for odd n < 0
|
||||
_RS_ASSERT(isposinf(rootn(0.f, -3)));
|
||||
_RS_ASSERT(isneginf(rootn(-0.f, -3)));
|
||||
|
||||
// rootn(+/-0, n) -> +inf for even n < 0
|
||||
_RS_ASSERT(isposinf(rootn(0.f, -8)));
|
||||
_RS_ASSERT(isposinf(rootn(-0.f, -8)));
|
||||
|
||||
// rootn(+/-0, n) -> +/-0 for odd n > 0
|
||||
_RS_ASSERT(isposzero(rootn(0.f, 3)));
|
||||
_RS_ASSERT(isnegzero(rootn(-0.f, 3)));
|
||||
|
||||
// rootn(+/-0, n) -> +0 for even n > 0
|
||||
_RS_ASSERT(isposzero(rootn(0.f, 8)));
|
||||
_RS_ASSERT(isposzero(rootn(-0.f, 8)));
|
||||
|
||||
// rootn(x, n) -> NaN for x < 0 and even n
|
||||
_RS_ASSERT(isnan(rootn(-10000.f, -4)));
|
||||
_RS_ASSERT(isnan(rootn(-10000.f, 4)));
|
||||
|
||||
// rootn(x, n) -> value for x < 0 and odd n
|
||||
_RS_ASSERT(!isnan(rootn(-10000.f, -3)));
|
||||
_RS_ASSERT(!isnan(rootn(-10000.f, 3)));
|
||||
|
||||
if (failed) {
|
||||
rsDebug("test_rootn FAILED", -1);
|
||||
}
|
||||
else {
|
||||
rsDebug("test_rootn PASSED", 0);
|
||||
}
|
||||
|
||||
return failed;
|
||||
}
|
||||
|
||||
void math_conformance_test() {
|
||||
bool failed = false;
|
||||
failed |= test_rootn();
|
||||
|
||||
if (failed) {
|
||||
rsDebug("math_conformance_test FAILED", -1);
|
||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||
}
|
||||
else {
|
||||
rsDebug("math_conformance_test PASSED", 0);
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
#include "shared.rsh"
|
||||
#pragma rs_fp_relaxed
|
||||
|
||||
volatile uchar2 res_uc_2 = 1;
|
||||
volatile uchar2 src1_uc_2 = 1;
|
||||
volatile uchar2 src2_uc_2 = 1;
|
||||
|
||||
void min_test() {
|
||||
bool failed = false;
|
||||
|
||||
res_uc_2 = min(src1_uc_2, src2_uc_2);
|
||||
|
||||
if (failed) {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||
}
|
||||
else {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
#include "shared.rsh"
|
||||
|
||||
int *a;
|
||||
int dimX;
|
||||
int dimY;
|
||||
static bool failed = false;
|
||||
|
||||
void foo(const int *in, int *out, uint32_t x, uint32_t y) {
|
||||
*out = 99 + x + y * dimX;
|
||||
}
|
||||
|
||||
static bool test_foo_output() {
|
||||
bool failed = false;
|
||||
int i, j;
|
||||
|
||||
for (j = 0; j < dimY; j++) {
|
||||
for (i = 0; i < dimX; i++) {
|
||||
_RS_ASSERT(a[i + j * dimX] == (99 + i + j * dimX));
|
||||
}
|
||||
}
|
||||
|
||||
if (failed) {
|
||||
rsDebug("test_foo_output FAILED", 0);
|
||||
}
|
||||
else {
|
||||
rsDebug("test_foo_output PASSED", 0);
|
||||
}
|
||||
|
||||
return failed;
|
||||
}
|
||||
|
||||
void verify_foo() {
|
||||
failed |= test_foo_output();
|
||||
}
|
||||
|
||||
void noroot_test() {
|
||||
if (failed) {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||
}
|
||||
else {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
#include "shared.rsh"
|
||||
|
||||
// Testing primitive types
|
||||
float floatTest = 1.99f;
|
||||
double doubleTest = 2.05;
|
||||
char charTest = -8;
|
||||
short shortTest = -16;
|
||||
int intTest = -32;
|
||||
long longTest = 17179869184l; // 1 << 34
|
||||
long long longlongTest = 68719476736l; // 1 << 36
|
||||
|
||||
uchar ucharTest = 8;
|
||||
ushort ushortTest = 16;
|
||||
uint uintTest = 32;
|
||||
ulong ulongTest = 4611686018427387904L;
|
||||
int64_t int64_tTest = -17179869184l; // - 1 << 34
|
||||
uint64_t uint64_tTest = 117179869184l;
|
||||
|
||||
static bool test_primitive_types(uint32_t index) {
|
||||
bool failed = false;
|
||||
start();
|
||||
|
||||
_RS_ASSERT(floatTest == 2.99f);
|
||||
_RS_ASSERT(doubleTest == 3.05);
|
||||
_RS_ASSERT(charTest == -16);
|
||||
_RS_ASSERT(shortTest == -32);
|
||||
_RS_ASSERT(intTest == -64);
|
||||
_RS_ASSERT(longTest == 17179869185l);
|
||||
_RS_ASSERT(longlongTest == 68719476735l);
|
||||
|
||||
_RS_ASSERT(ucharTest == 8);
|
||||
_RS_ASSERT(ushortTest == 16);
|
||||
_RS_ASSERT(uintTest == 32);
|
||||
_RS_ASSERT(ulongTest == 4611686018427387903L);
|
||||
_RS_ASSERT(int64_tTest == -17179869184l);
|
||||
_RS_ASSERT(uint64_tTest == 117179869185l);
|
||||
|
||||
float time = end(index);
|
||||
|
||||
if (failed) {
|
||||
rsDebug("test_primitives FAILED", time);
|
||||
}
|
||||
else {
|
||||
rsDebug("test_primitives PASSED", time);
|
||||
}
|
||||
|
||||
return failed;
|
||||
}
|
||||
|
||||
void primitives_test(uint32_t index, int test_num) {
|
||||
bool failed = false;
|
||||
failed |= test_primitive_types(index);
|
||||
|
||||
if (failed) {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||
}
|
||||
else {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
#include "shared.rsh"
|
||||
|
||||
// Testing reference counting of RS object types
|
||||
|
||||
rs_allocation globalA;
|
||||
static rs_allocation staticGlobalA;
|
||||
|
||||
void refcount_test() {
|
||||
staticGlobalA = globalA;
|
||||
rsClearObject(&globalA);
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
#include "shared.rsh"
|
||||
|
||||
// Testing primitive types
|
||||
float floatTest = 1.99f;
|
||||
float2 float2Test = {2.99f, 12.99f};
|
||||
float3 float3Test = {3.99f, 13.99f, 23.99f};
|
||||
float4 float4Test = {4.99f, 14.99f, 24.99f, 34.99f};
|
||||
double doubleTest = 2.05;
|
||||
char charTest = -8;
|
||||
short shortTest = -16;
|
||||
int intTest = -32;
|
||||
long longTest = 17179869184l; // 1 << 34
|
||||
long long longlongTest = 68719476736l; // 1 << 36
|
||||
|
||||
uchar ucharTest = 8;
|
||||
ushort ushortTest = 16;
|
||||
uint uintTest = 32;
|
||||
ulong ulongTest = 4611686018427387904L;
|
||||
int64_t int64_tTest = -17179869184l; // - 1 << 34
|
||||
uint64_t uint64_tTest = 117179869184l;
|
||||
|
||||
static bool basic_test(uint32_t index) {
|
||||
bool failed = false;
|
||||
|
||||
// This test focuses primarily on compilation-time, not run-time.
|
||||
// For this reason, none of the outputs are actually checked.
|
||||
|
||||
rsDebug("floatTest", floatTest);
|
||||
rsDebug("float2Test", float2Test);
|
||||
rsDebug("float3Test", float3Test);
|
||||
rsDebug("float4Test", float4Test);
|
||||
rsDebug("doubleTest", doubleTest);
|
||||
rsDebug("charTest", charTest);
|
||||
rsDebug("shortTest", shortTest);
|
||||
rsDebug("intTest", intTest);
|
||||
rsDebug("longTest", longTest);
|
||||
rsDebug("longlongTest", longlongTest);
|
||||
|
||||
rsDebug("ucharTest", ucharTest);
|
||||
rsDebug("ushortTest", ushortTest);
|
||||
rsDebug("uintTest", uintTest);
|
||||
rsDebug("ulongTest", ulongTest);
|
||||
rsDebug("int64_tTest", int64_tTest);
|
||||
rsDebug("uint64_tTest", uint64_tTest);
|
||||
|
||||
return failed;
|
||||
}
|
||||
|
||||
void test_rsdebug(uint32_t index, int test_num) {
|
||||
bool failed = false;
|
||||
failed |= basic_test(index);
|
||||
|
||||
if (failed) {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||
rsDebug("rsdebug_test FAILED", -1);
|
||||
}
|
||||
else {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
rsDebug("rsdebug_test PASSED", 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
#include "shared.rsh"
|
||||
|
||||
static bool basic_test(uint32_t index) {
|
||||
bool failed = false;
|
||||
|
||||
rs_time_t curTime = rsTime(0);
|
||||
rs_tm tm;
|
||||
rsDebug("curTime", curTime);
|
||||
|
||||
rsLocaltime(&tm, &curTime);
|
||||
|
||||
rsDebug("tm.tm_sec", tm.tm_sec);
|
||||
rsDebug("tm.tm_min", tm.tm_min);
|
||||
rsDebug("tm.tm_hour", tm.tm_hour);
|
||||
rsDebug("tm.tm_mday", tm.tm_mday);
|
||||
rsDebug("tm.tm_mon", tm.tm_mon);
|
||||
rsDebug("tm.tm_year", tm.tm_year);
|
||||
rsDebug("tm.tm_wday", tm.tm_wday);
|
||||
rsDebug("tm.tm_yday", tm.tm_yday);
|
||||
rsDebug("tm.tm_isdst", tm.tm_isdst);
|
||||
|
||||
// Test a specific time (since we set America/Los_Angeles localtime)
|
||||
curTime = 1294438893;
|
||||
rsLocaltime(&tm, &curTime);
|
||||
|
||||
_RS_ASSERT(tm.tm_sec == 33);
|
||||
_RS_ASSERT(tm.tm_min == 21);
|
||||
_RS_ASSERT(tm.tm_hour == 14);
|
||||
_RS_ASSERT(tm.tm_mday == 7);
|
||||
_RS_ASSERT(tm.tm_mon == 0);
|
||||
_RS_ASSERT(tm.tm_year == 111);
|
||||
_RS_ASSERT(tm.tm_wday == 5);
|
||||
_RS_ASSERT(tm.tm_yday == 6);
|
||||
_RS_ASSERT(tm.tm_isdst == 0);
|
||||
|
||||
return failed;
|
||||
}
|
||||
|
||||
void test_rstime(uint32_t index, int test_num) {
|
||||
bool failed = false;
|
||||
failed |= basic_test(index);
|
||||
|
||||
if (failed) {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||
rsDebug("rstime_test FAILED", -1);
|
||||
}
|
||||
else {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
rsDebug("rstime_test PASSED", 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
#include "shared.rsh"
|
||||
#include "rs_graphics.rsh"
|
||||
|
||||
rs_element elementTest;
|
||||
rs_type typeTest;
|
||||
rs_allocation allocationTest;
|
||||
rs_sampler samplerTest;
|
||||
rs_script scriptTest;
|
||||
|
||||
rs_matrix4x4 matrix4x4Test;
|
||||
rs_matrix3x3 matrix3x3Test;
|
||||
rs_matrix2x2 matrix2x2Test;
|
||||
|
||||
struct my_struct {
|
||||
int i;
|
||||
rs_allocation banana;
|
||||
};
|
||||
|
||||
static bool basic_test(uint32_t index) {
|
||||
bool failed = false;
|
||||
|
||||
rs_matrix4x4 matrix4x4TestLocal;
|
||||
rs_matrix3x3 matrix3x3TestLocal;
|
||||
rs_matrix2x2 matrix2x2TestLocal;
|
||||
|
||||
// This test focuses primarily on compilation-time, not run-time.
|
||||
rs_element elementTestLocal;
|
||||
rs_type typeTestLocal;
|
||||
rs_allocation allocationTestLocal;
|
||||
rs_sampler samplerTestLocal;
|
||||
rs_script scriptTestLocal;
|
||||
|
||||
struct my_struct structTest;
|
||||
|
||||
//allocationTestLocal = allocationTest;
|
||||
|
||||
//allocationTest = allocationTestLocal;
|
||||
|
||||
/*for (int i = 0; i < 4; i++) {
|
||||
fontTestLocalArray[i] = fontTestLocal;
|
||||
}*/
|
||||
|
||||
/*fontTest = fontTestLocalArray[3];*/
|
||||
|
||||
return failed;
|
||||
}
|
||||
|
||||
void test_rstypes(uint32_t index, int test_num) {
|
||||
bool failed = false;
|
||||
failed |= basic_test(index);
|
||||
|
||||
if (failed) {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||
rsDebug("rstypes_test FAILED", -1);
|
||||
}
|
||||
else {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
rsDebug("rstypes_test PASSED", 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
#include "shared.rsh"
|
||||
#include "rs_graphics.rsh"
|
||||
rs_sampler minification;
|
||||
rs_sampler magnification;
|
||||
rs_sampler wrapS;
|
||||
rs_sampler wrapT;
|
||||
rs_sampler anisotropy;
|
||||
|
||||
static bool test_sampler_getters() {
|
||||
bool failed = false;
|
||||
|
||||
_RS_ASSERT(rsSamplerGetMagnification(minification) == RS_SAMPLER_NEAREST);
|
||||
_RS_ASSERT(rsSamplerGetMinification(minification) == RS_SAMPLER_LINEAR_MIP_LINEAR);
|
||||
_RS_ASSERT(rsSamplerGetWrapS(minification) == RS_SAMPLER_CLAMP);
|
||||
_RS_ASSERT(rsSamplerGetWrapT(minification) == RS_SAMPLER_CLAMP);
|
||||
_RS_ASSERT(rsSamplerGetAnisotropy(minification) == 1.0f);
|
||||
|
||||
_RS_ASSERT(rsSamplerGetMagnification(magnification) == RS_SAMPLER_LINEAR);
|
||||
_RS_ASSERT(rsSamplerGetMinification(magnification) == RS_SAMPLER_NEAREST);
|
||||
_RS_ASSERT(rsSamplerGetWrapS(magnification) == RS_SAMPLER_CLAMP);
|
||||
_RS_ASSERT(rsSamplerGetWrapT(magnification) == RS_SAMPLER_CLAMP);
|
||||
_RS_ASSERT(rsSamplerGetAnisotropy(magnification) == 1.0f);
|
||||
|
||||
_RS_ASSERT(rsSamplerGetMagnification(wrapS) == RS_SAMPLER_NEAREST);
|
||||
_RS_ASSERT(rsSamplerGetMinification(wrapS) == RS_SAMPLER_NEAREST);
|
||||
_RS_ASSERT(rsSamplerGetWrapS(wrapS) == RS_SAMPLER_WRAP);
|
||||
_RS_ASSERT(rsSamplerGetWrapT(wrapS) == RS_SAMPLER_CLAMP);
|
||||
_RS_ASSERT(rsSamplerGetAnisotropy(wrapS) == 1.0f);
|
||||
|
||||
_RS_ASSERT(rsSamplerGetMagnification(wrapT) == RS_SAMPLER_NEAREST);
|
||||
_RS_ASSERT(rsSamplerGetMinification(wrapT) == RS_SAMPLER_NEAREST);
|
||||
_RS_ASSERT(rsSamplerGetWrapS(wrapT) == RS_SAMPLER_CLAMP);
|
||||
_RS_ASSERT(rsSamplerGetWrapT(wrapT) == RS_SAMPLER_WRAP);
|
||||
_RS_ASSERT(rsSamplerGetAnisotropy(wrapT) == 1.0f);
|
||||
|
||||
_RS_ASSERT(rsSamplerGetMagnification(anisotropy) == RS_SAMPLER_NEAREST);
|
||||
_RS_ASSERT(rsSamplerGetMinification(anisotropy) == RS_SAMPLER_NEAREST);
|
||||
_RS_ASSERT(rsSamplerGetWrapS(anisotropy) == RS_SAMPLER_CLAMP);
|
||||
_RS_ASSERT(rsSamplerGetWrapT(anisotropy) == RS_SAMPLER_CLAMP);
|
||||
_RS_ASSERT(rsSamplerGetAnisotropy(anisotropy) == 8.0f);
|
||||
|
||||
if (failed) {
|
||||
rsDebug("test_sampler_getters FAILED", 0);
|
||||
}
|
||||
else {
|
||||
rsDebug("test_sampler_getters PASSED", 0);
|
||||
}
|
||||
|
||||
return failed;
|
||||
}
|
||||
|
||||
void sampler_test() {
|
||||
bool failed = false;
|
||||
failed |= test_sampler_getters();
|
||||
|
||||
if (failed) {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||
}
|
||||
else {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,114 @@
|
||||
#pragma version(1)
|
||||
|
||||
#pragma rs java_package_name(com.android.rs.test)
|
||||
|
||||
typedef struct TestResult_s {
|
||||
rs_allocation name;
|
||||
bool pass;
|
||||
float score;
|
||||
int64_t time;
|
||||
} TestResult;
|
||||
//TestResult *g_results;
|
||||
|
||||
static int64_t g_time;
|
||||
|
||||
static void start(void) {
|
||||
g_time = rsUptimeMillis();
|
||||
}
|
||||
|
||||
static float end(uint32_t idx) {
|
||||
int64_t t = rsUptimeMillis() - g_time;
|
||||
//g_results[idx].time = t;
|
||||
//rsDebug("test time", (int)t);
|
||||
return ((float)t) / 1000.f;
|
||||
}
|
||||
|
||||
#define _RS_ASSERT(b) \
|
||||
do { \
|
||||
if (!(b)) { \
|
||||
failed = true; \
|
||||
rsDebug(#b " FAILED", 0); \
|
||||
} \
|
||||
\
|
||||
} while (0)
|
||||
|
||||
static const int iposinf = 0x7f800000;
|
||||
static const int ineginf = 0xff800000;
|
||||
|
||||
static const float posinf() {
|
||||
float f = *((float*)&iposinf);
|
||||
return f;
|
||||
}
|
||||
|
||||
static const float neginf() {
|
||||
float f = *((float*)&ineginf);
|
||||
return f;
|
||||
}
|
||||
|
||||
static bool isposinf(float f) {
|
||||
int i = *((int*)(void*)&f);
|
||||
return (i == iposinf);
|
||||
}
|
||||
|
||||
static bool isneginf(float f) {
|
||||
int i = *((int*)(void*)&f);
|
||||
return (i == ineginf);
|
||||
}
|
||||
|
||||
static bool isnan(float f) {
|
||||
int i = *((int*)(void*)&f);
|
||||
return (((i & 0x7f800000) == 0x7f800000) && (i & 0x007fffff));
|
||||
}
|
||||
|
||||
static bool isposzero(float f) {
|
||||
int i = *((int*)(void*)&f);
|
||||
return (i == 0x00000000);
|
||||
}
|
||||
|
||||
static bool isnegzero(float f) {
|
||||
int i = *((int*)(void*)&f);
|
||||
return (i == 0x80000000);
|
||||
}
|
||||
|
||||
static bool iszero(float f) {
|
||||
return isposzero(f) || isnegzero(f);
|
||||
}
|
||||
|
||||
/* Absolute epsilon used for floats. Value is similar to float.h. */
|
||||
#ifndef FLT_EPSILON
|
||||
#define FLT_EPSILON 1.19e7f
|
||||
#endif
|
||||
/* Max ULPs while still being considered "equal". Only used when this number
|
||||
of ULPs is of a greater size than FLT_EPSILON. */
|
||||
#define FLT_MAX_ULP 1
|
||||
|
||||
/* Calculate the difference in ULPs between the two values. (Return zero on
|
||||
perfect equality.) */
|
||||
static int float_dist(float f1, float f2) {
|
||||
return *((int *)(&f1)) - *((int *)(&f2));
|
||||
}
|
||||
|
||||
/* Check if two floats are essentially equal. Will fail with some values
|
||||
due to design. (Validate using FLT_EPSILON or similar if necessary.) */
|
||||
static bool float_almost_equal(float f1, float f2) {
|
||||
int *i1 = (int*)(&f1);
|
||||
int *i2 = (int*)(&f2);
|
||||
|
||||
// Check for sign equality
|
||||
if ( ((*i1 >> 31) == 0) != ((*i2 >> 31) == 0) ) {
|
||||
// Handle signed zeroes
|
||||
if (f1 == f2)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check with ULP distance
|
||||
if (float_dist(f1, f2) > FLT_MAX_ULP)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
/* These constants must match those in UnitTest.java */
|
||||
static const int RS_MSG_TEST_PASSED = 100;
|
||||
static const int RS_MSG_TEST_FAILED = 101;
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
#include "shared.rsh"
|
||||
|
||||
typedef struct Point2 {
|
||||
int x;
|
||||
int y;
|
||||
} Point_2;
|
||||
Point_2 *point2;
|
||||
|
||||
static bool test_Point_2(int expected) {
|
||||
bool failed = false;
|
||||
|
||||
rsDebug("Point: ", point2[0].x, point2[0].y);
|
||||
_RS_ASSERT(point2[0].x == expected);
|
||||
_RS_ASSERT(point2[0].y == expected);
|
||||
|
||||
if (failed) {
|
||||
rsDebug("test_Point_2 FAILED", 0);
|
||||
}
|
||||
else {
|
||||
rsDebug("test_Point_2 PASSED", 0);
|
||||
}
|
||||
|
||||
return failed;
|
||||
}
|
||||
|
||||
void struct_test(int expected) {
|
||||
bool failed = false;
|
||||
failed |= test_Point_2(expected);
|
||||
|
||||
if (failed) {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||
}
|
||||
else {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
// Fountain test script
|
||||
#pragma version(1)
|
||||
|
||||
#pragma rs java_package_name(com.android.rs.test)
|
||||
|
||||
#pragma stateFragment(parent)
|
||||
|
||||
#include "rs_graphics.rsh"
|
||||
|
||||
|
||||
typedef struct TestResult {
|
||||
rs_allocation name;
|
||||
bool pass;
|
||||
float score;
|
||||
} TestResult_t;
|
||||
TestResult_t *results;
|
||||
|
||||
int root() {
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
#include "shared.rsh"
|
||||
|
||||
// Testing unsigned types for Bug 6764163
|
||||
unsigned int ui = 37;
|
||||
unsigned char uc = 5;
|
||||
|
||||
static bool test_unsigned() {
|
||||
bool failed = false;
|
||||
|
||||
rsDebug("ui", ui);
|
||||
rsDebug("uc", uc);
|
||||
_RS_ASSERT(ui == 0x7fffffff);
|
||||
_RS_ASSERT(uc == 129);
|
||||
|
||||
if (failed) {
|
||||
rsDebug("test_unsigned FAILED", -1);
|
||||
}
|
||||
else {
|
||||
rsDebug("test_unsigned PASSED", 0);
|
||||
}
|
||||
|
||||
return failed;
|
||||
}
|
||||
|
||||
void unsigned_test() {
|
||||
bool failed = false;
|
||||
failed |= test_unsigned();
|
||||
|
||||
if (failed) {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||
}
|
||||
else {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,198 @@
|
||||
#include "shared.rsh"
|
||||
|
||||
// Testing vector types
|
||||
float2 f2 = { 1.0f, 2.0f };
|
||||
float3 f3 = { 1.0f, 2.0f, 3.0f };
|
||||
float4 f4 = { 1.0f, 2.0f, 3.0f, 4.0f };
|
||||
|
||||
double2 d2 = { 1.0, 2.0 };
|
||||
double3 d3 = { 1.0, 2.0, 3.0 };
|
||||
double4 d4 = { 1.0, 2.0, 3.0, 4.0 };
|
||||
|
||||
char2 i8_2 = { 1, 2 };
|
||||
char3 i8_3 = { 1, 2, 3 };
|
||||
char4 i8_4 = { 1, 2, 3, 4 };
|
||||
|
||||
uchar2 u8_2 = { 1, 2 };
|
||||
uchar3 u8_3 = { 1, 2, 3 };
|
||||
uchar4 u8_4 = { 1, 2, 3, 4 };
|
||||
|
||||
short2 i16_2 = { 1, 2 };
|
||||
short3 i16_3 = { 1, 2, 3 };
|
||||
short4 i16_4 = { 1, 2, 3, 4 };
|
||||
|
||||
ushort2 u16_2 = { 1, 2 };
|
||||
ushort3 u16_3 = { 1, 2, 3 };
|
||||
ushort4 u16_4 = { 1, 2, 3, 4 };
|
||||
|
||||
int2 i32_2 = { 1, 2 };
|
||||
int3 i32_3 = { 1, 2, 3 };
|
||||
int4 i32_4 = { 1, 2, 3, 4 };
|
||||
|
||||
uint2 u32_2 = { 1, 2 };
|
||||
uint3 u32_3 = { 1, 2, 3 };
|
||||
uint4 u32_4 = { 1, 2, 3, 4 };
|
||||
|
||||
long2 i64_2 = { 1, 2 };
|
||||
long3 i64_3 = { 1, 2, 3 };
|
||||
long4 i64_4 = { 1, 2, 3, 4 };
|
||||
|
||||
ulong2 u64_2 = { 1, 2 };
|
||||
ulong3 u64_3 = { 1, 2, 3 };
|
||||
ulong4 u64_4 = { 1, 2, 3, 4 };
|
||||
|
||||
static bool test_vector_types() {
|
||||
bool failed = false;
|
||||
|
||||
rsDebug("Testing F32", 0);
|
||||
_RS_ASSERT(f2.x == 2.99f);
|
||||
_RS_ASSERT(f2.y == 3.99f);
|
||||
|
||||
_RS_ASSERT(f3.x == 2.99f);
|
||||
_RS_ASSERT(f3.y == 3.99f);
|
||||
_RS_ASSERT(f3.z == 4.99f);
|
||||
|
||||
_RS_ASSERT(f4.x == 2.99f);
|
||||
_RS_ASSERT(f4.y == 3.99f);
|
||||
_RS_ASSERT(f4.z == 4.99f);
|
||||
_RS_ASSERT(f4.w == 5.99f);
|
||||
|
||||
rsDebug("Testing F64", 0);
|
||||
_RS_ASSERT(d2.x == 2.99);
|
||||
_RS_ASSERT(d2.y == 3.99);
|
||||
|
||||
_RS_ASSERT(d3.x == 2.99);
|
||||
_RS_ASSERT(d3.y == 3.99);
|
||||
_RS_ASSERT(d3.z == 4.99);
|
||||
|
||||
_RS_ASSERT(d4.x == 2.99);
|
||||
_RS_ASSERT(d4.y == 3.99);
|
||||
_RS_ASSERT(d4.z == 4.99);
|
||||
_RS_ASSERT(d4.w == 5.99);
|
||||
|
||||
rsDebug("Testing I8", 0);
|
||||
_RS_ASSERT(i8_2.x == 2);
|
||||
_RS_ASSERT(i8_2.y == 3);
|
||||
|
||||
_RS_ASSERT(i8_3.x == 2);
|
||||
_RS_ASSERT(i8_3.y == 3);
|
||||
_RS_ASSERT(i8_3.z == 4);
|
||||
|
||||
_RS_ASSERT(i8_4.x == 2);
|
||||
_RS_ASSERT(i8_4.y == 3);
|
||||
_RS_ASSERT(i8_4.z == 4);
|
||||
_RS_ASSERT(i8_4.w == 5);
|
||||
|
||||
rsDebug("Testing U8", 0);
|
||||
_RS_ASSERT(u8_2.x == 2);
|
||||
_RS_ASSERT(u8_2.y == 3);
|
||||
|
||||
_RS_ASSERT(u8_3.x == 2);
|
||||
_RS_ASSERT(u8_3.y == 3);
|
||||
_RS_ASSERT(u8_3.z == 4);
|
||||
|
||||
_RS_ASSERT(u8_4.x == 2);
|
||||
_RS_ASSERT(u8_4.y == 3);
|
||||
_RS_ASSERT(u8_4.z == 4);
|
||||
_RS_ASSERT(u8_4.w == 5);
|
||||
|
||||
rsDebug("Testing I16", 0);
|
||||
_RS_ASSERT(i16_2.x == 2);
|
||||
_RS_ASSERT(i16_2.y == 3);
|
||||
|
||||
_RS_ASSERT(i16_3.x == 2);
|
||||
_RS_ASSERT(i16_3.y == 3);
|
||||
_RS_ASSERT(i16_3.z == 4);
|
||||
|
||||
_RS_ASSERT(i16_4.x == 2);
|
||||
_RS_ASSERT(i16_4.y == 3);
|
||||
_RS_ASSERT(i16_4.z == 4);
|
||||
_RS_ASSERT(i16_4.w == 5);
|
||||
|
||||
rsDebug("Testing U16", 0);
|
||||
_RS_ASSERT(u16_2.x == 2);
|
||||
_RS_ASSERT(u16_2.y == 3);
|
||||
|
||||
_RS_ASSERT(u16_3.x == 2);
|
||||
_RS_ASSERT(u16_3.y == 3);
|
||||
_RS_ASSERT(u16_3.z == 4);
|
||||
|
||||
_RS_ASSERT(u16_4.x == 2);
|
||||
_RS_ASSERT(u16_4.y == 3);
|
||||
_RS_ASSERT(u16_4.z == 4);
|
||||
_RS_ASSERT(u16_4.w == 5);
|
||||
|
||||
rsDebug("Testing I32", 0);
|
||||
_RS_ASSERT(i32_2.x == 2);
|
||||
_RS_ASSERT(i32_2.y == 3);
|
||||
|
||||
_RS_ASSERT(i32_3.x == 2);
|
||||
_RS_ASSERT(i32_3.y == 3);
|
||||
_RS_ASSERT(i32_3.z == 4);
|
||||
|
||||
_RS_ASSERT(i32_4.x == 2);
|
||||
_RS_ASSERT(i32_4.y == 3);
|
||||
_RS_ASSERT(i32_4.z == 4);
|
||||
_RS_ASSERT(i32_4.w == 5);
|
||||
|
||||
rsDebug("Testing U32", 0);
|
||||
_RS_ASSERT(u32_2.x == 2);
|
||||
_RS_ASSERT(u32_2.y == 3);
|
||||
|
||||
_RS_ASSERT(u32_3.x == 2);
|
||||
_RS_ASSERT(u32_3.y == 3);
|
||||
_RS_ASSERT(u32_3.z == 4);
|
||||
|
||||
_RS_ASSERT(u32_4.x == 2);
|
||||
_RS_ASSERT(u32_4.y == 3);
|
||||
_RS_ASSERT(u32_4.z == 4);
|
||||
_RS_ASSERT(u32_4.w == 5);
|
||||
|
||||
rsDebug("Testing I64", 0);
|
||||
_RS_ASSERT(i64_2.x == 2);
|
||||
_RS_ASSERT(i64_2.y == 3);
|
||||
|
||||
_RS_ASSERT(i64_3.x == 2);
|
||||
_RS_ASSERT(i64_3.y == 3);
|
||||
_RS_ASSERT(i64_3.z == 4);
|
||||
|
||||
_RS_ASSERT(i64_4.x == 2);
|
||||
_RS_ASSERT(i64_4.y == 3);
|
||||
_RS_ASSERT(i64_4.z == 4);
|
||||
_RS_ASSERT(i64_4.w == 5);
|
||||
|
||||
rsDebug("Testing U64", 0);
|
||||
_RS_ASSERT(u64_2.x == 2);
|
||||
_RS_ASSERT(u64_2.y == 3);
|
||||
|
||||
_RS_ASSERT(u64_3.x == 2);
|
||||
_RS_ASSERT(u64_3.y == 3);
|
||||
_RS_ASSERT(u64_3.z == 4);
|
||||
|
||||
_RS_ASSERT(u64_4.x == 2);
|
||||
_RS_ASSERT(u64_4.y == 3);
|
||||
_RS_ASSERT(u64_4.z == 4);
|
||||
_RS_ASSERT(u64_4.w == 5);
|
||||
|
||||
if (failed) {
|
||||
rsDebug("test_vector FAILED", 0);
|
||||
}
|
||||
else {
|
||||
rsDebug("test_vector PASSED", 0);
|
||||
}
|
||||
|
||||
return failed;
|
||||
}
|
||||
|
||||
void vector_test() {
|
||||
bool failed = false;
|
||||
failed |= test_vector_types();
|
||||
|
||||
if (failed) {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||
}
|
||||
else {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user