Merge "Move compute tests from frameworks/base to frameworks/rs" into jb-mr2-dev

This commit is contained in:
Jason Sams
2013-03-19 20:47:22 +00:00
committed by Android (Google) Code Review
455 changed files with 0 additions and 34915 deletions

View File

@@ -1,26 +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.
#
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := tests
LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src)
LOCAL_PACKAGE_NAME := RsBalls
include $(BUILD_PACKAGE)

View File

@@ -1,16 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.rs.balls">
<uses-sdk android:minSdkVersion="14" />
<application
android:label="RsBalls"
android:icon="@drawable/test_pattern">
<activity android:name="Balls"
android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

View File

@@ -1 +0,0 @@
<p>A brute force physics simulation that renders many balls onto the screen and moves them according to user touch and gravity.</p>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 413 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 307 B

View File

@@ -1,118 +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.example.android.rs.balls;
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.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.ListView;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
public class Balls extends Activity implements SensorEventListener {
//EventListener mListener = new EventListener();
private static final String LOG_TAG = "libRS_jni";
private static final boolean DEBUG = false;
private static final boolean LOG_ENABLED = false;
private BallsView mView;
private SensorManager mSensorManager;
// get the current looper (from your Activity UI thread for instance
public void onSensorChanged(SensorEvent event) {
//android.util.Log.d("rs", "sensor: " + event.sensor + ", x: " + event.values[0] + ", y: " + event.values[1] + ", z: " + event.values[2]);
synchronized (this) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
if(mView != null) {
mView.setAccel(event.values[0], event.values[1], event.values[2]);
}
}
}
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
// Create our Preview view and set it as the content of our
// Activity
mView = new BallsView(this);
setContentView(mView);
}
@Override
protected void onResume() {
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_FASTEST);
// 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() {
super.onPause();
mView.pause();
onStop();
}
@Override
protected void onStop() {
mSensorManager.unregisterListener(this);
super.onStop();
}
static void log(String message) {
if (LOG_ENABLED) {
Log.v(LOG_TAG, message);
}
}
}

View File

@@ -1,151 +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.example.android.rs.balls;
import android.content.res.Resources;
import android.renderscript.*;
import android.util.Log;
public class BallsRS {
public static final int PART_COUNT = 4000;
public BallsRS() {
}
private Resources mRes;
private RenderScriptGL mRS;
private ScriptC_balls mScript;
private ScriptC_ball_physics mPhysicsScript;
private ProgramFragment mPFPoints;
private ScriptField_Point mPoints;
private ScriptField_VpConsts mVpConsts;
private ScriptField_BallGrid mGrid;
private ScriptField_Ball mBalls;
private Allocation mGridCache;
void updateProjectionMatrices() {
mVpConsts = new ScriptField_VpConsts(mRS, 1,
Allocation.USAGE_SCRIPT |
Allocation.USAGE_GRAPHICS_CONSTANTS);
ScriptField_VpConsts.Item i = new ScriptField_VpConsts.Item();
Matrix4f mvp = new Matrix4f();
mvp.loadOrtho(0, mRS.getWidth(), mRS.getHeight(), 0, -1, 1);
i.MVP = mvp;
mVpConsts.set(i, 0, true);
}
private void createProgramVertex() {
updateProjectionMatrices();
ProgramVertex.Builder sb = new ProgramVertex.Builder(mRS);
String t = "varying vec4 varColor;\n" +
"void main() {\n" +
" vec4 pos = vec4(0.0, 0.0, 0.0, 1.0);\n" +
" pos.xy = ATTRIB_position;\n" +
" gl_Position = UNI_MVP * pos;\n" +
" varColor = ATTRIB_color;\n" +
" gl_PointSize = 12.0;\n" +
"}\n";
sb.setShader(t);
sb.addConstant(mVpConsts.getType());
sb.addInput(mPoints.getElement());
ProgramVertex pvs = sb.create();
pvs.bindConstants(mVpConsts.getAllocation(), 0);
mRS.bindProgramVertex(pvs);
}
private Allocation loadTexture(int id) {
final Allocation allocation =
Allocation.createFromBitmapResource(mRS, mRes,
id, Allocation.MipmapControl.MIPMAP_NONE,
Allocation.USAGE_GRAPHICS_TEXTURE);
return allocation;
}
ProgramStore BLEND_ADD_DEPTH_NONE(RenderScript rs) {
ProgramStore.Builder builder = new ProgramStore.Builder(rs);
builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
builder.setBlendFunc(ProgramStore.BlendSrcFunc.ONE, ProgramStore.BlendDstFunc.ONE);
builder.setDitherEnabled(false);
builder.setDepthMaskEnabled(false);
return builder.create();
}
private void createPF(int width, int height) {
ProgramFragmentFixedFunction.Builder pfb = new ProgramFragmentFixedFunction.Builder(mRS);
pfb.setPointSpriteTexCoordinateReplacement(true);
pfb.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.MODULATE,
ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
pfb.setVaryingColor(true);
mPFPoints = pfb.create();
}
public void init(RenderScriptGL rs, Resources res, int width, int height) {
mRS = rs;
mRes = res;
createPF(width, height);
mPFPoints.bindTexture(loadTexture(R.drawable.flares), 0);
mPoints = new ScriptField_Point(mRS, PART_COUNT, Allocation.USAGE_SCRIPT);
Mesh.AllocationBuilder smb = new Mesh.AllocationBuilder(mRS);
smb.addVertexAllocation(mPoints.getAllocation());
smb.addIndexSetType(Mesh.Primitive.POINT);
Mesh smP = smb.create();
mGrid = ScriptField_BallGrid.create2D(mRS, (width + 99) / 100, (height + 99) / 100);
mGridCache = Allocation.createSized(mRS, Element.F32_2(mRS), PART_COUNT);
mBalls = new ScriptField_Ball(mRS, PART_COUNT, Allocation.USAGE_SCRIPT);
mPhysicsScript = new ScriptC_ball_physics(mRS);
mPhysicsScript.set_gGridCache(mGridCache);
mPhysicsScript.set_gBalls(mBalls.getAllocation());
mScript = new ScriptC_balls(mRS);
mScript.set_partMesh(smP);
mScript.set_physics_script(mPhysicsScript);
mScript.bind_point(mPoints);
mScript.bind_balls(mBalls);
mScript.set_gGrid(mGrid.getAllocation());
mScript.bind_gGridCache(mGridCache);
mScript.set_gPFPoints(mPFPoints);
createProgramVertex();
mRS.bindProgramStore(BLEND_ADD_DEPTH_NONE(mRS));
mPhysicsScript.set_gMinPos(new Float2(5, 5));
mPhysicsScript.set_gMaxPos(new Float2(width - 5, height - 5));
mPhysicsScript.set_gGrid(mGrid.getAllocation());
mScript.invoke_initParts(width, height);
mRS.bindRootScript(mScript);
}
public void newTouchPosition(float x, float y, float pressure, int id) {
mPhysicsScript.invoke_touch(x, y, pressure * mRS.getWidth() / 1280, id);
}
public void setAccel(float x, float y) {
mPhysicsScript.set_gGravityVector(new Float2(x, y));
}
}

View File

@@ -1,116 +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.example.android.rs.balls;
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 BallsView extends RSSurfaceView {
public BallsView(Context context) {
super(context);
//setFocusable(true);
}
private RenderScriptGL mRS;
private BallsRS 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 BallsRS();
mRender.init(mRS, getResources(), w, h);
}
mRender.updateProjectionMatrices();
}
@Override
protected void onDetachedFromWindow() {
if(mRS != null) {
mRS = null;
destroyRenderScriptGL();
}
}
@Override
public boolean onTouchEvent(MotionEvent ev)
{
int act = ev.getActionMasked();
if (act == ev.ACTION_UP) {
mRender.newTouchPosition(0, 0, 0, ev.getPointerId(0));
return false;
} else if (act == MotionEvent.ACTION_POINTER_UP) {
// only one pointer going up, we can get the index like this
int pointerIndex = ev.getActionIndex();
int pointerId = ev.getPointerId(pointerIndex);
mRender.newTouchPosition(0, 0, 0, pointerId);
return false;
}
int count = ev.getHistorySize();
int pcount = ev.getPointerCount();
for (int p=0; p < pcount; p++) {
int id = ev.getPointerId(p);
mRender.newTouchPosition(ev.getX(p),
ev.getY(p),
ev.getPressure(p),
id);
for (int i=0; i < count; i++) {
mRender.newTouchPosition(ev.getHistoricalX(p, i),
ev.getHistoricalY(p, i),
ev.getHistoricalPressure(p, i),
id);
}
}
return true;
}
void setAccel(float x, float y, float z) {
if ((mRender == null) || (mRS == null)) {
return;
}
mRender.setAccel(x, -y);
}
}

View File

@@ -1,155 +0,0 @@
#pragma version(1)
#pragma rs java_package_name(com.example.android.rs.balls)
#include "balls.rsh"
float2 gGravityVector = {0.f, 9.8f};
float2 gMinPos = {0.f, 0.f};
float2 gMaxPos = {1280.f, 700.f};
static float2 touchPos[10];
static float touchPressure[10];
static const float gDT = 1.f / 30.f;
rs_allocation gGrid;
rs_allocation gGridCache;
rs_allocation gBalls;
float gScale = 1.f;
void touch(float x, float y, float pressure, int id) {
if (id >= 10) {
return;
}
touchPos[id].x = x;
touchPos[id].y = y;
touchPressure[id] = pressure;
}
void root(Ball_t *ball, uint32_t x) {
float2 fv = 0;
float pressure = 0;
float2 pos = ball->position;
int2 gridPos[9];
gridPos[0] = convert_int2((ball->position / 100.f) /*- 0.4999f*/);
gridPos[1] = (int2){gridPos[0].x - 1, gridPos[0].y - 1};
gridPos[2] = (int2){gridPos[0].x + 0, gridPos[0].y - 1};
gridPos[3] = (int2){gridPos[0].x + 1, gridPos[0].y - 1};
gridPos[4] = (int2){gridPos[0].x - 1, gridPos[0].y};
gridPos[5] = (int2){gridPos[0].x + 1, gridPos[0].y};
gridPos[6] = (int2){gridPos[0].x - 1, gridPos[0].y + 1};
gridPos[7] = (int2){gridPos[0].x + 0, gridPos[0].y + 1};
gridPos[8] = (int2){gridPos[0].x + 1, gridPos[0].y + 1};
for (int gct=0; gct < 9; gct++) {
if ((gridPos[gct].x >= rsAllocationGetDimX(gGrid)) ||
(gridPos[gct].x < 0) ||
(gridPos[gct].y >= rsAllocationGetDimY(gGrid)) ||
(gridPos[gct].y < 0)) {
continue;
}
//rsDebug("grid ", gridPos[gct]);
const BallGrid_t *bg = (const BallGrid_t *)rsGetElementAt(gGrid, gridPos[gct].x, gridPos[gct].y);
for (int cidx = 0; cidx < bg->count; cidx++) {
float2 bcptr = rsGetElementAt_float2(gGridCache, bg->cacheIdx + cidx);
float2 vec = bcptr - pos;
float2 vec2 = vec * vec;
float len2 = vec2.x + vec2.y;
if ((len2 < 10000.f) && (len2 > 0.f)) {
float t = native_powr(len2, 1.5f) + 16.0f;
float2 pfv = (vec / t) * 16000.f;
pressure += length(pfv);
fv -= pfv;
}
}
}
//fv /= ball->size * ball->size * ball->size;
fv -= gGravityVector * 4.f * gScale;
fv *= gDT;
for (int i=0; i < 10; i++) {
if (touchPressure[i] > 0.1f) {
float2 vec = touchPos[i] - ball->position;
float2 vec2 = vec * vec;
float len2 = max(2.f, vec2.x + vec2.y);
float2 pfv = (vec / len2) * touchPressure[i] * 500.f * gScale;
pressure += length(pfv);
fv -= pfv;
}
}
ball->delta = (ball->delta * (1.f - 0.008f)) + fv;
ball->position = ball->position + (ball->delta * gDT);
const float wallForce = 400.f * gScale;
if (ball->position.x > (gMaxPos.x - 20.f)) {
float d = gMaxPos.x - ball->position.x;
if (d < 0.f) {
if (ball->delta.x > 0) {
ball->delta.x *= -0.7f;
}
ball->position.x = gMaxPos.x - 1.f;
} else {
ball->delta.x -= min(wallForce / (d * d), 10.f);
}
}
if (ball->position.x < (gMinPos.x + 20.f)) {
float d = ball->position.x - gMinPos.x;
if (d < 0.f) {
if (ball->delta.x < 0) {
ball->delta.x *= -0.7f;
}
ball->position.x = gMinPos.x + 1.f;
} else {
ball->delta.x += min(wallForce / (d * d), 10.f);
}
}
if (ball->position.y > (gMaxPos.y - 20.f)) {
float d = gMaxPos.y - ball->position.y;
if (d < 0.f) {
if (ball->delta.y > 0) {
ball->delta.y *= -0.7f;
}
ball->position.y = gMaxPos.y - 1.f;
} else {
ball->delta.y -= min(wallForce / (d * d), 10.f);
}
}
if (ball->position.y < (gMinPos.y + 20.f)) {
float d = ball->position.y - gMinPos.y;
if (d < 0.f) {
if (ball->delta.y < 0) {
ball->delta.y *= -0.7f;
}
ball->position.y = gMinPos.y + 1.f;
} else {
ball->delta.y += min(wallForce / (d * d * d), 10.f);
}
}
// low pressure ~500, high ~2500
pressure = max(pressure - 400.f, 0.f);
ball->pressure = pressure;
//rsDebug("p ", pressure);
float4 color = 1.f;
color.r = pow(pressure, 0.25f) / 12.f;
color.b = 1.f - color.r;
color.g = sin(pressure / 1500.f * 3.14f);
color.rgb = max(color.rgb, (float3)0);
color.rgb = normalize(color.rgb);
ball->color = rsPackColorTo8888(color);
//rsDebug("physics pos out", ball->position);
}

View File

@@ -1,106 +0,0 @@
#pragma version(1)
#pragma rs java_package_name(com.example.android.rs.balls)
#include "rs_graphics.rsh"
#include "balls.rsh"
#pragma stateVertex(parent)
#pragma stateStore(parent)
rs_program_fragment gPFPoints;
rs_mesh partMesh;
rs_allocation gGrid;
BallGrid_t *unused1;
float2 *gGridCache;
typedef struct __attribute__((packed, aligned(4))) Point {
float2 position;
uchar4 color;
} Point_t;
Point_t *point;
typedef struct VpConsts {
rs_matrix4x4 MVP;
} VpConsts_t;
VpConsts_t *vpConstants;
rs_script physics_script;
void initParts(int w, int h)
{
uint32_t dimX = rsAllocationGetDimX(rsGetAllocation(balls));
for (uint32_t ct=0; ct < dimX; ct++) {
balls[ct].position.x = rsRand(0.f, (float)w);
balls[ct].position.y = rsRand(0.f, (float)h);
balls[ct].delta.x = 0.f;
balls[ct].delta.y = 0.f;
}
}
int root() {
rsgClearColor(0.f, 0.f, 0.f, 1.f);
int2 gridDims = (int2){ rsAllocationGetDimX(gGrid),
rsAllocationGetDimY(gGrid) };
rs_allocation ain = rsGetAllocation(balls);
int32_t dimX = rsAllocationGetDimX(ain);
// Binning
// Clear the particle list
for (uint32_t ct=0; ct < dimX; ct++) {
balls[ct].next = -1;
}
// Clear the grid
for (uint32_t y=0; y < gridDims.y; y++) {
for (uint32_t x=0; x < gridDims.x; x++) {
BallGrid_t *bg = (BallGrid_t *)rsGetElementAt(gGrid, x, y);
bg->count = 0;
bg->idx = -1;
}
}
// Create the particle list per grid
for (uint32_t ct=0; ct < dimX; ct++) {
int2 p = convert_int2(balls[ct].position / 100.f);
p.x = rsClamp(p.x, 0, (int)(gridDims.x-1));
p.y = rsClamp(p.y, 0, (int)(gridDims.y-1));
BallGrid_t *bg = (BallGrid_t *)rsGetElementAt(gGrid, p.x, p.y);
bg->count ++;
balls[ct].next = bg->idx;
bg->idx = ct;
}
// Create the sorted grid cache
uint32_t gridIdx = 0;
for (uint32_t y=0; y < gridDims.y; y++) {
for (uint32_t x=0; x < gridDims.x; x++) {
BallGrid_t *bg = (BallGrid_t *)rsGetElementAt(gGrid, x, y);
bg->cacheIdx = gridIdx;
int idx = bg->idx;
while (idx >= 0) {
const Ball_t * bPtr = &balls[idx];
gGridCache[gridIdx++] = bPtr->position;
idx = bPtr->next;
}
}
}
rsForEach(physics_script, ain, ain);
for (uint32_t ct=0; ct < dimX; ct++) {
point[ct].position = balls[ct].position;
point[ct].color = balls[ct].color;
}
rsgBindProgramFragment(gPFPoints);
rsgDrawMesh(partMesh);
return 1;
}

View File

@@ -1,19 +0,0 @@
typedef struct __attribute__((packed, aligned(4))) Ball {
float2 delta;
float2 position;
uchar4 color;
float pressure;
//float size;
int32_t next;
//int arcID;
//float arcStr;
} Ball_t;
Ball_t *balls;
typedef struct BallGrid {
int32_t idx;
int32_t count;
int32_t cacheIdx;
} BallGrid_t;

View File

@@ -1,27 +0,0 @@
#
# Copyright (C) 2012 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := tests
LOCAL_SRC_FILES := $(call all-java-files-under, src) \
$(call all-renderscript-files-under, src)
LOCAL_PACKAGE_NAME := RsComputeBenchmark
include $(BUILD_PACKAGE)

View File

@@ -1,30 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2012 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.rs.computebench">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-sdk android:minSdkVersion="17" />
<application android:label="_RS_Compute_Bench">
<activity android:name="ComputeBench">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

View File

@@ -1,31 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2012 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/displayin"
android:layout_width="320dip"
android:layout_height="266dip" />
<ImageView
android:id="@+id/displayout"
android:layout_width="320dip"
android:layout_height="266dip" />
</LinearLayout>

View File

@@ -1,39 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.android.rs.computebench;
import android.content.Context;
import android.content.res.Resources;
import android.renderscript.*;
public class Benchmark implements Runnable {
private final RenderScript mRS;
private ScriptC_compute_benchmark mScript;
public Benchmark(RenderScript rs, Resources res) {
mRS = rs;
mScript = new ScriptC_compute_benchmark(mRS, res, R.raw.compute_benchmark);
}
public void run() {
long t = java.lang.System.currentTimeMillis();
mScript.invoke_bench();
mRS.finish();
t = java.lang.System.currentTimeMillis() - t;
android.util.Log.v("ComputeBench", "Total benchmark took " + t + " ms");
}
}

View File

@@ -1,37 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.android.rs.computebench;
import android.app.Activity;
import android.os.Bundle;
import android.renderscript.RenderScript;
public class ComputeBench extends Activity {
private RenderScript mRS;
private Benchmark mBenchmark;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mRS = RenderScript.create(this);
mBenchmark = new Benchmark(mRS, getResources());
mBenchmark.run();
}
}

View File

@@ -1,407 +0,0 @@
// Copyright (C) 2012 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#pragma version(1)
#pragma rs java_package_name(com.example.android.rs.computebench)
// Test configuration (accessible from Java)
uint priming_runs = 1000000;
uint timing_runs = 5000000;
// Reused variables
static volatile int64_t bench_time;
static float inv_timing_runs;
#define DECL_VAR_SET(prefix) \
static volatile float prefix##_f_1 = 1; \
static volatile float2 prefix##_f_2 = 1; \
static volatile float3 prefix##_f_3 = 1; \
static volatile float4 prefix##_f_4 = 1; \
static volatile char prefix##_c_1 = 1; \
static volatile char2 prefix##_c_2 = 1; \
static volatile char3 prefix##_c_3 = 1; \
static volatile char4 prefix##_c_4 = 1; \
static volatile uchar prefix##_uc_1 = 1; \
static volatile uchar2 prefix##_uc_2 = 1; \
static volatile uchar3 prefix##_uc_3 = 1; \
static volatile uchar4 prefix##_uc_4 = 1; \
static volatile short prefix##_s_1 = 1; \
static volatile short2 prefix##_s_2 = 1; \
static volatile short3 prefix##_s_3 = 1; \
static volatile short4 prefix##_s_4 = 1; \
static volatile ushort prefix##_us_1 = 1; \
static volatile ushort2 prefix##_us_2 = 1; \
static volatile ushort3 prefix##_us_3 = 1; \
static volatile ushort4 prefix##_us_4 = 1; \
static volatile int prefix##_i_1 = 1; \
static volatile int2 prefix##_i_2 = 1; \
static volatile int3 prefix##_i_3 = 1; \
static volatile int4 prefix##_i_4 = 1; \
static volatile uint prefix##_ui_1 = 1; \
static volatile uint2 prefix##_ui_2 = 1; \
static volatile uint3 prefix##_ui_3 = 1; \
static volatile uint4 prefix##_ui_4 = 1; \
static volatile long prefix##_l_1 = 1; \
static volatile long2 prefix##_l_2 = 1; \
static volatile long3 prefix##_l_3 = 1; \
static volatile long4 prefix##_l_4 = 1; \
static volatile ulong prefix##_ul_1 = 1; \
static volatile ulong2 prefix##_ul_2 = 1; \
static volatile ulong3 prefix##_ul_3 = 1; \
static volatile ulong4 prefix##_ul_4 = 1; \
DECL_VAR_SET(res)
DECL_VAR_SET(src1)
DECL_VAR_SET(src2)
DECL_VAR_SET(src3)
// Testing macros
#define RUN_BENCH(line, op) \
for (int i = priming_runs - 1; i >= 0; --i) { \
line; \
} \
bench_time = rsUptimeMillis(); \
for (int i = timing_runs - 1; i >= 0; --i) { \
line; \
} \
bench_time = rsUptimeMillis() - bench_time; \
rsDebug(" " op " took ns", (float)bench_time * inv_timing_runs);
#define BENCH_BASIC_OP_TYPE(op, type) \
RUN_BENCH(res_##type##_1 = src1_##type##_1 op src2_##type##_1, #type "1 " #op " " #type "1") \
RUN_BENCH(res_##type##_2 = src1_##type##_2 op src2_##type##_2, #type "2 " #op " " #type "2") \
RUN_BENCH(res_##type##_3 = src1_##type##_3 op src2_##type##_3, #type "3 " #op " " #type "3") \
RUN_BENCH(res_##type##_4 = src1_##type##_4 op src2_##type##_4, #type "4 " #op " " #type "4") \
#define BENCH_BASIC_INT_OP(op) \
rsDebug("Testing basic operation " #op, 0); \
BENCH_BASIC_OP_TYPE(op, c) \
BENCH_BASIC_OP_TYPE(op, uc) \
BENCH_BASIC_OP_TYPE(op, s) \
BENCH_BASIC_OP_TYPE(op, us) \
BENCH_BASIC_OP_TYPE(op, i) \
BENCH_BASIC_OP_TYPE(op, ui) \
RUN_BENCH(res_l_1 = src1_l_1 op src2_l_1, "l1 " #op " l1") \
RUN_BENCH(res_ul_1 = src1_ul_1 op src2_ul_1, "ul1 " #op " ul1")
#define BENCH_BASIC_OP(op) \
BENCH_BASIC_INT_OP(op) \
BENCH_BASIC_OP_TYPE(op, f)
#define BENCH_CVT(to, from, type) \
rsDebug("Testing convert from " #from " to " #to, 0); \
RUN_BENCH(res_##to##_1 = (type)src1_##from##_1, "(" #to ")" #from) \
RUN_BENCH(res_##to##_2 = convert_##type##2(src1_##from##_2), #to "2 convert_" #type "2(" #from "2)") \
RUN_BENCH(res_##to##_3 = convert_##type##3(src1_##from##_3), #to "3 convert_" #type "3(" #from "3)") \
RUN_BENCH(res_##to##_4 = convert_##type##4(src1_##from##_4), #to "4 convert_" #type "4(" #from "4)")
#define BENCH_CVT_MATRIX(to, type) \
BENCH_CVT(to, c, type); \
BENCH_CVT(to, uc, type); \
BENCH_CVT(to, s, type); \
BENCH_CVT(to, us, type); \
BENCH_CVT(to, i, type); \
BENCH_CVT(to, ui, type); \
BENCH_CVT(to, f, type); \
#define BENCH_XN_FUNC_YN(typeout, fnc, typein) \
RUN_BENCH(res_##typeout##_1 = fnc(src1_##typein##_1);, #typeout "1 " #fnc "(" #typein "1)") \
RUN_BENCH(res_##typeout##_2 = fnc(src1_##typein##_2);, #typeout "2 " #fnc "(" #typein "2)") \
RUN_BENCH(res_##typeout##_3 = fnc(src1_##typein##_3);, #typeout "3 " #fnc "(" #typein "3)") \
RUN_BENCH(res_##typeout##_4 = fnc(src1_##typein##_4);, #typeout "4 " #fnc "(" #typein "4)")
#define BENCH_XN_FUNC_XN_XN(type, fnc) \
RUN_BENCH(res_##type##_1 = fnc(src1_##type##_1, src2_##type##_1), #type "1 " #fnc "(" #type "1, " #type "1)") \
RUN_BENCH(res_##type##_2 = fnc(src1_##type##_2, src2_##type##_2), #type "2 " #fnc "(" #type "2, " #type "2)") \
RUN_BENCH(res_##type##_3 = fnc(src1_##type##_3, src2_##type##_3), #type "3 " #fnc "(" #type "3, " #type "3)") \
RUN_BENCH(res_##type##_4 = fnc(src1_##type##_4, src2_##type##_4), #type "4 " #fnc "(" #type "4, " #type "4)") \
#define BENCH_X_FUNC_X_X_X(type, fnc) \
RUN_BENCH(res_##type##_1 = fnc(src1_##type##_1, src2_##type##_1, src3_##type##_1), #type "1 " #fnc "(" #type "1, " #type "1, " #type "1)")
#define BENCH_IN_FUNC_IN(fnc) \
rsDebug("Testing " #fnc, 0); \
BENCH_XN_FUNC_YN(uc, fnc, uc) \
BENCH_XN_FUNC_YN(c, fnc, c) \
BENCH_XN_FUNC_YN(us, fnc, us) \
BENCH_XN_FUNC_YN(s, fnc, s) \
BENCH_XN_FUNC_YN(ui, fnc, ui) \
BENCH_XN_FUNC_YN(i, fnc, i)
#define BENCH_UIN_FUNC_IN(fnc) \
rsDebug("Testing " #fnc, 0); \
BENCH_XN_FUNC_YN(uc, fnc, c) \
BENCH_XN_FUNC_YN(us, fnc, s) \
BENCH_XN_FUNC_YN(ui, fnc, i) \
#define BENCH_IN_FUNC_IN_IN(fnc) \
rsDebug("Testing " #fnc, 0); \
BENCH_XN_FUNC_XN_XN(uc, fnc) \
BENCH_XN_FUNC_XN_XN(c, fnc) \
BENCH_XN_FUNC_XN_XN(us, fnc) \
BENCH_XN_FUNC_XN_XN(s, fnc) \
BENCH_XN_FUNC_XN_XN(ui, fnc) \
BENCH_XN_FUNC_XN_XN(i, fnc)
#define BENCH_I_FUNC_I_I_I(fnc) \
rsDebug("Testing " #fnc, 0); \
BENCH_X_FUNC_X_X_X(uc, fnc) \
BENCH_X_FUNC_X_X_X(c, fnc) \
BENCH_X_FUNC_X_X_X(us, fnc) \
BENCH_X_FUNC_X_X_X(s, fnc) \
BENCH_X_FUNC_X_X_X(ui, fnc) \
BENCH_X_FUNC_X_X_X(i, fnc)
#define BENCH_FN_FUNC_FN(fnc) \
rsDebug("Testing " #fnc, 0); \
RUN_BENCH(res_f_1 = fnc(src1_f_1), "f1 " #fnc "(f1)") \
RUN_BENCH(res_f_2 = fnc(src1_f_2), "f2 " #fnc "(f2)") \
RUN_BENCH(res_f_3 = fnc(src1_f_3), "f3 " #fnc "(f3)") \
RUN_BENCH(res_f_4 = fnc(src1_f_4), "f4 " #fnc "(f4)")
#define BENCH_FN_FUNC_FN_PFN(fnc) \
rsDebug("Testing " #fnc, 0); \
RUN_BENCH(res_f_1 = fnc(src1_f_1, (float*) &src2_f_1), "f1 " #fnc "(f1, f1*)") \
RUN_BENCH(res_f_2 = fnc(src1_f_2, (float2*) &src2_f_2), "f2 " #fnc "(f2, f2*)") \
RUN_BENCH(res_f_3 = fnc(src1_f_3, (float3*) &src2_f_3), "f3 " #fnc "(f3, f3*)") \
RUN_BENCH(res_f_4 = fnc(src1_f_4, (float4*) &src2_f_4), "f4 " #fnc "(f4, f4*)")
#define BENCH_FN_FUNC_FN_FN(fnc) \
rsDebug("Testing " #fnc, 0); \
RUN_BENCH(res_f_1 = fnc(src1_f_1, src2_f_1), "f1 " #fnc "(f1, f1)") \
RUN_BENCH(res_f_2 = fnc(src1_f_2, src2_f_2), "f2 " #fnc "(f2, f2)") \
RUN_BENCH(res_f_3 = fnc(src1_f_3, src2_f_3), "f3 " #fnc "(f3, f3)") \
RUN_BENCH(res_f_4 = fnc(src1_f_4, src2_f_4), "f4 " #fnc "(f4, f4)")
#define BENCH_F34_FUNC_F34_F34(fnc) \
rsDebug("Testing " #fnc, 0); \
RUN_BENCH(res_f_3 = fnc(src1_f_3, src2_f_3), "f3 " #fnc "(f3, f3)") \
RUN_BENCH(res_f_4 = fnc(src1_f_4, src2_f_4), "f4 " #fnc "(f4, f4)")
#define BENCH_FN_FUNC_FN_F(fnc) \
rsDebug("Testing " #fnc, 0); \
RUN_BENCH(res_f_1 = fnc(src1_f_1, src2_f_1), "f1 " #fnc "(f1, f1)") \
RUN_BENCH(res_f_2 = fnc(src1_f_2, src2_f_1), "f2 " #fnc "(f2, f1)") \
RUN_BENCH(res_f_3 = fnc(src1_f_3, src2_f_1), "f3 " #fnc "(f3, f1)") \
RUN_BENCH(res_f_4 = fnc(src1_f_4, src2_f_1), "f4 " #fnc "(f4, f1)")
#define BENCH_F_FUNC_FN(fnc) \
rsDebug("Testing " #fnc, 0); \
RUN_BENCH(res_f_1 = fnc(src1_f_1), "f1 " #fnc "(f1)") \
RUN_BENCH(res_f_1 = fnc(src1_f_2), "f1 " #fnc "(f2)") \
RUN_BENCH(res_f_1 = fnc(src1_f_3), "f1 " #fnc "(f3)") \
RUN_BENCH(res_f_1 = fnc(src1_f_4), "f1 " #fnc "(f4)")
#define BENCH_F_FUNC_FN_FN(fnc) \
rsDebug("Testing " #fnc, 0); \
RUN_BENCH(res_f_1 = fnc(src1_f_1, src2_f_1), "f1 " #fnc "(f1, f1)") \
RUN_BENCH(res_f_1 = fnc(src1_f_2, src2_f_2), "f1 " #fnc "(f2, f2)") \
RUN_BENCH(res_f_1 = fnc(src1_f_3, src2_f_3), "f1 " #fnc "(f3, f3)") \
RUN_BENCH(res_f_1 = fnc(src1_f_4, src2_f_4), "f1 " #fnc "(f4, f4)")
#define BENCH_FN_FUNC_FN_IN(fnc) \
rsDebug("Testing " #fnc, 0); \
RUN_BENCH(res_f_1 = fnc(src1_f_1, src1_i_1), "f1 " #fnc "(f1, i1)") \
RUN_BENCH(res_f_2 = fnc(src1_f_2, src1_i_2), "f2 " #fnc "(f2, i2)") \
RUN_BENCH(res_f_3 = fnc(src1_f_3, src1_i_3), "f3 " #fnc "(f3, i3)") \
RUN_BENCH(res_f_4 = fnc(src1_f_4, src1_i_4), "f4 " #fnc "(f4, i4)")
#define BENCH_FN_FUNC_FN_I(fnc) \
rsDebug("Testing " #fnc, 0); \
RUN_BENCH(res_f_1 = fnc(src1_f_1, src1_i_1), "f1 " #fnc "(f1, i1)") \
RUN_BENCH(res_f_2 = fnc(src1_f_2, src1_i_1), "f2 " #fnc "(f2, i1)") \
RUN_BENCH(res_f_3 = fnc(src1_f_3, src1_i_1), "f3 " #fnc "(f3, i1)") \
RUN_BENCH(res_f_4 = fnc(src1_f_4, src1_i_1), "f4 " #fnc "(f4, i1)")
#define BENCH_FN_FUNC_FN_FN_FN(fnc) \
rsDebug("Testing " #fnc, 0); \
RUN_BENCH(res_f_1 = fnc(src1_f_1, src2_f_1, src3_f_1), "f1 " #fnc "(f1, f1, f1)") \
RUN_BENCH(res_f_2 = fnc(src1_f_2, src2_f_2, src3_f_2), "f2 " #fnc "(f2, f2, f2)") \
RUN_BENCH(res_f_3 = fnc(src1_f_3, src2_f_3, src3_f_3), "f3 " #fnc "(f3, f3, f3)") \
RUN_BENCH(res_f_4 = fnc(src1_f_4, src2_f_4, src3_f_4), "f4 " #fnc "(f4, f4, f4)")
#define BENCH_FN_FUNC_FN_FN_F(fnc) \
rsDebug("Testing " #fnc, 0); \
RUN_BENCH(res_f_1 = fnc(src1_f_1, src2_f_1, src3_f_1), "f1 " #fnc "(f1, f1, f1)") \
RUN_BENCH(res_f_2 = fnc(src1_f_2, src2_f_2, src3_f_1), "f2 " #fnc "(f2, f2, f1)") \
RUN_BENCH(res_f_3 = fnc(src1_f_3, src2_f_3, src3_f_1), "f3 " #fnc "(f3, f3, f1)") \
RUN_BENCH(res_f_4 = fnc(src1_f_4, src2_f_4, src3_f_1), "f4 " #fnc "(f4, f4, f1)")
#define BENCH_FN_FUNC_FN_PIN(fnc) \
rsDebug("Testing " #fnc, 0); \
RUN_BENCH(res_f_1 = fnc(src1_f_1, (int*) &src1_i_1), "f1 " #fnc "(f1, i1*)") \
RUN_BENCH(res_f_2 = fnc(src1_f_2, (int2*) &src1_i_2), "f2 " #fnc "(f2, i2*)") \
RUN_BENCH(res_f_3 = fnc(src1_f_3, (int3*) &src1_i_3), "f3 " #fnc "(f3, i3*)") \
RUN_BENCH(res_f_4 = fnc(src1_f_4, (int4*) &src1_i_4), "f4 " #fnc "(f4, i4*)")
#define BENCH_FN_FUNC_FN_FN_PIN(fnc) \
rsDebug("Testing " #fnc, 0); \
RUN_BENCH(res_f_1 = fnc(src1_f_1, src2_f_1, (int*) &src1_i_1), "f1 " #fnc "(f1, f1, i1*)") \
RUN_BENCH(res_f_2 = fnc(src1_f_2, src2_f_2, (int2*) &src1_i_2), "f2 " #fnc "(f2, f2, i2*)") \
RUN_BENCH(res_f_3 = fnc(src1_f_3, src2_f_3, (int3*) &src1_i_3), "f3 " #fnc "(f3, f3, i3*)") \
RUN_BENCH(res_f_4 = fnc(src1_f_4, src2_f_4, (int4*) &src1_i_4), "f4 " #fnc "(f4, f4, i4*)")
#define BENCH_IN_FUNC_FN(fnc) \
rsDebug("Testing " #fnc, 0); \
RUN_BENCH(res_i_1 = fnc(src1_f_1), "i1 " #fnc "(f1)") \
RUN_BENCH(res_i_2 = fnc(src1_f_2), "i2 " #fnc "(f2)") \
RUN_BENCH(res_i_3 = fnc(src1_f_3), "i3 " #fnc "(f3)") \
RUN_BENCH(res_i_4 = fnc(src1_f_4), "i4 " #fnc "(f4)")
// Testing functions
static void bench_basic_operators() {
int i = 0;
BENCH_BASIC_OP(+);
BENCH_BASIC_OP(-);
BENCH_BASIC_OP(*);
BENCH_BASIC_OP(/);
BENCH_BASIC_INT_OP(%);
BENCH_BASIC_INT_OP(<<);
BENCH_BASIC_INT_OP(>>);
}
static void bench_convert() {
BENCH_CVT_MATRIX(c, char);
BENCH_CVT_MATRIX(uc, uchar);
BENCH_CVT_MATRIX(s, short);
BENCH_CVT_MATRIX(us, ushort);
BENCH_CVT_MATRIX(i, int);
BENCH_CVT_MATRIX(ui, uint);
BENCH_CVT_MATRIX(f, float);
}
static void bench_int_math() {
BENCH_UIN_FUNC_IN(abs);
BENCH_IN_FUNC_IN(clz);
BENCH_IN_FUNC_IN_IN(min);
BENCH_IN_FUNC_IN_IN(max);
BENCH_I_FUNC_I_I_I(rsClamp);
}
static void bench_fp_math() {
BENCH_FN_FUNC_FN(acos);
BENCH_FN_FUNC_FN(acosh);
BENCH_FN_FUNC_FN(acospi);
BENCH_FN_FUNC_FN(asin);
BENCH_FN_FUNC_FN(asinh);
BENCH_FN_FUNC_FN(asinpi);
BENCH_FN_FUNC_FN(atan);
BENCH_FN_FUNC_FN_FN(atan2);
BENCH_FN_FUNC_FN(atanh);
BENCH_FN_FUNC_FN(atanpi);
BENCH_FN_FUNC_FN_FN(atan2pi);
BENCH_FN_FUNC_FN(cbrt);
BENCH_FN_FUNC_FN(ceil);
BENCH_FN_FUNC_FN_FN_FN(clamp);
BENCH_FN_FUNC_FN_FN_F(clamp);
BENCH_FN_FUNC_FN_FN(copysign);
BENCH_FN_FUNC_FN(cos);
BENCH_FN_FUNC_FN(cosh);
BENCH_FN_FUNC_FN(cospi);
BENCH_F34_FUNC_F34_F34(cross);
BENCH_FN_FUNC_FN(degrees);
BENCH_F_FUNC_FN_FN(distance);
BENCH_F_FUNC_FN_FN(dot);
BENCH_FN_FUNC_FN(erfc);
BENCH_FN_FUNC_FN(erf);
BENCH_FN_FUNC_FN(exp);
BENCH_FN_FUNC_FN(exp2);
BENCH_FN_FUNC_FN(exp10);
BENCH_FN_FUNC_FN(expm1);
BENCH_FN_FUNC_FN(fabs);
BENCH_FN_FUNC_FN_FN(fdim);
BENCH_FN_FUNC_FN(floor);
BENCH_FN_FUNC_FN_FN_FN(fma);
BENCH_FN_FUNC_FN_FN(fmax);
BENCH_FN_FUNC_FN_F(fmax);
BENCH_FN_FUNC_FN_FN(fmin);
BENCH_FN_FUNC_FN_F(fmin);
BENCH_FN_FUNC_FN_FN(fmod);
BENCH_FN_FUNC_FN_PFN(fract);
BENCH_FN_FUNC_FN_PIN(frexp);
BENCH_FN_FUNC_FN_FN(hypot);
BENCH_IN_FUNC_FN(ilogb);
BENCH_FN_FUNC_FN_IN(ldexp);
BENCH_FN_FUNC_FN_I(ldexp);
BENCH_F_FUNC_FN(length);
BENCH_FN_FUNC_FN(lgamma);
BENCH_FN_FUNC_FN_PIN(lgamma);
BENCH_FN_FUNC_FN(log);
BENCH_FN_FUNC_FN(log2);
BENCH_FN_FUNC_FN(log10);
BENCH_FN_FUNC_FN(log1p);
BENCH_FN_FUNC_FN(logb);
BENCH_FN_FUNC_FN_FN_FN(mad);
BENCH_FN_FUNC_FN_FN(max);
BENCH_FN_FUNC_FN_F(max);
BENCH_FN_FUNC_FN_FN(min);
BENCH_FN_FUNC_FN_F(min);
BENCH_FN_FUNC_FN_FN_FN(mix);
BENCH_FN_FUNC_FN_FN_F(mix);
BENCH_FN_FUNC_FN_PFN(modf);
BENCH_FN_FUNC_FN_FN(nextafter);
BENCH_FN_FUNC_FN(normalize);
BENCH_FN_FUNC_FN_FN(pow);
BENCH_FN_FUNC_FN_IN(pown);
BENCH_FN_FUNC_FN_FN(powr);
BENCH_FN_FUNC_FN(radians);
BENCH_FN_FUNC_FN_FN(remainder);
BENCH_FN_FUNC_FN_FN_PIN(remquo);
BENCH_FN_FUNC_FN(rint);
BENCH_FN_FUNC_FN_IN(rootn);
BENCH_FN_FUNC_FN(round);
BENCH_FN_FUNC_FN(rsqrt);
BENCH_FN_FUNC_FN(sign);
BENCH_FN_FUNC_FN(sin);
BENCH_FN_FUNC_FN_PFN(sincos);
BENCH_FN_FUNC_FN(sinh);
BENCH_FN_FUNC_FN(sinpi);
BENCH_FN_FUNC_FN(sqrt);
BENCH_FN_FUNC_FN_FN(step);
BENCH_FN_FUNC_FN_F(step);
BENCH_FN_FUNC_FN(tan);
BENCH_FN_FUNC_FN(tanh);
BENCH_FN_FUNC_FN(tanpi);
BENCH_FN_FUNC_FN(tgamma);
BENCH_FN_FUNC_FN(trunc);
}
static void bench_approx_math() {
BENCH_FN_FUNC_FN(half_recip);
BENCH_FN_FUNC_FN(half_sqrt);
BENCH_FN_FUNC_FN(half_rsqrt);
BENCH_FN_FUNC_FN(fast_length);
BENCH_FN_FUNC_FN_FN(fast_distance);
BENCH_FN_FUNC_FN(fast_normalize);
}
void bench() {
rsDebug("RS Compute Benchmark", 0);
rsDebug("Current configuration:", 0);
rsDebug("Priming runs", priming_runs);
rsDebug("Timing runs", timing_runs);
rsDebug("Beginning test", 0);
inv_timing_runs = 1000000.f / (float)timing_runs;
bench_basic_operators();
bench_convert();
bench_int_math();
bench_fp_math();
bench_approx_math();
}

View File

@@ -1,27 +0,0 @@
#
# Copyright (C) 2011 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := tests
LOCAL_SRC_FILES := $(call all-java-files-under, src) \
$(call all-renderscript-files-under, src)
LOCAL_PACKAGE_NAME := RsComputePerf
include $(BUILD_PACKAGE)

View File

@@ -1,30 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2011 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.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.rs.computeperf">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-sdk android:minSdkVersion="14" />
<application android:label="Compute Perf">
<activity android:name="ComputePerf">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

View File

@@ -1,31 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2011 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.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/displayin"
android:layout_width="320dip"
android:layout_height="266dip" />
<ImageView
android:id="@+id/displayout"
android:layout_width="320dip"
android:layout_height="266dip" />
</LinearLayout>

View File

@@ -1,62 +0,0 @@
/*
* Copyright (C) 2011-2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.android.rs.computeperf;
import android.app.Activity;
import android.os.Bundle;
import android.graphics.BitmapFactory;
import android.graphics.Bitmap;
import android.renderscript.RenderScript;
import android.renderscript.Allocation;
import android.util.Log;
import android.widget.ImageView;
public class ComputePerf extends Activity {
private LaunchTest mLT;
private Mandelbrot mMandel;
private RenderScript mRS;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final int numTries = 100;
long timesXLW = 0;
long timesXYW = 0;
mRS = RenderScript.create(this);
mLT = new LaunchTest(mRS, getResources());
mLT.XLW();
mLT.XYW();
for (int i = 0; i < numTries; i++) {
timesXLW += mLT.XLW();
timesXYW += mLT.XYW();
}
timesXLW /= numTries;
timesXYW /= numTries;
// XLW and XYW running times should match pretty closely
Log.v("ComputePerf", "xlw launch test " + timesXLW + "ms");
Log.v("ComputePerf", "xyw launch test " + timesXYW + "ms");
mMandel = new Mandelbrot(mRS, getResources());
mMandel.run();
}
}

View File

@@ -1,58 +0,0 @@
/*
* Copyright (C) 2011-2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.android.rs.computeperf;
import android.content.res.Resources;
import android.renderscript.*;
public class LaunchTest {
private RenderScript mRS;
private Allocation mAllocationX;
private Allocation mAllocationXY;
private ScriptC_launchtestxlw mScript_xlw;
private ScriptC_launchtestxyw mScript_xyw;
LaunchTest(RenderScript rs, Resources res) {
mRS = rs;
mScript_xlw = new ScriptC_launchtestxlw(mRS, res, R.raw.launchtestxlw);
mScript_xyw = new ScriptC_launchtestxyw(mRS, res, R.raw.launchtestxyw);
final int dim = mScript_xlw.get_dim();
mAllocationX = Allocation.createSized(rs, Element.U8(rs), dim);
Type.Builder tb = new Type.Builder(rs, Element.U8(rs));
tb.setX(dim);
tb.setY(dim);
mAllocationXY = Allocation.createTyped(rs, tb.create());
mScript_xlw.bind_buf(mAllocationXY);
}
public long XLW() {
long t = java.lang.System.currentTimeMillis();
mScript_xlw.forEach_root(mAllocationX);
mRS.finish();
t = java.lang.System.currentTimeMillis() - t;
return t;
}
public long XYW() {
long t = java.lang.System.currentTimeMillis();
mScript_xyw.forEach_root(mAllocationXY);
mRS.finish();
t = java.lang.System.currentTimeMillis() - t;
return t;
}
}

View File

@@ -1,45 +0,0 @@
/*
* Copyright (C) 2011 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.example.android.rs.computeperf;
import android.content.res.Resources;
import android.renderscript.*;
public class Mandelbrot implements Runnable {
private RenderScript mRS;
private Allocation mAllocationXY;
private ScriptC_mandelbrot mScript;
Mandelbrot(RenderScript rs, Resources res) {
mRS = rs;
mScript = new ScriptC_mandelbrot(mRS, res, R.raw.mandelbrot);
Type.Builder tb = new Type.Builder(rs, Element.U8_4(rs));
tb.setX(mScript.get_gDimX());
tb.setY(mScript.get_gDimY());
mAllocationXY = Allocation.createTyped(rs, tb.create());
}
public void run() {
long t = java.lang.System.currentTimeMillis();
mScript.forEach_root(mAllocationXY);
mRS.finish();
t = java.lang.System.currentTimeMillis() - t;
android.util.Log.v("ComputePerf", "mandelbrot ms " + t);
}
}

View File

@@ -1,30 +0,0 @@
/*
* Copyright (C) 2011 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.example.android.rs.computeperf)
const int dim = 2048;
uint8_t *buf;
void root(uchar *v_out, uint32_t x) {
uint8_t *p = buf;
p += x * dim;
for (int i=0; i<dim; i++) {
p[i] = 1;
}
}

View File

@@ -1,23 +0,0 @@
/*
* Copyright (C) 2011 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.example.android.rs.computeperf)
void root(uchar *v_out, uint32_t x, uint32_t y) {
*v_out = 0;
}

View File

@@ -1,43 +0,0 @@
// Copyright (C) 2011 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.example.android.rs.computeperf)
const int gMaxIteration = 500;
const int gDimX = 1024;
const int gDimY = 1024;
void root(uchar4 *v_out, uint32_t x, uint32_t y) {
float2 p;
p.x = -2.5f + ((float)x / gDimX) * 3.5f;
p.y = -1.f + ((float)y / gDimY) * 2.f;
float2 t = 0;
float2 t2 = t * t;
int iteration = 0;
while((t2.x + t2.y < 4.f) && (iteration < gMaxIteration)) {
float xtemp = t2.x - t2.y + p.x;
t.y = 2 * t.x * t.y + p.y;
t.x = xtemp;
iteration++;
t2 = t * t;
}
if(iteration >= gMaxIteration) {
*v_out = 0;
} else {
*v_out = (uchar4){iteration & 0xff, (iteration >> 6) & 0xff, 0x8f, 0xff};
}
}

View File

@@ -1,30 +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.
#
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := tests
LOCAL_JAVA_LIBRARIES := android.test.runner
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)

View File

@@ -1,22 +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="17" />
<application android:label="Image Processing"
android:hardwareAccelerated="true">
<uses-library android:name="android.test.runner" />
<activity android:name="ImageProcessingActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<instrumentation android:name=".ImageProcessingTestRunner"
android:targetPackage="com.android.rs.image"
android:label="Test runner for Image Processing Benchmark Test"
/>
</manifest>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

View File

@@ -1,139 +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.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/toplevel">
<SurfaceView
android:id="@+id/surface"
android:layout_width="1dip"
android:layout_height="1dip" />
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:id="@+id/display"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/benchmark"
android:onClick="benchmark"/>
<TextView
android:id="@+id/benchmarkText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="8pt"
android:text="@string/saturation"/>
</LinearLayout>
<Spinner
android:id="@+id/filterselection"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<Spinner
android:id="@+id/spinner1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/slider1Text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="8pt"
android:layout_marginLeft="10sp"
android:layout_marginTop="15sp"
android:text="@string/saturation"/>
<SeekBar
android:id="@+id/slider1"
android:layout_marginLeft="10sp"
android:layout_marginRight="10sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/slider2Text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="8pt"
android:layout_marginLeft="10sp"
android:layout_marginTop="15sp"
android:text="@string/gamma"/>
<SeekBar
android:id="@+id/slider2"
android:layout_marginLeft="10sp"
android:layout_marginRight="10sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/slider3Text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10sp"
android:layout_marginTop="15sp"
android:textSize="8pt"
android:text="@string/out_white"/>
<SeekBar
android:id="@+id/slider3"
android:layout_marginLeft="10sp"
android:layout_marginRight="10sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/slider4Text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="8pt"
android:layout_marginLeft="10sp"
android:layout_marginTop="15sp"
android:text="@string/in_white"/>
<SeekBar
android:id="@+id/slider4"
android:layout_marginLeft="10sp"
android:layout_marginRight="10sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/slider5Text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="8pt"
android:layout_marginLeft="10sp"
android:layout_marginTop="15sp"
android:text="@string/in_white"/>
<SeekBar
android:id="@+id/slider5"
android:layout_marginLeft="10sp"
android:layout_marginRight="10sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/benchmark_all"
android:onClick="benchmark_all"/>
</LinearLayout>
</ScrollView>
</LinearLayout>

View File

@@ -1,23 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2012 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dp"
android:textSize="16sp"
/>

View File

@@ -1,34 +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>
<string name="benchmark_all">Benchmark All</string>
</resources>

View File

@@ -1,34 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.rs.image;
import java.lang.Math;
public class BWFilter extends TestBase {
private ScriptC_bwfilter mScript;
public void createTest(android.content.res.Resources res) {
mScript = new ScriptC_bwfilter(mRS);
}
public void runTest() {
mScript.invoke_prepareBwFilter(50, 50, 50);
mScript.forEach_bwFilterKernel(mInPixelsAllocation, mOutPixelsAllocation);
}
}

View File

@@ -1,178 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.rs.image;
import java.lang.Math;
import java.lang.Short;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.Matrix4f;
import android.renderscript.RenderScript;
import android.renderscript.Script;
import android.renderscript.ScriptC;
import android.renderscript.ScriptGroup;
import android.renderscript.ScriptIntrinsicBlend;
import android.renderscript.Type;
import android.util.Log;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.view.View;
import android.widget.Spinner;
public class Blend extends TestBase {
private ScriptIntrinsicBlend mBlend;
private ScriptC_blend mBlendHelper;
private short image1Alpha = 128;
private short image2Alpha = 128;
String mIntrinsicNames[];
private Allocation image1;
private Allocation image2;
private int currentIntrinsic = 0;
private AdapterView.OnItemSelectedListener mIntrinsicSpinnerListener =
new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
currentIntrinsic = pos;
if (mRS != null) {
runTest();
act.updateDisplay();
}
}
public void onNothingSelected(AdapterView parent) {
}
};
public void createTest(android.content.res.Resources res) {
mBlend = ScriptIntrinsicBlend.create(mRS, Element.U8_4(mRS));
mBlendHelper = new ScriptC_blend(mRS);
mBlendHelper.set_alpha((short)128);
image1 = Allocation.createTyped(mRS, mInPixelsAllocation.getType());
image2 = Allocation.createTyped(mRS, mInPixelsAllocation2.getType());
mIntrinsicNames = new String[14];
mIntrinsicNames[0] = "Source";
mIntrinsicNames[1] = "Destination";
mIntrinsicNames[2] = "Source Over";
mIntrinsicNames[3] = "Destination Over";
mIntrinsicNames[4] = "Source In";
mIntrinsicNames[5] = "Destination In";
mIntrinsicNames[6] = "Source Out";
mIntrinsicNames[7] = "Destination Out";
mIntrinsicNames[8] = "Source Atop";
mIntrinsicNames[9] = "Destination Atop";
mIntrinsicNames[10] = "XOR";
mIntrinsicNames[11] = "Add";
mIntrinsicNames[12] = "Subtract";
mIntrinsicNames[13] = "Multiply";
}
public boolean onSpinner1Setup(Spinner s) {
s.setAdapter(new ArrayAdapter<String>(
act, R.layout.spinner_layout, mIntrinsicNames));
s.setOnItemSelectedListener(mIntrinsicSpinnerListener);
return true;
}
public boolean onBar1Setup(SeekBar b, TextView t) {
t.setText("Image 1 Alpha");
b.setMax(255);
b.setProgress(image1Alpha);
return true;
}
public void onBar1Changed(int progress) {
image1Alpha = (short)progress;
}
public boolean onBar2Setup(SeekBar b, TextView t) {
t.setText("Image 2 Alpha");
b.setMax(255);
b.setProgress(image2Alpha);
return true;
}
public void onBar2Changed(int progress) {
image2Alpha = (short)progress;
}
public void runTest() {
image1.copy2DRangeFrom(0, 0, mInPixelsAllocation.getType().getX(), mInPixelsAllocation.getType().getY(), mInPixelsAllocation, 0, 0);
image2.copy2DRangeFrom(0, 0, mInPixelsAllocation2.getType().getX(), mInPixelsAllocation2.getType().getY(), mInPixelsAllocation2, 0, 0);
mBlendHelper.set_alpha(image1Alpha);
mBlendHelper.forEach_setImageAlpha(image1);
mBlendHelper.set_alpha(image2Alpha);
mBlendHelper.forEach_setImageAlpha(image2);
switch (currentIntrinsic) {
case 0:
mBlend.forEachSrc(image1, image2);
break;
case 1:
mBlend.forEachDst(image1, image2);
break;
case 2:
mBlend.forEachSrcOver(image1, image2);
break;
case 3:
mBlend.forEachDstOver(image1, image2);
break;
case 4:
mBlend.forEachSrcIn(image1, image2);
break;
case 5:
mBlend.forEachDstIn(image1, image2);
break;
case 6:
mBlend.forEachSrcOut(image1, image2);
break;
case 7:
mBlend.forEachDstOut(image1, image2);
break;
case 8:
mBlend.forEachSrcAtop(image1, image2);
break;
case 9:
mBlend.forEachDstAtop(image1, image2);
break;
case 10:
mBlend.forEachXor(image1, image2);
break;
case 11:
mBlend.forEachAdd(image1, image2);
break;
case 12:
mBlend.forEachSubtract(image1, image2);
break;
case 13:
mBlend.forEachMultiply(image1, image2);
break;
}
mOutPixelsAllocation.copy2DRangeFrom(0, 0, image2.getType().getX(), image2.getType().getY(), image2, 0, 0);
}
}

View File

@@ -1,118 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.rs.image;
import java.lang.Math;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.ScriptIntrinsicBlur;
import android.renderscript.Type;
import android.util.Log;
import android.widget.SeekBar;
import android.widget.TextView;
public class Blur25 extends TestBase {
private boolean mUseIntrinsic = false;
private ScriptIntrinsicBlur mIntrinsic;
private int MAX_RADIUS = 25;
private ScriptC_threshold mScript;
private float mRadius = MAX_RADIUS;
private float mSaturation = 1.0f;
private Allocation mScratchPixelsAllocation1;
private Allocation mScratchPixelsAllocation2;
public Blur25(boolean useIntrinsic) {
mUseIntrinsic = useIntrinsic;
}
public boolean onBar1Setup(SeekBar b, TextView t) {
t.setText("Radius");
b.setProgress(100);
return true;
}
public void onBar1Changed(int progress) {
mRadius = ((float)progress) / 100.0f * MAX_RADIUS;
if (mRadius <= 0.10f) {
mRadius = 0.10f;
}
if (mUseIntrinsic) {
mIntrinsic.setRadius(mRadius);
} else {
mScript.invoke_setRadius((int)mRadius);
}
}
public void createTest(android.content.res.Resources res) {
int width = mInPixelsAllocation.getType().getX();
int height = mInPixelsAllocation.getType().getY();
if (mUseIntrinsic) {
mIntrinsic = ScriptIntrinsicBlur.create(mRS, Element.U8_4(mRS));
mIntrinsic.setRadius(MAX_RADIUS);
mIntrinsic.setInput(mInPixelsAllocation);
} else {
Type.Builder tb = new Type.Builder(mRS, Element.F32_4(mRS));
tb.setX(width);
tb.setY(height);
mScratchPixelsAllocation1 = Allocation.createTyped(mRS, tb.create());
mScratchPixelsAllocation2 = Allocation.createTyped(mRS, tb.create());
mScript = new ScriptC_threshold(mRS, res, R.raw.threshold);
mScript.set_width(width);
mScript.set_height(height);
mScript.invoke_setRadius(MAX_RADIUS);
mScript.set_InPixel(mInPixelsAllocation);
mScript.set_ScratchPixel1(mScratchPixelsAllocation1);
mScript.set_ScratchPixel2(mScratchPixelsAllocation2);
}
}
public void runTest() {
if (mUseIntrinsic) {
mIntrinsic.forEach(mOutPixelsAllocation);
} else {
mScript.forEach_copyIn(mInPixelsAllocation, mScratchPixelsAllocation1);
mScript.forEach_horz(mScratchPixelsAllocation2);
mScript.forEach_vert(mOutPixelsAllocation);
}
}
public void setupBenchmark() {
if (mUseIntrinsic) {
mIntrinsic.setRadius(MAX_RADIUS);
} else {
mScript.invoke_setRadius(MAX_RADIUS);
}
}
public void exitBenchmark() {
if (mUseIntrinsic) {
mIntrinsic.setRadius(mRadius);
} else {
mScript.invoke_setRadius((int)mRadius);
}
}
}

View File

@@ -1,97 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.rs.image;
import java.lang.Math;
import android.graphics.Bitmap;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.ScriptIntrinsicBlur;
import android.renderscript.Type;
import android.util.Log;
import android.widget.SeekBar;
import android.widget.TextView;
public class Blur25G extends TestBase {
private final int MAX_RADIUS = 25;
private float mRadius = MAX_RADIUS;
private ScriptIntrinsicBlur mIntrinsic;
private ScriptC_greyscale mScript;
private Allocation mScratchPixelsAllocation1;
private Allocation mScratchPixelsAllocation2;
public Blur25G() {
}
public boolean onBar1Setup(SeekBar b, TextView t) {
t.setText("Radius");
b.setProgress(100);
return true;
}
public void onBar1Changed(int progress) {
mRadius = ((float)progress) / 100.0f * MAX_RADIUS;
if (mRadius <= 0.10f) {
mRadius = 0.10f;
}
mIntrinsic.setRadius(mRadius);
}
public void createTest(android.content.res.Resources res) {
int width = mInPixelsAllocation.getType().getX();
int height = mInPixelsAllocation.getType().getY();
Type.Builder tb = new Type.Builder(mRS, Element.U8(mRS));
tb.setX(width);
tb.setY(height);
mScratchPixelsAllocation1 = Allocation.createTyped(mRS, tb.create());
mScratchPixelsAllocation2 = Allocation.createTyped(mRS, tb.create());
mScript = new ScriptC_greyscale(mRS);
mScript.forEach_toU8(mInPixelsAllocation, mScratchPixelsAllocation1);
mIntrinsic = ScriptIntrinsicBlur.create(mRS, Element.U8(mRS));
mIntrinsic.setRadius(MAX_RADIUS);
mIntrinsic.setInput(mScratchPixelsAllocation1);
}
public void runTest() {
mIntrinsic.forEach(mScratchPixelsAllocation2);
}
public void setupBenchmark() {
mIntrinsic.setRadius(MAX_RADIUS);
}
public void exitBenchmark() {
mIntrinsic.setRadius(mRadius);
}
public void updateBitmap(Bitmap b) {
mScript.forEach_toU8_4(mScratchPixelsAllocation2, mOutPixelsAllocation);
mOutPixelsAllocation.copyTo(b);
}
}

View File

@@ -1,88 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.rs.image;
import java.lang.Math;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.Matrix4f;
import android.renderscript.RenderScript;
import android.renderscript.Script;
import android.renderscript.ScriptC;
import android.renderscript.ScriptGroup;
import android.renderscript.ScriptIntrinsic3DLUT;
import android.renderscript.ScriptIntrinsicColorMatrix;
import android.renderscript.Type;
import android.util.Log;
public class ColorCube extends TestBase {
private Allocation mCube;
private ScriptC_colorcube mScript;
private ScriptIntrinsic3DLUT mIntrinsic;
private boolean mUseIntrinsic;
public ColorCube(boolean useIntrinsic) {
mUseIntrinsic = useIntrinsic;
}
private void initCube() {
final int sx = 32;
final int sy = 32;
final int sz = 16;
Type.Builder tb = new Type.Builder(mRS, Element.U8_4(mRS));
tb.setX(sx);
tb.setY(sy);
tb.setZ(sz);
Type t = tb.create();
mCube = Allocation.createTyped(mRS, t);
int dat[] = new int[sx * sy * sz];
for (int z = 0; z < sz; z++) {
for (int y = 0; y < sy; y++) {
for (int x = 0; x < sx; x++ ) {
int v = 0xff000000;
v |= (0xff * x / (sx - 1));
v |= (0xff * y / (sy - 1)) << 8;
v |= (0xff * z / (sz - 1)) << 16;
dat[z*sy*sx + y*sx + x] = v;
}
}
}
mCube.copyFromUnchecked(dat);
}
public void createTest(android.content.res.Resources res) {
mScript = new ScriptC_colorcube(mRS, res, R.raw.colorcube);
mIntrinsic = ScriptIntrinsic3DLUT.create(mRS, Element.U8_4(mRS));
initCube();
mScript.invoke_setCube(mCube);
mIntrinsic.setLUT(mCube);
}
public void runTest() {
if (mUseIntrinsic) {
mIntrinsic.forEach(mInPixelsAllocation, mOutPixelsAllocation);
} else {
mScript.forEach_root(mInPixelsAllocation, mOutPixelsAllocation);
}
}
}

View File

@@ -1,70 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.rs.image;
import java.lang.Math;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.Matrix4f;
import android.renderscript.RenderScript;
import android.renderscript.Script;
import android.renderscript.ScriptC;
import android.renderscript.ScriptGroup;
import android.renderscript.ScriptIntrinsicColorMatrix;
import android.renderscript.Type;
import android.util.Log;
public class ColorMatrix extends TestBase {
private ScriptC_colormatrix mScript;
private ScriptIntrinsicColorMatrix mIntrinsic;
private boolean mUseIntrinsic;
private boolean mUseGrey;
public ColorMatrix(boolean useIntrinsic, boolean useGrey) {
mUseIntrinsic = useIntrinsic;
mUseGrey = useGrey;
}
public void createTest(android.content.res.Resources res) {
Matrix4f m = new Matrix4f();
m.set(1, 0, 0.2f);
m.set(1, 1, 0.9f);
m.set(1, 2, 0.2f);
if (mUseIntrinsic) {
mIntrinsic = ScriptIntrinsicColorMatrix.create(mRS, Element.U8_4(mRS));
if (mUseGrey) {
mIntrinsic.setGreyscale();
} else {
mIntrinsic.setColorMatrix(m);
}
} else {
mScript = new ScriptC_colormatrix(mRS, res, R.raw.colormatrix);
mScript.invoke_setMatrix(m);
}
}
public void runTest() {
if (mUseIntrinsic) {
mIntrinsic.forEach(mInPixelsAllocation, mOutPixelsAllocation);
} else {
mScript.forEach_root(mInPixelsAllocation, mOutPixelsAllocation);
}
}
}

View File

@@ -1,35 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.rs.image;
import java.lang.Math;
import android.renderscript.Allocation;
public class Contrast extends TestBase {
private ScriptC_contrast mScript;
public void createTest(android.content.res.Resources res) {
mScript = new ScriptC_contrast(mRS);
}
public void runTest() {
mScript.invoke_setBright(50.f);
mScript.forEach_contrast(mInPixelsAllocation, mOutPixelsAllocation);
}
}

View File

@@ -1,74 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.rs.image;
import java.lang.Math;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.Matrix4f;
import android.renderscript.RenderScript;
import android.renderscript.Script;
import android.renderscript.ScriptC;
import android.renderscript.ScriptGroup;
import android.renderscript.ScriptIntrinsicConvolve3x3;
import android.renderscript.Type;
import android.util.Log;
public class Convolve3x3 extends TestBase {
private ScriptC_convolve3x3 mScript;
private ScriptIntrinsicConvolve3x3 mIntrinsic;
private int mWidth;
private int mHeight;
private boolean mUseIntrinsic;
public Convolve3x3(boolean useIntrinsic) {
mUseIntrinsic = useIntrinsic;
}
public void createTest(android.content.res.Resources res) {
mWidth = mInPixelsAllocation.getType().getX();
mHeight = mInPixelsAllocation.getType().getY();
float f[] = new float[9];
f[0] = 0.f; f[1] = -1.f; f[2] = 0.f;
f[3] = -1.f; f[4] = 5.f; f[5] = -1.f;
f[6] = 0.f; f[7] = -1.f; f[8] = 0.f;
if (mUseIntrinsic) {
mIntrinsic = ScriptIntrinsicConvolve3x3.create(mRS, Element.U8_4(mRS));
mIntrinsic.setCoefficients(f);
mIntrinsic.setInput(mInPixelsAllocation);
} else {
mScript = new ScriptC_convolve3x3(mRS, res, R.raw.convolve3x3);
mScript.set_gCoeffs(f);
mScript.set_gIn(mInPixelsAllocation);
mScript.set_gWidth(mWidth);
mScript.set_gHeight(mHeight);
}
}
public void runTest() {
if (mUseIntrinsic) {
mIntrinsic.forEach(mOutPixelsAllocation);
} else {
mScript.forEach_root(mOutPixelsAllocation);
}
}
}

View File

@@ -1,88 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.rs.image;
import java.lang.Math;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.Matrix4f;
import android.renderscript.RenderScript;
import android.renderscript.Script;
import android.renderscript.ScriptC;
import android.renderscript.ScriptGroup;
import android.renderscript.ScriptIntrinsicConvolve5x5;
import android.renderscript.Type;
import android.util.Log;
public class Convolve5x5 extends TestBase {
private ScriptC_convolve5x5 mScript;
private ScriptIntrinsicConvolve5x5 mIntrinsic;
private int mWidth;
private int mHeight;
private boolean mUseIntrinsic;
public Convolve5x5(boolean useIntrinsic) {
mUseIntrinsic = useIntrinsic;
}
public void createTest(android.content.res.Resources res) {
mWidth = mInPixelsAllocation.getType().getX();
mHeight = mInPixelsAllocation.getType().getY();
float f[] = new float[25];
//f[0] = 0.012f; f[1] = 0.025f; f[2] = 0.031f; f[3] = 0.025f; f[4] = 0.012f;
//f[5] = 0.025f; f[6] = 0.057f; f[7] = 0.075f; f[8] = 0.057f; f[9] = 0.025f;
//f[10]= 0.031f; f[11]= 0.075f; f[12]= 0.095f; f[13]= 0.075f; f[14]= 0.031f;
//f[15]= 0.025f; f[16]= 0.057f; f[17]= 0.075f; f[18]= 0.057f; f[19]= 0.025f;
//f[20]= 0.012f; f[21]= 0.025f; f[22]= 0.031f; f[23]= 0.025f; f[24]= 0.012f;
//f[0] = 1.f; f[1] = 2.f; f[2] = 0.f; f[3] = -2.f; f[4] = -1.f;
//f[5] = 4.f; f[6] = 8.f; f[7] = 0.f; f[8] = -8.f; f[9] = -4.f;
//f[10]= 6.f; f[11]=12.f; f[12]= 0.f; f[13]=-12.f; f[14]= -6.f;
//f[15]= 4.f; f[16]= 8.f; f[17]= 0.f; f[18]= -8.f; f[19]= -4.f;
//f[20]= 1.f; f[21]= 2.f; f[22]= 0.f; f[23]= -2.f; f[24]= -1.f;
f[0] = -1.f; f[1] = -3.f; f[2] = -4.f; f[3] = -3.f; f[4] = -1.f;
f[5] = -3.f; f[6] = 0.f; f[7] = 6.f; f[8] = 0.f; f[9] = -3.f;
f[10]= -4.f; f[11]= 6.f; f[12]= 20.f; f[13]= 6.f; f[14]= -4.f;
f[15]= -3.f; f[16]= 0.f; f[17]= 6.f; f[18]= 0.f; f[19]= -3.f;
f[20]= -1.f; f[21]= -3.f; f[22]= -4.f; f[23]= -3.f; f[24]= -1.f;
if (mUseIntrinsic) {
mIntrinsic = ScriptIntrinsicConvolve5x5.create(mRS, Element.U8_4(mRS));
mIntrinsic.setCoefficients(f);
mIntrinsic.setInput(mInPixelsAllocation);
} else {
mScript = new ScriptC_convolve5x5(mRS, res, R.raw.convolve5x5);
mScript.set_gCoeffs(f);
mScript.set_gIn(mInPixelsAllocation);
mScript.set_gWidth(mWidth);
mScript.set_gHeight(mHeight);
}
}
public void runTest() {
if (mUseIntrinsic) {
mIntrinsic.forEach(mOutPixelsAllocation);
} else {
mScript.forEach_root(mOutPixelsAllocation);
}
}
}

View File

@@ -1,40 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.rs.image;
import java.lang.Math;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.Script;
import android.renderscript.ScriptC;
import android.renderscript.Type;
import android.util.Log;
public class Copy extends TestBase {
private ScriptC_copy mScript;
public void createTest(android.content.res.Resources res) {
mScript = new ScriptC_copy(mRS, res, R.raw.copy);
}
public void runTest() {
mScript.forEach_root(mInPixelsAllocation, mOutPixelsAllocation);
}
}

View File

@@ -1,63 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.rs.image;
import java.lang.Math;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.ScriptIntrinsicLUT;
import android.util.Log;
public class CrossProcess extends TestBase {
private ScriptIntrinsicLUT mIntrinsic;
public void createTest(android.content.res.Resources res) {
mIntrinsic = ScriptIntrinsicLUT.create(mRS, Element.U8_4(mRS));
for (int ct=0; ct < 256; ct++) {
float f = ((float)ct) / 255.f;
float r = f;
if (r < 0.5f) {
r = 4.0f * r * r * r;
} else {
r = 1.0f - r;
r = 1.0f - (4.0f * r * r * r);
}
mIntrinsic.setRed(ct, (int)(r * 255.f + 0.5f));
float g = f;
if (g < 0.5f) {
g = 2.0f * g * g;
} else {
g = 1.0f - g;
g = 1.0f - (2.0f * g * g);
}
mIntrinsic.setGreen(ct, (int)(g * 255.f + 0.5f));
float b = f * 0.5f + 0.25f;
mIntrinsic.setBlue(ct, (int)(b * 255.f + 0.5f));
}
}
public void runTest() {
mIntrinsic.forEach(mInPixelsAllocation, mOutPixelsAllocation);
}
}

View File

@@ -1,35 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.rs.image;
import java.lang.Math;
import android.renderscript.Allocation;
public class Exposure extends TestBase {
private ScriptC_exposure mScript;
public void createTest(android.content.res.Resources res) {
mScript = new ScriptC_exposure(mRS);
}
public void runTest() {
mScript.invoke_setBright(50.f);
mScript.forEach_exposure(mInPixelsAllocation, mOutPixelsAllocation);
}
}

View File

@@ -1,138 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.rs.image;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.Sampler;
import android.renderscript.Type;
import android.widget.SeekBar;
import android.widget.TextView;
public class Fisheye extends TestBase {
private ScriptC_fisheye_full mScript_full = null;
private ScriptC_fisheye_relaxed mScript_relaxed = null;
private ScriptC_fisheye_approx_full mScript_approx_full = null;
private ScriptC_fisheye_approx_relaxed mScript_approx_relaxed = null;
private final boolean approx;
private final boolean relaxed;
private float center_x = 0.5f;
private float center_y = 0.5f;
private float scale = 0.5f;
public Fisheye(boolean approx, boolean relaxed) {
this.approx = approx;
this.relaxed = relaxed;
}
public boolean onBar1Setup(SeekBar b, TextView t) {
t.setText("Scale");
b.setMax(100);
b.setProgress(25);
return true;
}
public boolean onBar2Setup(SeekBar b, TextView t) {
t.setText("Shift center X");
b.setMax(100);
b.setProgress(50);
return true;
}
public boolean onBar3Setup(SeekBar b, TextView t) {
t.setText("Shift center Y");
b.setMax(100);
b.setProgress(50);
return true;
}
public void onBar1Changed(int progress) {
scale = progress / 50.0f;
do_init();
}
public void onBar2Changed(int progress) {
center_x = progress / 100.0f;
do_init();
}
public void onBar3Changed(int progress) {
center_y = progress / 100.0f;
do_init();
}
private void do_init() {
if (approx) {
if (relaxed)
mScript_approx_relaxed.invoke_init_filter(
mInPixelsAllocation.getType().getX(),
mInPixelsAllocation.getType().getY(), center_x,
center_y, scale);
else
mScript_approx_full.invoke_init_filter(
mInPixelsAllocation.getType().getX(),
mInPixelsAllocation.getType().getY(), center_x,
center_y, scale);
} else if (relaxed)
mScript_relaxed.invoke_init_filter(
mInPixelsAllocation.getType().getX(),
mInPixelsAllocation.getType().getY(), center_x, center_y,
scale);
else
mScript_full.invoke_init_filter(
mInPixelsAllocation.getType().getX(),
mInPixelsAllocation.getType().getY(), center_x, center_y,
scale);
}
public void createTest(android.content.res.Resources res) {
if (approx) {
if (relaxed) {
mScript_approx_relaxed = new ScriptC_fisheye_approx_relaxed(mRS,
res, R.raw.fisheye_approx_relaxed);
mScript_approx_relaxed.set_in_alloc(mInPixelsAllocation);
mScript_approx_relaxed.set_sampler(Sampler.CLAMP_LINEAR(mRS));
} else {
mScript_approx_full = new ScriptC_fisheye_approx_full(mRS, res,
R.raw.fisheye_approx_full);
mScript_approx_full.set_in_alloc(mInPixelsAllocation);
mScript_approx_full.set_sampler(Sampler.CLAMP_LINEAR(mRS));
}
} else if (relaxed) {
mScript_relaxed = new ScriptC_fisheye_relaxed(mRS, res,
R.raw.fisheye_relaxed);
mScript_relaxed.set_in_alloc(mInPixelsAllocation);
mScript_relaxed.set_sampler(Sampler.CLAMP_LINEAR(mRS));
} else {
mScript_full = new ScriptC_fisheye_full(mRS, res,
R.raw.fisheye_full);
mScript_full.set_in_alloc(mInPixelsAllocation);
mScript_full.set_sampler(Sampler.CLAMP_LINEAR(mRS));
}
do_init();
}
public void runTest() {
if (approx) {
if (relaxed)
mScript_approx_relaxed.forEach_root(mOutPixelsAllocation);
else
mScript_approx_full.forEach_root(mOutPixelsAllocation);
} else if (relaxed)
mScript_relaxed.forEach_root(mOutPixelsAllocation);
else
mScript_full.forEach_root(mOutPixelsAllocation);
}
}

View File

@@ -1,94 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.rs.image;
import java.lang.Math;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.Script;
import android.renderscript.ScriptC;
import android.renderscript.Type;
import android.util.Log;
import android.widget.SeekBar;
import android.widget.TextView;
public class Grain extends TestBase {
private ScriptC_grain mScript;
private Allocation mNoise;
private Allocation mNoise2;
public boolean onBar1Setup(SeekBar b, TextView t) {
t.setText("Strength");
b.setProgress(50);
return true;
}
public void onBar1Changed(int progress) {
float s = progress / 100.0f;
mScript.set_gNoiseStrength(s);
}
private int findHighBit(int v) {
int bit = 0;
while (v > 1) {
bit++;
v >>= 1;
}
return bit;
}
public void createTest(android.content.res.Resources res) {
int width = mInPixelsAllocation.getType().getX();
int height = mInPixelsAllocation.getType().getY();
int noiseW = findHighBit(width);
int noiseH = findHighBit(height);
if (noiseW > 9) {
noiseW = 9;
}
if (noiseH > 9) {
noiseH = 9;
}
noiseW = 1 << noiseW;
noiseH = 1 << noiseH;
Type.Builder tb = new Type.Builder(mRS, Element.U8(mRS));
tb.setX(noiseW);
tb.setY(noiseH);
mNoise = Allocation.createTyped(mRS, tb.create());
mNoise2 = Allocation.createTyped(mRS, tb.create());
mScript = new ScriptC_grain(mRS, res, R.raw.grain);
mScript.set_gWMask(noiseW - 1);
mScript.set_gHMask(noiseH - 1);
mScript.set_gNoiseStrength(0.5f);
mScript.set_gBlendSource(mNoise);
mScript.set_gNoise(mNoise2);
}
public void runTest() {
mScript.forEach_genRand(mNoise);
mScript.forEach_blend9(mNoise2);
mScript.forEach_root(mInPixelsAllocation, mOutPixelsAllocation);
}
}

View File

@@ -1,40 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.rs.image;
import java.lang.Math;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.Script;
import android.renderscript.ScriptC;
import android.renderscript.Type;
import android.util.Log;
public class Greyscale extends TestBase {
private ScriptC_greyscale mScript;
public void createTest(android.content.res.Resources res) {
mScript = new ScriptC_greyscale(mRS, res, R.raw.greyscale);
}
public void runTest() {
mScript.forEach_root(mInPixelsAllocation, mOutPixelsAllocation);
}
}

View File

@@ -1,93 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.rs.image;
import java.lang.Math;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.ScriptIntrinsicConvolve3x3;
import android.renderscript.ScriptIntrinsicColorMatrix;
import android.renderscript.Type;
import android.renderscript.Matrix4f;
import android.renderscript.ScriptGroup;
import android.util.Log;
public class GroupTest extends TestBase {
private ScriptIntrinsicConvolve3x3 mConvolve;
private ScriptIntrinsicColorMatrix mMatrix;
private Allocation mScratchPixelsAllocation1;
private ScriptGroup mGroup;
private int mWidth;
private int mHeight;
private boolean mUseNative;
public GroupTest(boolean useNative) {
mUseNative = useNative;
}
public void createTest(android.content.res.Resources res) {
mWidth = mInPixelsAllocation.getType().getX();
mHeight = mInPixelsAllocation.getType().getY();
mConvolve = ScriptIntrinsicConvolve3x3.create(mRS, Element.U8_4(mRS));
mMatrix = ScriptIntrinsicColorMatrix.create(mRS, Element.U8_4(mRS));
float f[] = new float[9];
f[0] = 0.f; f[1] = -1.f; f[2] = 0.f;
f[3] = -1.f; f[4] = 5.f; f[5] = -1.f;
f[6] = 0.f; f[7] = -1.f; f[8] = 0.f;
mConvolve.setCoefficients(f);
Matrix4f m = new Matrix4f();
m.set(1, 0, 0.2f);
m.set(1, 1, 0.9f);
m.set(1, 2, 0.2f);
mMatrix.setColorMatrix(m);
Type.Builder tb = new Type.Builder(mRS, Element.U8_4(mRS));
tb.setX(mWidth);
tb.setY(mHeight);
Type connect = tb.create();
if (mUseNative) {
ScriptGroup.Builder b = new ScriptGroup.Builder(mRS);
b.addKernel(mConvolve.getKernelID());
b.addKernel(mMatrix.getKernelID());
b.addConnection(connect, mConvolve.getKernelID(), mMatrix.getKernelID());
mGroup = b.create();
} else {
mScratchPixelsAllocation1 = Allocation.createTyped(mRS, connect);
}
}
public void runTest() {
mConvolve.setInput(mInPixelsAllocation);
if (mUseNative) {
mGroup.setOutput(mMatrix.getKernelID(), mOutPixelsAllocation);
mGroup.execute();
} else {
mConvolve.forEach(mScratchPixelsAllocation1);
mMatrix.forEach(mScratchPixelsAllocation1, mOutPixelsAllocation);
}
}
}

View File

@@ -1,557 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.rs.image;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.graphics.BitmapFactory;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.view.SurfaceView;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.Spinner;
import android.widget.TextView;
import android.view.View;
import android.util.Log;
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.os.Environment;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class ImageProcessingActivity extends Activity
implements SeekBar.OnSeekBarChangeListener {
private final String TAG = "Img";
public final String RESULT_FILE = "image_processing_result.csv";
RenderScript mRS;
Allocation mInPixelsAllocation;
Allocation mInPixelsAllocation2;
Allocation mOutPixelsAllocation;
/**
* Define enum type for test names
*/
public enum TestName {
// totally there are 38 test cases
LEVELS_VEC3_RELAXED ("Levels Vec3 Relaxed"),
LEVELS_VEC4_RELAXED ("Levels Vec4 Relaxed"),
LEVELS_VEC3_FULL ("Levels Vec3 Full"),
LEVELS_VEC4_FULL ("Levels Vec4 Full"),
BLUR_RADIUS_25 ("Blur radius 25"),
INTRINSIC_BLUE_RADIUS_25 ("Intrinsic Blur radius 25"),
GREYSCALE ("Greyscale"),
GRAIN ("Grain"),
FISHEYE_FULL ("Fisheye Full"),
FISHEYE_RELAXED ("Fisheye Relaxed"),
FISHEYE_APPROXIMATE_FULL ("Fisheye Approximate Full"),
FISHEYE_APPROXIMATE_RELAXED ("Fisheye Approximate Relaxed"),
VIGNETTE_FULL ("Vignette Full"),
VIGNETTE_RELAXED ("Vignette Relaxed"),
VIGNETTE_APPROXIMATE_FULL ("Vignette Approximate Full"),
VIGNETTE_APPROXIMATE_RELAXED ("Vignette Approximate Relaxed"),
GROUP_TEST_EMULATED ("Group Test (emulated)"),
GROUP_TEST_NATIVE ("Group Test (native)"),
CONVOLVE_3X3 ("Convolve 3x3"),
INTRINSICS_CONVOLVE_3X3 ("Intrinsics Convolve 3x3"),
COLOR_MATRIX ("ColorMatrix"),
INTRINSICS_COLOR_MATRIX ("Intrinsics ColorMatrix"),
INTRINSICS_COLOR_MATRIX_GREY ("Intrinsics ColorMatrix Grey"),
COPY ("Copy"),
CROSS_PROCESS_USING_LUT ("CrossProcess (using LUT)"),
CONVOLVE_5X5 ("Convolve 5x5"),
INTRINSICS_CONVOLVE_5X5 ("Intrinsics Convolve 5x5"),
MANDELBROT ("Mandelbrot"),
INTRINSICS_BLEND ("Intrinsics Blend"),
INTRINSICS_BLUR_25G ("Intrinsics Blur 25 uchar"),
VIBRANCE ("Vibrance"),
BW_FILTER ("BW Filter"),
SHADOWS ("Shadows"),
CONTRAST ("Contrast"),
EXPOSURE ("Exposure"),
WHITE_BALANCE ("White Balance"),
COLOR_CUBE ("Color Cube"),
COLOR_CUBE_3D_INTRINSIC ("Color Cube (3D LUT intrinsic)"),
USAGE_IO ("Usage io)");
private final String name;
private TestName(String s) {
name = s;
}
// return quoted string as displayed test name
public String toString() {
return name;
}
}
Bitmap mBitmapIn;
Bitmap mBitmapIn2;
Bitmap mBitmapOut;
private Spinner mSpinner;
private SeekBar mBar1;
private SeekBar mBar2;
private SeekBar mBar3;
private SeekBar mBar4;
private SeekBar mBar5;
private TextView mText1;
private TextView mText2;
private TextView mText3;
private TextView mText4;
private TextView mText5;
private float mSaturation = 1.0f;
private TextView mBenchmarkResult;
private Spinner mTestSpinner;
private SurfaceView mSurfaceView;
private ImageView mDisplayView;
private boolean mDoingBenchmark;
private TestBase mTest;
private int mRunCount;
public void updateDisplay() {
mHandler.sendMessage(Message.obtain());
}
private Handler mHandler = new Handler() {
// Allow the filter to complete without blocking the UI
// thread. When the message arrives that the op is complete
// we will either mark completion or start a new filter if
// more work is ready. Either way, display the result.
@Override
public void handleMessage(Message msg) {
boolean doTest = false;
synchronized(this) {
if (mRS == null) {
return;
}
mTest.updateBitmap(mBitmapOut);
mDisplayView.invalidate();
if (mRunCount > 0) {
mRunCount--;
if (mRunCount > 0) {
doTest = true;
}
}
if (doTest) {
mTest.runTestSendMessage();
}
}
}
};
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
if (seekBar == mBar1) {
mTest.onBar1Changed(progress);
} else if (seekBar == mBar2) {
mTest.onBar2Changed(progress);
} else if (seekBar == mBar3) {
mTest.onBar3Changed(progress);
} else if (seekBar == mBar4) {
mTest.onBar4Changed(progress);
} else if (seekBar == mBar5) {
mTest.onBar5Changed(progress);
}
boolean doTest = false;
synchronized(this) {
if (mRunCount == 0) {
doTest = true;
mRunCount = 1;
} else {
mRunCount = 2;
}
}
if (doTest) {
mTest.runTestSendMessage();
}
}
}
public void onStartTrackingTouch(SeekBar seekBar) {
}
public void onStopTrackingTouch(SeekBar seekBar) {
}
void setupBars() {
mSpinner.setVisibility(View.VISIBLE);
mTest.onSpinner1Setup(mSpinner);
mBar1.setVisibility(View.VISIBLE);
mText1.setVisibility(View.VISIBLE);
mTest.onBar1Setup(mBar1, mText1);
mBar2.setVisibility(View.VISIBLE);
mText2.setVisibility(View.VISIBLE);
mTest.onBar2Setup(mBar2, mText2);
mBar3.setVisibility(View.VISIBLE);
mText3.setVisibility(View.VISIBLE);
mTest.onBar3Setup(mBar3, mText3);
mBar4.setVisibility(View.VISIBLE);
mText4.setVisibility(View.VISIBLE);
mTest.onBar4Setup(mBar4, mText4);
mBar5.setVisibility(View.VISIBLE);
mText5.setVisibility(View.VISIBLE);
mTest.onBar5Setup(mBar5, mText5);
}
void changeTest(TestName testName) {
if (mTest != null) {
mTest.destroy();
}
switch(testName) {
case LEVELS_VEC3_RELAXED:
mTest = new LevelsV4(false, false);
break;
case LEVELS_VEC4_RELAXED:
mTest = new LevelsV4(false, true);
break;
case LEVELS_VEC3_FULL:
mTest = new LevelsV4(true, false);
break;
case LEVELS_VEC4_FULL:
mTest = new LevelsV4(true, true);
break;
case BLUR_RADIUS_25:
mTest = new Blur25(false);
break;
case INTRINSIC_BLUE_RADIUS_25:
mTest = new Blur25(true);
break;
case GREYSCALE:
mTest = new Greyscale();
break;
case GRAIN:
mTest = new Grain();
break;
case FISHEYE_FULL:
mTest = new Fisheye(false, false);
break;
case FISHEYE_RELAXED:
mTest = new Fisheye(false, true);
break;
case FISHEYE_APPROXIMATE_FULL:
mTest = new Fisheye(true, false);
break;
case FISHEYE_APPROXIMATE_RELAXED:
mTest = new Fisheye(true, true);
break;
case VIGNETTE_FULL:
mTest = new Vignette(false, false);
break;
case VIGNETTE_RELAXED:
mTest = new Vignette(false, true);
break;
case VIGNETTE_APPROXIMATE_FULL:
mTest = new Vignette(true, false);
break;
case VIGNETTE_APPROXIMATE_RELAXED:
mTest = new Vignette(true, true);
break;
case GROUP_TEST_EMULATED:
mTest = new GroupTest(false);
break;
case GROUP_TEST_NATIVE:
mTest = new GroupTest(true);
break;
case CONVOLVE_3X3:
mTest = new Convolve3x3(false);
break;
case INTRINSICS_CONVOLVE_3X3:
mTest = new Convolve3x3(true);
break;
case COLOR_MATRIX:
mTest = new ColorMatrix(false, false);
break;
case INTRINSICS_COLOR_MATRIX:
mTest = new ColorMatrix(true, false);
break;
case INTRINSICS_COLOR_MATRIX_GREY:
mTest = new ColorMatrix(true, true);
break;
case COPY:
mTest = new Copy();
break;
case CROSS_PROCESS_USING_LUT:
mTest = new CrossProcess();
break;
case CONVOLVE_5X5:
mTest = new Convolve5x5(false);
break;
case INTRINSICS_CONVOLVE_5X5:
mTest = new Convolve5x5(true);
break;
case MANDELBROT:
mTest = new Mandelbrot();
break;
case INTRINSICS_BLEND:
mTest = new Blend();
break;
case INTRINSICS_BLUR_25G:
mTest = new Blur25G();
break;
case VIBRANCE:
mTest = new Vibrance();
break;
case BW_FILTER:
mTest = new BWFilter();
break;
case SHADOWS:
mTest = new Shadows();
break;
case CONTRAST:
mTest = new Contrast();
break;
case EXPOSURE:
mTest = new Exposure();
break;
case WHITE_BALANCE:
mTest = new WhiteBalance();
break;
case COLOR_CUBE:
mTest = new ColorCube(false);
break;
case COLOR_CUBE_3D_INTRINSIC:
mTest = new ColorCube(true);
break;
case USAGE_IO:
mTest = new UsageIO();
break;
}
mTest.createBaseTest(this, mBitmapIn, mBitmapIn2, mBitmapOut);
setupBars();
mTest.runTest();
updateDisplay();
mBenchmarkResult.setText("Result: not run");
}
void setupTests() {
mTestSpinner.setAdapter(new ArrayAdapter<TestName>(
this, R.layout.spinner_layout, TestName.values()));
}
private AdapterView.OnItemSelectedListener mTestSpinnerListener =
new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
changeTest(TestName.values()[pos]);
}
public void onNothingSelected(AdapterView parent) {
}
};
void init() {
mBitmapIn = loadBitmap(R.drawable.img1600x1067);
mBitmapIn2 = loadBitmap(R.drawable.img1600x1067b);
mBitmapOut = Bitmap.createBitmap(mBitmapIn.getWidth(), mBitmapIn.getHeight(),
mBitmapIn.getConfig());
mSurfaceView = (SurfaceView) findViewById(R.id.surface);
mDisplayView = (ImageView) findViewById(R.id.display);
mDisplayView.setImageBitmap(mBitmapOut);
mSpinner = (Spinner) findViewById(R.id.spinner1);
mBar1 = (SeekBar) findViewById(R.id.slider1);
mBar2 = (SeekBar) findViewById(R.id.slider2);
mBar3 = (SeekBar) findViewById(R.id.slider3);
mBar4 = (SeekBar) findViewById(R.id.slider4);
mBar5 = (SeekBar) findViewById(R.id.slider5);
mBar1.setOnSeekBarChangeListener(this);
mBar2.setOnSeekBarChangeListener(this);
mBar3.setOnSeekBarChangeListener(this);
mBar4.setOnSeekBarChangeListener(this);
mBar5.setOnSeekBarChangeListener(this);
mText1 = (TextView) findViewById(R.id.slider1Text);
mText2 = (TextView) findViewById(R.id.slider2Text);
mText3 = (TextView) findViewById(R.id.slider3Text);
mText4 = (TextView) findViewById(R.id.slider4Text);
mText5 = (TextView) findViewById(R.id.slider5Text);
mTestSpinner = (Spinner) findViewById(R.id.filterselection);
mTestSpinner.setOnItemSelectedListener(mTestSpinnerListener);
mBenchmarkResult = (TextView) findViewById(R.id.benchmarkText);
mBenchmarkResult.setText("Result: not run");
mRS = RenderScript.create(this);
mInPixelsAllocation = Allocation.createFromBitmap(mRS, mBitmapIn);
mInPixelsAllocation2 = Allocation.createFromBitmap(mRS, mBitmapIn2);
mOutPixelsAllocation = Allocation.createFromBitmap(mRS, mBitmapOut);
setupTests();
changeTest(TestName.LEVELS_VEC3_RELAXED);
}
void cleanup() {
synchronized(this) {
RenderScript rs = mRS;
mRS = null;
while(mDoingBenchmark) {
try {
Thread.sleep(1, 0);
} catch(InterruptedException e) {
}
}
rs.destroy();
}
mInPixelsAllocation = null;
mInPixelsAllocation2 = null;
mOutPixelsAllocation = null;
mBitmapIn = null;
mBitmapIn2 = null;
mBitmapOut = null;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
}
@Override
protected void onPause() {
super.onPause();
cleanup();
}
@Override
protected void onResume() {
super.onResume();
init();
}
private Bitmap loadBitmap(int resource) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
return BitmapFactory.decodeResource(getResources(), resource, options);
}
// button hook
public void benchmark(View v) {
float t = getBenchmark();
//long javaTime = javaFilter();
//mBenchmarkResult.setText("RS: " + t + " ms Java: " + javaTime + " ms");
mBenchmarkResult.setText("Result: " + t + " ms");
Log.v(TAG, "getBenchmark: Renderscript frame time core ms " + t);
}
public void benchmark_all(View v) {
// write result into a file
File externalStorage = Environment.getExternalStorageDirectory();
if (!externalStorage.canWrite()) {
Log.v(TAG, "sdcard is not writable");
return;
}
File resultFile = new File(externalStorage, RESULT_FILE);
resultFile.setWritable(true, false);
try {
BufferedWriter rsWriter = new BufferedWriter(new FileWriter(resultFile));
Log.v(TAG, "Saved results in: " + resultFile.getAbsolutePath());
for (TestName tn: TestName.values()) {
changeTest(tn);
float t = getBenchmark();
String s = new String("" + tn.toString() + ", " + t);
rsWriter.write(s + "\n");
Log.v(TAG, "Test " + s + "ms\n");
}
rsWriter.close();
} catch (IOException e) {
Log.v(TAG, "Unable to write result file " + e.getMessage());
}
changeTest(TestName.LEVELS_VEC3_RELAXED);
}
// For benchmark test
public float getBenchmark() {
if (mRS == null) {
return 0;
}
mDoingBenchmark = true;
mTest.setupBenchmark();
long result = 0;
//Log.v(TAG, "Warming");
long t = java.lang.System.currentTimeMillis() + 250;
do {
mTest.runTest();
mTest.finish();
} while (t > java.lang.System.currentTimeMillis());
//Log.v(TAG, "Benchmarking");
int ct = 0;
t = java.lang.System.currentTimeMillis();
do {
mTest.runTest();
mTest.finish();
ct++;
} while ((t+1000) > java.lang.System.currentTimeMillis());
t = java.lang.System.currentTimeMillis() - t;
float ft = (float)t;
ft /= ct;
mTest.exitBenchmark();
mDoingBenchmark = false;
return ft;
}
}

View File

@@ -1,379 +0,0 @@
/*
* Copyright (C) 2011 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 com.android.rs.image.ImageProcessingTestRunner;
import android.os.Bundle;
import com.android.rs.image.ImageProcessingActivity.TestName;
import android.test.ActivityInstrumentationTestCase2;
import android.test.suitebuilder.annotation.LargeTest;
import android.util.Log;
/**
* ImageProcessing benchmark test.
* To run the test, please use command
*
* adb shell am instrument -e iteration <n> -w com.android.rs.image/.ImageProcessingTestRunner
*
*/
public class ImageProcessingTest extends ActivityInstrumentationTestCase2<ImageProcessingActivity> {
private final String TAG = "ImageProcessingTest";
private final String TEST_NAME = "Testname";
private final String ITERATIONS = "Iterations";
private final String BENCHMARK = "Benchmark";
private static int INSTRUMENTATION_IN_PROGRESS = 2;
private int mIteration;
private ImageProcessingActivity mActivity;
public ImageProcessingTest() {
super(ImageProcessingActivity.class);
}
@Override
public void setUp() throws Exception {
super.setUp();
setActivityInitialTouchMode(false);
mActivity = getActivity();
ImageProcessingTestRunner mRunner = (ImageProcessingTestRunner) getInstrumentation();
mIteration = mRunner.mIteration;
assertTrue("please enter a valid iteration value", mIteration > 0);
}
@Override
public void tearDown() throws Exception {
super.tearDown();
}
class TestAction implements Runnable {
TestName mTestName;
float mResult;
public TestAction(TestName testName) {
mTestName = testName;
}
public void run() {
mActivity.changeTest(mTestName);
mResult = mActivity.getBenchmark();
Log.v(TAG, "Benchmark for test \"" + mTestName.toString() + "\" is: " + mResult);
synchronized(this) {
this.notify();
}
}
public float getBenchmark() {
return mResult;
}
}
// Set the benchmark thread to run on ui thread
// Synchronized the thread such that the test will wait for the benchmark thread to finish
public void runOnUiThread(Runnable action) {
synchronized(action) {
mActivity.runOnUiThread(action);
try {
action.wait();
} catch (InterruptedException e) {
Log.v(TAG, "waiting for action running on UI thread is interrupted: " +
e.toString());
}
}
}
public void runTest(TestAction ta, String testName) {
float sum = 0;
for (int i = 0; i < mIteration; i++) {
runOnUiThread(ta);
float bmValue = ta.getBenchmark();
Log.v(TAG, "results for iteration " + i + " is " + bmValue);
sum += bmValue;
}
float avgResult = sum/mIteration;
// post result to INSTRUMENTATION_STATUS
Bundle results = new Bundle();
results.putString(TEST_NAME, testName);
results.putInt(ITERATIONS, mIteration);
results.putFloat(BENCHMARK, avgResult);
getInstrumentation().sendStatus(INSTRUMENTATION_IN_PROGRESS, results);
}
// Test case 0: Levels Vec3 Relaxed
@LargeTest
public void testLevelsVec3Relaxed() {
TestAction ta = new TestAction(TestName.LEVELS_VEC3_RELAXED);
runTest(ta, TestName.LEVELS_VEC3_RELAXED.name());
}
// Test case 1: Levels Vec4 Relaxed
@LargeTest
public void testLevelsVec4Relaxed() {
TestAction ta = new TestAction(TestName.LEVELS_VEC4_RELAXED);
runTest(ta, TestName.LEVELS_VEC4_RELAXED.name());
}
// Test case 2: Levels Vec3 Full
@LargeTest
public void testLevelsVec3Full() {
TestAction ta = new TestAction(TestName.LEVELS_VEC3_FULL);
runTest(ta, TestName.LEVELS_VEC3_FULL.name());
}
// Test case 3: Levels Vec4 Full
@LargeTest
public void testLevelsVec4Full() {
TestAction ta = new TestAction(TestName.LEVELS_VEC4_FULL);
runTest(ta, TestName.LEVELS_VEC4_FULL.name());
}
// Test case 4: Blur Radius 25
@LargeTest
public void testBlurRadius25() {
TestAction ta = new TestAction(TestName.BLUR_RADIUS_25);
runTest(ta, TestName.BLUR_RADIUS_25.name());
}
// Test case 5: Intrinsic Blur Radius 25
@LargeTest
public void testIntrinsicBlurRadius25() {
TestAction ta = new TestAction(TestName.INTRINSIC_BLUE_RADIUS_25);
runTest(ta, TestName.INTRINSIC_BLUE_RADIUS_25.name());
}
// Test case 6: Greyscale
@LargeTest
public void testGreyscale() {
TestAction ta = new TestAction(TestName.GREYSCALE);
runTest(ta, TestName.GREYSCALE.name());
}
// Test case 7: Grain
@LargeTest
public void testGrain() {
TestAction ta = new TestAction(TestName.GRAIN);
runTest(ta, TestName.GRAIN.name());
}
// Test case 8: Fisheye Full
@LargeTest
public void testFisheyeFull() {
TestAction ta = new TestAction(TestName.FISHEYE_FULL);
runTest(ta, TestName.FISHEYE_FULL.name());
}
// Test case 9: Fisheye Relaxed
@LargeTest
public void testFishEyeRelaxed() {
TestAction ta = new TestAction(TestName.FISHEYE_RELAXED);
runTest(ta, TestName.FISHEYE_RELAXED.name());
}
// Test case 10: Fisheye Approximate Full
@LargeTest
public void testFisheyeApproximateFull() {
TestAction ta = new TestAction(TestName.FISHEYE_APPROXIMATE_FULL);
runTest(ta, TestName.FISHEYE_APPROXIMATE_FULL.name());
}
// Test case 11: Fisheye Approximate Relaxed
@LargeTest
public void testFisheyeApproximateRelaxed() {
TestAction ta = new TestAction(TestName.FISHEYE_APPROXIMATE_RELAXED);
runTest(ta, TestName.FISHEYE_APPROXIMATE_RELAXED.name());
}
// Test case 12: Vignette Full
@LargeTest
public void testVignetteFull() {
TestAction ta = new TestAction(TestName.VIGNETTE_FULL);
runTest(ta, TestName.VIGNETTE_FULL.name());
}
// Test case 13: Vignette Relaxed
@LargeTest
public void testVignetteRelaxed() {
TestAction ta = new TestAction(TestName.VIGNETTE_RELAXED);
runTest(ta, TestName.VIGNETTE_RELAXED.name());
}
// Test case 14: Vignette Approximate Full
@LargeTest
public void testVignetteApproximateFull() {
TestAction ta = new TestAction(TestName.VIGNETTE_APPROXIMATE_FULL);
runTest(ta, TestName.VIGNETTE_APPROXIMATE_FULL.name());
}
// Test case 15: Vignette Approximate Relaxed
@LargeTest
public void testVignetteApproximateRelaxed() {
TestAction ta = new TestAction(TestName.VIGNETTE_APPROXIMATE_RELAXED);
runTest(ta, TestName.VIGNETTE_APPROXIMATE_RELAXED.name());
}
// Test case 16: Group Test (emulated)
@LargeTest
public void testGroupTestEmulated() {
TestAction ta = new TestAction(TestName.GROUP_TEST_EMULATED);
runTest(ta, TestName.GROUP_TEST_EMULATED.name());
}
// Test case 17: Group Test (native)
@LargeTest
public void testGroupTestNative() {
TestAction ta = new TestAction(TestName.GROUP_TEST_NATIVE);
runTest(ta, TestName.GROUP_TEST_NATIVE.name());
}
// Test case 18: Convolve 3x3
@LargeTest
public void testConvolve3x3() {
TestAction ta = new TestAction(TestName.CONVOLVE_3X3);
runTest(ta, TestName.CONVOLVE_3X3.name());
}
// Test case 19: Intrinsics Convolve 3x3
@LargeTest
public void testIntrinsicsConvolve3x3() {
TestAction ta = new TestAction(TestName.INTRINSICS_CONVOLVE_3X3);
runTest(ta, TestName.INTRINSICS_CONVOLVE_3X3.name());
}
// Test case 20: ColorMatrix
@LargeTest
public void testColorMatrix() {
TestAction ta = new TestAction(TestName.COLOR_MATRIX);
runTest(ta, TestName.COLOR_MATRIX.name());
}
// Test case 21: Intrinsics ColorMatrix
@LargeTest
public void testIntrinsicsColorMatrix() {
TestAction ta = new TestAction(TestName.INTRINSICS_COLOR_MATRIX);
runTest(ta, TestName.INTRINSICS_COLOR_MATRIX.name());
}
// Test case 22: Intrinsics ColorMatrix Grey
@LargeTest
public void testIntrinsicsColorMatrixGrey() {
TestAction ta = new TestAction(TestName.INTRINSICS_COLOR_MATRIX_GREY);
runTest(ta, TestName.INTRINSICS_COLOR_MATRIX_GREY.name());
}
// Test case 23: Copy
@LargeTest
public void testCopy() {
TestAction ta = new TestAction(TestName.COPY);
runTest(ta, TestName.COPY.name());
}
// Test case 24: CrossProcess (using LUT)
@LargeTest
public void testCrossProcessUsingLUT() {
TestAction ta = new TestAction(TestName.CROSS_PROCESS_USING_LUT);
runTest(ta, TestName.CROSS_PROCESS_USING_LUT.name());
}
// Test case 25: Convolve 5x5
@LargeTest
public void testConvolve5x5() {
TestAction ta = new TestAction(TestName.CONVOLVE_5X5);
runTest(ta, TestName.CONVOLVE_5X5.name());
}
// Test case 26: Intrinsics Convolve 5x5
@LargeTest
public void testIntrinsicsConvolve5x5() {
TestAction ta = new TestAction(TestName.INTRINSICS_CONVOLVE_5X5);
runTest(ta, TestName.INTRINSICS_CONVOLVE_5X5.name());
}
// Test case 27: Mandelbrot
@LargeTest
public void testMandelbrot() {
TestAction ta = new TestAction(TestName.MANDELBROT);
runTest(ta, TestName.MANDELBROT.name());
}
// Test case 28: Intrinsics Blend
@LargeTest
public void testIntrinsicsBlend() {
TestAction ta = new TestAction(TestName.INTRINSICS_BLEND);
runTest(ta, TestName.INTRINSICS_BLEND.name());
}
// Test case 29: Intrinsics Blur 25 uchar
@LargeTest
public void testIntrinsicsBlur25G() {
TestAction ta = new TestAction(TestName.INTRINSICS_BLUR_25G);
runTest(ta, TestName.INTRINSICS_BLUR_25G.name());
}
// Test case 30: Vibrance
@LargeTest
public void testVibrance() {
TestAction ta = new TestAction(TestName.VIBRANCE);
runTest(ta, TestName.VIBRANCE.name());
}
// Test case 31: BWFilter
@LargeTest
public void testBWFilter() {
TestAction ta = new TestAction(TestName.BW_FILTER);
runTest(ta, TestName.BW_FILTER.name());
}
// Test case 32: Shadows
@LargeTest
public void testShadows() {
TestAction ta = new TestAction(TestName.SHADOWS);
runTest(ta, TestName.SHADOWS.name());
}
// Test case 33: Contrast
@LargeTest
public void testContrast() {
TestAction ta = new TestAction(TestName.CONTRAST);
runTest(ta, TestName.CONTRAST.name());
}
// Test case 34: Exposure
@LargeTest
public void testExposure(){
TestAction ta = new TestAction(TestName.EXPOSURE);
runTest(ta, TestName.EXPOSURE.name());
}
// Test case 35: White Balance
@LargeTest
public void testWhiteBalance() {
TestAction ta = new TestAction(TestName.WHITE_BALANCE);
runTest(ta, TestName.WHITE_BALANCE.name());
}
// Test case 36: Color Cube
@LargeTest
public void testColorCube() {
TestAction ta = new TestAction(TestName.COLOR_CUBE);
runTest(ta, TestName.COLOR_CUBE.name());
}
// Test case 37: Color Cube (3D Intrinsic)
@LargeTest
public void testColorCube3DIntrinsic() {
TestAction ta = new TestAction(TestName.COLOR_CUBE_3D_INTRINSIC);
runTest(ta, TestName.COLOR_CUBE_3D_INTRINSIC.name());
}
}

View File

@@ -1,48 +0,0 @@
/*
* Copyright (C) 2011 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 com.android.rs.image.ImageProcessingTest;
import android.os.Bundle;
import android.test.InstrumentationTestRunner;
import android.test.InstrumentationTestSuite;
import junit.framework.TestSuite;
/**
* Run the ImageProcessing benchmark test
* adb shell am instrument -e iteration <n> -w com.android.rs.image/.ImageProcessingTestRunner
*
*/
public class ImageProcessingTestRunner extends InstrumentationTestRunner {
public int mIteration = 5;
@Override
public TestSuite getAllTests() {
TestSuite suite = new InstrumentationTestSuite(this);
suite.addTestSuite(ImageProcessingTest.class);
return suite;
}
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
String strIteration = (String) icicle.get("iteration");
if (strIteration != null) {
mIteration = Integer.parseInt(strIteration);
}
}
}

View File

@@ -1,167 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.rs.image;
import java.lang.Math;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.Matrix3f;
import android.renderscript.Script;
import android.renderscript.ScriptC;
import android.renderscript.Type;
import android.util.Log;
import android.widget.SeekBar;
import android.widget.TextView;
public class LevelsV4 extends TestBase {
private ScriptC_levels_relaxed mScriptR;
private ScriptC_levels_full mScriptF;
private float mInBlack = 0.0f;
private float mOutBlack = 0.0f;
private float mInWhite = 255.0f;
private float mOutWhite = 255.0f;
private float mSaturation = 1.0f;
Matrix3f satMatrix = new Matrix3f();
float mInWMinInB;
float mOutWMinOutB;
float mOverInWMinInB;
boolean mUseFull;
boolean mUseV4;
LevelsV4(boolean useFull, boolean useV4) {
mUseFull = useFull;
mUseV4 = useV4;
}
private void setLevels() {
mInWMinInB = mInWhite - mInBlack;
mOutWMinOutB = mOutWhite - mOutBlack;
mOverInWMinInB = 1.f / mInWMinInB;
mScriptR.set_inBlack(mInBlack);
mScriptR.set_outBlack(mOutBlack);
mScriptR.set_inWMinInB(mInWMinInB);
mScriptR.set_outWMinOutB(mOutWMinOutB);
mScriptR.set_overInWMinInB(mOverInWMinInB);
mScriptF.set_inBlack(mInBlack);
mScriptF.set_outBlack(mOutBlack);
mScriptF.set_inWMinInB(mInWMinInB);
mScriptF.set_outWMinOutB(mOutWMinOutB);
mScriptF.set_overInWMinInB(mOverInWMinInB);
}
private void setSaturation() {
float rWeight = 0.299f;
float gWeight = 0.587f;
float bWeight = 0.114f;
float oneMinusS = 1.0f - mSaturation;
satMatrix.set(0, 0, oneMinusS * rWeight + mSaturation);
satMatrix.set(0, 1, oneMinusS * rWeight);
satMatrix.set(0, 2, oneMinusS * rWeight);
satMatrix.set(1, 0, oneMinusS * gWeight);
satMatrix.set(1, 1, oneMinusS * gWeight + mSaturation);
satMatrix.set(1, 2, oneMinusS * gWeight);
satMatrix.set(2, 0, oneMinusS * bWeight);
satMatrix.set(2, 1, oneMinusS * bWeight);
satMatrix.set(2, 2, oneMinusS * bWeight + mSaturation);
mScriptR.set_colorMat(satMatrix);
mScriptF.set_colorMat(satMatrix);
}
public boolean onBar1Setup(SeekBar b, TextView t) {
b.setProgress(50);
t.setText("Saturation");
return true;
}
public boolean onBar2Setup(SeekBar b, TextView t) {
b.setMax(128);
b.setProgress(0);
t.setText("In Black");
return true;
}
public boolean onBar3Setup(SeekBar b, TextView t) {
b.setMax(128);
b.setProgress(0);
t.setText("Out Black");
return true;
}
public boolean onBar4Setup(SeekBar b, TextView t) {
b.setMax(128);
b.setProgress(128);
t.setText("Out White");
return true;
}
public boolean onBar5Setup(SeekBar b, TextView t) {
b.setMax(128);
b.setProgress(128);
t.setText("Out White");
return true;
}
public void onBar1Changed(int progress) {
mSaturation = (float)progress / 50.0f;
setSaturation();
}
public void onBar2Changed(int progress) {
mInBlack = (float)progress;
setLevels();
}
public void onBar3Changed(int progress) {
mOutBlack = (float)progress;
setLevels();
}
public void onBar4Changed(int progress) {
mInWhite = (float)progress + 127.0f;
setLevels();
}
public void onBar5Changed(int progress) {
mOutWhite = (float)progress + 127.0f;
setLevels();
}
public void createTest(android.content.res.Resources res) {
mScriptR = new ScriptC_levels_relaxed(mRS, res, R.raw.levels_relaxed);
mScriptF = new ScriptC_levels_full(mRS, res, R.raw.levels_full);
setSaturation();
setLevels();
}
public void runTest() {
if (mUseFull) {
if (mUseV4) {
mScriptF.forEach_root4(mInPixelsAllocation, mOutPixelsAllocation);
} else {
mScriptF.forEach_root(mInPixelsAllocation, mOutPixelsAllocation);
}
} else {
if (mUseV4) {
mScriptR.forEach_root4(mInPixelsAllocation, mOutPixelsAllocation);
} else {
mScriptR.forEach_root(mInPixelsAllocation, mOutPixelsAllocation);
}
}
}
}

View File

@@ -1,98 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.rs.image;
import java.lang.Math;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.Script;
import android.renderscript.ScriptC;
import android.renderscript.Type;
import android.util.Log;
import android.widget.SeekBar;
import android.widget.TextView;
public class Mandelbrot extends TestBase {
private ScriptC_mandelbrot mScript;
public boolean onBar1Setup(SeekBar b, TextView t) {
t.setText("Iterations");
b.setProgress(0);
return true;
}
public void onBar1Changed(int progress) {
int iters = progress * 3 + 50;
mScript.set_gMaxIteration(iters);
}
public boolean onBar2Setup(SeekBar b, TextView t) {
t.setText("Lower Bound: X");
b.setProgress(0);
return true;
}
public void onBar2Changed(int progress) {
float scaleFactor = mScript.get_scaleFactor();
// allow viewport to be moved by 2x scale factor
float lowerBoundX = -2.f + ((progress / scaleFactor) / 50.f);
mScript.set_lowerBoundX(lowerBoundX);
}
public boolean onBar3Setup(SeekBar b, TextView t) {
t.setText("Lower Bound: Y");
b.setProgress(0);
return true;
}
public void onBar3Changed(int progress) {
float scaleFactor = mScript.get_scaleFactor();
// allow viewport to be moved by 2x scale factor
float lowerBoundY = -2.f + ((progress / scaleFactor) / 50.f);
mScript.set_lowerBoundY(lowerBoundY);
}
public boolean onBar4Setup(SeekBar b, TextView t) {
t.setText("Scale Factor");
b.setProgress(0);
return true;
}
public void onBar4Changed(int progress) {
float scaleFactor = 4.f - (3.96f * (progress / 100.f));
mScript.set_scaleFactor(scaleFactor);
}
public void createTest(android.content.res.Resources res) {
int width = mOutPixelsAllocation.getType().getX();
int height = mOutPixelsAllocation.getType().getY();
mScript = new ScriptC_mandelbrot(mRS, res, R.raw.mandelbrot);
mScript.set_gDimX(width);
mScript.set_gDimY(height);
mScript.set_gMaxIteration(50);
}
public void runTest() {
mScript.forEach_root(mOutPixelsAllocation);
mRS.finish();
}
}

View File

@@ -1,35 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.rs.image;
import java.lang.Math;
import android.renderscript.Allocation;
public class Shadows extends TestBase {
private ScriptC_shadows mScript;
public void createTest(android.content.res.Resources res) {
mScript = new ScriptC_shadows(mRS);
}
public void runTest() {
mScript.invoke_prepareShadows(50.f);
mScript.forEach_shadowsKernel(mInPixelsAllocation, mOutPixelsAllocation);
}
}

View File

@@ -1,151 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.rs.image;
import android.app.Activity;
import android.content.Context;
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 android.util.Log;
import java.lang.Math;
import android.widget.Spinner;
public class TestBase {
protected final String TAG = "Img";
protected RenderScript mRS;
protected Allocation mInPixelsAllocation;
protected Allocation mInPixelsAllocation2;
protected Allocation mOutPixelsAllocation;
protected ImageProcessingActivity act;
private class MessageProcessor extends RenderScript.RSMessageHandler {
ImageProcessingActivity mAct;
MessageProcessor(ImageProcessingActivity act) {
mAct = act;
}
public void run() {
mAct.updateDisplay();
}
}
// Override to use UI elements
public void onBar1Changed(int progress) {
}
public void onBar2Changed(int progress) {
}
public void onBar3Changed(int progress) {
}
public void onBar4Changed(int progress) {
}
public void onBar5Changed(int progress) {
}
// Override to use UI elements
// Unused bars will be hidden.
public boolean onBar1Setup(SeekBar b, TextView t) {
b.setVisibility(View.INVISIBLE);
t.setVisibility(View.INVISIBLE);
return false;
}
public boolean onBar2Setup(SeekBar b, TextView t) {
b.setVisibility(View.INVISIBLE);
t.setVisibility(View.INVISIBLE);
return false;
}
public boolean onBar3Setup(SeekBar b, TextView t) {
b.setVisibility(View.INVISIBLE);
t.setVisibility(View.INVISIBLE);
return false;
}
public boolean onBar4Setup(SeekBar b, TextView t) {
b.setVisibility(View.INVISIBLE);
t.setVisibility(View.INVISIBLE);
return false;
}
public boolean onBar5Setup(SeekBar b, TextView t) {
b.setVisibility(View.INVISIBLE);
t.setVisibility(View.INVISIBLE);
return false;
}
public boolean onSpinner1Setup(Spinner s) {
s.setVisibility(View.INVISIBLE);
return false;
}
public final void createBaseTest(ImageProcessingActivity ipact, Bitmap b, Bitmap b2, Bitmap outb) {
act = ipact;
mRS = ipact.mRS;
mRS.setMessageHandler(new MessageProcessor(act));
mInPixelsAllocation = ipact.mInPixelsAllocation;
mInPixelsAllocation2 = ipact.mInPixelsAllocation2;
mOutPixelsAllocation = ipact.mOutPixelsAllocation;
createTest(act.getResources());
}
// Must override
public void createTest(android.content.res.Resources res) {
}
// Must override
public void runTest() {
}
final public void runTestSendMessage() {
runTest();
mRS.sendMessage(0, null);
}
public void finish() {
mRS.finish();
}
public void destroy() {
mRS.setMessageHandler(null);
}
public void updateBitmap(Bitmap b) {
mOutPixelsAllocation.copyTo(b);
}
// Override to configure specific benchmark config.
public void setupBenchmark() {
}
// Override to reset after benchmark.
public void exitBenchmark() {
}
}

View File

@@ -1,66 +0,0 @@
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.rs.image;
import java.lang.Math;
import android.view.Surface;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.ScriptIntrinsicConvolve3x3;
import android.renderscript.ScriptIntrinsicColorMatrix;
import android.renderscript.Type;
import android.renderscript.Matrix4f;
import android.renderscript.ScriptGroup;
import android.util.Log;
public class UsageIO extends TestBase {
private ScriptIntrinsicColorMatrix mMatrix;
private Allocation mScratchPixelsAllocation1;
private Allocation mScratchPixelsAllocation2;
public UsageIO() {
}
public void createTest(android.content.res.Resources res) {
mMatrix = ScriptIntrinsicColorMatrix.create(mRS, Element.U8_4(mRS));
Matrix4f m = new Matrix4f();
m.set(1, 0, 0.2f);
m.set(1, 1, 0.9f);
m.set(1, 2, 0.2f);
mMatrix.setColorMatrix(m);
Type connect = mInPixelsAllocation.getType();
mScratchPixelsAllocation1 = Allocation.createTyped(mRS, connect, Allocation.USAGE_IO_OUTPUT | Allocation.USAGE_SCRIPT);
mScratchPixelsAllocation2 = Allocation.createTyped(mRS, connect, Allocation.USAGE_IO_INPUT | Allocation.USAGE_SCRIPT);
Surface s = mScratchPixelsAllocation2.getSurface();
mScratchPixelsAllocation1.setSurface(s);
}
public void runTest() {
mScratchPixelsAllocation1.copyFrom(mInPixelsAllocation);
mScratchPixelsAllocation1.ioSend();
mScratchPixelsAllocation2.ioReceive();
mMatrix.forEach(mScratchPixelsAllocation2, mOutPixelsAllocation);
}
}

View File

@@ -1,36 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.rs.image;
import java.lang.Math;
import android.renderscript.Allocation;
public class Vibrance extends TestBase {
private ScriptC_vibrance mScript;
public void createTest(android.content.res.Resources res) {
mScript = new ScriptC_vibrance(mRS);
}
public void runTest() {
mScript.set_vibrance(50.f);
mScript.invoke_prepareVibrance();
mScript.forEach_vibranceKernel(mInPixelsAllocation, mOutPixelsAllocation);
}
}

View File

@@ -1,154 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.rs.image;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.Sampler;
import android.renderscript.Type;
import android.widget.SeekBar;
import android.widget.TextView;
public class Vignette extends TestBase {
private ScriptC_vignette_full mScript_full = null;
private ScriptC_vignette_relaxed mScript_relaxed = null;
private ScriptC_vignette_approx_full mScript_approx_full = null;
private ScriptC_vignette_approx_relaxed mScript_approx_relaxed = null;
private final boolean approx;
private final boolean relaxed;
private float center_x = 0.5f;
private float center_y = 0.5f;
private float scale = 0.5f;
private float shade = 0.5f;
private float slope = 20.0f;
public Vignette(boolean approx, boolean relaxed) {
this.approx = approx;
this.relaxed = relaxed;
}
public boolean onBar1Setup(SeekBar b, TextView t) {
t.setText("Scale");
b.setMax(100);
b.setProgress(25);
return true;
}
public boolean onBar2Setup(SeekBar b, TextView t) {
t.setText("Shade");
b.setMax(100);
b.setProgress(50);
return true;
}
public boolean onBar3Setup(SeekBar b, TextView t) {
t.setText("Slope");
b.setMax(100);
b.setProgress(20);
return true;
}
public boolean onBar4Setup(SeekBar b, TextView t) {
t.setText("Shift center X");
b.setMax(100);
b.setProgress(50);
return true;
}
public boolean onBar5Setup(SeekBar b, TextView t) {
t.setText("Shift center Y");
b.setMax(100);
b.setProgress(50);
return true;
}
public void onBar1Changed(int progress) {
scale = progress / 50.0f;
do_init();
}
public void onBar2Changed(int progress) {
shade = progress / 100.0f;
do_init();
}
public void onBar3Changed(int progress) {
slope = (float)progress;
do_init();
}
public void onBar4Changed(int progress) {
center_x = progress / 100.0f;
do_init();
}
public void onBar5Changed(int progress) {
center_y = progress / 100.0f;
do_init();
}
private void do_init() {
if (approx) {
if (relaxed)
mScript_approx_relaxed.invoke_init_vignette(
mInPixelsAllocation.getType().getX(),
mInPixelsAllocation.getType().getY(), center_x,
center_y, scale, shade, slope);
else
mScript_approx_full.invoke_init_vignette(
mInPixelsAllocation.getType().getX(),
mInPixelsAllocation.getType().getY(), center_x,
center_y, scale, shade, slope);
} else if (relaxed)
mScript_relaxed.invoke_init_vignette(
mInPixelsAllocation.getType().getX(),
mInPixelsAllocation.getType().getY(), center_x, center_y,
scale, shade, slope);
else
mScript_full.invoke_init_vignette(
mInPixelsAllocation.getType().getX(),
mInPixelsAllocation.getType().getY(), center_x, center_y,
scale, shade, slope);
}
public void createTest(android.content.res.Resources res) {
if (approx) {
if (relaxed)
mScript_approx_relaxed = new ScriptC_vignette_approx_relaxed(
mRS, res, R.raw.vignette_approx_relaxed);
else
mScript_approx_full = new ScriptC_vignette_approx_full(
mRS, res, R.raw.vignette_approx_full);
} else if (relaxed)
mScript_relaxed = new ScriptC_vignette_relaxed(mRS, res,
R.raw.vignette_relaxed);
else
mScript_full = new ScriptC_vignette_full(mRS, res,
R.raw.vignette_full);
do_init();
}
public void runTest() {
if (approx) {
if (relaxed)
mScript_approx_relaxed.forEach_root(mInPixelsAllocation,
mOutPixelsAllocation);
else
mScript_approx_full.forEach_root(mInPixelsAllocation,
mOutPixelsAllocation);
} else if (relaxed)
mScript_relaxed.forEach_root(mInPixelsAllocation,
mOutPixelsAllocation);
else
mScript_full.forEach_root(mInPixelsAllocation,
mOutPixelsAllocation);
}
}

View File

@@ -1,38 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.rs.image;
import java.lang.Math;
import android.renderscript.Allocation;
public class WhiteBalance extends TestBase {
private ScriptC_wbalance mScript;
public void createTest(android.content.res.Resources res) {
mScript = new ScriptC_wbalance(mRS);
}
public void runTest() {
mScript.set_histogramSource(mInPixelsAllocation);
mScript.set_histogramWidth(mInPixelsAllocation.getType().getX());
mScript.set_histogramHeight(mInPixelsAllocation.getType().getY());
mScript.invoke_prepareWhiteBalance();
mScript.forEach_whiteBalanceKernel(mInPixelsAllocation, mOutPixelsAllocation);
}
}

View File

@@ -1,23 +0,0 @@
// Copyright (C) 2011 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "ip.rsh"
uchar alpha = 0x0;
void setImageAlpha(uchar4 *v_out, uint32_t x, uint32_t y) {
v_out->rgba = convert_uchar4((convert_uint4(v_out->rgba) * alpha) >> (uint4)8);
v_out->a = alpha;
}

View File

@@ -1,52 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ip.rsh"
//#pragma rs_fp_relaxed
static float sr = 0.f;
static float sg = 0.f;
static float sb = 0.f;
void prepareBwFilter(uint32_t rw, uint32_t gw, uint32_t bw) {
sr = rw;
sg = gw;
sb = bw;
float imageMin = min(sg,sb);
imageMin = fmin(sr,imageMin);
float imageMax = max(sg,sb);
imageMax = fmax(sr,imageMax);
float avg = (imageMin + imageMax)/2;
sb /= avg;
sg /= avg;
sr /= avg;
}
void bwFilterKernel(const uchar4 *in, uchar4 *out) {
float r = in->r * sr;
float g = in->g * sg;
float b = in->b * sb;
float localMin, localMax, avg;
localMin = fmin(g,b);
localMin = fmin(r,localMin);
localMax = fmax(g,b);
localMax = fmax(r,localMax);
avg = (localMin+localMax) * 0.5f;
out->r = out->g = out->b = rsClamp(avg, 0, 255);
}

View File

@@ -1,89 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ip.rsh"
#pragma rs_fp_relaxed
static rs_allocation gCube;
static int4 gDims;
static int4 gCoordMul;
void setCube(rs_allocation c) {
gCube = c;
gDims.x = rsAllocationGetDimX(gCube);
gDims.y = rsAllocationGetDimY(gCube);
gDims.z = rsAllocationGetDimZ(gCube);
gDims.w = 0;
float4 m = (float4)(1.f / 255.f) * convert_float4(gDims - 1);
gCoordMul = convert_int4(m * (float4)0x10000);
rsDebug("dims", gDims);
rsDebug("gCoordMul", gCoordMul);
}
void root(const uchar4 *in, uchar4 *out, uint32_t x, uint32_t y) {
//rsDebug("root", in);
int4 baseCoord = convert_int4(*in) * gCoordMul;
int4 coord1 = baseCoord >> (int4)16;
int4 coord2 = min(coord1 + 1, gDims - 1);
int4 weight2 = baseCoord & 0xffff;
int4 weight1 = (int4)0x10000 - weight2;
uint4 v000 = convert_uint4(rsGetElementAt_uchar4(gCube, coord1.x, coord1.y, coord1.z));
uint4 v100 = convert_uint4(rsGetElementAt_uchar4(gCube, coord2.x, coord1.y, coord1.z));
uint4 v010 = convert_uint4(rsGetElementAt_uchar4(gCube, coord1.x, coord2.y, coord1.z));
uint4 v110 = convert_uint4(rsGetElementAt_uchar4(gCube, coord2.x, coord2.y, coord1.z));
uint4 v001 = convert_uint4(rsGetElementAt_uchar4(gCube, coord1.x, coord1.y, coord2.z));
uint4 v101 = convert_uint4(rsGetElementAt_uchar4(gCube, coord2.x, coord1.y, coord2.z));
uint4 v011 = convert_uint4(rsGetElementAt_uchar4(gCube, coord1.x, coord2.y, coord2.z));
uint4 v111 = convert_uint4(rsGetElementAt_uchar4(gCube, coord2.x, coord2.y, coord2.z));
uint4 yz00 = ((v000 * weight1.x) + (v100 * weight2.x)) >> (int4)8;
uint4 yz10 = ((v010 * weight1.x) + (v110 * weight2.x)) >> (int4)8;
uint4 yz01 = ((v001 * weight1.x) + (v101 * weight2.x)) >> (int4)8;
uint4 yz11 = ((v011 * weight1.x) + (v111 * weight2.x)) >> (int4)8;
uint4 z0 = ((yz00 * weight1.y) + (yz10 * weight2.y)) >> (int4)16;
uint4 z1 = ((yz01 * weight1.y) + (yz11 * weight2.y)) >> (int4)16;
uint4 v = ((z0 * weight1.z) + (z1 * weight2.z)) >> (int4)16;
uint4 v2 = (v + 0x7f) >> (int4)8;
*out = convert_uchar4(v2);
out->a = 0xff;
#if 0
if (in->r != out->r) {
rsDebug("dr", in->r - out->r);
//rsDebug("in", convert_int4(*in));
//rsDebug("coord1", coord1);
//rsDebug("coord2", coord2);
//rsDebug("weight1", weight1);
//rsDebug("weight2", weight2);
//rsDebug("yz00", yz00);
//rsDebug("z0", z0);
//rsDebug("v", v);
//rsDebug("v2", v2);
//rsDebug("out", convert_int4(*out));
}
#endif
}

View File

@@ -1,35 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ip.rsh"
static rs_matrix4x4 Mat;
void init() {
rsMatrixLoadIdentity(&Mat);
}
void setMatrix(rs_matrix4x4 m) {
Mat = m;
}
uchar4 __attribute__((kernel)) root(uchar4 in) {
float4 f = convert_float4(in);
f = rsMatrixMultiply(&Mat, f);
f = clamp(f, 0.f, 255.f);
return convert_uchar4(f);
}

View File

@@ -1,37 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ip.rsh"
static float brightM = 0.f;
static float brightC = 0.f;
void setBright(float v) {
brightM = pow(2.f, v / 100.f);
brightC = 127.f - brightM * 127.f;
}
void contrast(const uchar4 *in, uchar4 *out)
{
#if 0
out->r = rsClamp((int)(brightM * in->r + brightC), 0, 255);
out->g = rsClamp((int)(brightM * in->g + brightC), 0, 255);
out->b = rsClamp((int)(brightM * in->b + brightC), 0, 255);
#else
float3 v = convert_float3(in->rgb) * brightM + brightC;
out->rgb = convert_uchar3(clamp(v, 0.f, 255.f));
#endif
}

View File

@@ -1,65 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ip.rsh"
int32_t gWidth;
int32_t gHeight;
rs_allocation gIn;
float gCoeffs[9];
uchar4 __attribute__((kernel)) root(uint32_t x, uint32_t y) {
uint32_t x1 = min((int32_t)x+1, gWidth-1);
uint32_t x2 = max((int32_t)x-1, 0);
uint32_t y1 = min((int32_t)y+1, gHeight-1);
uint32_t y2 = max((int32_t)y-1, 0);
float4 p00 = convert_float4(rsGetElementAt_uchar4(gIn, x1, y1));
float4 p01 = convert_float4(rsGetElementAt_uchar4(gIn, x, y1));
float4 p02 = convert_float4(rsGetElementAt_uchar4(gIn, x2, y1));
float4 p10 = convert_float4(rsGetElementAt_uchar4(gIn, x1, y));
float4 p11 = convert_float4(rsGetElementAt_uchar4(gIn, x, y));
float4 p12 = convert_float4(rsGetElementAt_uchar4(gIn, x2, y));
float4 p20 = convert_float4(rsGetElementAt_uchar4(gIn, x1, y2));
float4 p21 = convert_float4(rsGetElementAt_uchar4(gIn, x, y2));
float4 p22 = convert_float4(rsGetElementAt_uchar4(gIn, x2, y2));
p00 *= gCoeffs[0];
p01 *= gCoeffs[1];
p02 *= gCoeffs[2];
p10 *= gCoeffs[3];
p11 *= gCoeffs[4];
p12 *= gCoeffs[5];
p20 *= gCoeffs[6];
p21 *= gCoeffs[7];
p22 *= gCoeffs[8];
p00 += p01;
p02 += p10;
p11 += p12;
p20 += p21;
p22 += p00;
p02 += p11;
p20 += p22;
p20 += p02;
p20 = clamp(p20, 0.f, 255.f);
return convert_uchar4(p20);
}

View File

@@ -1,72 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ip.rsh"
int32_t gWidth;
int32_t gHeight;
rs_allocation gIn;
float gCoeffs[25];
uchar4 __attribute__((kernel)) root(uint32_t x, uint32_t y) {
uint32_t x0 = max((int32_t)x-2, 0);
uint32_t x1 = max((int32_t)x-1, 0);
uint32_t x2 = x;
uint32_t x3 = min((int32_t)x+1, gWidth-1);
uint32_t x4 = min((int32_t)x+2, gWidth-1);
uint32_t y0 = max((int32_t)y-2, 0);
uint32_t y1 = max((int32_t)y-1, 0);
uint32_t y2 = y;
uint32_t y3 = min((int32_t)y+1, gHeight-1);
uint32_t y4 = min((int32_t)y+2, gHeight-1);
float4 p0 = convert_float4(rsGetElementAt_uchar4(gIn, x0, y0)) * gCoeffs[0]
+ convert_float4(rsGetElementAt_uchar4(gIn, x1, y0)) * gCoeffs[1]
+ convert_float4(rsGetElementAt_uchar4(gIn, x2, y0)) * gCoeffs[2]
+ convert_float4(rsGetElementAt_uchar4(gIn, x3, y0)) * gCoeffs[3]
+ convert_float4(rsGetElementAt_uchar4(gIn, x4, y0)) * gCoeffs[4];
float4 p1 = convert_float4(rsGetElementAt_uchar4(gIn, x0, y1)) * gCoeffs[5]
+ convert_float4(rsGetElementAt_uchar4(gIn, x1, y1)) * gCoeffs[6]
+ convert_float4(rsGetElementAt_uchar4(gIn, x2, y1)) * gCoeffs[7]
+ convert_float4(rsGetElementAt_uchar4(gIn, x3, y1)) * gCoeffs[8]
+ convert_float4(rsGetElementAt_uchar4(gIn, x4, y1)) * gCoeffs[9];
float4 p2 = convert_float4(rsGetElementAt_uchar4(gIn, x0, y2)) * gCoeffs[10]
+ convert_float4(rsGetElementAt_uchar4(gIn, x1, y2)) * gCoeffs[11]
+ convert_float4(rsGetElementAt_uchar4(gIn, x2, y2)) * gCoeffs[12]
+ convert_float4(rsGetElementAt_uchar4(gIn, x3, y2)) * gCoeffs[13]
+ convert_float4(rsGetElementAt_uchar4(gIn, x4, y2)) * gCoeffs[14];
float4 p3 = convert_float4(rsGetElementAt_uchar4(gIn, x0, y3)) * gCoeffs[15]
+ convert_float4(rsGetElementAt_uchar4(gIn, x1, y3)) * gCoeffs[16]
+ convert_float4(rsGetElementAt_uchar4(gIn, x2, y3)) * gCoeffs[17]
+ convert_float4(rsGetElementAt_uchar4(gIn, x3, y3)) * gCoeffs[18]
+ convert_float4(rsGetElementAt_uchar4(gIn, x4, y3)) * gCoeffs[19];
float4 p4 = convert_float4(rsGetElementAt_uchar4(gIn, x0, y4)) * gCoeffs[20]
+ convert_float4(rsGetElementAt_uchar4(gIn, x1, y4)) * gCoeffs[21]
+ convert_float4(rsGetElementAt_uchar4(gIn, x2, y4)) * gCoeffs[22]
+ convert_float4(rsGetElementAt_uchar4(gIn, x3, y4)) * gCoeffs[23]
+ convert_float4(rsGetElementAt_uchar4(gIn, x4, y4)) * gCoeffs[24];
p0 = clamp(p0 + p1 + p2 + p3 + p4, 0.f, 255.f);
return convert_uchar4(p0);
}

View File

@@ -1,23 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ip.rsh"
uchar4 __attribute__((kernel)) root(uchar4 v_in) {
return v_in;
}

View File

@@ -1,31 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ip.rsh"
static float bright = 0.f;
void setBright(float v) {
bright = 255.f / (255.f - v);
}
void exposure(const uchar4 *in, uchar4 *out)
{
out->r = rsClamp((int)(bright * in->r), 0, 255);
out->g = rsClamp((int)(bright * in->g), 0, 255);
out->b = rsClamp((int)(bright * in->b), 0, 255);
}

View File

@@ -1,58 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
rs_allocation in_alloc;
rs_sampler sampler;
static float2 center, neg_center, inv_dimensions, axis_scale;
static float alpha, radius2, factor;
void init_filter(uint32_t dim_x, uint32_t dim_y, float center_x, float center_y, float k) {
center.x = center_x;
center.y = center_y;
neg_center = -center;
inv_dimensions.x = 1.f / (float)dim_x;
inv_dimensions.y = 1.f / (float)dim_y;
alpha = k * 2.0f + 0.75f;
axis_scale = (float2)1.f;
if (dim_x > dim_y)
axis_scale.y = (float)dim_y / (float)dim_x;
else
axis_scale.x = (float)dim_x / (float)dim_y;
const float bound2 = 0.25f * (axis_scale.x*axis_scale.x + axis_scale.y*axis_scale.y);
const float bound = sqrt(bound2);
const float radius = 1.15f * bound;
radius2 = radius*radius;
const float max_radian = M_PI_2 - atan(alpha / bound * sqrt(radius2 - bound2));
factor = bound / max_radian;
}
uchar4 __attribute__((kernel)) root(uint32_t x, uint32_t y) {
// Convert x and y to floating point coordinates with center as origin
const float2 inCoord = {(float)x, (float)y};
const float2 coord = mad(inCoord, inv_dimensions, neg_center);
const float2 scaledCoord = axis_scale * coord;
const float dist2 = scaledCoord.x*scaledCoord.x + scaledCoord.y*scaledCoord.y;
const float inv_dist = rsqrt(dist2);
const float radian = M_PI_2 - atan((alpha * sqrt(radius2 - dist2)) * inv_dist);
const float scalar = radian * factor * inv_dist;
const float2 new_coord = mad(coord, scalar, center);
const float4 fout = rsSample(in_alloc, sampler, new_coord);
return rsPackColorTo8888(fout);
}

View File

@@ -1,58 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
rs_allocation in_alloc;
rs_sampler sampler;
static float2 center, neg_center, inv_dimensions, axis_scale;
static float alpha, radius2, factor;
void init_filter(uint32_t dim_x, uint32_t dim_y, float center_x, float center_y, float k) {
center.x = center_x;
center.y = center_y;
neg_center = -center;
inv_dimensions.x = 1.f / (float)dim_x;
inv_dimensions.y = 1.f / (float)dim_y;
alpha = k * 2.0f + 0.75f;
axis_scale = (float2)1.f;
if (dim_x > dim_y)
axis_scale.y = (float)dim_y / (float)dim_x;
else
axis_scale.x = (float)dim_x / (float)dim_y;
const float bound2 = 0.25f * (axis_scale.x*axis_scale.x + axis_scale.y*axis_scale.y);
const float bound = sqrt(bound2);
const float radius = 1.15f * bound;
radius2 = radius*radius;
const float max_radian = M_PI_2 - atan(alpha / bound * sqrt(radius2 - bound2));
factor = bound / max_radian;
}
uchar4 __attribute__((kernel)) root(uint32_t x, uint32_t y) {
// Convert x and y to floating point coordinates with center as origin
const float2 inCoord = {(float)x, (float)y};
const float2 coord = mad(inCoord, inv_dimensions, neg_center);
const float2 scaledCoord = axis_scale * coord;
const float dist2 = scaledCoord.x*scaledCoord.x + scaledCoord.y*scaledCoord.y;
const float inv_dist = half_rsqrt(dist2);
const float radian = M_PI_2 - atan((alpha * half_sqrt(radius2 - dist2)) * inv_dist);
const float scalar = radian * factor * inv_dist;
const float2 new_coord = mad(coord, scalar, center);
const float4 fout = rsSample(in_alloc, sampler, new_coord);
return rsPackColorTo8888(fout);
}

View File

@@ -1,20 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ip.rsh"
#include "fisheye_approx.rsh"

View File

@@ -1,20 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ip.rsh"
#include "fisheye_approx.rsh"

View File

@@ -1,20 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ip.rsh"
#include "fisheye.rsh"

View File

@@ -1,20 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ip.rsh"
#include "fisheye.rsh"

View File

@@ -1,91 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ip.rsh"
uchar __attribute__((kernel)) genRand() {
return (uchar)rsRand(0xff);
}
/*
* Convolution matrix of distance 2 with fixed point of 'kShiftBits' bits
* shifted. Thus the sum of this matrix should be 'kShiftValue'. Entries of
* small values are not calculated to gain efficiency.
* The order ot pixels represented in this matrix is:
* 1 2 3
* 4 0 5
* 6 7 8
* and the matrix should be: {230, 56, 114, 56, 114, 114, 56, 114, 56}.
* However, since most of the valus are identical, we only use the first three
* entries and the entries corresponding to the pixels is:
* 1 2 1
* 2 0 2
* 1 2 1
*/
int32_t gWMask;
int32_t gHMask;
rs_allocation gBlendSource;
uchar __attribute__((kernel)) blend9(uint32_t x, uint32_t y) {
uint32_t x1 = (x-1) & gWMask;
uint32_t x2 = (x+1) & gWMask;
uint32_t y1 = (y-1) & gHMask;
uint32_t y2 = (y+1) & gHMask;
uint p00 = 56 * rsGetElementAt_uchar(gBlendSource, x1, y1);
uint p01 = 114 * rsGetElementAt_uchar(gBlendSource, x, y1);
uint p02 = 56 * rsGetElementAt_uchar(gBlendSource, x2, y1);
uint p10 = 114 * rsGetElementAt_uchar(gBlendSource, x1, y);
uint p11 = 230 * rsGetElementAt_uchar(gBlendSource, x, y);
uint p12 = 114 * rsGetElementAt_uchar(gBlendSource, x2, y);
uint p20 = 56 * rsGetElementAt_uchar(gBlendSource, x1, y2);
uint p21 = 114 * rsGetElementAt_uchar(gBlendSource, x, y2);
uint p22 = 56 * rsGetElementAt_uchar(gBlendSource, x2, y2);
p00 += p01;
p02 += p10;
p11 += p12;
p20 += p21;
p22 += p00;
p02 += p11;
p20 += p22;
p20 += p02;
p20 = min(p20 >> 10, (uint)255);
return (uchar)p20;
}
float gNoiseStrength;
rs_allocation gNoise;
uchar4 __attribute__((kernel)) root(uchar4 in, uint32_t x, uint32_t y) {
float4 ip = convert_float4(in);
float pnoise = (float) rsGetElementAt_uchar(gNoise, x & gWMask, y & gHMask);
float energy_level = ip.r + ip.g + ip.b;
float energy_mask = (28.f - sqrt(energy_level)) * 0.03571f;
pnoise = (pnoise - 128.f) * energy_mask;
ip += pnoise * gNoiseStrength;
ip = clamp(ip, 0.f, 255.f);
uchar4 p = convert_uchar4(ip);
p.a = 0xff;
return p;
}

View File

@@ -1,36 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ip.rsh"
const static float3 gMonoMult = {0.299f, 0.587f, 0.114f};
uchar4 __attribute__((kernel)) root(uchar4 v_in) {
float4 f4 = rsUnpackColor8888(v_in);
float3 mono = dot(f4.rgb, gMonoMult);
return rsPackColorTo8888(mono);
}
uchar __attribute__((kernel)) toU8(uchar4 v_in) {
float4 f4 = convert_float4(v_in);
return (uchar)dot(f4.rgb, gMonoMult);
}
uchar4 __attribute__((kernel)) toU8_4(uchar v_in) {
return (uchar4)v_in;
}

View File

@@ -1,20 +0,0 @@
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma version(1)
#pragma rs java_package_name(com.android.rs.image)

View File

@@ -1,46 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
float inBlack;
float outBlack;
float inWMinInB;
float outWMinOutB;
float overInWMinInB;
rs_matrix3x3 colorMat;
uchar4 __attribute__((kernel)) root(uchar4 in, uint32_t x, uint32_t y) {
uchar4 out;
float3 pixel = convert_float4(in).rgb;
pixel = rsMatrixMultiply(&colorMat, pixel);
pixel = clamp(pixel, 0.f, 255.f);
pixel = (pixel - inBlack) * overInWMinInB;
pixel = pixel * outWMinOutB + outBlack;
pixel = clamp(pixel, 0.f, 255.f);
out.xyz = convert_uchar3(pixel);
out.w = 0xff;
return out;
}
uchar4 __attribute__((kernel)) root4(uchar4 in, uint32_t x, uint32_t y) {
float4 pixel = convert_float4(in);
pixel.rgb = rsMatrixMultiply(&colorMat, pixel.rgb);
pixel = clamp(pixel, 0.f, 255.f);
pixel = (pixel - inBlack) * overInWMinInB;
pixel = pixel * outWMinOutB + outBlack;
pixel = clamp(pixel, 0.f, 255.f);
return convert_uchar4(pixel);
}

View File

@@ -1,20 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ip.rsh"
#include "levels.rsh"

View File

@@ -1,20 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ip.rsh"
#include "levels.rsh"

View File

@@ -1,55 +0,0 @@
// Copyright (C) 2011 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "ip.rsh"
uint32_t gMaxIteration = 500;
uint32_t gDimX = 1024;
uint32_t gDimY = 1024;
float lowerBoundX = -2.f;
float lowerBoundY = -2.f;
float scaleFactor = 4.f;
uchar4 __attribute__((kernel)) root(uint32_t x, uint32_t y) {
float2 p;
p.x = lowerBoundX + ((float)x / gDimX) * scaleFactor;
p.y = lowerBoundY + ((float)y / gDimY) * scaleFactor;
float2 t = 0;
float2 t2 = t * t;
int iter = 0;
while((t2.x + t2.y < 4.f) && (iter < gMaxIteration)) {
float xtemp = t2.x - t2.y + p.x;
t.y = 2 * t.x * t.y + p.y;
t.x = xtemp;
iter++;
t2 = t * t;
}
if(iter >= gMaxIteration) {
// write a non-transparent black pixel
return (uchar4){0, 0, 0, 0xff};
} else {
float mi3 = gMaxIteration / 3.f;
if (iter <= (gMaxIteration / 3))
return (uchar4){0xff * (iter / mi3), 0, 0, 0xff};
else if (iter <= (((gMaxIteration / 3) * 2)))
return (uchar4){0xff - (0xff * ((iter - mi3) / mi3)),
(0xff * ((iter - mi3) / mi3)), 0, 0xff};
else
return (uchar4){0, 0xff - (0xff * ((iter - (mi3 * 2)) / mi3)),
(0xff * ((iter - (mi3 * 2)) / mi3)), 0xff};
}
}

View File

@@ -1,192 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ip.rsh"
//#pragma rs_fp_relaxed
static double shadowFilterMap[] = {
-0.00591, 0.0001,
1.16488, 0.01668,
-0.18027, -0.06791,
-0.12625, 0.09001,
0.15065, -0.03897
};
static double poly[] = {
0., 0.,
0., 0.,
0.
};
static const int ABITS = 4;
static const int HSCALE = 256;
static const int k1=255 << ABITS;
static const int k2=HSCALE << ABITS;
static double fastevalPoly(double *poly,int n, double x){
double f =x;
double sum = poly[0]+poly[1]*f;
int i;
for (i = 2; i < n; i++) {
f*=x;
sum += poly[i]*f;
}
return sum;
}
static ushort3 rgb2hsv( uchar4 rgb)
{
int iMin,iMax,chroma;
int ri = rgb.r;
int gi = rgb.g;
int bi = rgb.b;
short rv,rs,rh;
if (ri > gi) {
iMax = max (ri, bi);
iMin = min (gi, bi);
} else {
iMax = max (gi, bi);
iMin = min (ri, bi);
}
chroma = iMax - iMin;
// set value
rv = (short)( iMax << ABITS);
// set saturation
if (rv == 0)
rs = 0;
else
rs = (short)((k1*chroma)/iMax);
// set hue
if (rs == 0)
rh = 0;
else {
if ( ri == iMax ) {
rh = (short)( (k2*(6*chroma+gi - bi))/(6*chroma));
if (rh >= k2) rh -= k2;
} else if (gi == iMax)
rh = (short)( (k2*(2*chroma+bi - ri ))/(6*chroma));
else // (bi == iMax )
rh = (short)( (k2*(4*chroma+ri - gi ))/(6*chroma));
}
ushort3 out;
out.x = rv;
out.y = rs;
out.z = rh;
return out;
}
static uchar4 hsv2rgb(ushort3 hsv)
{
int ABITS = 4;
int HSCALE = 256;
int m;
int H,X,ih,is,iv;
int k1=255<<ABITS;
int k2=HSCALE<<ABITS;
int k3=1<<(ABITS-1);
int rr=0;
int rg=0;
int rb=0;
short cv = hsv.x;
short cs = hsv.y;
short ch = hsv.z;
// set chroma and min component value m
//chroma = ( cv * cs )/k1;
//m = cv - chroma;
m = ((int)cv*(k1 - (int)cs ))/k1;
// chroma == 0 <-> cs == 0 --> m=cv
if (cs == 0) {
rb = ( rg = ( rr =( cv >> ABITS) ));
} else {
ih=(int)ch;
is=(int)cs;
iv=(int)cv;
H = (6*ih)/k2;
X = ((iv*is)/k2)*(k2- abs(6*ih- 2*(H>>1)*k2 - k2)) ;
// removing additional bits --> unit8
X=( (X+iv*(k1 - is ))/k1 + k3 ) >> ABITS;
m=m >> ABITS;
// ( chroma + m ) --> cv ;
cv=(short) (cv >> ABITS);
switch (H) {
case 0:
rr = cv;
rg = X;
rb = m;
break;
case 1:
rr = X;
rg = cv;
rb = m;
break;
case 2:
rr = m;
rg = cv;
rb = X;
break;
case 3:
rr = m;
rg = X;
rb = cv;
break;
case 4:
rr = X;
rg = m;
rb = cv;
break;
case 5:
rr = cv;
rg = m ;
rb = X;
break;
}
}
uchar4 rgb;
rgb.r = rr;
rgb.g = rg;
rgb.b = rb;
return rgb;
}
void prepareShadows(float scale) {
double s = (scale>=0)?scale:scale/5;
for (int i = 0; i < 5; i++) {
poly[i] = fastevalPoly(shadowFilterMap+i*2,2 , s);
}
}
void shadowsKernel(const uchar4 *in, uchar4 *out) {
ushort3 hsv = rgb2hsv(*in);
double v = (fastevalPoly(poly,5,hsv.x/4080.)*4080);
if (v>4080) v = 4080;
hsv.x = (unsigned short) ((v>0)?v:0);
*out = hsv2rgb(hsv);
}

View File

@@ -1,118 +0,0 @@
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ip.rsh"
int height;
int width;
static int radius;
rs_allocation InPixel;
rs_allocation ScratchPixel1;
rs_allocation ScratchPixel2;
const int MAX_RADIUS = 25;
// Store our coefficients here
static float gaussian[MAX_RADIUS * 2 + 1];
void setRadius(int rad) {
radius = rad;
// 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;
for (int 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 (int r = -radius; r <= radius; r ++) {
floatR = (float)r;
gaussian[r + radius] *= normalizeFactor;
}
}
float4 __attribute__((kernel)) copyIn(uchar4 in) {
return convert_float4(in);
}
uchar4 __attribute__((kernel)) vert(uint32_t x, uint32_t y) {
float3 blurredPixel = 0;
int gi = 0;
uchar4 out;
if ((y > radius) && (y < (height - radius))) {
for (int r = -radius; r <= radius; r ++) {
float4 i = rsGetElementAt_float4(ScratchPixel2, x, y + r);
blurredPixel += i.xyz * gaussian[gi++];
}
} else {
for (int r = -radius; r <= radius; r ++) {
int validH = rsClamp((int)y + r, (int)0, (int)(height - 1));
float4 i = rsGetElementAt_float4(ScratchPixel2, x, validH);
blurredPixel += i.xyz * gaussian[gi++];
}
}
out.xyz = convert_uchar3(clamp(blurredPixel, 0.f, 255.f));
out.w = 0xff;
return out;
}
float4 __attribute__((kernel)) horz(uint32_t x, uint32_t y) {
float4 blurredPixel = 0;
int gi = 0;
if ((x > radius) && (x < (width - radius))) {
for (int r = -radius; r <= radius; r ++) {
float4 i = rsGetElementAt_float4(ScratchPixel1, x + r, y);
blurredPixel += i * gaussian[gi++];
}
} else {
for (int r = -radius; r <= radius; r ++) {
// Stepping left and right away from the pixel
int validX = rsClamp((int)x + r, (int)0, (int)(width - 1));
float4 i = rsGetElementAt_float4(ScratchPixel1, validX, y);
blurredPixel += i * gaussian[gi++];
}
}
return blurredPixel;
}

View File

@@ -1,70 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ip.rsh"
float vibrance = 0.f;
static const float Rf = 0.2999f;
static const float Gf = 0.587f;
static const float Bf = 0.114f;
static float S = 0.f;
static float MS = 0.f;
static float Rt = 0.f;
static float Gt = 0.f;
static float Bt = 0.f;
static float Vib = 0.f;
void vibranceKernel(const uchar4 *in, uchar4 *out) {
float R, G, B;
int r = in->r;
int g = in->g;
int b = in->b;
float red = (r-max(g, b))/256.f;
float sx = (float)(Vib/(1+native_exp(-red*3)));
S = sx+1;
MS = 1.0f - S;
Rt = Rf * MS;
Gt = Gf * MS;
Bt = Bf * MS;
int t = (r + g) / 2;
R = r;
G = g;
B = b;
float Rc = R * (Rt + S) + G * Gt + B * Bt;
float Gc = R * Rt + G * (Gt + S) + B * Bt;
float Bc = R * Rt + G * Gt + B * (Bt + S);
out->r = rsClamp(Rc, 0, 255);
out->g = rsClamp(Gc, 0, 255);
out->b = rsClamp(Bc, 0, 255);
}
void prepareVibrance() {
Vib = vibrance/100.f;
S = Vib + 1;
MS = 1.0f - S;
Rt = Rf * MS;
Gt = Gf * MS;
Bt = Bf * MS;
}

View File

@@ -1,59 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
static float2 neg_center, axis_scale, inv_dimensions;
static float sloped_neg_range, sloped_inv_max_dist, shade, opp_shade;
void init_vignette(uint32_t dim_x, uint32_t dim_y, float center_x, float center_y,
float desired_scale, float desired_shade, float desired_slope) {
neg_center.x = -center_x;
neg_center.y = -center_y;
inv_dimensions.x = 1.f / (float)dim_x;
inv_dimensions.y = 1.f / (float)dim_y;
axis_scale = (float2)1.f;
if (dim_x > dim_y)
axis_scale.y = (float)dim_y / (float)dim_x;
else
axis_scale.x = (float)dim_x / (float)dim_y;
const float max_dist = 0.5f * length(axis_scale);
sloped_inv_max_dist = desired_slope * 1.f/max_dist;
// Range needs to be between 1.3 to 0.6. When scale is zero then range is
// 1.3 which means no vignette at all because the luminousity difference is
// less than 1/256. Expect input scale to be between 0.0 and 1.0.
const float neg_range = 0.7f*sqrt(desired_scale) - 1.3f;
sloped_neg_range = exp(neg_range * desired_slope);
shade = desired_shade;
opp_shade = 1.f - desired_shade;
}
uchar4 __attribute__((kernel)) root(uchar4 in, uint32_t x, uint32_t y) {
// Convert x and y to floating point coordinates with center as origin
const float4 fin = convert_float4(in);
const float2 inCoord = {(float)x, (float)y};
const float2 coord = mad(inCoord, inv_dimensions, neg_center);
const float sloped_dist_ratio = length(axis_scale * coord) * sloped_inv_max_dist;
const float lumen = opp_shade + shade / ( 1.0f + sloped_neg_range * exp(sloped_dist_ratio) );
float4 fout;
fout.rgb = fin.rgb * lumen;
fout.w = fin.w;
return convert_uchar4(fout);
}

View File

@@ -1,59 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
static float2 neg_center, axis_scale, inv_dimensions;
static float sloped_neg_range, sloped_inv_max_dist, shade, opp_shade;
void init_vignette(uint32_t dim_x, uint32_t dim_y, float center_x, float center_y,
float desired_scale, float desired_shade, float desired_slope) {
neg_center.x = -center_x;
neg_center.y = -center_y;
inv_dimensions.x = 1.f / (float)dim_x;
inv_dimensions.y = 1.f / (float)dim_y;
axis_scale = (float2)1.f;
if (dim_x > dim_y)
axis_scale.y = (float)dim_y / (float)dim_x;
else
axis_scale.x = (float)dim_x / (float)dim_y;
const float max_dist = 0.5f * length(axis_scale);
sloped_inv_max_dist = desired_slope * 1.f/max_dist;
// Range needs to be between 1.3 to 0.6. When scale is zero then range is
// 1.3 which means no vignette at all because the luminousity difference is
// less than 1/256. Expect input scale to be between 0.0 and 1.0.
const float neg_range = 0.7f*sqrt(desired_scale) - 1.3f;
sloped_neg_range = exp(neg_range * desired_slope);
shade = desired_shade;
opp_shade = 1.f - desired_shade;
}
uchar4 __attribute__((kernel)) root(uchar4 in, uint32_t x, uint32_t y) {
// Convert x and y to floating point coordinates with center as origin
const float4 fin = convert_float4(in);
const float2 inCoord = {(float)x, (float)y};
const float2 coord = mad(inCoord, inv_dimensions, neg_center);
const float sloped_dist_ratio = fast_length(axis_scale * coord) * sloped_inv_max_dist;
const float lumen = opp_shade + shade * half_recip(1.f + sloped_neg_range * native_exp(sloped_dist_ratio));
float4 fout;
fout.rgb = fin.rgb * lumen;
fout.w = fin.w;
return convert_uchar4(fout);
}

View File

@@ -1,20 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ip.rsh"
#include "vignette_approx.rsh"

View File

@@ -1,20 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ip.rsh"
#include "vignette_approx.rsh"

View File

@@ -1,20 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ip.rsh"
#include "vignette.rsh"

View File

@@ -1,20 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ip.rsh"
#include "vignette.rsh"

View File

@@ -1,142 +0,0 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ip.rsh"
//#pragma rs_fp_relaxed
static int histR[256] = {0}, histG[256] = {0}, histB[256] = {0};
rs_allocation histogramSource;
uint32_t histogramHeight;
uint32_t histogramWidth;
static float scaleR;
static float scaleG;
static float scaleB;
static uchar4 estimateWhite() {
for (int i = 0; i < 256; i++) {
histR[i] = 0; histG[i] = 0; histB[i] = 0;
}
for (uint32_t i = 0; i < histogramHeight; i++) {
for (uint32_t j = 0; j < histogramWidth; j++) {
uchar4 in = rsGetElementAt_uchar4(histogramSource, j, i);
histR[in.r]++;
histG[in.g]++;
histB[in.b]++;
}
}
int min_r = -1, min_g = -1, min_b = -1;
int max_r = 0, max_g = 0, max_b = 0;
int sum_r = 0, sum_g = 0, sum_b = 0;
for (int i = 1; i < 255; i++) {
int r = histR[i];
int g = histG[i];
int b = histB[i];
sum_r += r;
sum_g += g;
sum_b += b;
if (r>0){
if (min_r < 0) min_r = i;
max_r = i;
}
if (g>0){
if (min_g < 0) min_g = i;
max_g = i;
}
if (b>0){
if (min_b < 0) min_b = i;
max_b = i;
}
}
int sum15r = 0, sum15g = 0, sum15b = 0;
int count15r = 0, count15g = 0, count15b = 0;
int tmp_r = 0, tmp_g = 0, tmp_b = 0;
for (int i = 254; i >0; i--) {
int r = histR[i];
int g = histG[i];
int b = histB[i];
tmp_r += r;
tmp_g += g;
tmp_b += b;
if ((tmp_r > sum_r/20) && (tmp_r < sum_r/5)) {
sum15r += r*i;
count15r += r;
}
if ((tmp_g > sum_g/20) && (tmp_g < sum_g/5)) {
sum15g += g*i;
count15g += g;
}
if ((tmp_b > sum_b/20) && (tmp_b < sum_b/5)) {
sum15b += b*i;
count15b += b;
}
}
uchar4 out;
if ((count15r>0) && (count15g>0) && (count15b>0) ){
out.r = sum15r/count15r;
out.g = sum15g/count15g;
out.b = sum15b/count15b;
}else {
out.r = out.g = out.b = 255;
}
return out;
}
void prepareWhiteBalance() {
uchar4 estimation = estimateWhite();
int minimum = min(estimation.r, min(estimation.g, estimation.b));
int maximum = max(estimation.r, max(estimation.g, estimation.b));
float avg = (minimum + maximum) / 2.f;
scaleR = avg/estimation.r;
scaleG = avg/estimation.g;
scaleB = avg/estimation.b;
}
static unsigned char contrastClamp(int c)
{
int N = 255;
c &= ~(c >> 31);
c -= N;
c &= (c >> 31);
c += N;
return (unsigned char) c;
}
void whiteBalanceKernel(const uchar4 *in, uchar4 *out) {
float Rc = in->r*scaleR;
float Gc = in->g*scaleG;
float Bc = in->b*scaleB;
out->r = contrastClamp(Rc);
out->g = contrastClamp(Gc);
out->b = contrastClamp(Bc);
}

View File

@@ -1,40 +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.
#
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := tests
LOCAL_SRC_FILES := $(call all-java-files-under, src) \
$(call all-renderscript-files-under, src)
LOCAL_STATIC_JAVA_LIBRARIES := android.support.v8.renderscript
LOCAL_PACKAGE_NAME := ImageProcessing2
LOCAL_SDK_VERSION := 8
LOCAL_RENDERSCRIPT_TARGET_API := 18
LOCAL_RENDERSCRIPT_COMPATIBILITY := 18
LOCAL_RENDERSCRIPT_INCLUDES_OVERRIDE := $(TOPDIR)external/clang/lib/Headers \
$(TOPDIR)frameworks/rs/scriptc
LOCAL_RENDERSCRIPT_FLAGS := -rs-package-name=android.support.v8.renderscript
LOCAL_REQUIRED_MODULES := librsjni
include $(BUILD_PACKAGE)
#include $(call all-makefiles-under, $(LOCAL_PATH))

View File

@@ -1,14 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.rs.image2">
<uses-sdk android:minSdkVersion="8" />
<application android:label="IP GB">
<activity android:name="ImageProcessingActivity2">
<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: 597 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

View File

@@ -1,139 +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.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/toplevel">
<SurfaceView
android:id="@+id/surface"
android:layout_width="1dip"
android:layout_height="1dip" />
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:id="@+id/display"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/benchmark"
android:onClick="benchmark"/>
<TextView
android:id="@+id/benchmarkText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="8pt"
android:text="@string/saturation"/>
</LinearLayout>
<Spinner
android:id="@+id/filterselection"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<Spinner
android:id="@+id/spinner1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/slider1Text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="8pt"
android:layout_marginLeft="10sp"
android:layout_marginTop="15sp"
android:text="@string/saturation"/>
<SeekBar
android:id="@+id/slider1"
android:layout_marginLeft="10sp"
android:layout_marginRight="10sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/slider2Text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="8pt"
android:layout_marginLeft="10sp"
android:layout_marginTop="15sp"
android:text="@string/gamma"/>
<SeekBar
android:id="@+id/slider2"
android:layout_marginLeft="10sp"
android:layout_marginRight="10sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/slider3Text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10sp"
android:layout_marginTop="15sp"
android:textSize="8pt"
android:text="@string/out_white"/>
<SeekBar
android:id="@+id/slider3"
android:layout_marginLeft="10sp"
android:layout_marginRight="10sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/slider4Text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="8pt"
android:layout_marginLeft="10sp"
android:layout_marginTop="15sp"
android:text="@string/in_white"/>
<SeekBar
android:id="@+id/slider4"
android:layout_marginLeft="10sp"
android:layout_marginRight="10sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/slider5Text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="8pt"
android:layout_marginLeft="10sp"
android:layout_marginTop="15sp"
android:text="@string/in_white"/>
<SeekBar
android:id="@+id/slider5"
android:layout_marginLeft="10sp"
android:layout_marginRight="10sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/benchmark_all"
android:onClick="benchmark_all"/>
</LinearLayout>
</ScrollView>
</LinearLayout>

View File

@@ -1,23 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2012 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dp"
android:textSize="16sp"
/>

View File

@@ -1,34 +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>
<string name="benchmark_all">Benchmark All</string>
</resources>

Some files were not shown because too many files have changed in this diff Show More