DO NOT MERGE
Delete unused/broken samples and tests from the renderscript libs, so we can publish the entire contents of libs/rs/java/ for samples in HC Change-Id: I0428074e995d7ee282520f54a9a3c81e32bff027
This commit is contained in:
@@ -1,32 +0,0 @@
|
||||
#
|
||||
# Copyright (C) 2009 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.
|
||||
#
|
||||
|
||||
ifneq ($(TARGET_SIMULATOR),true)
|
||||
|
||||
LOCAL_PATH := $(call my-dir)
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_MODULE_TAGS := optional
|
||||
|
||||
LOCAL_SRC_FILES := $(call all-java-files-under, src) \
|
||||
$(call all-renderscript-files-under, src)
|
||||
#LOCAL_STATIC_JAVA_LIBRARIES := android.renderscript
|
||||
|
||||
LOCAL_PACKAGE_NAME := ImageProcessing
|
||||
|
||||
include $(BUILD_PACKAGE)
|
||||
|
||||
endif
|
||||
@@ -1,17 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.android.rs.image">
|
||||
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
<uses-sdk android:minSdkVersion="11" />
|
||||
<application android:label="Image Processing">
|
||||
<activity android:name="ImageProcessingActivity"
|
||||
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.
|
Before Width: | Height: | Size: 75 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 75 KiB |
@@ -1,187 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2009 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.
|
||||
-->
|
||||
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<SurfaceView
|
||||
android:id="@+id/surface"
|
||||
android:layout_width="1dip"
|
||||
android:layout_height="1dip" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/display"
|
||||
android:layout_width="320dip"
|
||||
android:layout_height="266dip" />
|
||||
|
||||
<Button
|
||||
android:layout_marginBottom="170dip"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="40dip"
|
||||
android:text="@string/benchmark"
|
||||
android:onClick="benchmark"
|
||||
android:layout_gravity="bottom"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/benchmarkText"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="18sp"
|
||||
android:layout_marginLeft="100dip"
|
||||
android:layout_marginBottom="175dip"
|
||||
android:layout_gravity="bottom"
|
||||
android:text="@string/saturation"/>
|
||||
|
||||
<SeekBar
|
||||
android:id="@+id/inSaturation"
|
||||
android:layout_marginBottom="140dip"
|
||||
android:layout_marginLeft="10dip"
|
||||
android:layout_marginRight="10dip"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/inSaturationText"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="18sp"
|
||||
android:layout_marginLeft="50dip"
|
||||
android:layout_marginBottom="142dip"
|
||||
android:textColor="#000"
|
||||
android:layout_gravity="bottom"
|
||||
android:text="@string/saturation"/>
|
||||
|
||||
<SeekBar
|
||||
android:id="@+id/inGamma"
|
||||
android:layout_marginBottom="110dip"
|
||||
android:layout_marginLeft="10dip"
|
||||
android:layout_marginRight="10dip"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/inGammaText"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="18sp"
|
||||
android:layout_marginLeft="50dip"
|
||||
android:layout_marginBottom="112dip"
|
||||
android:textColor="#000"
|
||||
android:layout_gravity="bottom"
|
||||
android:text="@string/gamma"/>
|
||||
|
||||
<SeekBar
|
||||
android:id="@+id/outWhite"
|
||||
android:layout_marginBottom="80dip"
|
||||
android:layout_marginLeft="170dip"
|
||||
android:layout_marginRight="10dip"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/outWhiteText"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="18sp"
|
||||
android:layout_marginLeft="220dip"
|
||||
android:layout_marginBottom="82dip"
|
||||
android:textColor="#000"
|
||||
android:layout_gravity="bottom"
|
||||
android:text="@string/out_white"/>
|
||||
|
||||
<SeekBar
|
||||
android:id="@+id/inWhite"
|
||||
android:layout_marginBottom="80dip"
|
||||
android:layout_marginLeft="10dip"
|
||||
android:layout_marginRight="170dip"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/inWhiteText"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="18sp"
|
||||
android:layout_marginLeft="50dip"
|
||||
android:layout_marginBottom="82dip"
|
||||
android:textColor="#000"
|
||||
android:layout_gravity="bottom"
|
||||
android:text="@string/in_white"/>
|
||||
|
||||
<SeekBar
|
||||
android:id="@+id/outBlack"
|
||||
android:layout_marginBottom="50dip"
|
||||
android:layout_marginLeft="170dip"
|
||||
android:layout_marginRight="10dip"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/outBlackText"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="18sp"
|
||||
android:layout_marginLeft="220dip"
|
||||
android:layout_marginBottom="52dip"
|
||||
android:textColor="#000"
|
||||
android:layout_gravity="bottom"
|
||||
android:text="@string/out_black"/>
|
||||
|
||||
<SeekBar
|
||||
android:id="@+id/inBlack"
|
||||
android:layout_marginBottom="50dip"
|
||||
android:layout_marginLeft="10dip"
|
||||
android:layout_marginRight="170dip"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/inBlackText"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="18sp"
|
||||
android:layout_marginLeft="50dip"
|
||||
android:layout_marginBottom="52dip"
|
||||
android:textColor="#000"
|
||||
android:layout_gravity="bottom"
|
||||
android:text="@string/in_black"/>
|
||||
|
||||
<SeekBar
|
||||
android:id="@+id/radius"
|
||||
android:layout_marginBottom="10dip"
|
||||
android:layout_marginLeft="10dip"
|
||||
android:layout_marginRight="10dip"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/blurText"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="18sp"
|
||||
android:layout_marginLeft="50dip"
|
||||
android:layout_marginBottom="12dip"
|
||||
android:textColor="#000"
|
||||
android:layout_gravity="bottom"
|
||||
android:text="@string/blur_description"/>
|
||||
|
||||
</merge>
|
||||
@@ -1,33 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
/*
|
||||
* Copyright (C) 2008 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.
|
||||
*/
|
||||
-->
|
||||
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<!-- General -->
|
||||
<skip />
|
||||
<!--slider label -->
|
||||
<string name="blur_description">Blur Radius</string>
|
||||
<string name="in_white">In White</string>
|
||||
<string name="out_white">Out White</string>
|
||||
<string name="in_black">In Black</string>
|
||||
<string name="out_black">Out Black</string>
|
||||
<string name="gamma">Gamma</string>
|
||||
<string name="saturation">Saturation</string>
|
||||
<string name="benchmark">Benchmark</string>
|
||||
|
||||
</resources>
|
||||
@@ -1,441 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2009 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.image;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.os.Bundle;
|
||||
import android.graphics.BitmapFactory;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Canvas;
|
||||
import android.renderscript.ScriptC;
|
||||
import android.renderscript.RenderScript;
|
||||
import android.renderscript.Type;
|
||||
import android.renderscript.Allocation;
|
||||
import android.renderscript.Element;
|
||||
import android.renderscript.Script;
|
||||
import android.view.SurfaceView;
|
||||
import android.view.SurfaceHolder;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.SeekBar;
|
||||
import android.widget.TextView;
|
||||
import android.view.View;
|
||||
import java.lang.Math;
|
||||
|
||||
public class ImageProcessingActivity extends Activity
|
||||
implements SurfaceHolder.Callback,
|
||||
SeekBar.OnSeekBarChangeListener {
|
||||
private Bitmap mBitmapIn;
|
||||
private Bitmap mBitmapOut;
|
||||
private Bitmap mBitmapScratch;
|
||||
private ScriptC_threshold mScript;
|
||||
private ScriptC_vertical_blur mScriptVBlur;
|
||||
private ScriptC_horizontal_blur mScriptHBlur;
|
||||
private int mRadius = 0;
|
||||
private SeekBar mRadiusSeekBar;
|
||||
|
||||
private float mInBlack = 0.0f;
|
||||
private SeekBar mInBlackSeekBar;
|
||||
private float mOutBlack = 0.0f;
|
||||
private SeekBar mOutBlackSeekBar;
|
||||
private float mInWhite = 255.0f;
|
||||
private SeekBar mInWhiteSeekBar;
|
||||
private float mOutWhite = 255.0f;
|
||||
private SeekBar mOutWhiteSeekBar;
|
||||
private float mGamma = 1.0f;
|
||||
private SeekBar mGammaSeekBar;
|
||||
|
||||
private float mSaturation = 1.0f;
|
||||
private SeekBar mSaturationSeekBar;
|
||||
|
||||
private TextView mBenchmarkResult;
|
||||
|
||||
@SuppressWarnings({"FieldCanBeLocal"})
|
||||
private RenderScript mRS;
|
||||
@SuppressWarnings({"FieldCanBeLocal"})
|
||||
private Type mPixelType;
|
||||
@SuppressWarnings({"FieldCanBeLocal"})
|
||||
private Allocation mInPixelsAllocation;
|
||||
@SuppressWarnings({"FieldCanBeLocal"})
|
||||
private Allocation mOutPixelsAllocation;
|
||||
@SuppressWarnings({"FieldCanBeLocal"})
|
||||
private Allocation mScratchPixelsAllocation1;
|
||||
private Allocation mScratchPixelsAllocation2;
|
||||
|
||||
private SurfaceView mSurfaceView;
|
||||
private ImageView mDisplayView;
|
||||
|
||||
class FilterCallback extends RenderScript.RSMessageHandler {
|
||||
private Runnable mAction = new Runnable() {
|
||||
public void run() {
|
||||
mDisplayView.invalidate();
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
mSurfaceView.removeCallbacks(mAction);
|
||||
mSurfaceView.post(mAction);
|
||||
}
|
||||
}
|
||||
|
||||
int in[];
|
||||
int interm[];
|
||||
int out[];
|
||||
int MAX_RADIUS = 25;
|
||||
// Store our coefficients here
|
||||
float gaussian[];
|
||||
|
||||
private long javaFilter() {
|
||||
final int width = mBitmapIn.getWidth();
|
||||
final int height = mBitmapIn.getHeight();
|
||||
final int count = width * height;
|
||||
|
||||
if (in == null) {
|
||||
in = new int[count];
|
||||
interm = new int[count];
|
||||
out = new int[count];
|
||||
gaussian = new float[MAX_RADIUS * 2 + 1];
|
||||
mBitmapIn.getPixels(in, 0, width, 0, 0, width, height);
|
||||
}
|
||||
|
||||
long t = java.lang.System.currentTimeMillis();
|
||||
|
||||
int w, h, r;
|
||||
|
||||
float fRadius = (float)mRadius;
|
||||
int radius = (int)mRadius;
|
||||
|
||||
// Compute gaussian weights for the blur
|
||||
// e is the euler's number
|
||||
float e = 2.718281828459045f;
|
||||
float pi = 3.1415926535897932f;
|
||||
// g(x) = ( 1 / sqrt( 2 * pi ) * sigma) * e ^ ( -x^2 / 2 * sigma^2 )
|
||||
// x is of the form [-radius .. 0 .. radius]
|
||||
// and sigma varies with radius.
|
||||
// Based on some experimental radius values and sigma's
|
||||
// we approximately fit sigma = f(radius) as
|
||||
// sigma = radius * 0.4 + 0.6
|
||||
// The larger the radius gets, the more our gaussian blur
|
||||
// will resemble a box blur since with large sigma
|
||||
// the gaussian curve begins to lose its shape
|
||||
float sigma = 0.4f * fRadius + 0.6f;
|
||||
// Now compute the coefficints
|
||||
// We will store some redundant values to save some math during
|
||||
// the blur calculations
|
||||
// precompute some values
|
||||
float coeff1 = 1.0f / (float)(Math.sqrt( 2.0f * pi ) * sigma);
|
||||
float coeff2 = - 1.0f / (2.0f * sigma * sigma);
|
||||
float normalizeFactor = 0.0f;
|
||||
float floatR = 0.0f;
|
||||
for (r = -radius; r <= radius; r ++) {
|
||||
floatR = (float)r;
|
||||
gaussian[r + radius] = coeff1 * (float)Math.pow(e, floatR * floatR * coeff2);
|
||||
normalizeFactor += gaussian[r + radius];
|
||||
}
|
||||
|
||||
//Now we need to normalize the weights because all our coefficients need to add up to one
|
||||
normalizeFactor = 1.0f / normalizeFactor;
|
||||
for (r = -radius; r <= radius; r ++) {
|
||||
floatR = (float)r;
|
||||
gaussian[r + radius] *= normalizeFactor;
|
||||
}
|
||||
|
||||
float blurredPixelR = 0.0f;
|
||||
float blurredPixelG = 0.0f;
|
||||
float blurredPixelB = 0.0f;
|
||||
float blurredPixelA = 0.0f;
|
||||
|
||||
for (h = 0; h < height; h ++) {
|
||||
for (w = 0; w < width; w ++) {
|
||||
|
||||
blurredPixelR = 0.0f;
|
||||
blurredPixelG = 0.0f;
|
||||
blurredPixelB = 0.0f;
|
||||
blurredPixelA = 0.0f;
|
||||
|
||||
for (r = -radius; r <= radius; r ++) {
|
||||
// Stepping left and right away from the pixel
|
||||
int validW = w + r;
|
||||
// Clamp to zero and width max() isn't exposed for ints yet
|
||||
if (validW < 0) {
|
||||
validW = 0;
|
||||
}
|
||||
if (validW > width - 1) {
|
||||
validW = width - 1;
|
||||
}
|
||||
|
||||
int input = in[h*width + validW];
|
||||
|
||||
int R = ((input >> 24) & 0xff);
|
||||
int G = ((input >> 16) & 0xff);
|
||||
int B = ((input >> 8) & 0xff);
|
||||
int A = (input & 0xff);
|
||||
|
||||
float weight = gaussian[r + radius];
|
||||
|
||||
blurredPixelR += (float)(R)*weight;
|
||||
blurredPixelG += (float)(G)*weight;
|
||||
blurredPixelB += (float)(B)*weight;
|
||||
blurredPixelA += (float)(A)*weight;
|
||||
}
|
||||
|
||||
int R = (int)blurredPixelR;
|
||||
int G = (int)blurredPixelG;
|
||||
int B = (int)blurredPixelB;
|
||||
int A = (int)blurredPixelA;
|
||||
|
||||
interm[h*width + w] = (R << 24) | (G << 16) | (B << 8) | (A);
|
||||
}
|
||||
}
|
||||
|
||||
for (h = 0; h < height; h ++) {
|
||||
for (w = 0; w < width; w ++) {
|
||||
|
||||
blurredPixelR = 0.0f;
|
||||
blurredPixelG = 0.0f;
|
||||
blurredPixelB = 0.0f;
|
||||
blurredPixelA = 0.0f;
|
||||
for (r = -radius; r <= radius; r ++) {
|
||||
int validH = h + r;
|
||||
// Clamp to zero and width
|
||||
if (validH < 0) {
|
||||
validH = 0;
|
||||
}
|
||||
if (validH > height - 1) {
|
||||
validH = height - 1;
|
||||
}
|
||||
|
||||
int input = interm[validH*width + w];
|
||||
|
||||
int R = ((input >> 24) & 0xff);
|
||||
int G = ((input >> 16) & 0xff);
|
||||
int B = ((input >> 8) & 0xff);
|
||||
int A = (input & 0xff);
|
||||
|
||||
float weight = gaussian[r + radius];
|
||||
|
||||
blurredPixelR += (float)(R)*weight;
|
||||
blurredPixelG += (float)(G)*weight;
|
||||
blurredPixelB += (float)(B)*weight;
|
||||
blurredPixelA += (float)(A)*weight;
|
||||
}
|
||||
|
||||
int R = (int)blurredPixelR;
|
||||
int G = (int)blurredPixelG;
|
||||
int B = (int)blurredPixelB;
|
||||
int A = (int)blurredPixelA;
|
||||
|
||||
out[h*width + w] = (R << 24) | (G << 16) | (B << 8) | (A);
|
||||
}
|
||||
}
|
||||
|
||||
t = java.lang.System.currentTimeMillis() - t;
|
||||
android.util.Log.v("Img", "Java frame time ms " + t);
|
||||
mBitmapOut.setPixels(out, 0, width, 0, 0, width, height);
|
||||
return t;
|
||||
}
|
||||
|
||||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
|
||||
if (fromUser) {
|
||||
|
||||
if (seekBar == mRadiusSeekBar) {
|
||||
float fRadius = progress / 100.0f;
|
||||
fRadius *= (float)(MAX_RADIUS);
|
||||
mRadius = (int)fRadius;
|
||||
|
||||
mScript.set_radius(mRadius);
|
||||
} else if (seekBar == mInBlackSeekBar) {
|
||||
mInBlack = (float)progress;
|
||||
mScriptVBlur.invoke_setLevels(mInBlack, mOutBlack, mInWhite, mOutWhite);
|
||||
} else if (seekBar == mOutBlackSeekBar) {
|
||||
mOutBlack = (float)progress;
|
||||
mScriptVBlur.invoke_setLevels(mInBlack, mOutBlack, mInWhite, mOutWhite);
|
||||
} else if (seekBar == mInWhiteSeekBar) {
|
||||
mInWhite = (float)progress + 127.0f;
|
||||
mScriptVBlur.invoke_setLevels(mInBlack, mOutBlack, mInWhite, mOutWhite);
|
||||
} else if (seekBar == mOutWhiteSeekBar) {
|
||||
mOutWhite = (float)progress + 127.0f;
|
||||
mScriptVBlur.invoke_setLevels(mInBlack, mOutBlack, mInWhite, mOutWhite);
|
||||
} else if (seekBar == mGammaSeekBar) {
|
||||
mGamma = (float)progress/100.0f;
|
||||
mGamma = Math.max(mGamma, 0.1f);
|
||||
mGamma = 1.0f / mGamma;
|
||||
mScriptVBlur.invoke_setGamma(mGamma);
|
||||
} else if (seekBar == mSaturationSeekBar) {
|
||||
mSaturation = (float)progress / 50.0f;
|
||||
mScriptVBlur.invoke_setSaturation(mSaturation);
|
||||
}
|
||||
|
||||
long t = java.lang.System.currentTimeMillis();
|
||||
if (true) {
|
||||
mScript.invoke_filter();
|
||||
mOutPixelsAllocation.copyTo(mBitmapOut);
|
||||
} else {
|
||||
javaFilter();
|
||||
mDisplayView.invalidate();
|
||||
}
|
||||
|
||||
t = java.lang.System.currentTimeMillis() - t;
|
||||
android.util.Log.v("Img", "Renderscript frame time core ms " + t);
|
||||
}
|
||||
}
|
||||
|
||||
public void onStartTrackingTouch(SeekBar seekBar) {
|
||||
}
|
||||
|
||||
public void onStopTrackingTouch(SeekBar seekBar) {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.main);
|
||||
|
||||
mBitmapIn = loadBitmap(R.drawable.data);
|
||||
mBitmapOut = loadBitmap(R.drawable.data);
|
||||
mBitmapScratch = loadBitmap(R.drawable.data);
|
||||
|
||||
mSurfaceView = (SurfaceView) findViewById(R.id.surface);
|
||||
mSurfaceView.getHolder().addCallback(this);
|
||||
|
||||
mDisplayView = (ImageView) findViewById(R.id.display);
|
||||
mDisplayView.setImageBitmap(mBitmapOut);
|
||||
|
||||
mRadiusSeekBar = (SeekBar) findViewById(R.id.radius);
|
||||
mRadiusSeekBar.setOnSeekBarChangeListener(this);
|
||||
|
||||
mInBlackSeekBar = (SeekBar)findViewById(R.id.inBlack);
|
||||
mInBlackSeekBar.setOnSeekBarChangeListener(this);
|
||||
mInBlackSeekBar.setMax(128);
|
||||
mInBlackSeekBar.setProgress(0);
|
||||
mOutBlackSeekBar = (SeekBar)findViewById(R.id.outBlack);
|
||||
mOutBlackSeekBar.setOnSeekBarChangeListener(this);
|
||||
mOutBlackSeekBar.setMax(128);
|
||||
mOutBlackSeekBar.setProgress(0);
|
||||
|
||||
mInWhiteSeekBar = (SeekBar)findViewById(R.id.inWhite);
|
||||
mInWhiteSeekBar.setOnSeekBarChangeListener(this);
|
||||
mInWhiteSeekBar.setMax(128);
|
||||
mInWhiteSeekBar.setProgress(128);
|
||||
mOutWhiteSeekBar = (SeekBar)findViewById(R.id.outWhite);
|
||||
mOutWhiteSeekBar.setOnSeekBarChangeListener(this);
|
||||
mOutWhiteSeekBar.setMax(128);
|
||||
mOutWhiteSeekBar.setProgress(128);
|
||||
|
||||
mGammaSeekBar = (SeekBar)findViewById(R.id.inGamma);
|
||||
mGammaSeekBar.setOnSeekBarChangeListener(this);
|
||||
mGammaSeekBar.setMax(150);
|
||||
mGammaSeekBar.setProgress(100);
|
||||
|
||||
mSaturationSeekBar = (SeekBar)findViewById(R.id.inSaturation);
|
||||
mSaturationSeekBar.setOnSeekBarChangeListener(this);
|
||||
mSaturationSeekBar.setProgress(50);
|
||||
|
||||
mBenchmarkResult = (TextView) findViewById(R.id.benchmarkText);
|
||||
mBenchmarkResult.setText("Benchmark not yet run");
|
||||
}
|
||||
|
||||
public void surfaceCreated(SurfaceHolder holder) {
|
||||
createScript();
|
||||
mScript.invoke_filter();
|
||||
mOutPixelsAllocation.copyTo(mBitmapOut);
|
||||
}
|
||||
|
||||
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
|
||||
}
|
||||
|
||||
public void surfaceDestroyed(SurfaceHolder holder) {
|
||||
}
|
||||
|
||||
private void createScript() {
|
||||
mRS = RenderScript.create(this);
|
||||
mRS.setMessageHandler(new FilterCallback());
|
||||
|
||||
mInPixelsAllocation = Allocation.createFromBitmap(mRS, mBitmapIn,
|
||||
Allocation.MipmapControl.MIPMAP_NONE,
|
||||
Allocation.USAGE_SCRIPT);
|
||||
mOutPixelsAllocation = Allocation.createFromBitmap(mRS, mBitmapOut,
|
||||
Allocation.MipmapControl.MIPMAP_NONE,
|
||||
Allocation.USAGE_SCRIPT);
|
||||
|
||||
Type.Builder tb = new Type.Builder(mRS, Element.F32_4(mRS));
|
||||
tb.setX(mBitmapIn.getWidth());
|
||||
tb.setY(mBitmapIn.getHeight());
|
||||
mScratchPixelsAllocation1 = Allocation.createTyped(mRS, tb.create());
|
||||
mScratchPixelsAllocation2 = Allocation.createTyped(mRS, tb.create());
|
||||
|
||||
mScriptVBlur = new ScriptC_vertical_blur(mRS, getResources(), R.raw.vertical_blur);
|
||||
mScriptHBlur = new ScriptC_horizontal_blur(mRS, getResources(), R.raw.horizontal_blur);
|
||||
|
||||
mScript = new ScriptC_threshold(mRS, getResources(), R.raw.threshold);
|
||||
mScript.set_width(mBitmapIn.getWidth());
|
||||
mScript.set_height(mBitmapIn.getHeight());
|
||||
mScript.set_radius(mRadius);
|
||||
|
||||
mScriptVBlur.invoke_setLevels(mInBlack, mOutBlack, mInWhite, mOutWhite);
|
||||
mScriptVBlur.invoke_setGamma(mGamma);
|
||||
mScriptVBlur.invoke_setSaturation(mSaturation);
|
||||
|
||||
mScript.bind_InPixel(mInPixelsAllocation);
|
||||
mScript.bind_OutPixel(mOutPixelsAllocation);
|
||||
mScript.bind_ScratchPixel1(mScratchPixelsAllocation1);
|
||||
mScript.bind_ScratchPixel2(mScratchPixelsAllocation2);
|
||||
|
||||
mScript.set_vBlurScript(mScriptVBlur);
|
||||
mScript.set_hBlurScript(mScriptHBlur);
|
||||
}
|
||||
|
||||
private Bitmap loadBitmap(int resource) {
|
||||
final BitmapFactory.Options options = new BitmapFactory.Options();
|
||||
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
|
||||
return copyBitmap(BitmapFactory.decodeResource(getResources(), resource, options));
|
||||
}
|
||||
|
||||
private static Bitmap copyBitmap(Bitmap source) {
|
||||
Bitmap b = Bitmap.createBitmap(source.getWidth(), source.getHeight(), source.getConfig());
|
||||
Canvas c = new Canvas(b);
|
||||
c.drawBitmap(source, 0, 0, null);
|
||||
source.recycle();
|
||||
return b;
|
||||
}
|
||||
|
||||
// button hook
|
||||
public void benchmark(View v) {
|
||||
android.util.Log.v("Img", "Benchmarking");
|
||||
int oldRadius = mRadius;
|
||||
mRadius = MAX_RADIUS;
|
||||
mScript.set_radius(mRadius);
|
||||
|
||||
long t = java.lang.System.currentTimeMillis();
|
||||
|
||||
mScript.invoke_filter();
|
||||
mOutPixelsAllocation.copyTo(mBitmapOut);
|
||||
|
||||
t = java.lang.System.currentTimeMillis() - t;
|
||||
android.util.Log.v("Img", "Renderscript frame time core ms " + t);
|
||||
|
||||
//long javaTime = javaFilter();
|
||||
//mBenchmarkResult.setText("RS: " + t + " ms Java: " + javaTime + " ms");
|
||||
mBenchmarkResult.setText("RS: " + t + " ms");
|
||||
|
||||
mRadius = oldRadius;
|
||||
mScript.set_radius(mRadius);
|
||||
|
||||
mScript.invoke_filter();
|
||||
mOutPixelsAllocation.copyTo(mBitmapOut);
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
#pragma version(1)
|
||||
|
||||
#include "ip.rsh"
|
||||
|
||||
void root(const void *v_in, void *v_out, const void *usrData, uint32_t x, uint32_t y) {
|
||||
float4 *output = (float4 *)v_out;
|
||||
const FilterStruct *fs = (const FilterStruct *)usrData;
|
||||
const float4 *input = (const float4 *)rsGetElementAt(fs->ain, 0, y);
|
||||
|
||||
float3 blurredPixel = 0;
|
||||
const float *gPtr = fs->gaussian;
|
||||
if ((x > fs->radius) && (x < (fs->width - fs->radius))) {
|
||||
const float4 *i = input + (x - fs->radius);
|
||||
for (int r = -fs->radius; r <= fs->radius; r ++) {
|
||||
blurredPixel += i->xyz * gPtr[0];
|
||||
gPtr++;
|
||||
i++;
|
||||
}
|
||||
} else {
|
||||
for (int r = -fs->radius; r <= fs->radius; r ++) {
|
||||
// Stepping left and right away from the pixel
|
||||
int validW = rsClamp(x + r, (uint)0, (uint)(fs->width - 1));
|
||||
blurredPixel += input[validW].xyz * gPtr[0];
|
||||
gPtr++;
|
||||
}
|
||||
}
|
||||
|
||||
output->xyz = blurredPixel;
|
||||
}
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
#pragma rs java_package_name(com.android.rs.image)
|
||||
|
||||
#define MAX_RADIUS 25
|
||||
|
||||
typedef struct FilterStruct_s {
|
||||
rs_allocation ain;
|
||||
|
||||
float *gaussian; //[MAX_RADIUS * 2 + 1];
|
||||
int height;
|
||||
int width;
|
||||
int radius;
|
||||
|
||||
} FilterStruct;
|
||||
|
||||
|
||||
@@ -1,93 +0,0 @@
|
||||
#pragma version(1)
|
||||
|
||||
#include "ip.rsh"
|
||||
|
||||
int height;
|
||||
int width;
|
||||
int radius;
|
||||
|
||||
uchar4 * InPixel;
|
||||
uchar4 * OutPixel;
|
||||
float4 * ScratchPixel1;
|
||||
float4 * ScratchPixel2;
|
||||
|
||||
rs_script vBlurScript;
|
||||
rs_script hBlurScript;
|
||||
|
||||
const int CMD_FINISHED = 1;
|
||||
|
||||
// Store our coefficients here
|
||||
static float gaussian[MAX_RADIUS * 2 + 1];
|
||||
|
||||
|
||||
static void computeGaussianWeights() {
|
||||
// Compute gaussian weights for the blur
|
||||
// e is the euler's number
|
||||
float e = 2.718281828459045f;
|
||||
float pi = 3.1415926535897932f;
|
||||
// g(x) = ( 1 / sqrt( 2 * pi ) * sigma) * e ^ ( -x^2 / 2 * sigma^2 )
|
||||
// x is of the form [-radius .. 0 .. radius]
|
||||
// and sigma varies with radius.
|
||||
// Based on some experimental radius values and sigma's
|
||||
// we approximately fit sigma = f(radius) as
|
||||
// sigma = radius * 0.4 + 0.6
|
||||
// The larger the radius gets, the more our gaussian blur
|
||||
// will resemble a box blur since with large sigma
|
||||
// the gaussian curve begins to lose its shape
|
||||
float sigma = 0.4f * (float)radius + 0.6f;
|
||||
|
||||
// Now compute the coefficints
|
||||
// We will store some redundant values to save some math during
|
||||
// the blur calculations
|
||||
// precompute some values
|
||||
float coeff1 = 1.0f / (sqrt( 2.0f * pi ) * sigma);
|
||||
float coeff2 = - 1.0f / (2.0f * sigma * sigma);
|
||||
|
||||
float normalizeFactor = 0.0f;
|
||||
float floatR = 0.0f;
|
||||
int r;
|
||||
for (r = -radius; r <= radius; r ++) {
|
||||
floatR = (float)r;
|
||||
gaussian[r + radius] = coeff1 * pow(e, floatR * floatR * coeff2);
|
||||
normalizeFactor += gaussian[r + radius];
|
||||
}
|
||||
|
||||
//Now we need to normalize the weights because all our coefficients need to add up to one
|
||||
normalizeFactor = 1.0f / normalizeFactor;
|
||||
for (r = -radius; r <= radius; r ++) {
|
||||
floatR = (float)r;
|
||||
gaussian[r + radius] *= normalizeFactor;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void copyInput() {
|
||||
rs_allocation ain;
|
||||
rsSetObject(&ain,rsGetAllocation(InPixel));
|
||||
uint32_t dimx = rsAllocationGetDimX(ain);
|
||||
uint32_t dimy = rsAllocationGetDimY(ain);
|
||||
for (uint32_t y = 0; y < dimy; y++) {
|
||||
for (uint32_t x = 0; x < dimx; x++) {
|
||||
ScratchPixel1[x + y * dimx] = convert_float4(InPixel[x + y * dimx]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void filter() {
|
||||
copyInput();
|
||||
computeGaussianWeights();
|
||||
|
||||
FilterStruct fs;
|
||||
fs.gaussian = gaussian;
|
||||
fs.width = width;
|
||||
fs.height = height;
|
||||
fs.radius = radius;
|
||||
|
||||
fs.ain = rsGetAllocation(ScratchPixel1);
|
||||
rsForEach(hBlurScript, fs.ain, rsGetAllocation(ScratchPixel2), &fs);
|
||||
|
||||
fs.ain = rsGetAllocation(ScratchPixel2);
|
||||
rsForEach(vBlurScript, fs.ain, rsGetAllocation(OutPixel), &fs);
|
||||
rsSendToClientBlocking(CMD_FINISHED);
|
||||
}
|
||||
|
||||
@@ -1,93 +0,0 @@
|
||||
#pragma version(1)
|
||||
|
||||
#include "ip.rsh"
|
||||
|
||||
static float inBlack;
|
||||
static float outBlack;
|
||||
static float inWhite;
|
||||
static float outWhite;
|
||||
static float3 gamma;
|
||||
static float saturation;
|
||||
|
||||
static float inWMinInB;
|
||||
static float outWMinOutB;
|
||||
static float overInWMinInB;
|
||||
static rs_matrix3x3 colorMat;
|
||||
|
||||
void setLevels(float iBlk, float oBlk, float iWht, float oWht) {
|
||||
inBlack = iBlk;
|
||||
outBlack = oBlk;
|
||||
inWhite = iWht;
|
||||
outWhite = oWht;
|
||||
|
||||
inWMinInB = inWhite - inBlack;
|
||||
outWMinOutB = outWhite - outBlack;
|
||||
overInWMinInB = 1.f / inWMinInB;
|
||||
}
|
||||
|
||||
void setSaturation(float sat) {
|
||||
saturation = sat;
|
||||
|
||||
// Saturation
|
||||
// Linear weights
|
||||
//float rWeight = 0.3086f;
|
||||
//float gWeight = 0.6094f;
|
||||
//float bWeight = 0.0820f;
|
||||
|
||||
// Gamma 2.2 weights (we haven't converted our image to linear space yet for perf reasons)
|
||||
float rWeight = 0.299f;
|
||||
float gWeight = 0.587f;
|
||||
float bWeight = 0.114f;
|
||||
|
||||
float oneMinusS = 1.0f - saturation;
|
||||
rsMatrixSet(&colorMat, 0, 0, oneMinusS * rWeight + saturation);
|
||||
rsMatrixSet(&colorMat, 0, 1, oneMinusS * rWeight);
|
||||
rsMatrixSet(&colorMat, 0, 2, oneMinusS * rWeight);
|
||||
rsMatrixSet(&colorMat, 1, 0, oneMinusS * gWeight);
|
||||
rsMatrixSet(&colorMat, 1, 1, oneMinusS * gWeight + saturation);
|
||||
rsMatrixSet(&colorMat, 1, 2, oneMinusS * gWeight);
|
||||
rsMatrixSet(&colorMat, 2, 0, oneMinusS * bWeight);
|
||||
rsMatrixSet(&colorMat, 2, 1, oneMinusS * bWeight);
|
||||
rsMatrixSet(&colorMat, 2, 2, oneMinusS * bWeight + saturation);
|
||||
}
|
||||
|
||||
void setGamma(float g) {
|
||||
gamma = (float3)g;
|
||||
}
|
||||
|
||||
//sliao
|
||||
extern uchar3 __attribute__((overloadable)) convert2uchar3(float3 xyz);
|
||||
|
||||
void root(const void *v_in, void *v_out, const void *usrData, uint32_t x, uint32_t y) {
|
||||
uchar4 *output = (uchar4 *)v_out;
|
||||
const FilterStruct *fs = (const FilterStruct *)usrData;
|
||||
const float4 *input = (const float4 *)rsGetElementAt(fs->ain, x, 0);
|
||||
|
||||
float3 blurredPixel = 0;
|
||||
const float *gPtr = fs->gaussian;
|
||||
if ((y > fs->radius) && (y < (fs->height - fs->radius))) {
|
||||
const float4 *i = input + ((y - fs->radius) * fs->width);
|
||||
for (int r = -fs->radius; r <= fs->radius; r ++) {
|
||||
blurredPixel += i->xyz * gPtr[0];
|
||||
gPtr++;
|
||||
i += fs->width;
|
||||
}
|
||||
} else {
|
||||
for (int r = -fs->radius; r <= fs->radius; r ++) {
|
||||
int validH = rsClamp(y + r, (uint)0, (uint)(fs->height - 1));
|
||||
const float4 *i = input + validH * fs->width;
|
||||
blurredPixel += i->xyz * gPtr[0];
|
||||
gPtr++;
|
||||
}
|
||||
}
|
||||
|
||||
float3 temp = rsMatrixMultiply(&colorMat, blurredPixel);
|
||||
temp = (clamp(temp, 0.f, 255.f) - inBlack) * overInWMinInB;
|
||||
if (gamma.x != 1.0f)
|
||||
temp = pow(temp, (float3)gamma);
|
||||
temp = clamp(temp * outWMinOutB + outBlack, 0.f, 255.f);
|
||||
|
||||
output->xyz = convert_uchar3(temp);
|
||||
//output->w = input->w;
|
||||
}
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
#
|
||||
# Copyright (C) 2008 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.
|
||||
#
|
||||
|
||||
ifneq ($(TARGET_SIMULATOR),true)
|
||||
|
||||
LOCAL_PATH := $(call my-dir)
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_MODULE_TAGS := optional
|
||||
|
||||
LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src)
|
||||
#LOCAL_STATIC_JAVA_LIBRARIES := android.renderscript
|
||||
|
||||
LOCAL_PACKAGE_NAME := ModelViewer
|
||||
|
||||
include $(BUILD_PACKAGE)
|
||||
|
||||
endif
|
||||
@@ -1,23 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.android.modelviewer">
|
||||
<application android:label="ModelViewer">
|
||||
<activity android:name="SimpleModel"
|
||||
android:label="SimpleModel"
|
||||
android:screenOrientation="portrait"
|
||||
android:theme="@android:style/Theme.Black.NoTitleBar">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity android:name="SceneGraph"
|
||||
android:label="SceneGraph"
|
||||
android:theme="@android:style/Theme.Black.NoTitleBar">
|
||||
<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.
|
Before Width: | Height: | Size: 286 KiB |
Binary file not shown.
@@ -1,71 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2008 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.modelviewer;
|
||||
|
||||
import android.renderscript.RSSurfaceView;
|
||||
import android.renderscript.RenderScript;
|
||||
|
||||
import android.app.Activity;
|
||||
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.Config;
|
||||
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 java.lang.Runtime;
|
||||
|
||||
public class SceneGraph extends Activity {
|
||||
|
||||
private SceneGraphView mView;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle icicle) {
|
||||
super.onCreate(icicle);
|
||||
|
||||
// Create our Preview view and set it as the content of our
|
||||
// Activity
|
||||
mView = new SceneGraphView(this);
|
||||
setContentView(mView);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
// Ideally a game should implement onResume() and onPause()
|
||||
// to take appropriate action when the activity looses focus
|
||||
super.onResume();
|
||||
mView.resume();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
// Ideally a game should implement onResume() and onPause()
|
||||
// to take appropriate action when the activity looses focus
|
||||
super.onPause();
|
||||
mView.pause();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,217 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2008 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.modelviewer;
|
||||
|
||||
import java.io.Writer;
|
||||
import java.util.Map;
|
||||
import java.util.Vector;
|
||||
|
||||
import android.content.res.Resources;
|
||||
import android.renderscript.*;
|
||||
import android.renderscript.Element.Builder;
|
||||
import android.renderscript.Font.Style;
|
||||
import android.renderscript.ProgramStore.DepthFunc;
|
||||
import android.util.Log;
|
||||
|
||||
|
||||
public class SceneGraphRS {
|
||||
|
||||
private final int STATE_LAST_FOCUS = 1;
|
||||
|
||||
int mWidth;
|
||||
int mHeight;
|
||||
int mRotation;
|
||||
|
||||
public SceneGraphRS() {
|
||||
}
|
||||
|
||||
public void init(RenderScriptGL rs, Resources res, int width, int height) {
|
||||
mRS = rs;
|
||||
mRes = res;
|
||||
mWidth = width;
|
||||
mHeight = height;
|
||||
mRotation = 0;
|
||||
initRS();
|
||||
}
|
||||
|
||||
private Resources mRes;
|
||||
private RenderScriptGL mRS;
|
||||
private Sampler mSampler;
|
||||
private ProgramStore mPSBackground;
|
||||
private ProgramFragment mPFBackground;
|
||||
private ProgramVertex mPVBackground;
|
||||
private ProgramVertexFixedFunction.Constants mPVA;
|
||||
|
||||
private Allocation mGridImage;
|
||||
private Allocation mAllocPV;
|
||||
|
||||
private Mesh mMesh;
|
||||
|
||||
private Font mItalic;
|
||||
private Allocation mTextAlloc;
|
||||
|
||||
private ScriptC_scenegraph mScript;
|
||||
private ScriptC_transform mTransformScript;
|
||||
|
||||
int mLastX;
|
||||
int mLastY;
|
||||
|
||||
public void touchEvent(int x, int y) {
|
||||
int dx = mLastX - x;
|
||||
if (Math.abs(dx) > 50 || Math.abs(dx) < 3) {
|
||||
dx = 0;
|
||||
}
|
||||
|
||||
mRotation -= dx;
|
||||
if (mRotation > 360) {
|
||||
mRotation -= 360;
|
||||
}
|
||||
if (mRotation < 0) {
|
||||
mRotation += 360;
|
||||
}
|
||||
|
||||
mScript.set_gRotate(-(float)mRotation);
|
||||
|
||||
mLastX = x;
|
||||
mLastY = y;
|
||||
}
|
||||
|
||||
private void initPFS() {
|
||||
ProgramStore.Builder b = new ProgramStore.Builder(mRS);
|
||||
|
||||
b.setDepthFunc(ProgramStore.DepthFunc.LESS);
|
||||
b.setDitherEnabled(false);
|
||||
b.setDepthMaskEnabled(true);
|
||||
mPSBackground = b.create();
|
||||
|
||||
mScript.set_gPFSBackground(mPSBackground);
|
||||
}
|
||||
|
||||
private void initPF() {
|
||||
Sampler.Builder bs = new Sampler.Builder(mRS);
|
||||
bs.setMinification(Sampler.Value.LINEAR);
|
||||
bs.setMagnification(Sampler.Value.LINEAR);
|
||||
bs.setWrapS(Sampler.Value.CLAMP);
|
||||
bs.setWrapT(Sampler.Value.CLAMP);
|
||||
mSampler = bs.create();
|
||||
|
||||
ProgramFragmentFixedFunction.Builder b = new ProgramFragmentFixedFunction.Builder(mRS);
|
||||
b.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE,
|
||||
ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
|
||||
mPFBackground = b.create();
|
||||
mPFBackground.bindSampler(mSampler, 0);
|
||||
|
||||
mScript.set_gPFBackground(mPFBackground);
|
||||
}
|
||||
|
||||
private void initPV() {
|
||||
ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS);
|
||||
mPVBackground = pvb.create();
|
||||
|
||||
mPVA = new ProgramVertexFixedFunction.Constants(mRS);
|
||||
((ProgramVertexFixedFunction)mPVBackground).bindConstants(mPVA);
|
||||
|
||||
mScript.set_gPVBackground(mPVBackground);
|
||||
}
|
||||
|
||||
private void loadImage() {
|
||||
mGridImage = Allocation.createFromBitmapResource(mRS, mRes, R.drawable.robot,
|
||||
Allocation.MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
|
||||
Allocation.USAGE_GRAPHICS_TEXTURE);
|
||||
mScript.set_gTGrid(mGridImage);
|
||||
}
|
||||
|
||||
private void initTextAllocation() {
|
||||
String allocString = "Displaying file: R.raw.robot";
|
||||
mTextAlloc = Allocation.createFromString(mRS, allocString, Allocation.USAGE_SCRIPT);
|
||||
mScript.set_gTextAlloc(mTextAlloc);
|
||||
}
|
||||
|
||||
SgTransform mRootTransform;
|
||||
SgTransform mGroup1;
|
||||
|
||||
SgTransform mRobot1;
|
||||
SgTransform mRobot2;
|
||||
|
||||
void initTransformHierarchy() {
|
||||
mRootTransform = new SgTransform(mRS);
|
||||
|
||||
mGroup1 = new SgTransform(mRS);
|
||||
mRootTransform.addChild(mGroup1);
|
||||
|
||||
mRobot1 = new SgTransform(mRS);
|
||||
mRobot2 = new SgTransform(mRS);
|
||||
|
||||
mGroup1.addChild(mRobot1);
|
||||
mGroup1.addChild(mRobot2);
|
||||
|
||||
mGroup1.setTransform(0, new Float4(0.0f, 0.0f, -15.0f, 0.0f), TransformType.TRANSLATE);
|
||||
mGroup1.setTransform(1, new Float4(0.0f, 1.0f, 0.0f, 15.0f), TransformType.ROTATE);
|
||||
|
||||
mRobot1.setTransform(0, new Float4(-3.0f, -0.5f, 0.0f, 0.0f), TransformType.TRANSLATE);
|
||||
mRobot1.setTransform(1, new Float4(0.0f, 1.0f, 0.0f, 20.0f), TransformType.ROTATE);
|
||||
mRobot1.setTransform(2, new Float4(0.2f, 0.2f, 0.2f, 0.0f), TransformType.SCALE);
|
||||
|
||||
mRobot2.setTransform(0, new Float4(3.0f, 0.0f, 0.0f, 0.0f), TransformType.TRANSLATE);
|
||||
mRobot2.setTransform(1, new Float4(0.0f, 1.0f, 0.0f, -20.0f), TransformType.ROTATE);
|
||||
mRobot2.setTransform(2, new Float4(0.3f, 0.3f, 0.3f, 0.0f), TransformType.SCALE);
|
||||
}
|
||||
|
||||
private void initRS() {
|
||||
|
||||
mScript = new ScriptC_scenegraph(mRS, mRes, R.raw.scenegraph);
|
||||
mTransformScript = new ScriptC_transform(mRS, mRes, R.raw.transform);
|
||||
mTransformScript.set_transformScript(mTransformScript);
|
||||
|
||||
mScript.set_gTransformRS(mTransformScript);
|
||||
|
||||
initPFS();
|
||||
initPF();
|
||||
initPV();
|
||||
|
||||
loadImage();
|
||||
|
||||
FileA3D model = FileA3D.createFromResource(mRS, mRes, R.raw.robot);
|
||||
FileA3D.IndexEntry entry = model.getIndexEntry(0);
|
||||
if (entry == null || entry.getEntryType() != FileA3D.EntryType.MESH) {
|
||||
Log.e("rs", "could not load model");
|
||||
} else {
|
||||
mMesh = (Mesh)entry.getObject();
|
||||
mScript.set_gTestMesh(mMesh);
|
||||
}
|
||||
|
||||
mItalic = Font.create(mRS, mRes, "serif", Font.Style.ITALIC, 8);
|
||||
mScript.set_gItalic(mItalic);
|
||||
|
||||
initTextAllocation();
|
||||
|
||||
initTransformHierarchy();
|
||||
|
||||
mScript.bind_gRootNode(mRootTransform.getField());
|
||||
|
||||
mScript.bind_gGroup(mGroup1.mParent.mChildField);
|
||||
mScript.bind_gRobot1(mRobot1.mParent.mChildField);
|
||||
mScript.set_gRobot1Index(mRobot1.mIndexInParentGroup);
|
||||
mScript.bind_gRobot2(mRobot2.mParent.mChildField);
|
||||
mScript.set_gRobot2Index(mRobot2.mIndexInParentGroup);
|
||||
|
||||
mRS.bindRootScript(mScript);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,96 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2008 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.modelviewer;
|
||||
|
||||
import java.io.Writer;
|
||||
import java.util.ArrayList;
|
||||
import java.util.concurrent.Semaphore;
|
||||
|
||||
import android.renderscript.RSSurfaceView;
|
||||
import android.renderscript.RenderScript;
|
||||
import android.renderscript.RenderScriptGL;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.drawable.BitmapDrawable;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
import android.view.Surface;
|
||||
import android.view.SurfaceHolder;
|
||||
import android.view.SurfaceView;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.MotionEvent;
|
||||
|
||||
public class SceneGraphView extends RSSurfaceView {
|
||||
|
||||
public SceneGraphView(Context context) {
|
||||
super(context);
|
||||
//setFocusable(true);
|
||||
}
|
||||
|
||||
private RenderScriptGL mRS;
|
||||
private SceneGraphRS mRender;
|
||||
|
||||
|
||||
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
|
||||
super.surfaceChanged(holder, format, w, h);
|
||||
if (mRS == null) {
|
||||
RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig();
|
||||
sc.setDepth(16, 24);
|
||||
mRS = createRenderScriptGL(sc);
|
||||
mRS.setSurface(holder, w, h);
|
||||
mRender = new SceneGraphRS();
|
||||
mRender.init(mRS, getResources(), w, h);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDetachedFromWindow() {
|
||||
if (mRS != null) {
|
||||
mRS = null;
|
||||
destroyRenderScriptGL();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onKeyDown(int keyCode, KeyEvent event)
|
||||
{
|
||||
// break point at here
|
||||
// this method doesn't work when 'extends View' include 'extends ScrollView'.
|
||||
return super.onKeyDown(keyCode, event);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent ev)
|
||||
{
|
||||
boolean ret = true;
|
||||
int act = ev.getAction();
|
||||
if (act == ev.ACTION_UP) {
|
||||
ret = false;
|
||||
}
|
||||
|
||||
mRender.touchEvent((int)ev.getX(), (int)ev.getY());
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,112 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2008 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.modelviewer;
|
||||
|
||||
import java.io.Writer;
|
||||
import java.util.Map;
|
||||
import java.util.Vector;
|
||||
|
||||
import android.content.res.Resources;
|
||||
import android.renderscript.*;
|
||||
import android.renderscript.Element.Builder;
|
||||
import android.renderscript.ProgramStore.DepthFunc;
|
||||
import android.util.Log;
|
||||
|
||||
enum TransformType {
|
||||
|
||||
NONE(0),
|
||||
TRANSLATE(1),
|
||||
ROTATE(2),
|
||||
SCALE(3);
|
||||
|
||||
int mID;
|
||||
TransformType(int id) {
|
||||
mID = id;
|
||||
}
|
||||
}
|
||||
|
||||
public class SgTransform {
|
||||
|
||||
|
||||
ScriptField_SgTransform mTransformField;
|
||||
ScriptField_SgTransform mChildField;
|
||||
public ScriptField_SgTransform.Item mTransformData;
|
||||
|
||||
RenderScript mRS;
|
||||
|
||||
Vector mChildren;
|
||||
SgTransform mParent;
|
||||
int mIndexInParentGroup;
|
||||
|
||||
public void setParent(SgTransform parent, int parentIndex) {
|
||||
mParent = parent;
|
||||
mIndexInParentGroup = parentIndex;
|
||||
}
|
||||
|
||||
public void addChild(SgTransform child) {
|
||||
mChildren.add(child);
|
||||
child.setParent(this, mChildren.size() - 1);
|
||||
}
|
||||
|
||||
public void setTransform(int index, Float4 value, TransformType type) {
|
||||
mTransformData.transforms[index] = value;
|
||||
mTransformData.transformTypes[index] = type.mID;
|
||||
}
|
||||
|
||||
void initData() {
|
||||
int numElements = mTransformData.transforms.length;
|
||||
mTransformData.transformTypes = new int[numElements];
|
||||
for (int i = 0; i < numElements; i ++) {
|
||||
mTransformData.transforms[i] = new Float4(0, 0, 0, 0);
|
||||
mTransformData.transformTypes[i] = TransformType.NONE.mID;
|
||||
}
|
||||
|
||||
mTransformData.isDirty = 1;
|
||||
mTransformData.children = null;
|
||||
}
|
||||
|
||||
public SgTransform(RenderScript rs) {
|
||||
mRS = rs;
|
||||
mTransformData = new ScriptField_SgTransform.Item();
|
||||
mChildren = new Vector();
|
||||
initData();
|
||||
}
|
||||
|
||||
public ScriptField_SgTransform.Item getData() {
|
||||
if (mChildren.size() != 0) {
|
||||
mChildField = new ScriptField_SgTransform(mRS, mChildren.size());
|
||||
mTransformData.children = mChildField.getAllocation();
|
||||
|
||||
for (int i = 0; i < mChildren.size(); i ++) {
|
||||
SgTransform child = (SgTransform)mChildren.get(i);
|
||||
mChildField.set(child.getData(), i, false);
|
||||
}
|
||||
mChildField.copyAll();
|
||||
}
|
||||
|
||||
return mTransformData;
|
||||
}
|
||||
|
||||
public ScriptField_SgTransform getField() {
|
||||
mTransformField = new ScriptField_SgTransform(mRS, 1);
|
||||
mTransformField.set(getData(), 0, true);
|
||||
return mTransformField;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,71 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2008 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.modelviewer;
|
||||
|
||||
import android.renderscript.RSSurfaceView;
|
||||
import android.renderscript.RenderScript;
|
||||
|
||||
import android.app.Activity;
|
||||
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.Config;
|
||||
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 java.lang.Runtime;
|
||||
|
||||
public class SimpleModel extends Activity {
|
||||
|
||||
private SimpleModelView mView;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle icicle) {
|
||||
super.onCreate(icicle);
|
||||
|
||||
// Create our Preview view and set it as the content of our
|
||||
// Activity
|
||||
mView = new SimpleModelView(this);
|
||||
setContentView(mView);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
// Ideally a game should implement onResume() and onPause()
|
||||
// to take appropriate action when the activity looses focus
|
||||
super.onResume();
|
||||
mView.resume();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
// Ideally a game should implement onResume() and onPause()
|
||||
// to take appropriate action when the activity looses focus
|
||||
super.onPause();
|
||||
mView.pause();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,168 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2008 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.modelviewer;
|
||||
|
||||
import java.io.Writer;
|
||||
|
||||
import android.content.res.Resources;
|
||||
import android.renderscript.*;
|
||||
import android.renderscript.ProgramStore.DepthFunc;
|
||||
import android.util.Log;
|
||||
|
||||
|
||||
public class SimpleModelRS {
|
||||
|
||||
private final int STATE_LAST_FOCUS = 1;
|
||||
|
||||
int mWidth;
|
||||
int mHeight;
|
||||
int mRotation;
|
||||
|
||||
public SimpleModelRS() {
|
||||
}
|
||||
|
||||
public void init(RenderScriptGL rs, Resources res, int width, int height) {
|
||||
mRS = rs;
|
||||
mRes = res;
|
||||
mWidth = width;
|
||||
mHeight = height;
|
||||
mRotation = 0;
|
||||
initRS();
|
||||
}
|
||||
|
||||
private Resources mRes;
|
||||
private RenderScriptGL mRS;
|
||||
private Sampler mSampler;
|
||||
private ProgramStore mPSBackground;
|
||||
private ProgramFragment mPFBackground;
|
||||
private ProgramVertex mPVBackground;
|
||||
private ProgramVertexFixedFunction.Constants mPVA;
|
||||
|
||||
private Allocation mGridImage;
|
||||
private Allocation mAllocPV;
|
||||
|
||||
private Mesh mMesh;
|
||||
|
||||
private Font mItalic;
|
||||
private Allocation mTextAlloc;
|
||||
|
||||
private ScriptC_simplemodel mScript;
|
||||
|
||||
int mLastX;
|
||||
int mLastY;
|
||||
|
||||
public void touchEvent(int x, int y) {
|
||||
int dx = mLastX - x;
|
||||
if (Math.abs(dx) > 50 || Math.abs(dx) < 3) {
|
||||
dx = 0;
|
||||
}
|
||||
|
||||
mRotation -= dx;
|
||||
if (mRotation > 360) {
|
||||
mRotation -= 360;
|
||||
}
|
||||
if (mRotation < 0) {
|
||||
mRotation += 360;
|
||||
}
|
||||
|
||||
mScript.set_gRotate((float)mRotation);
|
||||
|
||||
mLastX = x;
|
||||
mLastY = y;
|
||||
}
|
||||
|
||||
private void initPFS() {
|
||||
ProgramStore.Builder b = new ProgramStore.Builder(mRS);
|
||||
|
||||
b.setDepthFunc(ProgramStore.DepthFunc.LESS);
|
||||
b.setDitherEnabled(false);
|
||||
b.setDepthMaskEnabled(true);
|
||||
mPSBackground = b.create();
|
||||
|
||||
mScript.set_gPFSBackground(mPSBackground);
|
||||
}
|
||||
|
||||
private void initPF() {
|
||||
Sampler.Builder bs = new Sampler.Builder(mRS);
|
||||
bs.setMinification(Sampler.Value.LINEAR);
|
||||
bs.setMagnification(Sampler.Value.LINEAR);
|
||||
bs.setWrapS(Sampler.Value.CLAMP);
|
||||
bs.setWrapT(Sampler.Value.CLAMP);
|
||||
mSampler = bs.create();
|
||||
|
||||
ProgramFragmentFixedFunction.Builder b = new ProgramFragmentFixedFunction.Builder(mRS);
|
||||
b.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE,
|
||||
ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
|
||||
mPFBackground = b.create();
|
||||
mPFBackground.bindSampler(mSampler, 0);
|
||||
|
||||
mScript.set_gPFBackground(mPFBackground);
|
||||
}
|
||||
|
||||
private void initPV() {
|
||||
ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS);
|
||||
mPVBackground = pvb.create();
|
||||
|
||||
mPVA = new ProgramVertexFixedFunction.Constants(mRS);
|
||||
((ProgramVertexFixedFunction)mPVBackground).bindConstants(mPVA);
|
||||
|
||||
mScript.set_gPVBackground(mPVBackground);
|
||||
}
|
||||
|
||||
private void loadImage() {
|
||||
mGridImage = Allocation.createFromBitmapResource(mRS, mRes, R.drawable.robot,
|
||||
Allocation.MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
|
||||
Allocation.USAGE_GRAPHICS_TEXTURE);
|
||||
mScript.set_gTGrid(mGridImage);
|
||||
}
|
||||
|
||||
private void initTextAllocation() {
|
||||
String allocString = "Displaying file: R.raw.robot";
|
||||
mTextAlloc = Allocation.createFromString(mRS, allocString, Allocation.USAGE_SCRIPT);
|
||||
mScript.set_gTextAlloc(mTextAlloc);
|
||||
}
|
||||
|
||||
private void initRS() {
|
||||
|
||||
mScript = new ScriptC_simplemodel(mRS, mRes, R.raw.simplemodel);
|
||||
|
||||
initPFS();
|
||||
initPF();
|
||||
initPV();
|
||||
|
||||
loadImage();
|
||||
|
||||
FileA3D model = FileA3D.createFromResource(mRS, mRes, R.raw.robot);
|
||||
FileA3D.IndexEntry entry = model.getIndexEntry(0);
|
||||
if (entry == null || entry.getEntryType() != FileA3D.EntryType.MESH) {
|
||||
Log.e("rs", "could not load model");
|
||||
} else {
|
||||
mMesh = (Mesh)entry.getObject();
|
||||
mScript.set_gTestMesh(mMesh);
|
||||
}
|
||||
|
||||
mItalic = Font.create(mRS, mRes, "serif", Font.Style.ITALIC, 8);
|
||||
mScript.set_gItalic(mItalic);
|
||||
|
||||
initTextAllocation();
|
||||
|
||||
mRS.bindRootScript(mScript);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,96 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2008 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.modelviewer;
|
||||
|
||||
import java.io.Writer;
|
||||
import java.util.ArrayList;
|
||||
import java.util.concurrent.Semaphore;
|
||||
|
||||
import android.renderscript.RSSurfaceView;
|
||||
import android.renderscript.RenderScript;
|
||||
import android.renderscript.RenderScriptGL;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.drawable.BitmapDrawable;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
import android.view.Surface;
|
||||
import android.view.SurfaceHolder;
|
||||
import android.view.SurfaceView;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.MotionEvent;
|
||||
|
||||
public class SimpleModelView extends RSSurfaceView {
|
||||
|
||||
public SimpleModelView(Context context) {
|
||||
super(context);
|
||||
//setFocusable(true);
|
||||
}
|
||||
|
||||
private RenderScriptGL mRS;
|
||||
private SimpleModelRS mRender;
|
||||
|
||||
|
||||
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
|
||||
super.surfaceChanged(holder, format, w, h);
|
||||
if (mRS == null) {
|
||||
RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig();
|
||||
sc.setDepth(16, 24);
|
||||
mRS = createRenderScriptGL(sc);
|
||||
mRS.setSurface(holder, w, h);
|
||||
mRender = new SimpleModelRS();
|
||||
mRender.init(mRS, getResources(), w, h);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDetachedFromWindow() {
|
||||
if (mRS != null) {
|
||||
mRS = null;
|
||||
destroyRenderScriptGL();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onKeyDown(int keyCode, KeyEvent event)
|
||||
{
|
||||
// break point at here
|
||||
// this method doesn't work when 'extends View' include 'extends ScrollView'.
|
||||
return super.onKeyDown(keyCode, event);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent ev)
|
||||
{
|
||||
boolean ret = true;
|
||||
int act = ev.getAction();
|
||||
if (act == ev.ACTION_UP) {
|
||||
ret = false;
|
||||
}
|
||||
|
||||
mRender.touchEvent((int)ev.getX(), (int)ev.getY());
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,91 +0,0 @@
|
||||
// Copyright (C) 2009 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.
|
||||
|
||||
#pragma version(1)
|
||||
|
||||
#pragma rs java_package_name(com.android.modelviewer)
|
||||
|
||||
#include "rs_graphics.rsh"
|
||||
#include "transform_def.rsh"
|
||||
|
||||
rs_program_vertex gPVBackground;
|
||||
rs_program_fragment gPFBackground;
|
||||
|
||||
rs_allocation gTGrid;
|
||||
rs_mesh gTestMesh;
|
||||
|
||||
rs_program_store gPFSBackground;
|
||||
|
||||
float gRotate;
|
||||
|
||||
rs_font gItalic;
|
||||
rs_allocation gTextAlloc;
|
||||
|
||||
rs_script gTransformRS;
|
||||
|
||||
SgTransform *gGroup;
|
||||
SgTransform *gRobot1;
|
||||
int gRobot1Index;
|
||||
SgTransform *gRobot2;
|
||||
int gRobot2Index;
|
||||
|
||||
SgTransform *gRootNode;
|
||||
|
||||
void init() {
|
||||
gRotate = 0.0f;
|
||||
}
|
||||
|
||||
int root(int launchID) {
|
||||
|
||||
gGroup->transforms[1].w += 0.5f;
|
||||
gGroup->isDirty = 1;
|
||||
|
||||
SgTransform *robot1Ptr = gRobot1 + gRobot1Index;
|
||||
|
||||
robot1Ptr->transforms[1].w -= 1.5f;
|
||||
robot1Ptr->isDirty = 1;
|
||||
|
||||
SgTransform *robot2Ptr = gRobot2 + gRobot2Index;
|
||||
robot2Ptr->transforms[1].w += 2.5f;
|
||||
robot2Ptr->isDirty = 1;
|
||||
|
||||
rsForEach(gTransformRS, gRootNode->children, gRootNode->children, 0);
|
||||
|
||||
rsgClearColor(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
rsgClearDepth(1.0f);
|
||||
|
||||
rsgBindProgramVertex(gPVBackground);
|
||||
rs_matrix4x4 proj;
|
||||
float aspect = (float)rsgGetWidth() / (float)rsgGetHeight();
|
||||
rsMatrixLoadPerspective(&proj, 30.0f, aspect, 0.1f, 100.0f);
|
||||
rsgProgramVertexLoadProjectionMatrix(&proj);
|
||||
|
||||
rsgBindProgramFragment(gPFBackground);
|
||||
rsgBindProgramStore(gPFSBackground);
|
||||
rsgBindTexture(gPFBackground, 0, gTGrid);
|
||||
|
||||
rsgProgramVertexLoadModelMatrix(&robot1Ptr->globalMat);
|
||||
rsgDrawMesh(gTestMesh);
|
||||
|
||||
rsgProgramVertexLoadModelMatrix(&robot2Ptr->globalMat);
|
||||
rsgDrawMesh(gTestMesh);
|
||||
|
||||
//color(0.3f, 0.3f, 0.3f, 1.0f);
|
||||
rsgDrawText("Renderscript transform test", 30, 695);
|
||||
|
||||
rsgBindFont(gItalic);
|
||||
rsgDrawText(gTextAlloc, 30, 730);
|
||||
|
||||
return 10;
|
||||
}
|
||||
@@ -1,71 +0,0 @@
|
||||
// Copyright (C) 2009 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.
|
||||
|
||||
#pragma version(1)
|
||||
|
||||
#pragma rs java_package_name(com.android.modelviewer)
|
||||
|
||||
#include "rs_graphics.rsh"
|
||||
|
||||
rs_program_vertex gPVBackground;
|
||||
rs_program_fragment gPFBackground;
|
||||
|
||||
rs_allocation gTGrid;
|
||||
rs_mesh gTestMesh;
|
||||
|
||||
rs_program_store gPFSBackground;
|
||||
|
||||
float gRotate;
|
||||
|
||||
rs_font gItalic;
|
||||
rs_allocation gTextAlloc;
|
||||
|
||||
void init() {
|
||||
gRotate = 0.0f;
|
||||
}
|
||||
|
||||
int root(int launchID) {
|
||||
|
||||
rsgClearColor(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
rsgClearDepth(1.0f);
|
||||
|
||||
rsgBindProgramVertex(gPVBackground);
|
||||
rs_matrix4x4 proj;
|
||||
float aspect = (float)rsgGetWidth() / (float)rsgGetHeight();
|
||||
rsMatrixLoadPerspective(&proj, 30.0f, aspect, 0.1f, 100.0f);
|
||||
rsgProgramVertexLoadProjectionMatrix(&proj);
|
||||
|
||||
rsgBindProgramFragment(gPFBackground);
|
||||
rsgBindProgramStore(gPFSBackground);
|
||||
rsgBindTexture(gPFBackground, 0, gTGrid);
|
||||
|
||||
rs_matrix4x4 matrix;
|
||||
rsMatrixLoadIdentity(&matrix);
|
||||
// Position our model on the screen
|
||||
rsMatrixTranslate(&matrix, 0.0f, -0.3f, -10.0f);
|
||||
rsMatrixScale(&matrix, 0.2f, 0.2f, 0.2f);
|
||||
rsMatrixRotate(&matrix, 25.0f, 1.0f, 0.0f, 0.0f);
|
||||
rsMatrixRotate(&matrix, gRotate, 0.0f, 1.0f, 0.0f);
|
||||
rsgProgramVertexLoadModelMatrix(&matrix);
|
||||
|
||||
rsgDrawMesh(gTestMesh);
|
||||
|
||||
rsgFontColor(0.3f, 0.3f, 0.3f, 1.0f);
|
||||
rsgDrawText("Renderscript model test", 30, 695);
|
||||
|
||||
rsgBindFont(gItalic);
|
||||
rsgDrawText(gTextAlloc, 30, 730);
|
||||
|
||||
return 10;
|
||||
}
|
||||
@@ -1,96 +0,0 @@
|
||||
// Copyright (C) 2009 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.
|
||||
|
||||
#pragma version(1)
|
||||
|
||||
#pragma rs java_package_name(com.android.modelviewer)
|
||||
|
||||
#include "transform_def.rsh"
|
||||
|
||||
rs_script transformScript;
|
||||
|
||||
typedef struct {
|
||||
int changed;
|
||||
rs_matrix4x4 *mat;
|
||||
} ParentData;
|
||||
|
||||
static void appendTransformation(int type, float4 data, rs_matrix4x4 *mat) {
|
||||
rs_matrix4x4 temp;
|
||||
|
||||
switch (type) {
|
||||
case TRANSFORM_TRANSLATE:
|
||||
rsMatrixLoadTranslate(&temp, data.x, data.y, data.z);
|
||||
break;
|
||||
case TRANSFORM_ROTATE:
|
||||
rsMatrixLoadRotate(&temp, data.w, data.x, data.y, data.z);
|
||||
break;
|
||||
case TRANSFORM_SCALE:
|
||||
rsMatrixLoadScale(&temp, data.x, data.y, data.z);
|
||||
break;
|
||||
}
|
||||
rsMatrixMultiply(mat, &temp);
|
||||
}
|
||||
|
||||
void root(const void *v_in, void *v_out, const void *usrData, uint32_t x, uint32_t y) {
|
||||
|
||||
SgTransform *data = (SgTransform *)v_out;
|
||||
const ParentData *parent = (const ParentData *)usrData;
|
||||
|
||||
//rsDebug("Transform data", (int)data);
|
||||
//rsDebug("Entering parent", (int)parent);
|
||||
|
||||
rs_matrix4x4 *localMat = &data->localMat;
|
||||
rs_matrix4x4 *globalMat = &data->globalMat;
|
||||
|
||||
ParentData toChild;
|
||||
toChild.changed = 0;
|
||||
toChild.mat = globalMat;
|
||||
|
||||
//rsDebug("Transform is dirty", data->isDirty);
|
||||
|
||||
// Refresh matrices if dirty
|
||||
if (data->isDirty) {
|
||||
data->isDirty = 0;
|
||||
toChild.changed = 1;
|
||||
|
||||
// Reset our local matrix
|
||||
rsMatrixLoadIdentity(localMat);
|
||||
|
||||
for (int i = 0; i < 16; i ++) {
|
||||
if (data->transformTypes[i] == TRANSFORM_NONE) {
|
||||
break;
|
||||
}
|
||||
//rsDebug("Transform adding transformation", transformTypes[i]);
|
||||
appendTransformation(data->transformTypes[i], data->transforms[i], localMat);
|
||||
}
|
||||
}
|
||||
|
||||
//rsDebug("Transform checking parent", (int)0);
|
||||
|
||||
if (parent) {
|
||||
if (parent->changed) {
|
||||
toChild.changed = 1;
|
||||
|
||||
rsMatrixLoad(globalMat, parent->mat);
|
||||
rsMatrixMultiply(globalMat, localMat);
|
||||
}
|
||||
} else {
|
||||
rsMatrixLoad(globalMat, localMat);
|
||||
}
|
||||
|
||||
//rsDebug("Transform calling self with child ", (int)data->children.p);
|
||||
if (data->children.p) {
|
||||
rsForEach(transformScript, data->children, data->children, (void*)&toChild);
|
||||
}
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
// Copyright (C) 2009 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.
|
||||
|
||||
#pragma version(1)
|
||||
|
||||
#pragma rs java_package_name(com.android.modelviewer)
|
||||
|
||||
#define TRANSFORM_NONE 0
|
||||
#define TRANSFORM_TRANSLATE 1
|
||||
#define TRANSFORM_ROTATE 2
|
||||
#define TRANSFORM_SCALE 3
|
||||
|
||||
typedef struct __attribute__((packed, aligned(4))) SgTransform {
|
||||
rs_matrix4x4 globalMat;
|
||||
rs_matrix4x4 localMat;
|
||||
|
||||
float4 transforms[16];
|
||||
int transformTypes[16];
|
||||
|
||||
int isDirty;
|
||||
|
||||
rs_allocation children;
|
||||
|
||||
} SgTransform;
|
||||
@@ -1,30 +0,0 @@
|
||||
#
|
||||
# Copyright (C) 2008 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.
|
||||
#
|
||||
|
||||
ifneq ($(TARGET_SIMULATOR),true)
|
||||
|
||||
LOCAL_PATH := $(call my-dir)
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_MODULE_TAGS := optional
|
||||
|
||||
LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src)
|
||||
|
||||
LOCAL_PACKAGE_NAME := RSTest
|
||||
|
||||
include $(BUILD_PACKAGE)
|
||||
|
||||
endif
|
||||
@@ -1,15 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.android.rs.test">
|
||||
<application
|
||||
android:label="_RS_Test"
|
||||
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.
|
Before Width: | Height: | Size: 307 B |
@@ -1,84 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2008 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.renderscript.RSSurfaceView;
|
||||
import android.renderscript.RenderScript;
|
||||
|
||||
import android.app.Activity;
|
||||
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.Config;
|
||||
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 java.lang.Runtime;
|
||||
|
||||
public class RSTest extends Activity {
|
||||
//EventListener mListener = new EventListener();
|
||||
|
||||
private static final String LOG_TAG = "libRS_jni";
|
||||
private static final boolean DEBUG = false;
|
||||
private static final boolean LOG_ENABLED = DEBUG ? Config.LOGD : Config.LOGV;
|
||||
|
||||
private RSTestView mView;
|
||||
|
||||
// get the current looper (from your Activity UI thread for instance
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle icicle) {
|
||||
super.onCreate(icicle);
|
||||
|
||||
// Create our Preview view and set it as the content of our
|
||||
// Activity
|
||||
mView = new RSTestView(this);
|
||||
setContentView(mView);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
// Ideally a game should implement onResume() and onPause()
|
||||
// to take appropriate action when the activity loses focus
|
||||
super.onResume();
|
||||
mView.resume();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
// Ideally a game should implement onResume() and onPause()
|
||||
// to take appropriate action when the activity loses focus
|
||||
super.onPause();
|
||||
mView.pause();
|
||||
}
|
||||
|
||||
static void log(String message) {
|
||||
if (LOG_ENABLED) {
|
||||
Log.v(LOG_TAG, message);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -1,206 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2008 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.rs.test;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.renderscript.*;
|
||||
import android.util.Log;
|
||||
import java.util.ArrayList;
|
||||
import java.util.ListIterator;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
|
||||
public class RSTestCore {
|
||||
int mWidth;
|
||||
int mHeight;
|
||||
Context mCtx;
|
||||
|
||||
public RSTestCore(Context ctx) {
|
||||
mCtx = ctx;
|
||||
}
|
||||
|
||||
private Resources mRes;
|
||||
private RenderScriptGL mRS;
|
||||
|
||||
private Font mFont;
|
||||
ScriptField_ListAllocs_s mListAllocs;
|
||||
int mLastX;
|
||||
int mLastY;
|
||||
private ScriptC_rslist mScript;
|
||||
|
||||
private ArrayList<UnitTest> unitTests;
|
||||
private ListIterator<UnitTest> test_iter;
|
||||
private UnitTest activeTest;
|
||||
private boolean stopTesting;
|
||||
|
||||
/* Periodic timer for ensuring future tests get scheduled */
|
||||
private Timer mTimer;
|
||||
public static final int RS_TIMER_PERIOD = 100;
|
||||
|
||||
public void init(RenderScriptGL rs, Resources res, int width, int height) {
|
||||
mRS = rs;
|
||||
mRes = res;
|
||||
mWidth = width;
|
||||
mHeight = height;
|
||||
stopTesting = false;
|
||||
|
||||
mScript = new ScriptC_rslist(mRS, mRes, R.raw.rslist);
|
||||
|
||||
unitTests = new ArrayList<UnitTest>();
|
||||
|
||||
unitTests.add(new UT_primitives(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_math(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].result;
|
||||
mListAllocs.set(listElem, i, false);
|
||||
uta[i].setItem(listElem);
|
||||
}
|
||||
|
||||
mListAllocs.copyAll();
|
||||
|
||||
mScript.bind_gList(mListAllocs);
|
||||
|
||||
mFont = Font.create(mRS, mRes, "serif", Font.Style.BOLD, 8);
|
||||
mScript.set_gFont(mFont);
|
||||
|
||||
mRS.bindRootScript(mScript);
|
||||
|
||||
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() {
|
||||
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();
|
||||
|
||||
if (mListAllocs != null && mScript != null && mRS != null) {
|
||||
mListAllocs.copyAll();
|
||||
|
||||
mScript.bind_gList(mListAllocs);
|
||||
mRS.bindRootScript(mScript);
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void newTouchPosition(float x, float y, float pressure, int id) {
|
||||
}
|
||||
|
||||
public void onActionDown(int x, int y) {
|
||||
mScript.set_gDY(0.0f);
|
||||
mLastX = x;
|
||||
mLastY = y;
|
||||
refreshTestResults();
|
||||
}
|
||||
|
||||
public void onActionMove(int x, int y) {
|
||||
int dx = mLastX - x;
|
||||
int dy = mLastY - y;
|
||||
|
||||
if (Math.abs(dy) <= 2) {
|
||||
dy = 0;
|
||||
}
|
||||
|
||||
mScript.set_gDY(dy);
|
||||
|
||||
mLastX = x;
|
||||
mLastY = y;
|
||||
refreshTestResults();
|
||||
}
|
||||
}
|
||||
@@ -1,97 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2008 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 java.io.Writer;
|
||||
import java.util.ArrayList;
|
||||
import java.util.concurrent.Semaphore;
|
||||
|
||||
import android.renderscript.RSSurfaceView;
|
||||
import android.renderscript.RenderScript;
|
||||
import android.renderscript.RenderScriptGL;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.drawable.BitmapDrawable;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
import android.view.Surface;
|
||||
import android.view.SurfaceHolder;
|
||||
import android.view.SurfaceView;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.MotionEvent;
|
||||
|
||||
public class RSTestView extends RSSurfaceView {
|
||||
|
||||
private Context mCtx;
|
||||
|
||||
public RSTestView(Context context) {
|
||||
super(context);
|
||||
mCtx = context;
|
||||
//setFocusable(true);
|
||||
}
|
||||
|
||||
private RenderScriptGL mRS;
|
||||
private RSTestCore mRender;
|
||||
|
||||
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
|
||||
super.surfaceChanged(holder, format, w, h);
|
||||
if (mRS == null) {
|
||||
RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig();
|
||||
mRS = createRenderScriptGL(sc);
|
||||
mRS.setSurface(holder, w, h);
|
||||
mRender = new RSTestCore(mCtx);
|
||||
mRender.init(mRS, getResources(), w, h);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDetachedFromWindow() {
|
||||
if(mRS != null) {
|
||||
mRender.cleanup();
|
||||
mRS = null;
|
||||
destroyRenderScriptGL();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onKeyDown(int keyCode, KeyEvent event)
|
||||
{
|
||||
return super.onKeyDown(keyCode, event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent ev)
|
||||
{
|
||||
boolean ret = false;
|
||||
int act = ev.getAction();
|
||||
if (act == ev.ACTION_DOWN) {
|
||||
mRender.onActionDown((int)ev.getX(), (int)ev.getY());
|
||||
ret = true;
|
||||
}
|
||||
else if (act == ev.ACTION_MOVE) {
|
||||
mRender.onActionMove((int)ev.getX(), (int)ev.getY());
|
||||
ret = true;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2010 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.rs.test;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.renderscript.*;
|
||||
|
||||
public class UT_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, mRes, R.raw.fp_mad);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
s.invoke_fp_mad_test(0, 0);
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2010 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.rs.test;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.renderscript.*;
|
||||
|
||||
public class UT_math extends UnitTest {
|
||||
private Resources mRes;
|
||||
|
||||
protected UT_math(RSTestCore rstc, Resources res, Context ctx) {
|
||||
super(rstc, "Math", ctx);
|
||||
mRes = res;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
RenderScript pRS = RenderScript.create(mCtx);
|
||||
ScriptC_math s = new ScriptC_math(pRS, mRes, R.raw.math);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
s.invoke_math_test(0, 0);
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -1,104 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2010 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.rs.test;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.renderscript.*;
|
||||
|
||||
public class UT_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, mRes, R.raw.primitives);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
if (!initializeGlobals(s)) {
|
||||
// initializeGlobals failed
|
||||
result = -1;
|
||||
} else {
|
||||
s.invoke_primitives_test(0, 0);
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
}
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2010 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.rs.test;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.renderscript.*;
|
||||
|
||||
public class UT_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, mRes, R.raw.rsdebug);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
s.invoke_test_rsdebug(0, 0);
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2010 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.rs.test;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.renderscript.*;
|
||||
|
||||
public class UT_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, mRes, R.raw.rstime);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
s.invoke_test_rstime(0, 0);
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2010 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.rs.test;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.renderscript.*;
|
||||
|
||||
public class UT_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, mRes, R.raw.rstypes);
|
||||
pRS.setMessageHandler(mRsMessage);
|
||||
s.invoke_test_rstypes(0, 0);
|
||||
pRS.finish();
|
||||
waitForMessage();
|
||||
pRS.destroy();
|
||||
}
|
||||
}
|
||||
@@ -1,106 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2010 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.rs.test;
|
||||
import android.content.Context;
|
||||
import android.renderscript.RenderScript.RSMessageHandler;
|
||||
import android.util.Log;
|
||||
|
||||
public class UnitTest extends Thread {
|
||||
public String name;
|
||||
public 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 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:
|
||||
android.util.Log.v("RenderScript", "Unit test got unexpected message");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
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. */
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
public void waitForMessage() {
|
||||
while (!msgHandled) {
|
||||
yield();
|
||||
}
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,174 +0,0 @@
|
||||
#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);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,322 +0,0 @@
|
||||
#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 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_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_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_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(copysign);
|
||||
TEST_FN_FUNC_FN(cos);
|
||||
TEST_FN_FUNC_FN(cosh);
|
||||
TEST_FN_FUNC_FN(cospi);
|
||||
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_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_PFN(modf);
|
||||
// nan
|
||||
TEST_FN_FUNC_FN_FN(nextafter);
|
||||
TEST_FN_FUNC_FN_FN(pow);
|
||||
TEST_FN_FUNC_FN_IN(pown);
|
||||
TEST_FN_FUNC_FN_FN(powr);
|
||||
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(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(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;
|
||||
}
|
||||
|
||||
#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;
|
||||
|
||||
#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;
|
||||
|
||||
DECL_INT(res)
|
||||
DECL_INT(src1)
|
||||
DECL_INT(src2)
|
||||
|
||||
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_basic_operators();
|
||||
|
||||
if (failed) {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||
}
|
||||
else {
|
||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,61 +0,0 @@
|
||||
#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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
#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 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("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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,107 +0,0 @@
|
||||
// Copyright (C) 2009 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.
|
||||
|
||||
#pragma version(1)
|
||||
|
||||
#pragma rs java_package_name(com.android.rs.test)
|
||||
|
||||
#include "rs_graphics.rsh"
|
||||
|
||||
float gDY;
|
||||
|
||||
rs_font gFont;
|
||||
|
||||
typedef struct ListAllocs_s {
|
||||
rs_allocation text;
|
||||
int result;
|
||||
} ListAllocs;
|
||||
|
||||
ListAllocs *gList;
|
||||
|
||||
void init() {
|
||||
gDY = 0.0f;
|
||||
}
|
||||
|
||||
int textPos = 0;
|
||||
|
||||
int root(int launchID) {
|
||||
|
||||
rsgClearColor(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
rsgClearDepth(1.0f);
|
||||
|
||||
textPos -= (int)gDY*2;
|
||||
gDY *= 0.95;
|
||||
|
||||
rsgFontColor(0.9f, 0.9f, 0.9f, 1.0f);
|
||||
rsgBindFont(gFont);
|
||||
|
||||
rs_allocation listAlloc;
|
||||
rsSetObject(&listAlloc, rsGetAllocation(gList));
|
||||
int allocSize = rsAllocationGetDimX(listAlloc);
|
||||
|
||||
int width = rsgGetWidth();
|
||||
int height = rsgGetHeight();
|
||||
|
||||
int itemHeight = 80;
|
||||
int totalItemHeight = itemHeight * allocSize;
|
||||
|
||||
/* Prevent scrolling above the top of the list */
|
||||
int firstItem = height - totalItemHeight;
|
||||
if (firstItem < 0) {
|
||||
firstItem = 0;
|
||||
}
|
||||
|
||||
/* Prevent scrolling past the last line of the list */
|
||||
int lastItem = -1 * (totalItemHeight - height);
|
||||
if (lastItem > 0) {
|
||||
lastItem = 0;
|
||||
}
|
||||
|
||||
if (textPos > firstItem) {
|
||||
textPos = firstItem;
|
||||
}
|
||||
else if (textPos < lastItem) {
|
||||
textPos = lastItem;
|
||||
}
|
||||
|
||||
int currentYPos = itemHeight + textPos;
|
||||
|
||||
for(int i = 0; i < allocSize; i ++) {
|
||||
if(currentYPos - itemHeight > height) {
|
||||
break;
|
||||
}
|
||||
|
||||
if(currentYPos > 0) {
|
||||
switch(gList[i].result) {
|
||||
case 1: /* Passed */
|
||||
rsgFontColor(0.5f, 0.9f, 0.5f, 1.0f);
|
||||
break;
|
||||
case -1: /* Failed */
|
||||
rsgFontColor(0.9f, 0.5f, 0.5f, 1.0f);
|
||||
break;
|
||||
case 0: /* Still Testing */
|
||||
rsgFontColor(0.9f, 0.9f, 0.5f, 1.0f);
|
||||
break;
|
||||
default: /* Unknown */
|
||||
rsgFontColor(0.9f, 0.9f, 0.9f, 1.0f);
|
||||
break;
|
||||
}
|
||||
rsgDrawRect(0, currentYPos - 1, width, currentYPos, 0);
|
||||
rsgDrawText(gList[i].text, 30, currentYPos - 32);
|
||||
}
|
||||
currentYPos += itemHeight;
|
||||
}
|
||||
|
||||
return 10;
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
#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 (only valid for PST 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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,79 +0,0 @@
|
||||
#include "shared.rsh"
|
||||
#include "rs_graphics.rsh"
|
||||
|
||||
rs_element elementTest;
|
||||
rs_type typeTest;
|
||||
rs_allocation allocationTest;
|
||||
rs_sampler samplerTest;
|
||||
rs_script scriptTest;
|
||||
rs_mesh meshTest;
|
||||
rs_program_fragment program_fragmentTest;
|
||||
rs_program_vertex program_vertexTest;
|
||||
rs_program_raster program_rasterTest;
|
||||
rs_program_store program_storeTest;
|
||||
rs_font fontTest;
|
||||
|
||||
rs_matrix4x4 matrix4x4Test;
|
||||
rs_matrix3x3 matrix3x3Test;
|
||||
rs_matrix2x2 matrix2x2Test;
|
||||
|
||||
struct my_struct {
|
||||
int i;
|
||||
rs_font fontTestStruct;
|
||||
};
|
||||
|
||||
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;
|
||||
rs_mesh meshTestLocal;
|
||||
rs_program_fragment program_fragmentTestLocal;
|
||||
rs_program_vertex program_vertexTestLocal;
|
||||
rs_program_raster program_rasterTestLocal;
|
||||
rs_program_store program_storeTestLocal;
|
||||
rs_font fontTestLocal;
|
||||
|
||||
rs_font fontTestLocalArray[4];
|
||||
|
||||
rs_font fontTestLocalPreInit = fontTest;
|
||||
|
||||
struct my_struct structTest;
|
||||
|
||||
rsSetObject(&fontTestLocal, fontTest);
|
||||
//allocationTestLocal = allocationTest;
|
||||
|
||||
rsSetObject(&fontTest, fontTestLocal);
|
||||
//allocationTest = allocationTestLocal;
|
||||
|
||||
/*for (int i = 0; i < 4; i++) {
|
||||
rsSetObject(&fontTestLocalArray[i], fontTestLocal);
|
||||
}*/
|
||||
|
||||
/*rsSetObject(&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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
#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)
|
||||
|
||||
/* These constants must match those in UnitTest.java */
|
||||
static const int RS_MSG_TEST_PASSED = 100;
|
||||
static const int RS_MSG_TEST_FAILED = 101;
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
// 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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user