DO NOT MERGE
Delete unused/broken samples and tests from the renderscript libs, so we can publish the entire contents of libs/rs/java/ for samples in HC Change-Id: I0428074e995d7ee282520f54a9a3c81e32bff027
This commit is contained in:
@@ -1,32 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (C) 2009 The Android Open Source Project
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
#
|
|
||||||
|
|
||||||
ifneq ($(TARGET_SIMULATOR),true)
|
|
||||||
|
|
||||||
LOCAL_PATH := $(call my-dir)
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
|
|
||||||
LOCAL_MODULE_TAGS := optional
|
|
||||||
|
|
||||||
LOCAL_SRC_FILES := $(call all-java-files-under, src) \
|
|
||||||
$(call all-renderscript-files-under, src)
|
|
||||||
#LOCAL_STATIC_JAVA_LIBRARIES := android.renderscript
|
|
||||||
|
|
||||||
LOCAL_PACKAGE_NAME := ImageProcessing
|
|
||||||
|
|
||||||
include $(BUILD_PACKAGE)
|
|
||||||
|
|
||||||
endif
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
|
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
package="com.android.rs.image">
|
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
|
||||||
<uses-sdk android:minSdkVersion="11" />
|
|
||||||
<application android:label="Image Processing">
|
|
||||||
<activity android:name="ImageProcessingActivity"
|
|
||||||
android:screenOrientation="portrait">
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.intent.action.MAIN" />
|
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
|
||||||
</intent-filter>
|
|
||||||
</activity>
|
|
||||||
</application>
|
|
||||||
</manifest>
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 75 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 75 KiB |
@@ -1,187 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!-- Copyright (C) 2009 The Android Open Source Project
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<merge xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
|
|
||||||
<SurfaceView
|
|
||||||
android:id="@+id/surface"
|
|
||||||
android:layout_width="1dip"
|
|
||||||
android:layout_height="1dip" />
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/display"
|
|
||||||
android:layout_width="320dip"
|
|
||||||
android:layout_height="266dip" />
|
|
||||||
|
|
||||||
<Button
|
|
||||||
android:layout_marginBottom="170dip"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="40dip"
|
|
||||||
android:text="@string/benchmark"
|
|
||||||
android:onClick="benchmark"
|
|
||||||
android:layout_gravity="bottom"/>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/benchmarkText"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:textSize="18sp"
|
|
||||||
android:layout_marginLeft="100dip"
|
|
||||||
android:layout_marginBottom="175dip"
|
|
||||||
android:layout_gravity="bottom"
|
|
||||||
android:text="@string/saturation"/>
|
|
||||||
|
|
||||||
<SeekBar
|
|
||||||
android:id="@+id/inSaturation"
|
|
||||||
android:layout_marginBottom="140dip"
|
|
||||||
android:layout_marginLeft="10dip"
|
|
||||||
android:layout_marginRight="10dip"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="bottom" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/inSaturationText"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:textSize="18sp"
|
|
||||||
android:layout_marginLeft="50dip"
|
|
||||||
android:layout_marginBottom="142dip"
|
|
||||||
android:textColor="#000"
|
|
||||||
android:layout_gravity="bottom"
|
|
||||||
android:text="@string/saturation"/>
|
|
||||||
|
|
||||||
<SeekBar
|
|
||||||
android:id="@+id/inGamma"
|
|
||||||
android:layout_marginBottom="110dip"
|
|
||||||
android:layout_marginLeft="10dip"
|
|
||||||
android:layout_marginRight="10dip"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="bottom" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/inGammaText"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:textSize="18sp"
|
|
||||||
android:layout_marginLeft="50dip"
|
|
||||||
android:layout_marginBottom="112dip"
|
|
||||||
android:textColor="#000"
|
|
||||||
android:layout_gravity="bottom"
|
|
||||||
android:text="@string/gamma"/>
|
|
||||||
|
|
||||||
<SeekBar
|
|
||||||
android:id="@+id/outWhite"
|
|
||||||
android:layout_marginBottom="80dip"
|
|
||||||
android:layout_marginLeft="170dip"
|
|
||||||
android:layout_marginRight="10dip"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="bottom" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/outWhiteText"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:textSize="18sp"
|
|
||||||
android:layout_marginLeft="220dip"
|
|
||||||
android:layout_marginBottom="82dip"
|
|
||||||
android:textColor="#000"
|
|
||||||
android:layout_gravity="bottom"
|
|
||||||
android:text="@string/out_white"/>
|
|
||||||
|
|
||||||
<SeekBar
|
|
||||||
android:id="@+id/inWhite"
|
|
||||||
android:layout_marginBottom="80dip"
|
|
||||||
android:layout_marginLeft="10dip"
|
|
||||||
android:layout_marginRight="170dip"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="bottom" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/inWhiteText"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:textSize="18sp"
|
|
||||||
android:layout_marginLeft="50dip"
|
|
||||||
android:layout_marginBottom="82dip"
|
|
||||||
android:textColor="#000"
|
|
||||||
android:layout_gravity="bottom"
|
|
||||||
android:text="@string/in_white"/>
|
|
||||||
|
|
||||||
<SeekBar
|
|
||||||
android:id="@+id/outBlack"
|
|
||||||
android:layout_marginBottom="50dip"
|
|
||||||
android:layout_marginLeft="170dip"
|
|
||||||
android:layout_marginRight="10dip"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="bottom" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/outBlackText"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:textSize="18sp"
|
|
||||||
android:layout_marginLeft="220dip"
|
|
||||||
android:layout_marginBottom="52dip"
|
|
||||||
android:textColor="#000"
|
|
||||||
android:layout_gravity="bottom"
|
|
||||||
android:text="@string/out_black"/>
|
|
||||||
|
|
||||||
<SeekBar
|
|
||||||
android:id="@+id/inBlack"
|
|
||||||
android:layout_marginBottom="50dip"
|
|
||||||
android:layout_marginLeft="10dip"
|
|
||||||
android:layout_marginRight="170dip"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="bottom" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/inBlackText"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:textSize="18sp"
|
|
||||||
android:layout_marginLeft="50dip"
|
|
||||||
android:layout_marginBottom="52dip"
|
|
||||||
android:textColor="#000"
|
|
||||||
android:layout_gravity="bottom"
|
|
||||||
android:text="@string/in_black"/>
|
|
||||||
|
|
||||||
<SeekBar
|
|
||||||
android:id="@+id/radius"
|
|
||||||
android:layout_marginBottom="10dip"
|
|
||||||
android:layout_marginLeft="10dip"
|
|
||||||
android:layout_marginRight="10dip"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="bottom" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/blurText"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:textSize="18sp"
|
|
||||||
android:layout_marginLeft="50dip"
|
|
||||||
android:layout_marginBottom="12dip"
|
|
||||||
android:textColor="#000"
|
|
||||||
android:layout_gravity="bottom"
|
|
||||||
android:text="@string/blur_description"/>
|
|
||||||
|
|
||||||
</merge>
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!--
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2008 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
-->
|
|
||||||
|
|
||||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
|
||||||
<!-- General -->
|
|
||||||
<skip />
|
|
||||||
<!--slider label -->
|
|
||||||
<string name="blur_description">Blur Radius</string>
|
|
||||||
<string name="in_white">In White</string>
|
|
||||||
<string name="out_white">Out White</string>
|
|
||||||
<string name="in_black">In Black</string>
|
|
||||||
<string name="out_black">Out Black</string>
|
|
||||||
<string name="gamma">Gamma</string>
|
|
||||||
<string name="saturation">Saturation</string>
|
|
||||||
<string name="benchmark">Benchmark</string>
|
|
||||||
|
|
||||||
</resources>
|
|
||||||
@@ -1,441 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2009 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.rs.image;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.graphics.BitmapFactory;
|
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import android.graphics.Canvas;
|
|
||||||
import android.renderscript.ScriptC;
|
|
||||||
import android.renderscript.RenderScript;
|
|
||||||
import android.renderscript.Type;
|
|
||||||
import android.renderscript.Allocation;
|
|
||||||
import android.renderscript.Element;
|
|
||||||
import android.renderscript.Script;
|
|
||||||
import android.view.SurfaceView;
|
|
||||||
import android.view.SurfaceHolder;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.SeekBar;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import android.view.View;
|
|
||||||
import java.lang.Math;
|
|
||||||
|
|
||||||
public class ImageProcessingActivity extends Activity
|
|
||||||
implements SurfaceHolder.Callback,
|
|
||||||
SeekBar.OnSeekBarChangeListener {
|
|
||||||
private Bitmap mBitmapIn;
|
|
||||||
private Bitmap mBitmapOut;
|
|
||||||
private Bitmap mBitmapScratch;
|
|
||||||
private ScriptC_threshold mScript;
|
|
||||||
private ScriptC_vertical_blur mScriptVBlur;
|
|
||||||
private ScriptC_horizontal_blur mScriptHBlur;
|
|
||||||
private int mRadius = 0;
|
|
||||||
private SeekBar mRadiusSeekBar;
|
|
||||||
|
|
||||||
private float mInBlack = 0.0f;
|
|
||||||
private SeekBar mInBlackSeekBar;
|
|
||||||
private float mOutBlack = 0.0f;
|
|
||||||
private SeekBar mOutBlackSeekBar;
|
|
||||||
private float mInWhite = 255.0f;
|
|
||||||
private SeekBar mInWhiteSeekBar;
|
|
||||||
private float mOutWhite = 255.0f;
|
|
||||||
private SeekBar mOutWhiteSeekBar;
|
|
||||||
private float mGamma = 1.0f;
|
|
||||||
private SeekBar mGammaSeekBar;
|
|
||||||
|
|
||||||
private float mSaturation = 1.0f;
|
|
||||||
private SeekBar mSaturationSeekBar;
|
|
||||||
|
|
||||||
private TextView mBenchmarkResult;
|
|
||||||
|
|
||||||
@SuppressWarnings({"FieldCanBeLocal"})
|
|
||||||
private RenderScript mRS;
|
|
||||||
@SuppressWarnings({"FieldCanBeLocal"})
|
|
||||||
private Type mPixelType;
|
|
||||||
@SuppressWarnings({"FieldCanBeLocal"})
|
|
||||||
private Allocation mInPixelsAllocation;
|
|
||||||
@SuppressWarnings({"FieldCanBeLocal"})
|
|
||||||
private Allocation mOutPixelsAllocation;
|
|
||||||
@SuppressWarnings({"FieldCanBeLocal"})
|
|
||||||
private Allocation mScratchPixelsAllocation1;
|
|
||||||
private Allocation mScratchPixelsAllocation2;
|
|
||||||
|
|
||||||
private SurfaceView mSurfaceView;
|
|
||||||
private ImageView mDisplayView;
|
|
||||||
|
|
||||||
class FilterCallback extends RenderScript.RSMessageHandler {
|
|
||||||
private Runnable mAction = new Runnable() {
|
|
||||||
public void run() {
|
|
||||||
mDisplayView.invalidate();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
mSurfaceView.removeCallbacks(mAction);
|
|
||||||
mSurfaceView.post(mAction);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int in[];
|
|
||||||
int interm[];
|
|
||||||
int out[];
|
|
||||||
int MAX_RADIUS = 25;
|
|
||||||
// Store our coefficients here
|
|
||||||
float gaussian[];
|
|
||||||
|
|
||||||
private long javaFilter() {
|
|
||||||
final int width = mBitmapIn.getWidth();
|
|
||||||
final int height = mBitmapIn.getHeight();
|
|
||||||
final int count = width * height;
|
|
||||||
|
|
||||||
if (in == null) {
|
|
||||||
in = new int[count];
|
|
||||||
interm = new int[count];
|
|
||||||
out = new int[count];
|
|
||||||
gaussian = new float[MAX_RADIUS * 2 + 1];
|
|
||||||
mBitmapIn.getPixels(in, 0, width, 0, 0, width, height);
|
|
||||||
}
|
|
||||||
|
|
||||||
long t = java.lang.System.currentTimeMillis();
|
|
||||||
|
|
||||||
int w, h, r;
|
|
||||||
|
|
||||||
float fRadius = (float)mRadius;
|
|
||||||
int radius = (int)mRadius;
|
|
||||||
|
|
||||||
// Compute gaussian weights for the blur
|
|
||||||
// e is the euler's number
|
|
||||||
float e = 2.718281828459045f;
|
|
||||||
float pi = 3.1415926535897932f;
|
|
||||||
// g(x) = ( 1 / sqrt( 2 * pi ) * sigma) * e ^ ( -x^2 / 2 * sigma^2 )
|
|
||||||
// x is of the form [-radius .. 0 .. radius]
|
|
||||||
// and sigma varies with radius.
|
|
||||||
// Based on some experimental radius values and sigma's
|
|
||||||
// we approximately fit sigma = f(radius) as
|
|
||||||
// sigma = radius * 0.4 + 0.6
|
|
||||||
// The larger the radius gets, the more our gaussian blur
|
|
||||||
// will resemble a box blur since with large sigma
|
|
||||||
// the gaussian curve begins to lose its shape
|
|
||||||
float sigma = 0.4f * fRadius + 0.6f;
|
|
||||||
// Now compute the coefficints
|
|
||||||
// We will store some redundant values to save some math during
|
|
||||||
// the blur calculations
|
|
||||||
// precompute some values
|
|
||||||
float coeff1 = 1.0f / (float)(Math.sqrt( 2.0f * pi ) * sigma);
|
|
||||||
float coeff2 = - 1.0f / (2.0f * sigma * sigma);
|
|
||||||
float normalizeFactor = 0.0f;
|
|
||||||
float floatR = 0.0f;
|
|
||||||
for (r = -radius; r <= radius; r ++) {
|
|
||||||
floatR = (float)r;
|
|
||||||
gaussian[r + radius] = coeff1 * (float)Math.pow(e, floatR * floatR * coeff2);
|
|
||||||
normalizeFactor += gaussian[r + radius];
|
|
||||||
}
|
|
||||||
|
|
||||||
//Now we need to normalize the weights because all our coefficients need to add up to one
|
|
||||||
normalizeFactor = 1.0f / normalizeFactor;
|
|
||||||
for (r = -radius; r <= radius; r ++) {
|
|
||||||
floatR = (float)r;
|
|
||||||
gaussian[r + radius] *= normalizeFactor;
|
|
||||||
}
|
|
||||||
|
|
||||||
float blurredPixelR = 0.0f;
|
|
||||||
float blurredPixelG = 0.0f;
|
|
||||||
float blurredPixelB = 0.0f;
|
|
||||||
float blurredPixelA = 0.0f;
|
|
||||||
|
|
||||||
for (h = 0; h < height; h ++) {
|
|
||||||
for (w = 0; w < width; w ++) {
|
|
||||||
|
|
||||||
blurredPixelR = 0.0f;
|
|
||||||
blurredPixelG = 0.0f;
|
|
||||||
blurredPixelB = 0.0f;
|
|
||||||
blurredPixelA = 0.0f;
|
|
||||||
|
|
||||||
for (r = -radius; r <= radius; r ++) {
|
|
||||||
// Stepping left and right away from the pixel
|
|
||||||
int validW = w + r;
|
|
||||||
// Clamp to zero and width max() isn't exposed for ints yet
|
|
||||||
if (validW < 0) {
|
|
||||||
validW = 0;
|
|
||||||
}
|
|
||||||
if (validW > width - 1) {
|
|
||||||
validW = width - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int input = in[h*width + validW];
|
|
||||||
|
|
||||||
int R = ((input >> 24) & 0xff);
|
|
||||||
int G = ((input >> 16) & 0xff);
|
|
||||||
int B = ((input >> 8) & 0xff);
|
|
||||||
int A = (input & 0xff);
|
|
||||||
|
|
||||||
float weight = gaussian[r + radius];
|
|
||||||
|
|
||||||
blurredPixelR += (float)(R)*weight;
|
|
||||||
blurredPixelG += (float)(G)*weight;
|
|
||||||
blurredPixelB += (float)(B)*weight;
|
|
||||||
blurredPixelA += (float)(A)*weight;
|
|
||||||
}
|
|
||||||
|
|
||||||
int R = (int)blurredPixelR;
|
|
||||||
int G = (int)blurredPixelG;
|
|
||||||
int B = (int)blurredPixelB;
|
|
||||||
int A = (int)blurredPixelA;
|
|
||||||
|
|
||||||
interm[h*width + w] = (R << 24) | (G << 16) | (B << 8) | (A);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (h = 0; h < height; h ++) {
|
|
||||||
for (w = 0; w < width; w ++) {
|
|
||||||
|
|
||||||
blurredPixelR = 0.0f;
|
|
||||||
blurredPixelG = 0.0f;
|
|
||||||
blurredPixelB = 0.0f;
|
|
||||||
blurredPixelA = 0.0f;
|
|
||||||
for (r = -radius; r <= radius; r ++) {
|
|
||||||
int validH = h + r;
|
|
||||||
// Clamp to zero and width
|
|
||||||
if (validH < 0) {
|
|
||||||
validH = 0;
|
|
||||||
}
|
|
||||||
if (validH > height - 1) {
|
|
||||||
validH = height - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int input = interm[validH*width + w];
|
|
||||||
|
|
||||||
int R = ((input >> 24) & 0xff);
|
|
||||||
int G = ((input >> 16) & 0xff);
|
|
||||||
int B = ((input >> 8) & 0xff);
|
|
||||||
int A = (input & 0xff);
|
|
||||||
|
|
||||||
float weight = gaussian[r + radius];
|
|
||||||
|
|
||||||
blurredPixelR += (float)(R)*weight;
|
|
||||||
blurredPixelG += (float)(G)*weight;
|
|
||||||
blurredPixelB += (float)(B)*weight;
|
|
||||||
blurredPixelA += (float)(A)*weight;
|
|
||||||
}
|
|
||||||
|
|
||||||
int R = (int)blurredPixelR;
|
|
||||||
int G = (int)blurredPixelG;
|
|
||||||
int B = (int)blurredPixelB;
|
|
||||||
int A = (int)blurredPixelA;
|
|
||||||
|
|
||||||
out[h*width + w] = (R << 24) | (G << 16) | (B << 8) | (A);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
t = java.lang.System.currentTimeMillis() - t;
|
|
||||||
android.util.Log.v("Img", "Java frame time ms " + t);
|
|
||||||
mBitmapOut.setPixels(out, 0, width, 0, 0, width, height);
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
|
|
||||||
if (fromUser) {
|
|
||||||
|
|
||||||
if (seekBar == mRadiusSeekBar) {
|
|
||||||
float fRadius = progress / 100.0f;
|
|
||||||
fRadius *= (float)(MAX_RADIUS);
|
|
||||||
mRadius = (int)fRadius;
|
|
||||||
|
|
||||||
mScript.set_radius(mRadius);
|
|
||||||
} else if (seekBar == mInBlackSeekBar) {
|
|
||||||
mInBlack = (float)progress;
|
|
||||||
mScriptVBlur.invoke_setLevels(mInBlack, mOutBlack, mInWhite, mOutWhite);
|
|
||||||
} else if (seekBar == mOutBlackSeekBar) {
|
|
||||||
mOutBlack = (float)progress;
|
|
||||||
mScriptVBlur.invoke_setLevels(mInBlack, mOutBlack, mInWhite, mOutWhite);
|
|
||||||
} else if (seekBar == mInWhiteSeekBar) {
|
|
||||||
mInWhite = (float)progress + 127.0f;
|
|
||||||
mScriptVBlur.invoke_setLevels(mInBlack, mOutBlack, mInWhite, mOutWhite);
|
|
||||||
} else if (seekBar == mOutWhiteSeekBar) {
|
|
||||||
mOutWhite = (float)progress + 127.0f;
|
|
||||||
mScriptVBlur.invoke_setLevels(mInBlack, mOutBlack, mInWhite, mOutWhite);
|
|
||||||
} else if (seekBar == mGammaSeekBar) {
|
|
||||||
mGamma = (float)progress/100.0f;
|
|
||||||
mGamma = Math.max(mGamma, 0.1f);
|
|
||||||
mGamma = 1.0f / mGamma;
|
|
||||||
mScriptVBlur.invoke_setGamma(mGamma);
|
|
||||||
} else if (seekBar == mSaturationSeekBar) {
|
|
||||||
mSaturation = (float)progress / 50.0f;
|
|
||||||
mScriptVBlur.invoke_setSaturation(mSaturation);
|
|
||||||
}
|
|
||||||
|
|
||||||
long t = java.lang.System.currentTimeMillis();
|
|
||||||
if (true) {
|
|
||||||
mScript.invoke_filter();
|
|
||||||
mOutPixelsAllocation.copyTo(mBitmapOut);
|
|
||||||
} else {
|
|
||||||
javaFilter();
|
|
||||||
mDisplayView.invalidate();
|
|
||||||
}
|
|
||||||
|
|
||||||
t = java.lang.System.currentTimeMillis() - t;
|
|
||||||
android.util.Log.v("Img", "Renderscript frame time core ms " + t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onStartTrackingTouch(SeekBar seekBar) {
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onStopTrackingTouch(SeekBar seekBar) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
setContentView(R.layout.main);
|
|
||||||
|
|
||||||
mBitmapIn = loadBitmap(R.drawable.data);
|
|
||||||
mBitmapOut = loadBitmap(R.drawable.data);
|
|
||||||
mBitmapScratch = loadBitmap(R.drawable.data);
|
|
||||||
|
|
||||||
mSurfaceView = (SurfaceView) findViewById(R.id.surface);
|
|
||||||
mSurfaceView.getHolder().addCallback(this);
|
|
||||||
|
|
||||||
mDisplayView = (ImageView) findViewById(R.id.display);
|
|
||||||
mDisplayView.setImageBitmap(mBitmapOut);
|
|
||||||
|
|
||||||
mRadiusSeekBar = (SeekBar) findViewById(R.id.radius);
|
|
||||||
mRadiusSeekBar.setOnSeekBarChangeListener(this);
|
|
||||||
|
|
||||||
mInBlackSeekBar = (SeekBar)findViewById(R.id.inBlack);
|
|
||||||
mInBlackSeekBar.setOnSeekBarChangeListener(this);
|
|
||||||
mInBlackSeekBar.setMax(128);
|
|
||||||
mInBlackSeekBar.setProgress(0);
|
|
||||||
mOutBlackSeekBar = (SeekBar)findViewById(R.id.outBlack);
|
|
||||||
mOutBlackSeekBar.setOnSeekBarChangeListener(this);
|
|
||||||
mOutBlackSeekBar.setMax(128);
|
|
||||||
mOutBlackSeekBar.setProgress(0);
|
|
||||||
|
|
||||||
mInWhiteSeekBar = (SeekBar)findViewById(R.id.inWhite);
|
|
||||||
mInWhiteSeekBar.setOnSeekBarChangeListener(this);
|
|
||||||
mInWhiteSeekBar.setMax(128);
|
|
||||||
mInWhiteSeekBar.setProgress(128);
|
|
||||||
mOutWhiteSeekBar = (SeekBar)findViewById(R.id.outWhite);
|
|
||||||
mOutWhiteSeekBar.setOnSeekBarChangeListener(this);
|
|
||||||
mOutWhiteSeekBar.setMax(128);
|
|
||||||
mOutWhiteSeekBar.setProgress(128);
|
|
||||||
|
|
||||||
mGammaSeekBar = (SeekBar)findViewById(R.id.inGamma);
|
|
||||||
mGammaSeekBar.setOnSeekBarChangeListener(this);
|
|
||||||
mGammaSeekBar.setMax(150);
|
|
||||||
mGammaSeekBar.setProgress(100);
|
|
||||||
|
|
||||||
mSaturationSeekBar = (SeekBar)findViewById(R.id.inSaturation);
|
|
||||||
mSaturationSeekBar.setOnSeekBarChangeListener(this);
|
|
||||||
mSaturationSeekBar.setProgress(50);
|
|
||||||
|
|
||||||
mBenchmarkResult = (TextView) findViewById(R.id.benchmarkText);
|
|
||||||
mBenchmarkResult.setText("Benchmark not yet run");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void surfaceCreated(SurfaceHolder holder) {
|
|
||||||
createScript();
|
|
||||||
mScript.invoke_filter();
|
|
||||||
mOutPixelsAllocation.copyTo(mBitmapOut);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
|
|
||||||
}
|
|
||||||
|
|
||||||
public void surfaceDestroyed(SurfaceHolder holder) {
|
|
||||||
}
|
|
||||||
|
|
||||||
private void createScript() {
|
|
||||||
mRS = RenderScript.create(this);
|
|
||||||
mRS.setMessageHandler(new FilterCallback());
|
|
||||||
|
|
||||||
mInPixelsAllocation = Allocation.createFromBitmap(mRS, mBitmapIn,
|
|
||||||
Allocation.MipmapControl.MIPMAP_NONE,
|
|
||||||
Allocation.USAGE_SCRIPT);
|
|
||||||
mOutPixelsAllocation = Allocation.createFromBitmap(mRS, mBitmapOut,
|
|
||||||
Allocation.MipmapControl.MIPMAP_NONE,
|
|
||||||
Allocation.USAGE_SCRIPT);
|
|
||||||
|
|
||||||
Type.Builder tb = new Type.Builder(mRS, Element.F32_4(mRS));
|
|
||||||
tb.setX(mBitmapIn.getWidth());
|
|
||||||
tb.setY(mBitmapIn.getHeight());
|
|
||||||
mScratchPixelsAllocation1 = Allocation.createTyped(mRS, tb.create());
|
|
||||||
mScratchPixelsAllocation2 = Allocation.createTyped(mRS, tb.create());
|
|
||||||
|
|
||||||
mScriptVBlur = new ScriptC_vertical_blur(mRS, getResources(), R.raw.vertical_blur);
|
|
||||||
mScriptHBlur = new ScriptC_horizontal_blur(mRS, getResources(), R.raw.horizontal_blur);
|
|
||||||
|
|
||||||
mScript = new ScriptC_threshold(mRS, getResources(), R.raw.threshold);
|
|
||||||
mScript.set_width(mBitmapIn.getWidth());
|
|
||||||
mScript.set_height(mBitmapIn.getHeight());
|
|
||||||
mScript.set_radius(mRadius);
|
|
||||||
|
|
||||||
mScriptVBlur.invoke_setLevels(mInBlack, mOutBlack, mInWhite, mOutWhite);
|
|
||||||
mScriptVBlur.invoke_setGamma(mGamma);
|
|
||||||
mScriptVBlur.invoke_setSaturation(mSaturation);
|
|
||||||
|
|
||||||
mScript.bind_InPixel(mInPixelsAllocation);
|
|
||||||
mScript.bind_OutPixel(mOutPixelsAllocation);
|
|
||||||
mScript.bind_ScratchPixel1(mScratchPixelsAllocation1);
|
|
||||||
mScript.bind_ScratchPixel2(mScratchPixelsAllocation2);
|
|
||||||
|
|
||||||
mScript.set_vBlurScript(mScriptVBlur);
|
|
||||||
mScript.set_hBlurScript(mScriptHBlur);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Bitmap loadBitmap(int resource) {
|
|
||||||
final BitmapFactory.Options options = new BitmapFactory.Options();
|
|
||||||
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
|
|
||||||
return copyBitmap(BitmapFactory.decodeResource(getResources(), resource, options));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Bitmap copyBitmap(Bitmap source) {
|
|
||||||
Bitmap b = Bitmap.createBitmap(source.getWidth(), source.getHeight(), source.getConfig());
|
|
||||||
Canvas c = new Canvas(b);
|
|
||||||
c.drawBitmap(source, 0, 0, null);
|
|
||||||
source.recycle();
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
// button hook
|
|
||||||
public void benchmark(View v) {
|
|
||||||
android.util.Log.v("Img", "Benchmarking");
|
|
||||||
int oldRadius = mRadius;
|
|
||||||
mRadius = MAX_RADIUS;
|
|
||||||
mScript.set_radius(mRadius);
|
|
||||||
|
|
||||||
long t = java.lang.System.currentTimeMillis();
|
|
||||||
|
|
||||||
mScript.invoke_filter();
|
|
||||||
mOutPixelsAllocation.copyTo(mBitmapOut);
|
|
||||||
|
|
||||||
t = java.lang.System.currentTimeMillis() - t;
|
|
||||||
android.util.Log.v("Img", "Renderscript frame time core ms " + t);
|
|
||||||
|
|
||||||
//long javaTime = javaFilter();
|
|
||||||
//mBenchmarkResult.setText("RS: " + t + " ms Java: " + javaTime + " ms");
|
|
||||||
mBenchmarkResult.setText("RS: " + t + " ms");
|
|
||||||
|
|
||||||
mRadius = oldRadius;
|
|
||||||
mScript.set_radius(mRadius);
|
|
||||||
|
|
||||||
mScript.invoke_filter();
|
|
||||||
mOutPixelsAllocation.copyTo(mBitmapOut);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
#pragma version(1)
|
|
||||||
|
|
||||||
#include "ip.rsh"
|
|
||||||
|
|
||||||
void root(const void *v_in, void *v_out, const void *usrData, uint32_t x, uint32_t y) {
|
|
||||||
float4 *output = (float4 *)v_out;
|
|
||||||
const FilterStruct *fs = (const FilterStruct *)usrData;
|
|
||||||
const float4 *input = (const float4 *)rsGetElementAt(fs->ain, 0, y);
|
|
||||||
|
|
||||||
float3 blurredPixel = 0;
|
|
||||||
const float *gPtr = fs->gaussian;
|
|
||||||
if ((x > fs->radius) && (x < (fs->width - fs->radius))) {
|
|
||||||
const float4 *i = input + (x - fs->radius);
|
|
||||||
for (int r = -fs->radius; r <= fs->radius; r ++) {
|
|
||||||
blurredPixel += i->xyz * gPtr[0];
|
|
||||||
gPtr++;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (int r = -fs->radius; r <= fs->radius; r ++) {
|
|
||||||
// Stepping left and right away from the pixel
|
|
||||||
int validW = rsClamp(x + r, (uint)0, (uint)(fs->width - 1));
|
|
||||||
blurredPixel += input[validW].xyz * gPtr[0];
|
|
||||||
gPtr++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
output->xyz = blurredPixel;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
#pragma rs java_package_name(com.android.rs.image)
|
|
||||||
|
|
||||||
#define MAX_RADIUS 25
|
|
||||||
|
|
||||||
typedef struct FilterStruct_s {
|
|
||||||
rs_allocation ain;
|
|
||||||
|
|
||||||
float *gaussian; //[MAX_RADIUS * 2 + 1];
|
|
||||||
int height;
|
|
||||||
int width;
|
|
||||||
int radius;
|
|
||||||
|
|
||||||
} FilterStruct;
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,93 +0,0 @@
|
|||||||
#pragma version(1)
|
|
||||||
|
|
||||||
#include "ip.rsh"
|
|
||||||
|
|
||||||
int height;
|
|
||||||
int width;
|
|
||||||
int radius;
|
|
||||||
|
|
||||||
uchar4 * InPixel;
|
|
||||||
uchar4 * OutPixel;
|
|
||||||
float4 * ScratchPixel1;
|
|
||||||
float4 * ScratchPixel2;
|
|
||||||
|
|
||||||
rs_script vBlurScript;
|
|
||||||
rs_script hBlurScript;
|
|
||||||
|
|
||||||
const int CMD_FINISHED = 1;
|
|
||||||
|
|
||||||
// Store our coefficients here
|
|
||||||
static float gaussian[MAX_RADIUS * 2 + 1];
|
|
||||||
|
|
||||||
|
|
||||||
static void computeGaussianWeights() {
|
|
||||||
// Compute gaussian weights for the blur
|
|
||||||
// e is the euler's number
|
|
||||||
float e = 2.718281828459045f;
|
|
||||||
float pi = 3.1415926535897932f;
|
|
||||||
// g(x) = ( 1 / sqrt( 2 * pi ) * sigma) * e ^ ( -x^2 / 2 * sigma^2 )
|
|
||||||
// x is of the form [-radius .. 0 .. radius]
|
|
||||||
// and sigma varies with radius.
|
|
||||||
// Based on some experimental radius values and sigma's
|
|
||||||
// we approximately fit sigma = f(radius) as
|
|
||||||
// sigma = radius * 0.4 + 0.6
|
|
||||||
// The larger the radius gets, the more our gaussian blur
|
|
||||||
// will resemble a box blur since with large sigma
|
|
||||||
// the gaussian curve begins to lose its shape
|
|
||||||
float sigma = 0.4f * (float)radius + 0.6f;
|
|
||||||
|
|
||||||
// Now compute the coefficints
|
|
||||||
// We will store some redundant values to save some math during
|
|
||||||
// the blur calculations
|
|
||||||
// precompute some values
|
|
||||||
float coeff1 = 1.0f / (sqrt( 2.0f * pi ) * sigma);
|
|
||||||
float coeff2 = - 1.0f / (2.0f * sigma * sigma);
|
|
||||||
|
|
||||||
float normalizeFactor = 0.0f;
|
|
||||||
float floatR = 0.0f;
|
|
||||||
int r;
|
|
||||||
for (r = -radius; r <= radius; r ++) {
|
|
||||||
floatR = (float)r;
|
|
||||||
gaussian[r + radius] = coeff1 * pow(e, floatR * floatR * coeff2);
|
|
||||||
normalizeFactor += gaussian[r + radius];
|
|
||||||
}
|
|
||||||
|
|
||||||
//Now we need to normalize the weights because all our coefficients need to add up to one
|
|
||||||
normalizeFactor = 1.0f / normalizeFactor;
|
|
||||||
for (r = -radius; r <= radius; r ++) {
|
|
||||||
floatR = (float)r;
|
|
||||||
gaussian[r + radius] *= normalizeFactor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void copyInput() {
|
|
||||||
rs_allocation ain;
|
|
||||||
rsSetObject(&ain,rsGetAllocation(InPixel));
|
|
||||||
uint32_t dimx = rsAllocationGetDimX(ain);
|
|
||||||
uint32_t dimy = rsAllocationGetDimY(ain);
|
|
||||||
for (uint32_t y = 0; y < dimy; y++) {
|
|
||||||
for (uint32_t x = 0; x < dimx; x++) {
|
|
||||||
ScratchPixel1[x + y * dimx] = convert_float4(InPixel[x + y * dimx]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void filter() {
|
|
||||||
copyInput();
|
|
||||||
computeGaussianWeights();
|
|
||||||
|
|
||||||
FilterStruct fs;
|
|
||||||
fs.gaussian = gaussian;
|
|
||||||
fs.width = width;
|
|
||||||
fs.height = height;
|
|
||||||
fs.radius = radius;
|
|
||||||
|
|
||||||
fs.ain = rsGetAllocation(ScratchPixel1);
|
|
||||||
rsForEach(hBlurScript, fs.ain, rsGetAllocation(ScratchPixel2), &fs);
|
|
||||||
|
|
||||||
fs.ain = rsGetAllocation(ScratchPixel2);
|
|
||||||
rsForEach(vBlurScript, fs.ain, rsGetAllocation(OutPixel), &fs);
|
|
||||||
rsSendToClientBlocking(CMD_FINISHED);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,93 +0,0 @@
|
|||||||
#pragma version(1)
|
|
||||||
|
|
||||||
#include "ip.rsh"
|
|
||||||
|
|
||||||
static float inBlack;
|
|
||||||
static float outBlack;
|
|
||||||
static float inWhite;
|
|
||||||
static float outWhite;
|
|
||||||
static float3 gamma;
|
|
||||||
static float saturation;
|
|
||||||
|
|
||||||
static float inWMinInB;
|
|
||||||
static float outWMinOutB;
|
|
||||||
static float overInWMinInB;
|
|
||||||
static rs_matrix3x3 colorMat;
|
|
||||||
|
|
||||||
void setLevels(float iBlk, float oBlk, float iWht, float oWht) {
|
|
||||||
inBlack = iBlk;
|
|
||||||
outBlack = oBlk;
|
|
||||||
inWhite = iWht;
|
|
||||||
outWhite = oWht;
|
|
||||||
|
|
||||||
inWMinInB = inWhite - inBlack;
|
|
||||||
outWMinOutB = outWhite - outBlack;
|
|
||||||
overInWMinInB = 1.f / inWMinInB;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setSaturation(float sat) {
|
|
||||||
saturation = sat;
|
|
||||||
|
|
||||||
// Saturation
|
|
||||||
// Linear weights
|
|
||||||
//float rWeight = 0.3086f;
|
|
||||||
//float gWeight = 0.6094f;
|
|
||||||
//float bWeight = 0.0820f;
|
|
||||||
|
|
||||||
// Gamma 2.2 weights (we haven't converted our image to linear space yet for perf reasons)
|
|
||||||
float rWeight = 0.299f;
|
|
||||||
float gWeight = 0.587f;
|
|
||||||
float bWeight = 0.114f;
|
|
||||||
|
|
||||||
float oneMinusS = 1.0f - saturation;
|
|
||||||
rsMatrixSet(&colorMat, 0, 0, oneMinusS * rWeight + saturation);
|
|
||||||
rsMatrixSet(&colorMat, 0, 1, oneMinusS * rWeight);
|
|
||||||
rsMatrixSet(&colorMat, 0, 2, oneMinusS * rWeight);
|
|
||||||
rsMatrixSet(&colorMat, 1, 0, oneMinusS * gWeight);
|
|
||||||
rsMatrixSet(&colorMat, 1, 1, oneMinusS * gWeight + saturation);
|
|
||||||
rsMatrixSet(&colorMat, 1, 2, oneMinusS * gWeight);
|
|
||||||
rsMatrixSet(&colorMat, 2, 0, oneMinusS * bWeight);
|
|
||||||
rsMatrixSet(&colorMat, 2, 1, oneMinusS * bWeight);
|
|
||||||
rsMatrixSet(&colorMat, 2, 2, oneMinusS * bWeight + saturation);
|
|
||||||
}
|
|
||||||
|
|
||||||
void setGamma(float g) {
|
|
||||||
gamma = (float3)g;
|
|
||||||
}
|
|
||||||
|
|
||||||
//sliao
|
|
||||||
extern uchar3 __attribute__((overloadable)) convert2uchar3(float3 xyz);
|
|
||||||
|
|
||||||
void root(const void *v_in, void *v_out, const void *usrData, uint32_t x, uint32_t y) {
|
|
||||||
uchar4 *output = (uchar4 *)v_out;
|
|
||||||
const FilterStruct *fs = (const FilterStruct *)usrData;
|
|
||||||
const float4 *input = (const float4 *)rsGetElementAt(fs->ain, x, 0);
|
|
||||||
|
|
||||||
float3 blurredPixel = 0;
|
|
||||||
const float *gPtr = fs->gaussian;
|
|
||||||
if ((y > fs->radius) && (y < (fs->height - fs->radius))) {
|
|
||||||
const float4 *i = input + ((y - fs->radius) * fs->width);
|
|
||||||
for (int r = -fs->radius; r <= fs->radius; r ++) {
|
|
||||||
blurredPixel += i->xyz * gPtr[0];
|
|
||||||
gPtr++;
|
|
||||||
i += fs->width;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (int r = -fs->radius; r <= fs->radius; r ++) {
|
|
||||||
int validH = rsClamp(y + r, (uint)0, (uint)(fs->height - 1));
|
|
||||||
const float4 *i = input + validH * fs->width;
|
|
||||||
blurredPixel += i->xyz * gPtr[0];
|
|
||||||
gPtr++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
float3 temp = rsMatrixMultiply(&colorMat, blurredPixel);
|
|
||||||
temp = (clamp(temp, 0.f, 255.f) - inBlack) * overInWMinInB;
|
|
||||||
if (gamma.x != 1.0f)
|
|
||||||
temp = pow(temp, (float3)gamma);
|
|
||||||
temp = clamp(temp * outWMinOutB + outBlack, 0.f, 255.f);
|
|
||||||
|
|
||||||
output->xyz = convert_uchar3(temp);
|
|
||||||
//output->w = input->w;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (C) 2008 The Android Open Source Project
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
#
|
|
||||||
|
|
||||||
ifneq ($(TARGET_SIMULATOR),true)
|
|
||||||
|
|
||||||
LOCAL_PATH := $(call my-dir)
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
|
|
||||||
LOCAL_MODULE_TAGS := optional
|
|
||||||
|
|
||||||
LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src)
|
|
||||||
#LOCAL_STATIC_JAVA_LIBRARIES := android.renderscript
|
|
||||||
|
|
||||||
LOCAL_PACKAGE_NAME := ModelViewer
|
|
||||||
|
|
||||||
include $(BUILD_PACKAGE)
|
|
||||||
|
|
||||||
endif
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
package="com.android.modelviewer">
|
|
||||||
<application android:label="ModelViewer">
|
|
||||||
<activity android:name="SimpleModel"
|
|
||||||
android:label="SimpleModel"
|
|
||||||
android:screenOrientation="portrait"
|
|
||||||
android:theme="@android:style/Theme.Black.NoTitleBar">
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.intent.action.MAIN" />
|
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
|
||||||
</intent-filter>
|
|
||||||
</activity>
|
|
||||||
<activity android:name="SceneGraph"
|
|
||||||
android:label="SceneGraph"
|
|
||||||
android:theme="@android:style/Theme.Black.NoTitleBar">
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.intent.action.MAIN" />
|
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
|
||||||
</intent-filter>
|
|
||||||
</activity>
|
|
||||||
</application>
|
|
||||||
</manifest>
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 286 KiB |
Binary file not shown.
@@ -1,71 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2008 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.modelviewer;
|
|
||||||
|
|
||||||
import android.renderscript.RSSurfaceView;
|
|
||||||
import android.renderscript.RenderScript;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.content.res.Configuration;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.os.Handler;
|
|
||||||
import android.os.Looper;
|
|
||||||
import android.os.Message;
|
|
||||||
import android.provider.Settings.System;
|
|
||||||
import android.util.Config;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.view.Menu;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.Window;
|
|
||||||
import android.widget.Button;
|
|
||||||
import android.widget.ListView;
|
|
||||||
|
|
||||||
import java.lang.Runtime;
|
|
||||||
|
|
||||||
public class SceneGraph extends Activity {
|
|
||||||
|
|
||||||
private SceneGraphView mView;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle icicle) {
|
|
||||||
super.onCreate(icicle);
|
|
||||||
|
|
||||||
// Create our Preview view and set it as the content of our
|
|
||||||
// Activity
|
|
||||||
mView = new SceneGraphView(this);
|
|
||||||
setContentView(mView);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onResume() {
|
|
||||||
// Ideally a game should implement onResume() and onPause()
|
|
||||||
// to take appropriate action when the activity looses focus
|
|
||||||
super.onResume();
|
|
||||||
mView.resume();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onPause() {
|
|
||||||
// Ideally a game should implement onResume() and onPause()
|
|
||||||
// to take appropriate action when the activity looses focus
|
|
||||||
super.onPause();
|
|
||||||
mView.pause();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,217 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2008 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.modelviewer;
|
|
||||||
|
|
||||||
import java.io.Writer;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Vector;
|
|
||||||
|
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.renderscript.*;
|
|
||||||
import android.renderscript.Element.Builder;
|
|
||||||
import android.renderscript.Font.Style;
|
|
||||||
import android.renderscript.ProgramStore.DepthFunc;
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
|
|
||||||
public class SceneGraphRS {
|
|
||||||
|
|
||||||
private final int STATE_LAST_FOCUS = 1;
|
|
||||||
|
|
||||||
int mWidth;
|
|
||||||
int mHeight;
|
|
||||||
int mRotation;
|
|
||||||
|
|
||||||
public SceneGraphRS() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public void init(RenderScriptGL rs, Resources res, int width, int height) {
|
|
||||||
mRS = rs;
|
|
||||||
mRes = res;
|
|
||||||
mWidth = width;
|
|
||||||
mHeight = height;
|
|
||||||
mRotation = 0;
|
|
||||||
initRS();
|
|
||||||
}
|
|
||||||
|
|
||||||
private Resources mRes;
|
|
||||||
private RenderScriptGL mRS;
|
|
||||||
private Sampler mSampler;
|
|
||||||
private ProgramStore mPSBackground;
|
|
||||||
private ProgramFragment mPFBackground;
|
|
||||||
private ProgramVertex mPVBackground;
|
|
||||||
private ProgramVertexFixedFunction.Constants mPVA;
|
|
||||||
|
|
||||||
private Allocation mGridImage;
|
|
||||||
private Allocation mAllocPV;
|
|
||||||
|
|
||||||
private Mesh mMesh;
|
|
||||||
|
|
||||||
private Font mItalic;
|
|
||||||
private Allocation mTextAlloc;
|
|
||||||
|
|
||||||
private ScriptC_scenegraph mScript;
|
|
||||||
private ScriptC_transform mTransformScript;
|
|
||||||
|
|
||||||
int mLastX;
|
|
||||||
int mLastY;
|
|
||||||
|
|
||||||
public void touchEvent(int x, int y) {
|
|
||||||
int dx = mLastX - x;
|
|
||||||
if (Math.abs(dx) > 50 || Math.abs(dx) < 3) {
|
|
||||||
dx = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
mRotation -= dx;
|
|
||||||
if (mRotation > 360) {
|
|
||||||
mRotation -= 360;
|
|
||||||
}
|
|
||||||
if (mRotation < 0) {
|
|
||||||
mRotation += 360;
|
|
||||||
}
|
|
||||||
|
|
||||||
mScript.set_gRotate(-(float)mRotation);
|
|
||||||
|
|
||||||
mLastX = x;
|
|
||||||
mLastY = y;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initPFS() {
|
|
||||||
ProgramStore.Builder b = new ProgramStore.Builder(mRS);
|
|
||||||
|
|
||||||
b.setDepthFunc(ProgramStore.DepthFunc.LESS);
|
|
||||||
b.setDitherEnabled(false);
|
|
||||||
b.setDepthMaskEnabled(true);
|
|
||||||
mPSBackground = b.create();
|
|
||||||
|
|
||||||
mScript.set_gPFSBackground(mPSBackground);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initPF() {
|
|
||||||
Sampler.Builder bs = new Sampler.Builder(mRS);
|
|
||||||
bs.setMinification(Sampler.Value.LINEAR);
|
|
||||||
bs.setMagnification(Sampler.Value.LINEAR);
|
|
||||||
bs.setWrapS(Sampler.Value.CLAMP);
|
|
||||||
bs.setWrapT(Sampler.Value.CLAMP);
|
|
||||||
mSampler = bs.create();
|
|
||||||
|
|
||||||
ProgramFragmentFixedFunction.Builder b = new ProgramFragmentFixedFunction.Builder(mRS);
|
|
||||||
b.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE,
|
|
||||||
ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
|
|
||||||
mPFBackground = b.create();
|
|
||||||
mPFBackground.bindSampler(mSampler, 0);
|
|
||||||
|
|
||||||
mScript.set_gPFBackground(mPFBackground);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initPV() {
|
|
||||||
ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS);
|
|
||||||
mPVBackground = pvb.create();
|
|
||||||
|
|
||||||
mPVA = new ProgramVertexFixedFunction.Constants(mRS);
|
|
||||||
((ProgramVertexFixedFunction)mPVBackground).bindConstants(mPVA);
|
|
||||||
|
|
||||||
mScript.set_gPVBackground(mPVBackground);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void loadImage() {
|
|
||||||
mGridImage = Allocation.createFromBitmapResource(mRS, mRes, R.drawable.robot,
|
|
||||||
Allocation.MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
|
|
||||||
Allocation.USAGE_GRAPHICS_TEXTURE);
|
|
||||||
mScript.set_gTGrid(mGridImage);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initTextAllocation() {
|
|
||||||
String allocString = "Displaying file: R.raw.robot";
|
|
||||||
mTextAlloc = Allocation.createFromString(mRS, allocString, Allocation.USAGE_SCRIPT);
|
|
||||||
mScript.set_gTextAlloc(mTextAlloc);
|
|
||||||
}
|
|
||||||
|
|
||||||
SgTransform mRootTransform;
|
|
||||||
SgTransform mGroup1;
|
|
||||||
|
|
||||||
SgTransform mRobot1;
|
|
||||||
SgTransform mRobot2;
|
|
||||||
|
|
||||||
void initTransformHierarchy() {
|
|
||||||
mRootTransform = new SgTransform(mRS);
|
|
||||||
|
|
||||||
mGroup1 = new SgTransform(mRS);
|
|
||||||
mRootTransform.addChild(mGroup1);
|
|
||||||
|
|
||||||
mRobot1 = new SgTransform(mRS);
|
|
||||||
mRobot2 = new SgTransform(mRS);
|
|
||||||
|
|
||||||
mGroup1.addChild(mRobot1);
|
|
||||||
mGroup1.addChild(mRobot2);
|
|
||||||
|
|
||||||
mGroup1.setTransform(0, new Float4(0.0f, 0.0f, -15.0f, 0.0f), TransformType.TRANSLATE);
|
|
||||||
mGroup1.setTransform(1, new Float4(0.0f, 1.0f, 0.0f, 15.0f), TransformType.ROTATE);
|
|
||||||
|
|
||||||
mRobot1.setTransform(0, new Float4(-3.0f, -0.5f, 0.0f, 0.0f), TransformType.TRANSLATE);
|
|
||||||
mRobot1.setTransform(1, new Float4(0.0f, 1.0f, 0.0f, 20.0f), TransformType.ROTATE);
|
|
||||||
mRobot1.setTransform(2, new Float4(0.2f, 0.2f, 0.2f, 0.0f), TransformType.SCALE);
|
|
||||||
|
|
||||||
mRobot2.setTransform(0, new Float4(3.0f, 0.0f, 0.0f, 0.0f), TransformType.TRANSLATE);
|
|
||||||
mRobot2.setTransform(1, new Float4(0.0f, 1.0f, 0.0f, -20.0f), TransformType.ROTATE);
|
|
||||||
mRobot2.setTransform(2, new Float4(0.3f, 0.3f, 0.3f, 0.0f), TransformType.SCALE);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initRS() {
|
|
||||||
|
|
||||||
mScript = new ScriptC_scenegraph(mRS, mRes, R.raw.scenegraph);
|
|
||||||
mTransformScript = new ScriptC_transform(mRS, mRes, R.raw.transform);
|
|
||||||
mTransformScript.set_transformScript(mTransformScript);
|
|
||||||
|
|
||||||
mScript.set_gTransformRS(mTransformScript);
|
|
||||||
|
|
||||||
initPFS();
|
|
||||||
initPF();
|
|
||||||
initPV();
|
|
||||||
|
|
||||||
loadImage();
|
|
||||||
|
|
||||||
FileA3D model = FileA3D.createFromResource(mRS, mRes, R.raw.robot);
|
|
||||||
FileA3D.IndexEntry entry = model.getIndexEntry(0);
|
|
||||||
if (entry == null || entry.getEntryType() != FileA3D.EntryType.MESH) {
|
|
||||||
Log.e("rs", "could not load model");
|
|
||||||
} else {
|
|
||||||
mMesh = (Mesh)entry.getObject();
|
|
||||||
mScript.set_gTestMesh(mMesh);
|
|
||||||
}
|
|
||||||
|
|
||||||
mItalic = Font.create(mRS, mRes, "serif", Font.Style.ITALIC, 8);
|
|
||||||
mScript.set_gItalic(mItalic);
|
|
||||||
|
|
||||||
initTextAllocation();
|
|
||||||
|
|
||||||
initTransformHierarchy();
|
|
||||||
|
|
||||||
mScript.bind_gRootNode(mRootTransform.getField());
|
|
||||||
|
|
||||||
mScript.bind_gGroup(mGroup1.mParent.mChildField);
|
|
||||||
mScript.bind_gRobot1(mRobot1.mParent.mChildField);
|
|
||||||
mScript.set_gRobot1Index(mRobot1.mIndexInParentGroup);
|
|
||||||
mScript.bind_gRobot2(mRobot2.mParent.mChildField);
|
|
||||||
mScript.set_gRobot2Index(mRobot2.mIndexInParentGroup);
|
|
||||||
|
|
||||||
mRS.bindRootScript(mScript);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,96 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2008 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.modelviewer;
|
|
||||||
|
|
||||||
import java.io.Writer;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.concurrent.Semaphore;
|
|
||||||
|
|
||||||
import android.renderscript.RSSurfaceView;
|
|
||||||
import android.renderscript.RenderScript;
|
|
||||||
import android.renderscript.RenderScriptGL;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import android.graphics.drawable.BitmapDrawable;
|
|
||||||
import android.graphics.drawable.Drawable;
|
|
||||||
import android.os.Handler;
|
|
||||||
import android.os.Message;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.view.Surface;
|
|
||||||
import android.view.SurfaceHolder;
|
|
||||||
import android.view.SurfaceView;
|
|
||||||
import android.view.KeyEvent;
|
|
||||||
import android.view.MotionEvent;
|
|
||||||
|
|
||||||
public class SceneGraphView extends RSSurfaceView {
|
|
||||||
|
|
||||||
public SceneGraphView(Context context) {
|
|
||||||
super(context);
|
|
||||||
//setFocusable(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
private RenderScriptGL mRS;
|
|
||||||
private SceneGraphRS mRender;
|
|
||||||
|
|
||||||
|
|
||||||
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
|
|
||||||
super.surfaceChanged(holder, format, w, h);
|
|
||||||
if (mRS == null) {
|
|
||||||
RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig();
|
|
||||||
sc.setDepth(16, 24);
|
|
||||||
mRS = createRenderScriptGL(sc);
|
|
||||||
mRS.setSurface(holder, w, h);
|
|
||||||
mRender = new SceneGraphRS();
|
|
||||||
mRender.init(mRS, getResources(), w, h);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onDetachedFromWindow() {
|
|
||||||
if (mRS != null) {
|
|
||||||
mRS = null;
|
|
||||||
destroyRenderScriptGL();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onKeyDown(int keyCode, KeyEvent event)
|
|
||||||
{
|
|
||||||
// break point at here
|
|
||||||
// this method doesn't work when 'extends View' include 'extends ScrollView'.
|
|
||||||
return super.onKeyDown(keyCode, event);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onTouchEvent(MotionEvent ev)
|
|
||||||
{
|
|
||||||
boolean ret = true;
|
|
||||||
int act = ev.getAction();
|
|
||||||
if (act == ev.ACTION_UP) {
|
|
||||||
ret = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
mRender.touchEvent((int)ev.getX(), (int)ev.getY());
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,112 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2008 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.modelviewer;
|
|
||||||
|
|
||||||
import java.io.Writer;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Vector;
|
|
||||||
|
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.renderscript.*;
|
|
||||||
import android.renderscript.Element.Builder;
|
|
||||||
import android.renderscript.ProgramStore.DepthFunc;
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
enum TransformType {
|
|
||||||
|
|
||||||
NONE(0),
|
|
||||||
TRANSLATE(1),
|
|
||||||
ROTATE(2),
|
|
||||||
SCALE(3);
|
|
||||||
|
|
||||||
int mID;
|
|
||||||
TransformType(int id) {
|
|
||||||
mID = id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class SgTransform {
|
|
||||||
|
|
||||||
|
|
||||||
ScriptField_SgTransform mTransformField;
|
|
||||||
ScriptField_SgTransform mChildField;
|
|
||||||
public ScriptField_SgTransform.Item mTransformData;
|
|
||||||
|
|
||||||
RenderScript mRS;
|
|
||||||
|
|
||||||
Vector mChildren;
|
|
||||||
SgTransform mParent;
|
|
||||||
int mIndexInParentGroup;
|
|
||||||
|
|
||||||
public void setParent(SgTransform parent, int parentIndex) {
|
|
||||||
mParent = parent;
|
|
||||||
mIndexInParentGroup = parentIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addChild(SgTransform child) {
|
|
||||||
mChildren.add(child);
|
|
||||||
child.setParent(this, mChildren.size() - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTransform(int index, Float4 value, TransformType type) {
|
|
||||||
mTransformData.transforms[index] = value;
|
|
||||||
mTransformData.transformTypes[index] = type.mID;
|
|
||||||
}
|
|
||||||
|
|
||||||
void initData() {
|
|
||||||
int numElements = mTransformData.transforms.length;
|
|
||||||
mTransformData.transformTypes = new int[numElements];
|
|
||||||
for (int i = 0; i < numElements; i ++) {
|
|
||||||
mTransformData.transforms[i] = new Float4(0, 0, 0, 0);
|
|
||||||
mTransformData.transformTypes[i] = TransformType.NONE.mID;
|
|
||||||
}
|
|
||||||
|
|
||||||
mTransformData.isDirty = 1;
|
|
||||||
mTransformData.children = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public SgTransform(RenderScript rs) {
|
|
||||||
mRS = rs;
|
|
||||||
mTransformData = new ScriptField_SgTransform.Item();
|
|
||||||
mChildren = new Vector();
|
|
||||||
initData();
|
|
||||||
}
|
|
||||||
|
|
||||||
public ScriptField_SgTransform.Item getData() {
|
|
||||||
if (mChildren.size() != 0) {
|
|
||||||
mChildField = new ScriptField_SgTransform(mRS, mChildren.size());
|
|
||||||
mTransformData.children = mChildField.getAllocation();
|
|
||||||
|
|
||||||
for (int i = 0; i < mChildren.size(); i ++) {
|
|
||||||
SgTransform child = (SgTransform)mChildren.get(i);
|
|
||||||
mChildField.set(child.getData(), i, false);
|
|
||||||
}
|
|
||||||
mChildField.copyAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
return mTransformData;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ScriptField_SgTransform getField() {
|
|
||||||
mTransformField = new ScriptField_SgTransform(mRS, 1);
|
|
||||||
mTransformField.set(getData(), 0, true);
|
|
||||||
return mTransformField;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2008 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.modelviewer;
|
|
||||||
|
|
||||||
import android.renderscript.RSSurfaceView;
|
|
||||||
import android.renderscript.RenderScript;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.content.res.Configuration;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.os.Handler;
|
|
||||||
import android.os.Looper;
|
|
||||||
import android.os.Message;
|
|
||||||
import android.provider.Settings.System;
|
|
||||||
import android.util.Config;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.view.Menu;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.Window;
|
|
||||||
import android.widget.Button;
|
|
||||||
import android.widget.ListView;
|
|
||||||
|
|
||||||
import java.lang.Runtime;
|
|
||||||
|
|
||||||
public class SimpleModel extends Activity {
|
|
||||||
|
|
||||||
private SimpleModelView mView;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle icicle) {
|
|
||||||
super.onCreate(icicle);
|
|
||||||
|
|
||||||
// Create our Preview view and set it as the content of our
|
|
||||||
// Activity
|
|
||||||
mView = new SimpleModelView(this);
|
|
||||||
setContentView(mView);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onResume() {
|
|
||||||
// Ideally a game should implement onResume() and onPause()
|
|
||||||
// to take appropriate action when the activity looses focus
|
|
||||||
super.onResume();
|
|
||||||
mView.resume();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onPause() {
|
|
||||||
// Ideally a game should implement onResume() and onPause()
|
|
||||||
// to take appropriate action when the activity looses focus
|
|
||||||
super.onPause();
|
|
||||||
mView.pause();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,168 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2008 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.modelviewer;
|
|
||||||
|
|
||||||
import java.io.Writer;
|
|
||||||
|
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.renderscript.*;
|
|
||||||
import android.renderscript.ProgramStore.DepthFunc;
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
|
|
||||||
public class SimpleModelRS {
|
|
||||||
|
|
||||||
private final int STATE_LAST_FOCUS = 1;
|
|
||||||
|
|
||||||
int mWidth;
|
|
||||||
int mHeight;
|
|
||||||
int mRotation;
|
|
||||||
|
|
||||||
public SimpleModelRS() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public void init(RenderScriptGL rs, Resources res, int width, int height) {
|
|
||||||
mRS = rs;
|
|
||||||
mRes = res;
|
|
||||||
mWidth = width;
|
|
||||||
mHeight = height;
|
|
||||||
mRotation = 0;
|
|
||||||
initRS();
|
|
||||||
}
|
|
||||||
|
|
||||||
private Resources mRes;
|
|
||||||
private RenderScriptGL mRS;
|
|
||||||
private Sampler mSampler;
|
|
||||||
private ProgramStore mPSBackground;
|
|
||||||
private ProgramFragment mPFBackground;
|
|
||||||
private ProgramVertex mPVBackground;
|
|
||||||
private ProgramVertexFixedFunction.Constants mPVA;
|
|
||||||
|
|
||||||
private Allocation mGridImage;
|
|
||||||
private Allocation mAllocPV;
|
|
||||||
|
|
||||||
private Mesh mMesh;
|
|
||||||
|
|
||||||
private Font mItalic;
|
|
||||||
private Allocation mTextAlloc;
|
|
||||||
|
|
||||||
private ScriptC_simplemodel mScript;
|
|
||||||
|
|
||||||
int mLastX;
|
|
||||||
int mLastY;
|
|
||||||
|
|
||||||
public void touchEvent(int x, int y) {
|
|
||||||
int dx = mLastX - x;
|
|
||||||
if (Math.abs(dx) > 50 || Math.abs(dx) < 3) {
|
|
||||||
dx = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
mRotation -= dx;
|
|
||||||
if (mRotation > 360) {
|
|
||||||
mRotation -= 360;
|
|
||||||
}
|
|
||||||
if (mRotation < 0) {
|
|
||||||
mRotation += 360;
|
|
||||||
}
|
|
||||||
|
|
||||||
mScript.set_gRotate((float)mRotation);
|
|
||||||
|
|
||||||
mLastX = x;
|
|
||||||
mLastY = y;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initPFS() {
|
|
||||||
ProgramStore.Builder b = new ProgramStore.Builder(mRS);
|
|
||||||
|
|
||||||
b.setDepthFunc(ProgramStore.DepthFunc.LESS);
|
|
||||||
b.setDitherEnabled(false);
|
|
||||||
b.setDepthMaskEnabled(true);
|
|
||||||
mPSBackground = b.create();
|
|
||||||
|
|
||||||
mScript.set_gPFSBackground(mPSBackground);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initPF() {
|
|
||||||
Sampler.Builder bs = new Sampler.Builder(mRS);
|
|
||||||
bs.setMinification(Sampler.Value.LINEAR);
|
|
||||||
bs.setMagnification(Sampler.Value.LINEAR);
|
|
||||||
bs.setWrapS(Sampler.Value.CLAMP);
|
|
||||||
bs.setWrapT(Sampler.Value.CLAMP);
|
|
||||||
mSampler = bs.create();
|
|
||||||
|
|
||||||
ProgramFragmentFixedFunction.Builder b = new ProgramFragmentFixedFunction.Builder(mRS);
|
|
||||||
b.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE,
|
|
||||||
ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
|
|
||||||
mPFBackground = b.create();
|
|
||||||
mPFBackground.bindSampler(mSampler, 0);
|
|
||||||
|
|
||||||
mScript.set_gPFBackground(mPFBackground);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initPV() {
|
|
||||||
ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS);
|
|
||||||
mPVBackground = pvb.create();
|
|
||||||
|
|
||||||
mPVA = new ProgramVertexFixedFunction.Constants(mRS);
|
|
||||||
((ProgramVertexFixedFunction)mPVBackground).bindConstants(mPVA);
|
|
||||||
|
|
||||||
mScript.set_gPVBackground(mPVBackground);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void loadImage() {
|
|
||||||
mGridImage = Allocation.createFromBitmapResource(mRS, mRes, R.drawable.robot,
|
|
||||||
Allocation.MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
|
|
||||||
Allocation.USAGE_GRAPHICS_TEXTURE);
|
|
||||||
mScript.set_gTGrid(mGridImage);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initTextAllocation() {
|
|
||||||
String allocString = "Displaying file: R.raw.robot";
|
|
||||||
mTextAlloc = Allocation.createFromString(mRS, allocString, Allocation.USAGE_SCRIPT);
|
|
||||||
mScript.set_gTextAlloc(mTextAlloc);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initRS() {
|
|
||||||
|
|
||||||
mScript = new ScriptC_simplemodel(mRS, mRes, R.raw.simplemodel);
|
|
||||||
|
|
||||||
initPFS();
|
|
||||||
initPF();
|
|
||||||
initPV();
|
|
||||||
|
|
||||||
loadImage();
|
|
||||||
|
|
||||||
FileA3D model = FileA3D.createFromResource(mRS, mRes, R.raw.robot);
|
|
||||||
FileA3D.IndexEntry entry = model.getIndexEntry(0);
|
|
||||||
if (entry == null || entry.getEntryType() != FileA3D.EntryType.MESH) {
|
|
||||||
Log.e("rs", "could not load model");
|
|
||||||
} else {
|
|
||||||
mMesh = (Mesh)entry.getObject();
|
|
||||||
mScript.set_gTestMesh(mMesh);
|
|
||||||
}
|
|
||||||
|
|
||||||
mItalic = Font.create(mRS, mRes, "serif", Font.Style.ITALIC, 8);
|
|
||||||
mScript.set_gItalic(mItalic);
|
|
||||||
|
|
||||||
initTextAllocation();
|
|
||||||
|
|
||||||
mRS.bindRootScript(mScript);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,96 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2008 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.modelviewer;
|
|
||||||
|
|
||||||
import java.io.Writer;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.concurrent.Semaphore;
|
|
||||||
|
|
||||||
import android.renderscript.RSSurfaceView;
|
|
||||||
import android.renderscript.RenderScript;
|
|
||||||
import android.renderscript.RenderScriptGL;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import android.graphics.drawable.BitmapDrawable;
|
|
||||||
import android.graphics.drawable.Drawable;
|
|
||||||
import android.os.Handler;
|
|
||||||
import android.os.Message;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.view.Surface;
|
|
||||||
import android.view.SurfaceHolder;
|
|
||||||
import android.view.SurfaceView;
|
|
||||||
import android.view.KeyEvent;
|
|
||||||
import android.view.MotionEvent;
|
|
||||||
|
|
||||||
public class SimpleModelView extends RSSurfaceView {
|
|
||||||
|
|
||||||
public SimpleModelView(Context context) {
|
|
||||||
super(context);
|
|
||||||
//setFocusable(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
private RenderScriptGL mRS;
|
|
||||||
private SimpleModelRS mRender;
|
|
||||||
|
|
||||||
|
|
||||||
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
|
|
||||||
super.surfaceChanged(holder, format, w, h);
|
|
||||||
if (mRS == null) {
|
|
||||||
RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig();
|
|
||||||
sc.setDepth(16, 24);
|
|
||||||
mRS = createRenderScriptGL(sc);
|
|
||||||
mRS.setSurface(holder, w, h);
|
|
||||||
mRender = new SimpleModelRS();
|
|
||||||
mRender.init(mRS, getResources(), w, h);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onDetachedFromWindow() {
|
|
||||||
if (mRS != null) {
|
|
||||||
mRS = null;
|
|
||||||
destroyRenderScriptGL();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onKeyDown(int keyCode, KeyEvent event)
|
|
||||||
{
|
|
||||||
// break point at here
|
|
||||||
// this method doesn't work when 'extends View' include 'extends ScrollView'.
|
|
||||||
return super.onKeyDown(keyCode, event);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onTouchEvent(MotionEvent ev)
|
|
||||||
{
|
|
||||||
boolean ret = true;
|
|
||||||
int act = ev.getAction();
|
|
||||||
if (act == ev.ACTION_UP) {
|
|
||||||
ret = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
mRender.touchEvent((int)ev.getX(), (int)ev.getY());
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,91 +0,0 @@
|
|||||||
// Copyright (C) 2009 The Android Open Source Project
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
#pragma version(1)
|
|
||||||
|
|
||||||
#pragma rs java_package_name(com.android.modelviewer)
|
|
||||||
|
|
||||||
#include "rs_graphics.rsh"
|
|
||||||
#include "transform_def.rsh"
|
|
||||||
|
|
||||||
rs_program_vertex gPVBackground;
|
|
||||||
rs_program_fragment gPFBackground;
|
|
||||||
|
|
||||||
rs_allocation gTGrid;
|
|
||||||
rs_mesh gTestMesh;
|
|
||||||
|
|
||||||
rs_program_store gPFSBackground;
|
|
||||||
|
|
||||||
float gRotate;
|
|
||||||
|
|
||||||
rs_font gItalic;
|
|
||||||
rs_allocation gTextAlloc;
|
|
||||||
|
|
||||||
rs_script gTransformRS;
|
|
||||||
|
|
||||||
SgTransform *gGroup;
|
|
||||||
SgTransform *gRobot1;
|
|
||||||
int gRobot1Index;
|
|
||||||
SgTransform *gRobot2;
|
|
||||||
int gRobot2Index;
|
|
||||||
|
|
||||||
SgTransform *gRootNode;
|
|
||||||
|
|
||||||
void init() {
|
|
||||||
gRotate = 0.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
int root(int launchID) {
|
|
||||||
|
|
||||||
gGroup->transforms[1].w += 0.5f;
|
|
||||||
gGroup->isDirty = 1;
|
|
||||||
|
|
||||||
SgTransform *robot1Ptr = gRobot1 + gRobot1Index;
|
|
||||||
|
|
||||||
robot1Ptr->transforms[1].w -= 1.5f;
|
|
||||||
robot1Ptr->isDirty = 1;
|
|
||||||
|
|
||||||
SgTransform *robot2Ptr = gRobot2 + gRobot2Index;
|
|
||||||
robot2Ptr->transforms[1].w += 2.5f;
|
|
||||||
robot2Ptr->isDirty = 1;
|
|
||||||
|
|
||||||
rsForEach(gTransformRS, gRootNode->children, gRootNode->children, 0);
|
|
||||||
|
|
||||||
rsgClearColor(1.0f, 1.0f, 1.0f, 1.0f);
|
|
||||||
rsgClearDepth(1.0f);
|
|
||||||
|
|
||||||
rsgBindProgramVertex(gPVBackground);
|
|
||||||
rs_matrix4x4 proj;
|
|
||||||
float aspect = (float)rsgGetWidth() / (float)rsgGetHeight();
|
|
||||||
rsMatrixLoadPerspective(&proj, 30.0f, aspect, 0.1f, 100.0f);
|
|
||||||
rsgProgramVertexLoadProjectionMatrix(&proj);
|
|
||||||
|
|
||||||
rsgBindProgramFragment(gPFBackground);
|
|
||||||
rsgBindProgramStore(gPFSBackground);
|
|
||||||
rsgBindTexture(gPFBackground, 0, gTGrid);
|
|
||||||
|
|
||||||
rsgProgramVertexLoadModelMatrix(&robot1Ptr->globalMat);
|
|
||||||
rsgDrawMesh(gTestMesh);
|
|
||||||
|
|
||||||
rsgProgramVertexLoadModelMatrix(&robot2Ptr->globalMat);
|
|
||||||
rsgDrawMesh(gTestMesh);
|
|
||||||
|
|
||||||
//color(0.3f, 0.3f, 0.3f, 1.0f);
|
|
||||||
rsgDrawText("Renderscript transform test", 30, 695);
|
|
||||||
|
|
||||||
rsgBindFont(gItalic);
|
|
||||||
rsgDrawText(gTextAlloc, 30, 730);
|
|
||||||
|
|
||||||
return 10;
|
|
||||||
}
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
// Copyright (C) 2009 The Android Open Source Project
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
#pragma version(1)
|
|
||||||
|
|
||||||
#pragma rs java_package_name(com.android.modelviewer)
|
|
||||||
|
|
||||||
#include "rs_graphics.rsh"
|
|
||||||
|
|
||||||
rs_program_vertex gPVBackground;
|
|
||||||
rs_program_fragment gPFBackground;
|
|
||||||
|
|
||||||
rs_allocation gTGrid;
|
|
||||||
rs_mesh gTestMesh;
|
|
||||||
|
|
||||||
rs_program_store gPFSBackground;
|
|
||||||
|
|
||||||
float gRotate;
|
|
||||||
|
|
||||||
rs_font gItalic;
|
|
||||||
rs_allocation gTextAlloc;
|
|
||||||
|
|
||||||
void init() {
|
|
||||||
gRotate = 0.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
int root(int launchID) {
|
|
||||||
|
|
||||||
rsgClearColor(1.0f, 1.0f, 1.0f, 1.0f);
|
|
||||||
rsgClearDepth(1.0f);
|
|
||||||
|
|
||||||
rsgBindProgramVertex(gPVBackground);
|
|
||||||
rs_matrix4x4 proj;
|
|
||||||
float aspect = (float)rsgGetWidth() / (float)rsgGetHeight();
|
|
||||||
rsMatrixLoadPerspective(&proj, 30.0f, aspect, 0.1f, 100.0f);
|
|
||||||
rsgProgramVertexLoadProjectionMatrix(&proj);
|
|
||||||
|
|
||||||
rsgBindProgramFragment(gPFBackground);
|
|
||||||
rsgBindProgramStore(gPFSBackground);
|
|
||||||
rsgBindTexture(gPFBackground, 0, gTGrid);
|
|
||||||
|
|
||||||
rs_matrix4x4 matrix;
|
|
||||||
rsMatrixLoadIdentity(&matrix);
|
|
||||||
// Position our model on the screen
|
|
||||||
rsMatrixTranslate(&matrix, 0.0f, -0.3f, -10.0f);
|
|
||||||
rsMatrixScale(&matrix, 0.2f, 0.2f, 0.2f);
|
|
||||||
rsMatrixRotate(&matrix, 25.0f, 1.0f, 0.0f, 0.0f);
|
|
||||||
rsMatrixRotate(&matrix, gRotate, 0.0f, 1.0f, 0.0f);
|
|
||||||
rsgProgramVertexLoadModelMatrix(&matrix);
|
|
||||||
|
|
||||||
rsgDrawMesh(gTestMesh);
|
|
||||||
|
|
||||||
rsgFontColor(0.3f, 0.3f, 0.3f, 1.0f);
|
|
||||||
rsgDrawText("Renderscript model test", 30, 695);
|
|
||||||
|
|
||||||
rsgBindFont(gItalic);
|
|
||||||
rsgDrawText(gTextAlloc, 30, 730);
|
|
||||||
|
|
||||||
return 10;
|
|
||||||
}
|
|
||||||
@@ -1,96 +0,0 @@
|
|||||||
// Copyright (C) 2009 The Android Open Source Project
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
#pragma version(1)
|
|
||||||
|
|
||||||
#pragma rs java_package_name(com.android.modelviewer)
|
|
||||||
|
|
||||||
#include "transform_def.rsh"
|
|
||||||
|
|
||||||
rs_script transformScript;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int changed;
|
|
||||||
rs_matrix4x4 *mat;
|
|
||||||
} ParentData;
|
|
||||||
|
|
||||||
static void appendTransformation(int type, float4 data, rs_matrix4x4 *mat) {
|
|
||||||
rs_matrix4x4 temp;
|
|
||||||
|
|
||||||
switch (type) {
|
|
||||||
case TRANSFORM_TRANSLATE:
|
|
||||||
rsMatrixLoadTranslate(&temp, data.x, data.y, data.z);
|
|
||||||
break;
|
|
||||||
case TRANSFORM_ROTATE:
|
|
||||||
rsMatrixLoadRotate(&temp, data.w, data.x, data.y, data.z);
|
|
||||||
break;
|
|
||||||
case TRANSFORM_SCALE:
|
|
||||||
rsMatrixLoadScale(&temp, data.x, data.y, data.z);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
rsMatrixMultiply(mat, &temp);
|
|
||||||
}
|
|
||||||
|
|
||||||
void root(const void *v_in, void *v_out, const void *usrData, uint32_t x, uint32_t y) {
|
|
||||||
|
|
||||||
SgTransform *data = (SgTransform *)v_out;
|
|
||||||
const ParentData *parent = (const ParentData *)usrData;
|
|
||||||
|
|
||||||
//rsDebug("Transform data", (int)data);
|
|
||||||
//rsDebug("Entering parent", (int)parent);
|
|
||||||
|
|
||||||
rs_matrix4x4 *localMat = &data->localMat;
|
|
||||||
rs_matrix4x4 *globalMat = &data->globalMat;
|
|
||||||
|
|
||||||
ParentData toChild;
|
|
||||||
toChild.changed = 0;
|
|
||||||
toChild.mat = globalMat;
|
|
||||||
|
|
||||||
//rsDebug("Transform is dirty", data->isDirty);
|
|
||||||
|
|
||||||
// Refresh matrices if dirty
|
|
||||||
if (data->isDirty) {
|
|
||||||
data->isDirty = 0;
|
|
||||||
toChild.changed = 1;
|
|
||||||
|
|
||||||
// Reset our local matrix
|
|
||||||
rsMatrixLoadIdentity(localMat);
|
|
||||||
|
|
||||||
for (int i = 0; i < 16; i ++) {
|
|
||||||
if (data->transformTypes[i] == TRANSFORM_NONE) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
//rsDebug("Transform adding transformation", transformTypes[i]);
|
|
||||||
appendTransformation(data->transformTypes[i], data->transforms[i], localMat);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//rsDebug("Transform checking parent", (int)0);
|
|
||||||
|
|
||||||
if (parent) {
|
|
||||||
if (parent->changed) {
|
|
||||||
toChild.changed = 1;
|
|
||||||
|
|
||||||
rsMatrixLoad(globalMat, parent->mat);
|
|
||||||
rsMatrixMultiply(globalMat, localMat);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
rsMatrixLoad(globalMat, localMat);
|
|
||||||
}
|
|
||||||
|
|
||||||
//rsDebug("Transform calling self with child ", (int)data->children.p);
|
|
||||||
if (data->children.p) {
|
|
||||||
rsForEach(transformScript, data->children, data->children, (void*)&toChild);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
// Copyright (C) 2009 The Android Open Source Project
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
#pragma version(1)
|
|
||||||
|
|
||||||
#pragma rs java_package_name(com.android.modelviewer)
|
|
||||||
|
|
||||||
#define TRANSFORM_NONE 0
|
|
||||||
#define TRANSFORM_TRANSLATE 1
|
|
||||||
#define TRANSFORM_ROTATE 2
|
|
||||||
#define TRANSFORM_SCALE 3
|
|
||||||
|
|
||||||
typedef struct __attribute__((packed, aligned(4))) SgTransform {
|
|
||||||
rs_matrix4x4 globalMat;
|
|
||||||
rs_matrix4x4 localMat;
|
|
||||||
|
|
||||||
float4 transforms[16];
|
|
||||||
int transformTypes[16];
|
|
||||||
|
|
||||||
int isDirty;
|
|
||||||
|
|
||||||
rs_allocation children;
|
|
||||||
|
|
||||||
} SgTransform;
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (C) 2008 The Android Open Source Project
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
#
|
|
||||||
|
|
||||||
ifneq ($(TARGET_SIMULATOR),true)
|
|
||||||
|
|
||||||
LOCAL_PATH := $(call my-dir)
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
|
|
||||||
LOCAL_MODULE_TAGS := optional
|
|
||||||
|
|
||||||
LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src)
|
|
||||||
|
|
||||||
LOCAL_PACKAGE_NAME := RSTest
|
|
||||||
|
|
||||||
include $(BUILD_PACKAGE)
|
|
||||||
|
|
||||||
endif
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
package="com.android.rs.test">
|
|
||||||
<application
|
|
||||||
android:label="_RS_Test"
|
|
||||||
android:icon="@drawable/test_pattern">
|
|
||||||
<activity android:name="RSTest"
|
|
||||||
android:screenOrientation="portrait">
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.intent.action.MAIN" />
|
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
|
||||||
</intent-filter>
|
|
||||||
</activity>
|
|
||||||
</application>
|
|
||||||
</manifest>
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 307 B |
@@ -1,84 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2008 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.rs.test;
|
|
||||||
|
|
||||||
import android.renderscript.RSSurfaceView;
|
|
||||||
import android.renderscript.RenderScript;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.content.res.Configuration;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.os.Handler;
|
|
||||||
import android.os.Looper;
|
|
||||||
import android.os.Message;
|
|
||||||
import android.provider.Settings.System;
|
|
||||||
import android.util.Config;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.view.Menu;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.Window;
|
|
||||||
import android.widget.Button;
|
|
||||||
import android.widget.ListView;
|
|
||||||
|
|
||||||
import java.lang.Runtime;
|
|
||||||
|
|
||||||
public class RSTest extends Activity {
|
|
||||||
//EventListener mListener = new EventListener();
|
|
||||||
|
|
||||||
private static final String LOG_TAG = "libRS_jni";
|
|
||||||
private static final boolean DEBUG = false;
|
|
||||||
private static final boolean LOG_ENABLED = DEBUG ? Config.LOGD : Config.LOGV;
|
|
||||||
|
|
||||||
private RSTestView mView;
|
|
||||||
|
|
||||||
// get the current looper (from your Activity UI thread for instance
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle icicle) {
|
|
||||||
super.onCreate(icicle);
|
|
||||||
|
|
||||||
// Create our Preview view and set it as the content of our
|
|
||||||
// Activity
|
|
||||||
mView = new RSTestView(this);
|
|
||||||
setContentView(mView);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onResume() {
|
|
||||||
// Ideally a game should implement onResume() and onPause()
|
|
||||||
// to take appropriate action when the activity loses focus
|
|
||||||
super.onResume();
|
|
||||||
mView.resume();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onPause() {
|
|
||||||
// Ideally a game should implement onResume() and onPause()
|
|
||||||
// to take appropriate action when the activity loses focus
|
|
||||||
super.onPause();
|
|
||||||
mView.pause();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void log(String message) {
|
|
||||||
if (LOG_ENABLED) {
|
|
||||||
Log.v(LOG_TAG, message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,206 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2008 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.rs.test;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.renderscript.*;
|
|
||||||
import android.util.Log;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.ListIterator;
|
|
||||||
import java.util.Timer;
|
|
||||||
import java.util.TimerTask;
|
|
||||||
|
|
||||||
|
|
||||||
public class RSTestCore {
|
|
||||||
int mWidth;
|
|
||||||
int mHeight;
|
|
||||||
Context mCtx;
|
|
||||||
|
|
||||||
public RSTestCore(Context ctx) {
|
|
||||||
mCtx = ctx;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Resources mRes;
|
|
||||||
private RenderScriptGL mRS;
|
|
||||||
|
|
||||||
private Font mFont;
|
|
||||||
ScriptField_ListAllocs_s mListAllocs;
|
|
||||||
int mLastX;
|
|
||||||
int mLastY;
|
|
||||||
private ScriptC_rslist mScript;
|
|
||||||
|
|
||||||
private ArrayList<UnitTest> unitTests;
|
|
||||||
private ListIterator<UnitTest> test_iter;
|
|
||||||
private UnitTest activeTest;
|
|
||||||
private boolean stopTesting;
|
|
||||||
|
|
||||||
/* Periodic timer for ensuring future tests get scheduled */
|
|
||||||
private Timer mTimer;
|
|
||||||
public static final int RS_TIMER_PERIOD = 100;
|
|
||||||
|
|
||||||
public void init(RenderScriptGL rs, Resources res, int width, int height) {
|
|
||||||
mRS = rs;
|
|
||||||
mRes = res;
|
|
||||||
mWidth = width;
|
|
||||||
mHeight = height;
|
|
||||||
stopTesting = false;
|
|
||||||
|
|
||||||
mScript = new ScriptC_rslist(mRS, mRes, R.raw.rslist);
|
|
||||||
|
|
||||||
unitTests = new ArrayList<UnitTest>();
|
|
||||||
|
|
||||||
unitTests.add(new UT_primitives(this, mRes, mCtx));
|
|
||||||
unitTests.add(new UT_rsdebug(this, mRes, mCtx));
|
|
||||||
unitTests.add(new UT_rstime(this, mRes, mCtx));
|
|
||||||
unitTests.add(new UT_rstypes(this, mRes, mCtx));
|
|
||||||
unitTests.add(new UT_math(this, mRes, mCtx));
|
|
||||||
unitTests.add(new UT_fp_mad(this, mRes, mCtx));
|
|
||||||
/*
|
|
||||||
unitTests.add(new UnitTest(null, "<Pass>", 1));
|
|
||||||
unitTests.add(new UnitTest());
|
|
||||||
unitTests.add(new UnitTest(null, "<Fail>", -1));
|
|
||||||
|
|
||||||
for (int i = 0; i < 20; i++) {
|
|
||||||
unitTests.add(new UnitTest(null, "<Pass>", 1));
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
UnitTest [] uta = new UnitTest[unitTests.size()];
|
|
||||||
uta = unitTests.toArray(uta);
|
|
||||||
|
|
||||||
mListAllocs = new ScriptField_ListAllocs_s(mRS, uta.length);
|
|
||||||
for (int i = 0; i < uta.length; i++) {
|
|
||||||
ScriptField_ListAllocs_s.Item listElem = new ScriptField_ListAllocs_s.Item();
|
|
||||||
listElem.text = Allocation.createFromString(mRS, uta[i].name, Allocation.USAGE_SCRIPT);
|
|
||||||
listElem.result = uta[i].result;
|
|
||||||
mListAllocs.set(listElem, i, false);
|
|
||||||
uta[i].setItem(listElem);
|
|
||||||
}
|
|
||||||
|
|
||||||
mListAllocs.copyAll();
|
|
||||||
|
|
||||||
mScript.bind_gList(mListAllocs);
|
|
||||||
|
|
||||||
mFont = Font.create(mRS, mRes, "serif", Font.Style.BOLD, 8);
|
|
||||||
mScript.set_gFont(mFont);
|
|
||||||
|
|
||||||
mRS.bindRootScript(mScript);
|
|
||||||
|
|
||||||
test_iter = unitTests.listIterator();
|
|
||||||
refreshTestResults(); /* Kick off the first test */
|
|
||||||
|
|
||||||
TimerTask pTask = new TimerTask() {
|
|
||||||
public void run() {
|
|
||||||
refreshTestResults();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
mTimer = new Timer();
|
|
||||||
mTimer.schedule(pTask, RS_TIMER_PERIOD, RS_TIMER_PERIOD);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void checkAndRunNextTest() {
|
|
||||||
if (activeTest != null) {
|
|
||||||
if (!activeTest.isAlive()) {
|
|
||||||
/* Properly clean up on our last test */
|
|
||||||
try {
|
|
||||||
activeTest.join();
|
|
||||||
}
|
|
||||||
catch (InterruptedException e) {
|
|
||||||
}
|
|
||||||
activeTest = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!stopTesting && activeTest == null) {
|
|
||||||
if (test_iter.hasNext()) {
|
|
||||||
activeTest = test_iter.next();
|
|
||||||
activeTest.start();
|
|
||||||
/* This routine will only get called once when a new test
|
|
||||||
* should start running. The message handler in UnitTest.java
|
|
||||||
* ensures this. */
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (mTimer != null) {
|
|
||||||
mTimer.cancel();
|
|
||||||
mTimer.purge();
|
|
||||||
mTimer = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void refreshTestResults() {
|
|
||||||
checkAndRunNextTest();
|
|
||||||
|
|
||||||
if (mListAllocs != null && mScript != null && mRS != null) {
|
|
||||||
mListAllocs.copyAll();
|
|
||||||
|
|
||||||
mScript.bind_gList(mListAllocs);
|
|
||||||
mRS.bindRootScript(mScript);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void cleanup() {
|
|
||||||
stopTesting = true;
|
|
||||||
UnitTest t = activeTest;
|
|
||||||
|
|
||||||
/* Stop periodic refresh of testing */
|
|
||||||
if (mTimer != null) {
|
|
||||||
mTimer.cancel();
|
|
||||||
mTimer.purge();
|
|
||||||
mTimer = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Wait to exit until we finish the current test */
|
|
||||||
if (t != null) {
|
|
||||||
try {
|
|
||||||
t.join();
|
|
||||||
}
|
|
||||||
catch (InterruptedException e) {
|
|
||||||
}
|
|
||||||
t = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void newTouchPosition(float x, float y, float pressure, int id) {
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onActionDown(int x, int y) {
|
|
||||||
mScript.set_gDY(0.0f);
|
|
||||||
mLastX = x;
|
|
||||||
mLastY = y;
|
|
||||||
refreshTestResults();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onActionMove(int x, int y) {
|
|
||||||
int dx = mLastX - x;
|
|
||||||
int dy = mLastY - y;
|
|
||||||
|
|
||||||
if (Math.abs(dy) <= 2) {
|
|
||||||
dy = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
mScript.set_gDY(dy);
|
|
||||||
|
|
||||||
mLastX = x;
|
|
||||||
mLastY = y;
|
|
||||||
refreshTestResults();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2008 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.rs.test;
|
|
||||||
|
|
||||||
import java.io.Writer;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.concurrent.Semaphore;
|
|
||||||
|
|
||||||
import android.renderscript.RSSurfaceView;
|
|
||||||
import android.renderscript.RenderScript;
|
|
||||||
import android.renderscript.RenderScriptGL;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import android.graphics.drawable.BitmapDrawable;
|
|
||||||
import android.graphics.drawable.Drawable;
|
|
||||||
import android.os.Handler;
|
|
||||||
import android.os.Message;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.view.Surface;
|
|
||||||
import android.view.SurfaceHolder;
|
|
||||||
import android.view.SurfaceView;
|
|
||||||
import android.view.KeyEvent;
|
|
||||||
import android.view.MotionEvent;
|
|
||||||
|
|
||||||
public class RSTestView extends RSSurfaceView {
|
|
||||||
|
|
||||||
private Context mCtx;
|
|
||||||
|
|
||||||
public RSTestView(Context context) {
|
|
||||||
super(context);
|
|
||||||
mCtx = context;
|
|
||||||
//setFocusable(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
private RenderScriptGL mRS;
|
|
||||||
private RSTestCore mRender;
|
|
||||||
|
|
||||||
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
|
|
||||||
super.surfaceChanged(holder, format, w, h);
|
|
||||||
if (mRS == null) {
|
|
||||||
RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig();
|
|
||||||
mRS = createRenderScriptGL(sc);
|
|
||||||
mRS.setSurface(holder, w, h);
|
|
||||||
mRender = new RSTestCore(mCtx);
|
|
||||||
mRender.init(mRS, getResources(), w, h);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onDetachedFromWindow() {
|
|
||||||
if(mRS != null) {
|
|
||||||
mRender.cleanup();
|
|
||||||
mRS = null;
|
|
||||||
destroyRenderScriptGL();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onKeyDown(int keyCode, KeyEvent event)
|
|
||||||
{
|
|
||||||
return super.onKeyDown(keyCode, event);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onTouchEvent(MotionEvent ev)
|
|
||||||
{
|
|
||||||
boolean ret = false;
|
|
||||||
int act = ev.getAction();
|
|
||||||
if (act == ev.ACTION_DOWN) {
|
|
||||||
mRender.onActionDown((int)ev.getX(), (int)ev.getY());
|
|
||||||
ret = true;
|
|
||||||
}
|
|
||||||
else if (act == ev.ACTION_MOVE) {
|
|
||||||
mRender.onActionMove((int)ev.getX(), (int)ev.getY());
|
|
||||||
ret = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2010 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.rs.test;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.renderscript.*;
|
|
||||||
|
|
||||||
public class UT_fp_mad extends UnitTest {
|
|
||||||
private Resources mRes;
|
|
||||||
|
|
||||||
protected UT_fp_mad(RSTestCore rstc, Resources res, Context ctx) {
|
|
||||||
super(rstc, "Fp_Mad", ctx);
|
|
||||||
mRes = res;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void run() {
|
|
||||||
RenderScript pRS = RenderScript.create(mCtx);
|
|
||||||
ScriptC_fp_mad s = new ScriptC_fp_mad(pRS, mRes, R.raw.fp_mad);
|
|
||||||
pRS.setMessageHandler(mRsMessage);
|
|
||||||
s.invoke_fp_mad_test(0, 0);
|
|
||||||
pRS.finish();
|
|
||||||
waitForMessage();
|
|
||||||
pRS.destroy();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2010 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.rs.test;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.renderscript.*;
|
|
||||||
|
|
||||||
public class UT_math extends UnitTest {
|
|
||||||
private Resources mRes;
|
|
||||||
|
|
||||||
protected UT_math(RSTestCore rstc, Resources res, Context ctx) {
|
|
||||||
super(rstc, "Math", ctx);
|
|
||||||
mRes = res;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void run() {
|
|
||||||
RenderScript pRS = RenderScript.create(mCtx);
|
|
||||||
ScriptC_math s = new ScriptC_math(pRS, mRes, R.raw.math);
|
|
||||||
pRS.setMessageHandler(mRsMessage);
|
|
||||||
s.invoke_math_test(0, 0);
|
|
||||||
pRS.finish();
|
|
||||||
waitForMessage();
|
|
||||||
pRS.destroy();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,104 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2010 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.rs.test;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.renderscript.*;
|
|
||||||
|
|
||||||
public class UT_primitives extends UnitTest {
|
|
||||||
private Resources mRes;
|
|
||||||
|
|
||||||
protected UT_primitives(RSTestCore rstc, Resources res, Context ctx) {
|
|
||||||
super(rstc, "Primitives", ctx);
|
|
||||||
mRes = res;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean initializeGlobals(ScriptC_primitives s) {
|
|
||||||
float pF = s.get_floatTest();
|
|
||||||
if (pF != 1.99f) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
s.set_floatTest(2.99f);
|
|
||||||
|
|
||||||
double pD = s.get_doubleTest();
|
|
||||||
if (pD != 2.05) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
s.set_doubleTest(3.05);
|
|
||||||
|
|
||||||
byte pC = s.get_charTest();
|
|
||||||
if (pC != -8) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
s.set_charTest((byte)-16);
|
|
||||||
|
|
||||||
short pS = s.get_shortTest();
|
|
||||||
if (pS != -16) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
s.set_shortTest((short)-32);
|
|
||||||
|
|
||||||
int pI = s.get_intTest();
|
|
||||||
if (pI != -32) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
s.set_intTest(-64);
|
|
||||||
|
|
||||||
long pL = s.get_longTest();
|
|
||||||
if (pL != 17179869184l) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
s.set_longTest(17179869185l);
|
|
||||||
|
|
||||||
long puL = s.get_ulongTest();
|
|
||||||
if (puL != 4611686018427387904L) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
s.set_ulongTest(4611686018427387903L);
|
|
||||||
|
|
||||||
|
|
||||||
long pLL = s.get_longlongTest();
|
|
||||||
if (pLL != 68719476736L) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
s.set_longlongTest(68719476735L);
|
|
||||||
|
|
||||||
long pu64 = s.get_uint64_tTest();
|
|
||||||
if (pu64 != 117179869184l) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
s.set_uint64_tTest(117179869185l);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void run() {
|
|
||||||
RenderScript pRS = RenderScript.create(mCtx);
|
|
||||||
ScriptC_primitives s = new ScriptC_primitives(pRS, mRes, R.raw.primitives);
|
|
||||||
pRS.setMessageHandler(mRsMessage);
|
|
||||||
if (!initializeGlobals(s)) {
|
|
||||||
// initializeGlobals failed
|
|
||||||
result = -1;
|
|
||||||
} else {
|
|
||||||
s.invoke_primitives_test(0, 0);
|
|
||||||
pRS.finish();
|
|
||||||
waitForMessage();
|
|
||||||
}
|
|
||||||
pRS.destroy();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2010 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.rs.test;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.renderscript.*;
|
|
||||||
|
|
||||||
public class UT_rsdebug extends UnitTest {
|
|
||||||
private Resources mRes;
|
|
||||||
|
|
||||||
protected UT_rsdebug(RSTestCore rstc, Resources res, Context ctx) {
|
|
||||||
super(rstc, "rsDebug", ctx);
|
|
||||||
mRes = res;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void run() {
|
|
||||||
RenderScript pRS = RenderScript.create(mCtx);
|
|
||||||
ScriptC_rsdebug s = new ScriptC_rsdebug(pRS, mRes, R.raw.rsdebug);
|
|
||||||
pRS.setMessageHandler(mRsMessage);
|
|
||||||
s.invoke_test_rsdebug(0, 0);
|
|
||||||
pRS.finish();
|
|
||||||
waitForMessage();
|
|
||||||
pRS.destroy();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2010 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.rs.test;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.renderscript.*;
|
|
||||||
|
|
||||||
public class UT_rstime extends UnitTest {
|
|
||||||
private Resources mRes;
|
|
||||||
|
|
||||||
protected UT_rstime(RSTestCore rstc, Resources res, Context ctx) {
|
|
||||||
super(rstc, "rsTime", ctx);
|
|
||||||
mRes = res;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void run() {
|
|
||||||
RenderScript pRS = RenderScript.create(mCtx);
|
|
||||||
ScriptC_rstime s = new ScriptC_rstime(pRS, mRes, R.raw.rstime);
|
|
||||||
pRS.setMessageHandler(mRsMessage);
|
|
||||||
s.invoke_test_rstime(0, 0);
|
|
||||||
pRS.finish();
|
|
||||||
waitForMessage();
|
|
||||||
pRS.destroy();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2010 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.rs.test;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.renderscript.*;
|
|
||||||
|
|
||||||
public class UT_rstypes extends UnitTest {
|
|
||||||
private Resources mRes;
|
|
||||||
|
|
||||||
protected UT_rstypes(RSTestCore rstc, Resources res, Context ctx) {
|
|
||||||
super(rstc, "rsTypes", ctx);
|
|
||||||
mRes = res;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void run() {
|
|
||||||
RenderScript pRS = RenderScript.create(mCtx);
|
|
||||||
ScriptC_rstypes s = new ScriptC_rstypes(pRS, mRes, R.raw.rstypes);
|
|
||||||
pRS.setMessageHandler(mRsMessage);
|
|
||||||
s.invoke_test_rstypes(0, 0);
|
|
||||||
pRS.finish();
|
|
||||||
waitForMessage();
|
|
||||||
pRS.destroy();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,106 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2010 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.rs.test;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.renderscript.RenderScript.RSMessageHandler;
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
public class UnitTest extends Thread {
|
|
||||||
public String name;
|
|
||||||
public int result;
|
|
||||||
private ScriptField_ListAllocs_s.Item mItem;
|
|
||||||
private RSTestCore mRSTC;
|
|
||||||
private boolean msgHandled;
|
|
||||||
protected Context mCtx;
|
|
||||||
|
|
||||||
/* These constants must match those in shared.rsh */
|
|
||||||
public static final int RS_MSG_TEST_PASSED = 100;
|
|
||||||
public static final int RS_MSG_TEST_FAILED = 101;
|
|
||||||
|
|
||||||
private static int numTests = 0;
|
|
||||||
public int testID;
|
|
||||||
|
|
||||||
protected UnitTest(RSTestCore rstc, String n, int initResult, Context ctx) {
|
|
||||||
super();
|
|
||||||
mRSTC = rstc;
|
|
||||||
name = n;
|
|
||||||
msgHandled = false;
|
|
||||||
mCtx = ctx;
|
|
||||||
result = initResult;
|
|
||||||
testID = numTests++;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected UnitTest(RSTestCore rstc, String n, Context ctx) {
|
|
||||||
this(rstc, n, 0, ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected UnitTest(RSTestCore rstc, Context ctx) {
|
|
||||||
this (rstc, "<Unknown>", ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected UnitTest(Context ctx) {
|
|
||||||
this (null, ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected RSMessageHandler mRsMessage = new RSMessageHandler() {
|
|
||||||
public void run() {
|
|
||||||
if (result == 0) {
|
|
||||||
switch (mID) {
|
|
||||||
case RS_MSG_TEST_PASSED:
|
|
||||||
result = 1;
|
|
||||||
break;
|
|
||||||
case RS_MSG_TEST_FAILED:
|
|
||||||
result = -1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
android.util.Log.v("RenderScript", "Unit test got unexpected message");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mItem != null) {
|
|
||||||
mItem.result = result;
|
|
||||||
msgHandled = true;
|
|
||||||
try {
|
|
||||||
mRSTC.refreshTestResults();
|
|
||||||
}
|
|
||||||
catch (IllegalStateException e) {
|
|
||||||
/* Ignore the case where our message receiver has been
|
|
||||||
disconnected. This happens when we leave the application
|
|
||||||
before it finishes running all of the unit tests. */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
public void waitForMessage() {
|
|
||||||
while (!msgHandled) {
|
|
||||||
yield();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setItem(ScriptField_ListAllocs_s.Item item) {
|
|
||||||
mItem = item;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void run() {
|
|
||||||
/* This method needs to be implemented for each subclass */
|
|
||||||
if (mRSTC != null) {
|
|
||||||
mRSTC.refreshTestResults();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,174 +0,0 @@
|
|||||||
#include "shared.rsh"
|
|
||||||
|
|
||||||
const int TEST_COUNT = 1;
|
|
||||||
|
|
||||||
static float data_f1[1025];
|
|
||||||
static float4 data_f4[1025];
|
|
||||||
|
|
||||||
static void test_mad4(uint32_t index) {
|
|
||||||
start();
|
|
||||||
|
|
||||||
float total = 0;
|
|
||||||
// Do ~1 billion ops
|
|
||||||
for (int ct=0; ct < 1000 * (1000 / 80); ct++) {
|
|
||||||
for (int i=0; i < (1000); i++) {
|
|
||||||
data_f4[i] = (data_f4[i] * 0.02f +
|
|
||||||
data_f4[i+1] * 0.04f +
|
|
||||||
data_f4[i+2] * 0.05f +
|
|
||||||
data_f4[i+3] * 0.1f +
|
|
||||||
data_f4[i+4] * 0.2f +
|
|
||||||
data_f4[i+5] * 0.2f +
|
|
||||||
data_f4[i+6] * 0.1f +
|
|
||||||
data_f4[i+7] * 0.05f +
|
|
||||||
data_f4[i+8] * 0.04f +
|
|
||||||
data_f4[i+9] * 0.02f + 1.f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
float time = end(index);
|
|
||||||
rsDebug("fp_mad4 M ops", 1000.f / time);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void test_mad(uint32_t index) {
|
|
||||||
start();
|
|
||||||
|
|
||||||
float total = 0;
|
|
||||||
// Do ~1 billion ops
|
|
||||||
for (int ct=0; ct < 1000 * (1000 / 20); ct++) {
|
|
||||||
for (int i=0; i < (1000); i++) {
|
|
||||||
data_f1[i] = (data_f1[i] * 0.02f +
|
|
||||||
data_f1[i+1] * 0.04f +
|
|
||||||
data_f1[i+2] * 0.05f +
|
|
||||||
data_f1[i+3] * 0.1f +
|
|
||||||
data_f1[i+4] * 0.2f +
|
|
||||||
data_f1[i+5] * 0.2f +
|
|
||||||
data_f1[i+6] * 0.1f +
|
|
||||||
data_f1[i+7] * 0.05f +
|
|
||||||
data_f1[i+8] * 0.04f +
|
|
||||||
data_f1[i+9] * 0.02f + 1.f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
float time = end(index);
|
|
||||||
rsDebug("fp_mad M ops", 1000.f / time);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void test_norm(uint32_t index) {
|
|
||||||
start();
|
|
||||||
|
|
||||||
float total = 0;
|
|
||||||
// Do ~10 M ops
|
|
||||||
for (int ct=0; ct < 1000 * 10; ct++) {
|
|
||||||
for (int i=0; i < (1000); i++) {
|
|
||||||
data_f4[i] = normalize(data_f4[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
float time = end(index);
|
|
||||||
rsDebug("fp_norm M ops", 10.f / time);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void test_sincos4(uint32_t index) {
|
|
||||||
start();
|
|
||||||
|
|
||||||
float total = 0;
|
|
||||||
// Do ~10 M ops
|
|
||||||
for (int ct=0; ct < 1000 * 10 / 4; ct++) {
|
|
||||||
for (int i=0; i < (1000); i++) {
|
|
||||||
data_f4[i] = sin(data_f4[i]) * cos(data_f4[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
float time = end(index);
|
|
||||||
rsDebug("fp_sincos4 M ops", 10.f / time);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void test_sincos(uint32_t index) {
|
|
||||||
start();
|
|
||||||
|
|
||||||
float total = 0;
|
|
||||||
// Do ~10 M ops
|
|
||||||
for (int ct=0; ct < 1000 * 10; ct++) {
|
|
||||||
for (int i=0; i < (1000); i++) {
|
|
||||||
data_f1[i] = sin(data_f1[i]) * cos(data_f1[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
float time = end(index);
|
|
||||||
rsDebug("fp_sincos M ops", 10.f / time);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void test_clamp(uint32_t index) {
|
|
||||||
start();
|
|
||||||
|
|
||||||
// Do ~100 M ops
|
|
||||||
for (int ct=0; ct < 1000 * 100; ct++) {
|
|
||||||
for (int i=0; i < (1000); i++) {
|
|
||||||
data_f1[i] = clamp(data_f1[i], -1.f, 1.f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
float time = end(index);
|
|
||||||
rsDebug("fp_clamp M ops", 100.f / time);
|
|
||||||
|
|
||||||
start();
|
|
||||||
// Do ~100 M ops
|
|
||||||
for (int ct=0; ct < 1000 * 100; ct++) {
|
|
||||||
for (int i=0; i < (1000); i++) {
|
|
||||||
if (data_f1[i] < -1.f) data_f1[i] = -1.f;
|
|
||||||
if (data_f1[i] > -1.f) data_f1[i] = 1.f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
time = end(index);
|
|
||||||
rsDebug("fp_clamp ref M ops", 100.f / time);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void test_clamp4(uint32_t index) {
|
|
||||||
start();
|
|
||||||
|
|
||||||
float total = 0;
|
|
||||||
// Do ~100 M ops
|
|
||||||
for (int ct=0; ct < 1000 * 100 /4; ct++) {
|
|
||||||
for (int i=0; i < (1000); i++) {
|
|
||||||
data_f4[i] = clamp(data_f4[i], -1.f, 1.f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
float time = end(index);
|
|
||||||
rsDebug("fp_clamp4 M ops", 100.f / time);
|
|
||||||
}
|
|
||||||
|
|
||||||
void fp_mad_test(uint32_t index, int test_num) {
|
|
||||||
int x;
|
|
||||||
for (x=0; x < 1025; x++) {
|
|
||||||
data_f1[x] = (x & 0xf) * 0.1f;
|
|
||||||
data_f4[x].x = (x & 0xf) * 0.1f;
|
|
||||||
data_f4[x].y = (x & 0xf0) * 0.1f;
|
|
||||||
data_f4[x].z = (x & 0x33) * 0.1f;
|
|
||||||
data_f4[x].w = (x & 0x77) * 0.1f;
|
|
||||||
}
|
|
||||||
|
|
||||||
test_mad4(index);
|
|
||||||
test_mad(index);
|
|
||||||
|
|
||||||
for (x=0; x < 1025; x++) {
|
|
||||||
data_f1[x] = (x & 0xf) * 0.1f + 1.f;
|
|
||||||
data_f4[x].x = (x & 0xf) * 0.1f + 1.f;
|
|
||||||
data_f4[x].y = (x & 0xf0) * 0.1f + 1.f;
|
|
||||||
data_f4[x].z = (x & 0x33) * 0.1f + 1.f;
|
|
||||||
data_f4[x].w = (x & 0x77) * 0.1f + 1.f;
|
|
||||||
}
|
|
||||||
|
|
||||||
test_norm(index);
|
|
||||||
test_sincos4(index);
|
|
||||||
test_sincos(index);
|
|
||||||
test_clamp4(index);
|
|
||||||
test_clamp(index);
|
|
||||||
|
|
||||||
// TODO Actually verify test result accuracy
|
|
||||||
rsDebug("fp_mad_test PASSED", 0);
|
|
||||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,322 +0,0 @@
|
|||||||
#include "shared.rsh"
|
|
||||||
|
|
||||||
// Testing math library
|
|
||||||
|
|
||||||
volatile float f1;
|
|
||||||
volatile float2 f2;
|
|
||||||
volatile float3 f3;
|
|
||||||
volatile float4 f4;
|
|
||||||
|
|
||||||
volatile int i1;
|
|
||||||
volatile int2 i2;
|
|
||||||
volatile int3 i3;
|
|
||||||
volatile int4 i4;
|
|
||||||
|
|
||||||
volatile uint ui1;
|
|
||||||
volatile uint2 ui2;
|
|
||||||
volatile uint3 ui3;
|
|
||||||
volatile uint4 ui4;
|
|
||||||
|
|
||||||
volatile short s1;
|
|
||||||
volatile short2 s2;
|
|
||||||
volatile short3 s3;
|
|
||||||
volatile short4 s4;
|
|
||||||
|
|
||||||
volatile ushort us1;
|
|
||||||
volatile ushort2 us2;
|
|
||||||
volatile ushort3 us3;
|
|
||||||
volatile ushort4 us4;
|
|
||||||
|
|
||||||
volatile char c1;
|
|
||||||
volatile char2 c2;
|
|
||||||
volatile char3 c3;
|
|
||||||
volatile char4 c4;
|
|
||||||
|
|
||||||
volatile uchar uc1;
|
|
||||||
volatile uchar2 uc2;
|
|
||||||
volatile uchar3 uc3;
|
|
||||||
volatile uchar4 uc4;
|
|
||||||
|
|
||||||
#define TEST_FN_FUNC_FN(fnc) \
|
|
||||||
rsDebug("Testing " #fnc, 0); \
|
|
||||||
f1 = fnc(f1); \
|
|
||||||
f2 = fnc(f2); \
|
|
||||||
f3 = fnc(f3); \
|
|
||||||
f4 = fnc(f4);
|
|
||||||
|
|
||||||
#define TEST_FN_FUNC_FN_PFN(fnc) \
|
|
||||||
rsDebug("Testing " #fnc, 0); \
|
|
||||||
f1 = fnc(f1, (float*) &f1); \
|
|
||||||
f2 = fnc(f2, (float2*) &f2); \
|
|
||||||
f3 = fnc(f3, (float3*) &f3); \
|
|
||||||
f4 = fnc(f4, (float4*) &f4);
|
|
||||||
|
|
||||||
#define TEST_FN_FUNC_FN_FN(fnc) \
|
|
||||||
rsDebug("Testing " #fnc, 0); \
|
|
||||||
f1 = fnc(f1, f1); \
|
|
||||||
f2 = fnc(f2, f2); \
|
|
||||||
f3 = fnc(f3, f3); \
|
|
||||||
f4 = fnc(f4, f4);
|
|
||||||
|
|
||||||
#define TEST_FN_FUNC_FN_F(fnc) \
|
|
||||||
rsDebug("Testing " #fnc, 0); \
|
|
||||||
f1 = fnc(f1, f1); \
|
|
||||||
f2 = fnc(f2, f1); \
|
|
||||||
f3 = fnc(f3, f1); \
|
|
||||||
f4 = fnc(f4, f1);
|
|
||||||
|
|
||||||
#define TEST_FN_FUNC_FN_IN(fnc) \
|
|
||||||
rsDebug("Testing " #fnc, 0); \
|
|
||||||
f1 = fnc(f1, i1); \
|
|
||||||
f2 = fnc(f2, i2); \
|
|
||||||
f3 = fnc(f3, i3); \
|
|
||||||
f4 = fnc(f4, i4);
|
|
||||||
|
|
||||||
#define TEST_FN_FUNC_FN_I(fnc) \
|
|
||||||
rsDebug("Testing " #fnc, 0); \
|
|
||||||
f1 = fnc(f1, i1); \
|
|
||||||
f2 = fnc(f2, i1); \
|
|
||||||
f3 = fnc(f3, i1); \
|
|
||||||
f4 = fnc(f4, i1);
|
|
||||||
|
|
||||||
#define TEST_FN_FUNC_FN_FN_FN(fnc) \
|
|
||||||
rsDebug("Testing " #fnc, 0); \
|
|
||||||
f1 = fnc(f1, f1, f1); \
|
|
||||||
f2 = fnc(f2, f2, f2); \
|
|
||||||
f3 = fnc(f3, f3, f3); \
|
|
||||||
f4 = fnc(f4, f4, f4);
|
|
||||||
|
|
||||||
#define TEST_FN_FUNC_FN_PIN(fnc) \
|
|
||||||
rsDebug("Testing " #fnc, 0); \
|
|
||||||
f1 = fnc(f1, (int*) &i1); \
|
|
||||||
f2 = fnc(f2, (int2*) &i2); \
|
|
||||||
f3 = fnc(f3, (int3*) &i3); \
|
|
||||||
f4 = fnc(f4, (int4*) &i4);
|
|
||||||
|
|
||||||
#define TEST_FN_FUNC_FN_FN_PIN(fnc) \
|
|
||||||
rsDebug("Testing " #fnc, 0); \
|
|
||||||
f1 = fnc(f1, f1, (int*) &i1); \
|
|
||||||
f2 = fnc(f2, f2, (int2*) &i2); \
|
|
||||||
f3 = fnc(f3, f3, (int3*) &i3); \
|
|
||||||
f4 = fnc(f4, f4, (int4*) &i4);
|
|
||||||
|
|
||||||
#define TEST_IN_FUNC_FN(fnc) \
|
|
||||||
rsDebug("Testing " #fnc, 0); \
|
|
||||||
i1 = fnc(f1); \
|
|
||||||
i2 = fnc(f2); \
|
|
||||||
i3 = fnc(f3); \
|
|
||||||
i4 = fnc(f4);
|
|
||||||
|
|
||||||
|
|
||||||
static bool test_fp_math(uint32_t index) {
|
|
||||||
bool failed = false;
|
|
||||||
start();
|
|
||||||
|
|
||||||
TEST_FN_FUNC_FN(acos);
|
|
||||||
TEST_FN_FUNC_FN(acosh);
|
|
||||||
TEST_FN_FUNC_FN(acospi);
|
|
||||||
TEST_FN_FUNC_FN(asin);
|
|
||||||
TEST_FN_FUNC_FN(asinh);
|
|
||||||
TEST_FN_FUNC_FN(asinpi);
|
|
||||||
TEST_FN_FUNC_FN(atan);
|
|
||||||
TEST_FN_FUNC_FN_FN(atan2);
|
|
||||||
TEST_FN_FUNC_FN(atanh);
|
|
||||||
TEST_FN_FUNC_FN(atanpi);
|
|
||||||
TEST_FN_FUNC_FN_FN(atan2pi);
|
|
||||||
TEST_FN_FUNC_FN(cbrt);
|
|
||||||
TEST_FN_FUNC_FN(ceil);
|
|
||||||
TEST_FN_FUNC_FN_FN(copysign);
|
|
||||||
TEST_FN_FUNC_FN(cos);
|
|
||||||
TEST_FN_FUNC_FN(cosh);
|
|
||||||
TEST_FN_FUNC_FN(cospi);
|
|
||||||
TEST_FN_FUNC_FN(erfc);
|
|
||||||
TEST_FN_FUNC_FN(erf);
|
|
||||||
TEST_FN_FUNC_FN(exp);
|
|
||||||
TEST_FN_FUNC_FN(exp2);
|
|
||||||
TEST_FN_FUNC_FN(exp10);
|
|
||||||
TEST_FN_FUNC_FN(expm1);
|
|
||||||
TEST_FN_FUNC_FN(fabs);
|
|
||||||
TEST_FN_FUNC_FN_FN(fdim);
|
|
||||||
TEST_FN_FUNC_FN(floor);
|
|
||||||
TEST_FN_FUNC_FN_FN_FN(fma);
|
|
||||||
TEST_FN_FUNC_FN_FN(fmax);
|
|
||||||
TEST_FN_FUNC_FN_F(fmax);
|
|
||||||
TEST_FN_FUNC_FN_FN(fmin);
|
|
||||||
TEST_FN_FUNC_FN_F(fmin);
|
|
||||||
TEST_FN_FUNC_FN_FN(fmod);
|
|
||||||
TEST_FN_FUNC_FN_PFN(fract);
|
|
||||||
TEST_FN_FUNC_FN_PIN(frexp);
|
|
||||||
TEST_FN_FUNC_FN_FN(hypot);
|
|
||||||
TEST_IN_FUNC_FN(ilogb);
|
|
||||||
TEST_FN_FUNC_FN_IN(ldexp);
|
|
||||||
TEST_FN_FUNC_FN_I(ldexp);
|
|
||||||
TEST_FN_FUNC_FN(lgamma);
|
|
||||||
TEST_FN_FUNC_FN_PIN(lgamma);
|
|
||||||
TEST_FN_FUNC_FN(log);
|
|
||||||
TEST_FN_FUNC_FN(log2);
|
|
||||||
TEST_FN_FUNC_FN(log10);
|
|
||||||
TEST_FN_FUNC_FN(log1p);
|
|
||||||
TEST_FN_FUNC_FN(logb);
|
|
||||||
TEST_FN_FUNC_FN_FN_FN(mad);
|
|
||||||
TEST_FN_FUNC_FN_PFN(modf);
|
|
||||||
// nan
|
|
||||||
TEST_FN_FUNC_FN_FN(nextafter);
|
|
||||||
TEST_FN_FUNC_FN_FN(pow);
|
|
||||||
TEST_FN_FUNC_FN_IN(pown);
|
|
||||||
TEST_FN_FUNC_FN_FN(powr);
|
|
||||||
TEST_FN_FUNC_FN_FN(remainder);
|
|
||||||
TEST_FN_FUNC_FN_FN_PIN(remquo);
|
|
||||||
TEST_FN_FUNC_FN(rint);
|
|
||||||
TEST_FN_FUNC_FN_IN(rootn);
|
|
||||||
TEST_FN_FUNC_FN(round);
|
|
||||||
TEST_FN_FUNC_FN(rsqrt);
|
|
||||||
TEST_FN_FUNC_FN(sin);
|
|
||||||
TEST_FN_FUNC_FN_PFN(sincos);
|
|
||||||
TEST_FN_FUNC_FN(sinh);
|
|
||||||
TEST_FN_FUNC_FN(sinpi);
|
|
||||||
TEST_FN_FUNC_FN(sqrt);
|
|
||||||
TEST_FN_FUNC_FN(tan);
|
|
||||||
TEST_FN_FUNC_FN(tanh);
|
|
||||||
TEST_FN_FUNC_FN(tanpi);
|
|
||||||
TEST_FN_FUNC_FN(tgamma);
|
|
||||||
TEST_FN_FUNC_FN(trunc);
|
|
||||||
|
|
||||||
float time = end(index);
|
|
||||||
|
|
||||||
if (failed) {
|
|
||||||
rsDebug("test_fp_math FAILED", time);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
rsDebug("test_fp_math PASSED", time);
|
|
||||||
}
|
|
||||||
|
|
||||||
return failed;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define DECL_INT(prefix) \
|
|
||||||
volatile char prefix##_c_1 = 1; \
|
|
||||||
volatile char2 prefix##_c_2 = 1; \
|
|
||||||
volatile char3 prefix##_c_3 = 1; \
|
|
||||||
volatile char4 prefix##_c_4 = 1; \
|
|
||||||
volatile uchar prefix##_uc_1 = 1; \
|
|
||||||
volatile uchar2 prefix##_uc_2 = 1; \
|
|
||||||
volatile uchar3 prefix##_uc_3 = 1; \
|
|
||||||
volatile uchar4 prefix##_uc_4 = 1; \
|
|
||||||
volatile short prefix##_s_1 = 1; \
|
|
||||||
volatile short2 prefix##_s_2 = 1; \
|
|
||||||
volatile short3 prefix##_s_3 = 1; \
|
|
||||||
volatile short4 prefix##_s_4 = 1; \
|
|
||||||
volatile ushort prefix##_us_1 = 1; \
|
|
||||||
volatile ushort2 prefix##_us_2 = 1; \
|
|
||||||
volatile ushort3 prefix##_us_3 = 1; \
|
|
||||||
volatile ushort4 prefix##_us_4 = 1; \
|
|
||||||
volatile int prefix##_i_1 = 1; \
|
|
||||||
volatile int2 prefix##_i_2 = 1; \
|
|
||||||
volatile int3 prefix##_i_3 = 1; \
|
|
||||||
volatile int4 prefix##_i_4 = 1; \
|
|
||||||
volatile uint prefix##_ui_1 = 1; \
|
|
||||||
volatile uint2 prefix##_ui_2 = 1; \
|
|
||||||
volatile uint3 prefix##_ui_3 = 1; \
|
|
||||||
volatile uint4 prefix##_ui_4 = 1; \
|
|
||||||
volatile long prefix##_l_1 = 1; \
|
|
||||||
volatile ulong prefix##_ul_1 = 1;
|
|
||||||
|
|
||||||
#define TEST_INT_OP_TYPE(op, type) \
|
|
||||||
rsDebug("Testing " #op " for " #type "1", i++); \
|
|
||||||
res_##type##_1 = src1_##type##_1 op src2_##type##_1; \
|
|
||||||
rsDebug("Testing " #op " for " #type "2", i++); \
|
|
||||||
res_##type##_2 = src1_##type##_2 op src2_##type##_2; \
|
|
||||||
rsDebug("Testing " #op " for " #type "3", i++); \
|
|
||||||
res_##type##_3 = src1_##type##_3 op src2_##type##_3; \
|
|
||||||
rsDebug("Testing " #op " for " #type "4", i++); \
|
|
||||||
res_##type##_4 = src1_##type##_4 op src2_##type##_4;
|
|
||||||
|
|
||||||
#define TEST_INT_OP(op) \
|
|
||||||
TEST_INT_OP_TYPE(op, c) \
|
|
||||||
TEST_INT_OP_TYPE(op, uc) \
|
|
||||||
TEST_INT_OP_TYPE(op, s) \
|
|
||||||
TEST_INT_OP_TYPE(op, us) \
|
|
||||||
TEST_INT_OP_TYPE(op, i) \
|
|
||||||
TEST_INT_OP_TYPE(op, ui) \
|
|
||||||
rsDebug("Testing " #op " for l1", i++); \
|
|
||||||
res_l_1 = src1_l_1 op src2_l_1; \
|
|
||||||
rsDebug("Testing " #op " for ul1", i++); \
|
|
||||||
res_ul_1 = src1_ul_1 op src2_ul_1;
|
|
||||||
|
|
||||||
DECL_INT(res)
|
|
||||||
DECL_INT(src1)
|
|
||||||
DECL_INT(src2)
|
|
||||||
|
|
||||||
static bool test_basic_operators() {
|
|
||||||
bool failed = false;
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
TEST_INT_OP(+);
|
|
||||||
TEST_INT_OP(-);
|
|
||||||
TEST_INT_OP(*);
|
|
||||||
TEST_INT_OP(/);
|
|
||||||
TEST_INT_OP(%);
|
|
||||||
TEST_INT_OP(<<);
|
|
||||||
TEST_INT_OP(>>);
|
|
||||||
|
|
||||||
if (failed) {
|
|
||||||
rsDebug("test_basic_operators FAILED", 0);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
rsDebug("test_basic_operators PASSED", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return failed;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define TEST_CVT(to, from, type) \
|
|
||||||
rsDebug("Testing convert from " #from " to " #to, 0); \
|
|
||||||
to##1 = from##1; \
|
|
||||||
to##2 = convert_##type##2(from##2); \
|
|
||||||
to##3 = convert_##type##3(from##3); \
|
|
||||||
to##4 = convert_##type##4(from##4);
|
|
||||||
|
|
||||||
#define TEST_CVT_MATRIX(to, type) \
|
|
||||||
TEST_CVT(to, c, type); \
|
|
||||||
TEST_CVT(to, uc, type); \
|
|
||||||
TEST_CVT(to, s, type); \
|
|
||||||
TEST_CVT(to, us, type); \
|
|
||||||
TEST_CVT(to, i, type); \
|
|
||||||
TEST_CVT(to, ui, type); \
|
|
||||||
TEST_CVT(to, f, type); \
|
|
||||||
|
|
||||||
static bool test_convert() {
|
|
||||||
bool failed = false;
|
|
||||||
|
|
||||||
TEST_CVT_MATRIX(c, char);
|
|
||||||
TEST_CVT_MATRIX(uc, uchar);
|
|
||||||
TEST_CVT_MATRIX(s, short);
|
|
||||||
TEST_CVT_MATRIX(us, ushort);
|
|
||||||
TEST_CVT_MATRIX(i, int);
|
|
||||||
TEST_CVT_MATRIX(ui, uint);
|
|
||||||
TEST_CVT_MATRIX(f, float);
|
|
||||||
|
|
||||||
if (failed) {
|
|
||||||
rsDebug("test_convert FAILED", 0);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
rsDebug("test_convert PASSED", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return failed;
|
|
||||||
}
|
|
||||||
|
|
||||||
void math_test(uint32_t index, int test_num) {
|
|
||||||
bool failed = false;
|
|
||||||
failed |= test_convert();
|
|
||||||
failed |= test_fp_math(index);
|
|
||||||
failed |= test_basic_operators();
|
|
||||||
|
|
||||||
if (failed) {
|
|
||||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
#include "shared.rsh"
|
|
||||||
|
|
||||||
// Testing primitive types
|
|
||||||
float floatTest = 1.99f;
|
|
||||||
double doubleTest = 2.05;
|
|
||||||
char charTest = -8;
|
|
||||||
short shortTest = -16;
|
|
||||||
int intTest = -32;
|
|
||||||
long longTest = 17179869184l; // 1 << 34
|
|
||||||
long long longlongTest = 68719476736l; // 1 << 36
|
|
||||||
|
|
||||||
uchar ucharTest = 8;
|
|
||||||
ushort ushortTest = 16;
|
|
||||||
uint uintTest = 32;
|
|
||||||
ulong ulongTest = 4611686018427387904L;
|
|
||||||
int64_t int64_tTest = -17179869184l; // - 1 << 34
|
|
||||||
uint64_t uint64_tTest = 117179869184l;
|
|
||||||
|
|
||||||
static bool test_primitive_types(uint32_t index) {
|
|
||||||
bool failed = false;
|
|
||||||
start();
|
|
||||||
|
|
||||||
_RS_ASSERT(floatTest == 2.99f);
|
|
||||||
_RS_ASSERT(doubleTest == 3.05);
|
|
||||||
_RS_ASSERT(charTest == -16);
|
|
||||||
_RS_ASSERT(shortTest == -32);
|
|
||||||
_RS_ASSERT(intTest == -64);
|
|
||||||
_RS_ASSERT(longTest == 17179869185l);
|
|
||||||
_RS_ASSERT(longlongTest == 68719476735l);
|
|
||||||
|
|
||||||
_RS_ASSERT(ucharTest == 8);
|
|
||||||
_RS_ASSERT(ushortTest == 16);
|
|
||||||
_RS_ASSERT(uintTest == 32);
|
|
||||||
_RS_ASSERT(ulongTest == 4611686018427387903L);
|
|
||||||
_RS_ASSERT(int64_tTest == -17179869184l);
|
|
||||||
_RS_ASSERT(uint64_tTest == 117179869185l);
|
|
||||||
|
|
||||||
float time = end(index);
|
|
||||||
|
|
||||||
if (failed) {
|
|
||||||
rsDebug("test_primitives FAILED", time);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
rsDebug("test_primitives PASSED", time);
|
|
||||||
}
|
|
||||||
|
|
||||||
return failed;
|
|
||||||
}
|
|
||||||
|
|
||||||
void primitives_test(uint32_t index, int test_num) {
|
|
||||||
bool failed = false;
|
|
||||||
failed |= test_primitive_types(index);
|
|
||||||
|
|
||||||
if (failed) {
|
|
||||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
#include "shared.rsh"
|
|
||||||
|
|
||||||
// Testing primitive types
|
|
||||||
float floatTest = 1.99f;
|
|
||||||
double doubleTest = 2.05;
|
|
||||||
char charTest = -8;
|
|
||||||
short shortTest = -16;
|
|
||||||
int intTest = -32;
|
|
||||||
long longTest = 17179869184l; // 1 << 34
|
|
||||||
long long longlongTest = 68719476736l; // 1 << 36
|
|
||||||
|
|
||||||
uchar ucharTest = 8;
|
|
||||||
ushort ushortTest = 16;
|
|
||||||
uint uintTest = 32;
|
|
||||||
ulong ulongTest = 4611686018427387904L;
|
|
||||||
int64_t int64_tTest = -17179869184l; // - 1 << 34
|
|
||||||
uint64_t uint64_tTest = 117179869184l;
|
|
||||||
|
|
||||||
static bool basic_test(uint32_t index) {
|
|
||||||
bool failed = false;
|
|
||||||
|
|
||||||
// This test focuses primarily on compilation-time, not run-time.
|
|
||||||
// For this reason, none of the outputs are actually checked.
|
|
||||||
|
|
||||||
rsDebug("floatTest", floatTest);
|
|
||||||
rsDebug("doubleTest", doubleTest);
|
|
||||||
rsDebug("charTest", charTest);
|
|
||||||
rsDebug("shortTest", shortTest);
|
|
||||||
rsDebug("intTest", intTest);
|
|
||||||
rsDebug("longTest", longTest);
|
|
||||||
rsDebug("longlongTest", longlongTest);
|
|
||||||
|
|
||||||
rsDebug("ucharTest", ucharTest);
|
|
||||||
rsDebug("ushortTest", ushortTest);
|
|
||||||
rsDebug("uintTest", uintTest);
|
|
||||||
rsDebug("ulongTest", ulongTest);
|
|
||||||
rsDebug("int64_tTest", int64_tTest);
|
|
||||||
rsDebug("uint64_tTest", uint64_tTest);
|
|
||||||
|
|
||||||
return failed;
|
|
||||||
}
|
|
||||||
|
|
||||||
void test_rsdebug(uint32_t index, int test_num) {
|
|
||||||
bool failed = false;
|
|
||||||
failed |= basic_test(index);
|
|
||||||
|
|
||||||
if (failed) {
|
|
||||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
|
||||||
rsDebug("rsdebug_test FAILED", -1);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
|
||||||
rsDebug("rsdebug_test PASSED", 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,107 +0,0 @@
|
|||||||
// Copyright (C) 2009 The Android Open Source Project
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
#pragma version(1)
|
|
||||||
|
|
||||||
#pragma rs java_package_name(com.android.rs.test)
|
|
||||||
|
|
||||||
#include "rs_graphics.rsh"
|
|
||||||
|
|
||||||
float gDY;
|
|
||||||
|
|
||||||
rs_font gFont;
|
|
||||||
|
|
||||||
typedef struct ListAllocs_s {
|
|
||||||
rs_allocation text;
|
|
||||||
int result;
|
|
||||||
} ListAllocs;
|
|
||||||
|
|
||||||
ListAllocs *gList;
|
|
||||||
|
|
||||||
void init() {
|
|
||||||
gDY = 0.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
int textPos = 0;
|
|
||||||
|
|
||||||
int root(int launchID) {
|
|
||||||
|
|
||||||
rsgClearColor(0.0f, 0.0f, 0.0f, 0.0f);
|
|
||||||
rsgClearDepth(1.0f);
|
|
||||||
|
|
||||||
textPos -= (int)gDY*2;
|
|
||||||
gDY *= 0.95;
|
|
||||||
|
|
||||||
rsgFontColor(0.9f, 0.9f, 0.9f, 1.0f);
|
|
||||||
rsgBindFont(gFont);
|
|
||||||
|
|
||||||
rs_allocation listAlloc;
|
|
||||||
rsSetObject(&listAlloc, rsGetAllocation(gList));
|
|
||||||
int allocSize = rsAllocationGetDimX(listAlloc);
|
|
||||||
|
|
||||||
int width = rsgGetWidth();
|
|
||||||
int height = rsgGetHeight();
|
|
||||||
|
|
||||||
int itemHeight = 80;
|
|
||||||
int totalItemHeight = itemHeight * allocSize;
|
|
||||||
|
|
||||||
/* Prevent scrolling above the top of the list */
|
|
||||||
int firstItem = height - totalItemHeight;
|
|
||||||
if (firstItem < 0) {
|
|
||||||
firstItem = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Prevent scrolling past the last line of the list */
|
|
||||||
int lastItem = -1 * (totalItemHeight - height);
|
|
||||||
if (lastItem > 0) {
|
|
||||||
lastItem = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (textPos > firstItem) {
|
|
||||||
textPos = firstItem;
|
|
||||||
}
|
|
||||||
else if (textPos < lastItem) {
|
|
||||||
textPos = lastItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
int currentYPos = itemHeight + textPos;
|
|
||||||
|
|
||||||
for(int i = 0; i < allocSize; i ++) {
|
|
||||||
if(currentYPos - itemHeight > height) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(currentYPos > 0) {
|
|
||||||
switch(gList[i].result) {
|
|
||||||
case 1: /* Passed */
|
|
||||||
rsgFontColor(0.5f, 0.9f, 0.5f, 1.0f);
|
|
||||||
break;
|
|
||||||
case -1: /* Failed */
|
|
||||||
rsgFontColor(0.9f, 0.5f, 0.5f, 1.0f);
|
|
||||||
break;
|
|
||||||
case 0: /* Still Testing */
|
|
||||||
rsgFontColor(0.9f, 0.9f, 0.5f, 1.0f);
|
|
||||||
break;
|
|
||||||
default: /* Unknown */
|
|
||||||
rsgFontColor(0.9f, 0.9f, 0.9f, 1.0f);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
rsgDrawRect(0, currentYPos - 1, width, currentYPos, 0);
|
|
||||||
rsgDrawText(gList[i].text, 30, currentYPos - 32);
|
|
||||||
}
|
|
||||||
currentYPos += itemHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 10;
|
|
||||||
}
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
#include "shared.rsh"
|
|
||||||
|
|
||||||
static bool basic_test(uint32_t index) {
|
|
||||||
bool failed = false;
|
|
||||||
|
|
||||||
rs_time_t curTime = rsTime(0);
|
|
||||||
rs_tm tm;
|
|
||||||
rsDebug("curTime", curTime);
|
|
||||||
|
|
||||||
rsLocaltime(&tm, &curTime);
|
|
||||||
|
|
||||||
rsDebug("tm.tm_sec", tm.tm_sec);
|
|
||||||
rsDebug("tm.tm_min", tm.tm_min);
|
|
||||||
rsDebug("tm.tm_hour", tm.tm_hour);
|
|
||||||
rsDebug("tm.tm_mday", tm.tm_mday);
|
|
||||||
rsDebug("tm.tm_mon", tm.tm_mon);
|
|
||||||
rsDebug("tm.tm_year", tm.tm_year);
|
|
||||||
rsDebug("tm.tm_wday", tm.tm_wday);
|
|
||||||
rsDebug("tm.tm_yday", tm.tm_yday);
|
|
||||||
rsDebug("tm.tm_isdst", tm.tm_isdst);
|
|
||||||
|
|
||||||
// Test a specific time (only valid for PST localtime)
|
|
||||||
curTime = 1294438893;
|
|
||||||
rsLocaltime(&tm, &curTime);
|
|
||||||
|
|
||||||
_RS_ASSERT(tm.tm_sec == 33);
|
|
||||||
_RS_ASSERT(tm.tm_min == 21);
|
|
||||||
_RS_ASSERT(tm.tm_hour == 14);
|
|
||||||
_RS_ASSERT(tm.tm_mday == 7);
|
|
||||||
_RS_ASSERT(tm.tm_mon == 0);
|
|
||||||
_RS_ASSERT(tm.tm_year == 111);
|
|
||||||
_RS_ASSERT(tm.tm_wday == 5);
|
|
||||||
_RS_ASSERT(tm.tm_yday == 6);
|
|
||||||
_RS_ASSERT(tm.tm_isdst == 0);
|
|
||||||
|
|
||||||
return failed;
|
|
||||||
}
|
|
||||||
|
|
||||||
void test_rstime(uint32_t index, int test_num) {
|
|
||||||
bool failed = false;
|
|
||||||
failed |= basic_test(index);
|
|
||||||
|
|
||||||
if (failed) {
|
|
||||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
|
||||||
rsDebug("rstime_test FAILED", -1);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
|
||||||
rsDebug("rstime_test PASSED", 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
#include "shared.rsh"
|
|
||||||
#include "rs_graphics.rsh"
|
|
||||||
|
|
||||||
rs_element elementTest;
|
|
||||||
rs_type typeTest;
|
|
||||||
rs_allocation allocationTest;
|
|
||||||
rs_sampler samplerTest;
|
|
||||||
rs_script scriptTest;
|
|
||||||
rs_mesh meshTest;
|
|
||||||
rs_program_fragment program_fragmentTest;
|
|
||||||
rs_program_vertex program_vertexTest;
|
|
||||||
rs_program_raster program_rasterTest;
|
|
||||||
rs_program_store program_storeTest;
|
|
||||||
rs_font fontTest;
|
|
||||||
|
|
||||||
rs_matrix4x4 matrix4x4Test;
|
|
||||||
rs_matrix3x3 matrix3x3Test;
|
|
||||||
rs_matrix2x2 matrix2x2Test;
|
|
||||||
|
|
||||||
struct my_struct {
|
|
||||||
int i;
|
|
||||||
rs_font fontTestStruct;
|
|
||||||
};
|
|
||||||
|
|
||||||
static bool basic_test(uint32_t index) {
|
|
||||||
bool failed = false;
|
|
||||||
|
|
||||||
rs_matrix4x4 matrix4x4TestLocal;
|
|
||||||
rs_matrix3x3 matrix3x3TestLocal;
|
|
||||||
rs_matrix2x2 matrix2x2TestLocal;
|
|
||||||
|
|
||||||
// This test focuses primarily on compilation-time, not run-time.
|
|
||||||
rs_element elementTestLocal;
|
|
||||||
rs_type typeTestLocal;
|
|
||||||
rs_allocation allocationTestLocal;
|
|
||||||
rs_sampler samplerTestLocal;
|
|
||||||
rs_script scriptTestLocal;
|
|
||||||
rs_mesh meshTestLocal;
|
|
||||||
rs_program_fragment program_fragmentTestLocal;
|
|
||||||
rs_program_vertex program_vertexTestLocal;
|
|
||||||
rs_program_raster program_rasterTestLocal;
|
|
||||||
rs_program_store program_storeTestLocal;
|
|
||||||
rs_font fontTestLocal;
|
|
||||||
|
|
||||||
rs_font fontTestLocalArray[4];
|
|
||||||
|
|
||||||
rs_font fontTestLocalPreInit = fontTest;
|
|
||||||
|
|
||||||
struct my_struct structTest;
|
|
||||||
|
|
||||||
rsSetObject(&fontTestLocal, fontTest);
|
|
||||||
//allocationTestLocal = allocationTest;
|
|
||||||
|
|
||||||
rsSetObject(&fontTest, fontTestLocal);
|
|
||||||
//allocationTest = allocationTestLocal;
|
|
||||||
|
|
||||||
/*for (int i = 0; i < 4; i++) {
|
|
||||||
rsSetObject(&fontTestLocalArray[i], fontTestLocal);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
/*rsSetObject(&fontTest, fontTestLocalArray[3]);*/
|
|
||||||
|
|
||||||
return failed;
|
|
||||||
}
|
|
||||||
|
|
||||||
void test_rstypes(uint32_t index, int test_num) {
|
|
||||||
bool failed = false;
|
|
||||||
failed |= basic_test(index);
|
|
||||||
|
|
||||||
if (failed) {
|
|
||||||
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
|
||||||
rsDebug("rstypes_test FAILED", -1);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
|
||||||
rsDebug("rstypes_test PASSED", 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
#pragma version(1)
|
|
||||||
|
|
||||||
#pragma rs java_package_name(com.android.rs.test)
|
|
||||||
|
|
||||||
typedef struct TestResult_s {
|
|
||||||
rs_allocation name;
|
|
||||||
bool pass;
|
|
||||||
float score;
|
|
||||||
int64_t time;
|
|
||||||
} TestResult;
|
|
||||||
//TestResult *g_results;
|
|
||||||
|
|
||||||
static int64_t g_time;
|
|
||||||
|
|
||||||
static void start(void) {
|
|
||||||
g_time = rsUptimeMillis();
|
|
||||||
}
|
|
||||||
|
|
||||||
static float end(uint32_t idx) {
|
|
||||||
int64_t t = rsUptimeMillis() - g_time;
|
|
||||||
//g_results[idx].time = t;
|
|
||||||
//rsDebug("test time", (int)t);
|
|
||||||
return ((float)t) / 1000.f;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define _RS_ASSERT(b) \
|
|
||||||
do { \
|
|
||||||
if (!(b)) { \
|
|
||||||
failed = true; \
|
|
||||||
rsDebug(#b " FAILED", 0); \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* These constants must match those in UnitTest.java */
|
|
||||||
static const int RS_MSG_TEST_PASSED = 100;
|
|
||||||
static const int RS_MSG_TEST_FAILED = 101;
|
|
||||||
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
// Fountain test script
|
|
||||||
#pragma version(1)
|
|
||||||
|
|
||||||
#pragma rs java_package_name(com.android.rs.test)
|
|
||||||
|
|
||||||
#pragma stateFragment(parent)
|
|
||||||
|
|
||||||
#include "rs_graphics.rsh"
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct TestResult {
|
|
||||||
rs_allocation name;
|
|
||||||
bool pass;
|
|
||||||
float score;
|
|
||||||
} TestResult_t;
|
|
||||||
TestResult_t *results;
|
|
||||||
|
|
||||||
int root() {
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user