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:
Scott Main
2011-02-17 16:09:25 -08:00
parent e766fcd5e9
commit 0ddd2d1ea7
48 changed files with 0 additions and 3873 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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>

View File

@@ -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>

View File

@@ -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);
}
}

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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

View File

@@ -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();
}
}

View File

@@ -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);
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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();
}
}

View File

@@ -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);
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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);
}
}

View File

@@ -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;

View File

@@ -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

View File

@@ -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

View File

@@ -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);
}
}
}

View File

@@ -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();
}
}

View File

@@ -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;
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}
}

View File

@@ -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);
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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;
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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;

View File

@@ -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;
}