diff options
Diffstat (limited to 'tests')
24 files changed, 546 insertions, 193 deletions
diff --git a/tests/HwAccelerationTest/res/layout/text_fade.xml b/tests/HwAccelerationTest/res/layout/text_fade.xml index 8da2204..08a70b3 100644 --- a/tests/HwAccelerationTest/res/layout/text_fade.xml +++ b/tests/HwAccelerationTest/res/layout/text_fade.xml @@ -32,6 +32,7 @@ android:ellipsize="marquee" android:fadingEdgeLength="16sp" android:fadingEdge="horizontal" + android:requiresFadingEdge="horizontal" android:text="This is a really really really really really really long string" android:textSize="16sp" /> diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/DatePicker.java b/tests/HwAccelerationTest/src/com/android/test/hwui/DatePicker.java index db247e3..eb4e3fd 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/DatePicker.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/DatePicker.java @@ -102,7 +102,7 @@ public class DatePicker extends FrameLayout { inflater.inflate(R.layout.date_picker, this, true); mDayPicker = (NumberPicker) findViewById(R.id.day); - mDayPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER); + mDayPicker.setFormatter(NumberPicker.getTwoDigitFormatter()); mDayPicker.setOnLongPressUpdateInterval(100); mDayPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { public void onValueChange(NumberPicker picker, int oldVal, int newVal) { @@ -111,7 +111,7 @@ public class DatePicker extends FrameLayout { } }); mMonthPicker = (NumberPicker) findViewById(R.id.month); - mMonthPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER); + mMonthPicker.setFormatter(NumberPicker.getTwoDigitFormatter()); DateFormatSymbols dfs = new DateFormatSymbols(); String[] months = dfs.getShortMonths(); diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/MultiLayersActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/MultiLayersActivity.java index 0127396..eb8a0a9 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/MultiLayersActivity.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/MultiLayersActivity.java @@ -45,10 +45,10 @@ public class MultiLayersActivity extends Activity { row1.addView(new LayerView(this, 0xffff0000), new LinearLayout.LayoutParams( 0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f)); - row1.addView(new LayerView(this, 0xff00ff00), new LinearLayout.LayoutParams( + row1.addView(new LayerView(this, 0x0f00ff00), new LinearLayout.LayoutParams( 0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f)); - row2.addView(new LayerView(this, 0xff0000ff), new LinearLayout.LayoutParams( + row2.addView(new LayerView(this, 0x0f0000ff), new LinearLayout.LayoutParams( 0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f)); row2.addView(new LayerView(this, 0xffffff00), new LinearLayout.LayoutParams( 0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f)); diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/TextFadeActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/TextFadeActivity.java index c8bbc7d..d307ef8 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/TextFadeActivity.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/TextFadeActivity.java @@ -21,7 +21,9 @@ import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.os.Bundle; +import android.text.TextUtils; import android.view.View; +import android.widget.TextView; @SuppressWarnings({"UnusedDeclaration"}) public class TextFadeActivity extends Activity { @@ -30,5 +32,8 @@ public class TextFadeActivity extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.text_fade); + + findViewById(R.id.contact_tile_name).setHorizontalFadingEdgeEnabled(true); + ((TextView) findViewById(R.id.contact_tile_name)).setEllipsize(TextUtils.TruncateAt.MARQUEE); } } diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity.java index 359447d..0ddd7fd 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity.java @@ -81,11 +81,14 @@ public class ViewLayersActivity extends Activity { leftList.setAlpha(0.5f); middleList.setLayerType(View.LAYER_TYPE_HARDWARE, p3); middleList.setAlpha(0.5f); + middleList.setVerticalFadingEdgeEnabled(true); rightList.setLayerType(View.LAYER_TYPE_SOFTWARE, p2); moveRight.start(); moveLeft.start(); rotate.start(); + + ((View) leftList.getParent()).setAlpha(0.5f); } }, 2000); } diff --git a/tests/RenderScriptTests/ComputeBenchmark/src/com/example/android/rs/computebench/compute_benchmark.rs b/tests/RenderScriptTests/ComputeBenchmark/src/com/example/android/rs/computebench/compute_benchmark.rs index 7b8ec04..2ee56ec 100644 --- a/tests/RenderScriptTests/ComputeBenchmark/src/com/example/android/rs/computebench/compute_benchmark.rs +++ b/tests/RenderScriptTests/ComputeBenchmark/src/com/example/android/rs/computebench/compute_benchmark.rs @@ -383,13 +383,12 @@ static void bench_fp_math() { } static void bench_approx_math() { - BENCH_FN_FUNC_FN(approx_recip); - BENCH_FN_FUNC_FN(approx_sqrt); - BENCH_FN_FUNC_FN(approx_rsqrt); - BENCH_FN_FUNC_FN(approx_length); - BENCH_FN_FUNC_FN_FN(approx_distance); - BENCH_FN_FUNC_FN(approx_normalize); - BENCH_FN_FUNC_FN(approx_atan); + 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() { diff --git a/tests/RenderScriptTests/ImageProcessing/res/layout/main.xml b/tests/RenderScriptTests/ImageProcessing/res/layout/main.xml index bd56d62..4715d6e 100644 --- a/tests/RenderScriptTests/ImageProcessing/res/layout/main.xml +++ b/tests/RenderScriptTests/ImageProcessing/res/layout/main.xml @@ -124,6 +124,11 @@ 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> diff --git a/tests/RenderScriptTests/ImageProcessing/res/values/strings.xml b/tests/RenderScriptTests/ImageProcessing/res/values/strings.xml index cc5cc4d..a7dd165 100644 --- a/tests/RenderScriptTests/ImageProcessing/res/values/strings.xml +++ b/tests/RenderScriptTests/ImageProcessing/res/values/strings.xml @@ -29,5 +29,6 @@ <string name="gamma">Gamma</string> <string name="saturation">Saturation</string> <string name="benchmark">Benchmark</string> + <string name="benchmark_all">Benchmark All</string> </resources> diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/Blur25.java b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/Blur25.java index 9728c12..a2e4298 100644 --- a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/Blur25.java +++ b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/Blur25.java @@ -33,8 +33,6 @@ public class Blur25 extends TestBase { private int MAX_RADIUS = 25; private ScriptC_threshold mScript; - private ScriptC_vertical_blur mScriptVBlur; - private ScriptC_horizontal_blur mScriptHBlur; private int mRadius = MAX_RADIUS; private float mSaturation = 1.0f; private Allocation mScratchPixelsAllocation1; @@ -50,22 +48,17 @@ public class Blur25 extends TestBase { b.setProgress(100); return true; } - public boolean onBar2Setup(SeekBar b, TextView t) { - b.setProgress(50); - t.setText("Saturation"); - return true; - } public void onBar1Changed(int progress) { float fRadius = progress / 100.0f; fRadius *= (float)(MAX_RADIUS); mRadius = (int)fRadius; - mScript.set_radius(mRadius); - } - public void onBar2Changed(int progress) { - mSaturation = (float)progress / 50.0f; - mScriptVBlur.invoke_setSaturation(mSaturation); + if (mUseIntrinsic) { + mIntrinsic.setRadius(mRadius); + } else { + mScript.invoke_setRadius(mRadius); + } } @@ -75,7 +68,7 @@ public class Blur25 extends TestBase { if (mUseIntrinsic) { mIntrinsic = ScriptIntrinsicBlur.create(mRS, Element.U8_4(mRS)); - mIntrinsic.setRadius(25.f); + mIntrinsic.setRadius(MAX_RADIUS); mIntrinsic.setInput(mInPixelsAllocation); } else { @@ -85,23 +78,14 @@ public class Blur25 extends TestBase { mScratchPixelsAllocation1 = Allocation.createTyped(mRS, tb.create()); mScratchPixelsAllocation2 = Allocation.createTyped(mRS, tb.create()); - mScriptVBlur = new ScriptC_vertical_blur(mRS, res, R.raw.vertical_blur); - mScriptHBlur = new ScriptC_horizontal_blur(mRS, res, R.raw.horizontal_blur); - mScript = new ScriptC_threshold(mRS, res, R.raw.threshold); mScript.set_width(width); mScript.set_height(height); - mScript.set_radius(mRadius); - - mScriptVBlur.invoke_setSaturation(mSaturation); - - mScript.bind_InPixel(mInPixelsAllocation); - mScript.bind_OutPixel(mOutPixelsAllocation); - mScript.bind_ScratchPixel1(mScratchPixelsAllocation1); - mScript.bind_ScratchPixel2(mScratchPixelsAllocation2); + mScript.invoke_setRadius(MAX_RADIUS); - mScript.set_vBlurScript(mScriptVBlur); - mScript.set_hBlurScript(mScriptHBlur); + mScript.set_InPixel(mInPixelsAllocation); + mScript.set_ScratchPixel1(mScratchPixelsAllocation1); + mScript.set_ScratchPixel2(mScratchPixelsAllocation2); } } @@ -109,7 +93,9 @@ public class Blur25 extends TestBase { if (mUseIntrinsic) { mIntrinsic.forEach(mOutPixelsAllocation); } else { - mScript.invoke_filter(); + mScript.forEach_copyIn(mInPixelsAllocation, mScratchPixelsAllocation1); + mScript.forEach_horz(mScratchPixelsAllocation2); + mScript.forEach_vert(mOutPixelsAllocation); } } @@ -117,7 +103,7 @@ public class Blur25 extends TestBase { if (mUseIntrinsic) { mIntrinsic.setRadius(MAX_RADIUS); } else { - mScript.set_radius(MAX_RADIUS); + mScript.invoke_setRadius(MAX_RADIUS); } } @@ -125,7 +111,7 @@ public class Blur25 extends TestBase { if (mUseIntrinsic) { mIntrinsic.setRadius(mRadius); } else { - mScript.set_radius(mRadius); + mScript.invoke_setRadius(mRadius); } } } diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java index 7b84355..c171a64 100644 --- a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java +++ b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java @@ -39,9 +39,21 @@ import android.view.View; import android.util.Log; import java.lang.Math; +import android.os.Environment; +import android.app.Instrumentation; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +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"; + private final String RESULT_FILE = "image_processing_result.csv"; + Bitmap mBitmapIn; Bitmap mBitmapOut; String mTestNames[]; @@ -121,6 +133,9 @@ public class ImageProcessingActivity extends Activity void changeTest(int testID) { + if (mTest != null) { + mTest.destroy(); + } switch(testID) { case 0: mTest = new LevelsV4(false, false); @@ -203,6 +218,9 @@ public class ImageProcessingActivity extends Activity case 26: mTest = new Convolve5x5(true); break; + case 27: + mTest = new Mandelbrot(); + break; } mTest.createBaseTest(this, mBitmapIn); @@ -215,7 +233,7 @@ public class ImageProcessingActivity extends Activity } void setupTests() { - mTestNames = new String[27]; + mTestNames = new String[28]; mTestNames[0] = "Levels Vec3 Relaxed"; mTestNames[1] = "Levels Vec4 Relaxed"; mTestNames[2] = "Levels Vec3 Full"; @@ -243,6 +261,8 @@ public class ImageProcessingActivity extends Activity mTestNames[24] = "CrossProcess (using LUT)"; mTestNames[25] = "Convolve 5x5"; mTestNames[26] = "Intrinsics Convolve 5x5"; + mTestNames[27] = "Mandelbrot"; + mTestSpinner.setAdapter(new ArrayAdapter<String>( this, R.layout.spinner_layout, mTestNames)); } @@ -320,6 +340,33 @@ public class ImageProcessingActivity extends Activity //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 (int i = 0; i < mTestNames.length; i++ ) { + changeTest(i); + float t = getBenchmark(); + String s = new String("" + mTestNames[i] + ", " + 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(0); } // For benchmark test @@ -329,7 +376,7 @@ public class ImageProcessingActivity extends Activity mTest.setupBenchmark(); long result = 0; - Log.v(TAG, "Warming"); + //Log.v(TAG, "Warming"); long t = java.lang.System.currentTimeMillis() + 2000; do { mTest.runTest(); @@ -337,17 +384,18 @@ public class ImageProcessingActivity extends Activity } while (t > java.lang.System.currentTimeMillis()); - Log.v(TAG, "Benchmarking"); + //Log.v(TAG, "Benchmarking"); + int ct = 0; t = java.lang.System.currentTimeMillis(); - for (int i=0; i<10; i++) { + do { mTest.runTest(); - } - mTest.finish(); + mTest.finish(); + ct++; + } while ((t+5000) > java.lang.System.currentTimeMillis()); t = java.lang.System.currentTimeMillis() - t; float ft = (float)t; - ft /= 10; + ft /= ct; - Log.v(TAG, "getBenchmark: Renderscript frame time core ms " + ft); mTest.exitBenchmark(); mDoingBenchmark = false; diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/Mandelbrot.java b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/Mandelbrot.java new file mode 100644 index 0000000..20036e6 --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/Mandelbrot.java @@ -0,0 +1,98 @@ +/* + * 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(); + } + +} + diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/TestBase.java b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/TestBase.java index 3a6241d..6885181 100644 --- a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/TestBase.java +++ b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/TestBase.java @@ -108,6 +108,10 @@ public class TestBase { mRS.finish(); } + public void destroy() { + mRS.destroy(); + } + public void updateBitmap(Bitmap b) { mOutPixelsAllocation.copyTo(b); } diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/fisheye_approx.rsh b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/fisheye_approx.rsh index 008acbe..08b4126 100644 --- a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/fisheye_approx.rsh +++ b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/fisheye_approx.rsh @@ -48,8 +48,8 @@ void root(uchar4 *out, uint32_t x, uint32_t 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 = approx_rsqrt(dist2); - const float radian = M_PI_2 - approx_atan((alpha * approx_sqrt(radius2 - dist2)) * inv_dist); + 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); diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/horizontal_blur.rs b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/horizontal_blur.rs deleted file mode 100644 index ee83496..0000000 --- a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/horizontal_blur.rs +++ /dev/null @@ -1,28 +0,0 @@ -#pragma version(1) -#pragma rs_fp_relaxed - -#include "ip.rsh" - -void root(float4 *out, const void *usrData, uint32_t x, uint32_t y) { - const FilterStruct *fs = (const FilterStruct *)usrData; - float3 blurredPixel = 0; - const float *gPtr = fs->gaussian; - if ((x > fs->radius) && (x < (fs->width - fs->radius))) { - for (int r = -fs->radius; r <= fs->radius; r ++) { - const float4 *i = (const float4 *)rsGetElementAt(fs->ain, x + r, y); - blurredPixel += i->xyz * gPtr[0]; - gPtr++; - } - } else { - for (int r = -fs->radius; r <= fs->radius; r ++) { - // Stepping left and right away from the pixel - int validX = rsClamp((int)x + r, (int)0, (int)(fs->width - 1)); - const float4 *i = (const float4 *)rsGetElementAt(fs->ain, validX, y); - blurredPixel += i->xyz * gPtr[0]; - gPtr++; - } - } - - out->xyz = blurredPixel; -} - diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/ip.rsh b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/ip.rsh deleted file mode 100644 index 1d7a719..0000000 --- a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/ip.rsh +++ /dev/null @@ -1,15 +0,0 @@ -#pragma rs java_package_name(com.android.rs.image) - -#define MAX_RADIUS 25 - -typedef struct FilterStruct_s { - rs_allocation ain; - - float *gaussian; //[MAX_RADIUS * 2 + 1]; - int height; - int width; - int radius; - -} FilterStruct; - - diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/mandelbrot.rs b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/mandelbrot.rs new file mode 100644 index 0000000..da81d2e --- /dev/null +++ b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/mandelbrot.rs @@ -0,0 +1,56 @@ +// 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.android.rs.image) + +uint32_t gMaxIteration = 500; +uint32_t gDimX = 1024; +uint32_t gDimY = 1024; + +float lowerBoundX = -2.f; +float lowerBoundY = -2.f; +float scaleFactor = 4.f; + +void root(uchar4 *v_out, 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 + *v_out = (uchar4){0, 0, 0, 0xff}; + } else { + float mi3 = gMaxIteration / 3.; + if (iter <= (gMaxIteration / 3)) + *v_out = (uchar4){0xff * (iter / mi3), 0, 0, 0xff}; + else if (iter <= (((gMaxIteration / 3) * 2))) + *v_out = (uchar4){0xff - (0xff * ((iter - mi3) / mi3)), + (0xff * ((iter - mi3) / mi3)), 0, 0xff}; + else + *v_out = (uchar4){0, 0xff - (0xff * ((iter - (mi3 * 2)) / mi3)), + (0xff * ((iter - (mi3 * 2)) / mi3)), 0xff}; + } +} diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/threshold.rs b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/threshold.rs index 77cd5be..3dfa94b 100644 --- a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/threshold.rs +++ b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/threshold.rs @@ -1,26 +1,23 @@ #pragma version(1) +#pragma rs java_package_name(com.android.rs.image) +#pragma rs_fp_relaxed -#include "ip.rsh" int height; int width; -int radius; +static int radius; -uchar4 * InPixel; -uchar4 * OutPixel; -float4 * ScratchPixel1; -float4 * ScratchPixel2; +rs_allocation InPixel; +rs_allocation ScratchPixel1; +rs_allocation ScratchPixel2; -rs_script vBlurScript; -rs_script hBlurScript; - -const int CMD_FINISHED = 1; +const int MAX_RADIUS = 25; // Store our coefficients here static float gaussian[MAX_RADIUS * 2 + 1]; - -static void computeGaussianWeights() { +void setRadius(int rad) { + radius = rad; // Compute gaussian weights for the blur // e is the euler's number float e = 2.718281828459045f; @@ -45,8 +42,7 @@ static void computeGaussianWeights() { float normalizeFactor = 0.0f; float floatR = 0.0f; - int r; - for (r = -radius; r <= radius; r ++) { + for (int r = -radius; r <= radius; r ++) { floatR = (float)r; gaussian[r + radius] = coeff1 * pow(e, floatR * floatR * coeff2); normalizeFactor += gaussian[r + radius]; @@ -54,40 +50,57 @@ static void computeGaussianWeights() { //Now we need to normalize the weights because all our coefficients need to add up to one normalizeFactor = 1.0f / normalizeFactor; - for (r = -radius; r <= radius; r ++) { + for (int r = -radius; r <= radius; r ++) { floatR = (float)r; gaussian[r + radius] *= normalizeFactor; } } +void copyIn(const uchar4 *in, float4 *out) { + *out = convert_float4(*in); +} -static void copyInput() { - rs_allocation ain; - ain = rsGetAllocation(InPixel); - uint32_t dimx = rsAllocationGetDimX(ain); - uint32_t dimy = rsAllocationGetDimY(ain); - for (uint32_t y = 0; y < dimy; y++) { - for (uint32_t x = 0; x < dimx; x++) { - ScratchPixel1[x + y * dimx] = convert_float4(InPixel[x + y * dimx]); +void vert(uchar4 *out, uint32_t x, uint32_t y) { + float3 blurredPixel = 0; + const float *gPtr = gaussian; + if ((y > radius) && (y < (height - radius))) { + for (int r = -radius; r <= radius; r ++) { + const float4 *i = (const float4 *)rsGetElementAt(ScratchPixel2, x, y + r); + blurredPixel += i->xyz * gPtr[0]; + gPtr++; + } + } else { + for (int r = -radius; r <= radius; r ++) { + int validH = rsClamp((int)y + r, (int)0, (int)(height - 1)); + const float4 *i = (const float4 *)rsGetElementAt(ScratchPixel2, x, validH); + blurredPixel += i->xyz * gPtr[0]; + gPtr++; } } -} -void filter() { - copyInput(); - computeGaussianWeights(); - - FilterStruct fs; - fs.gaussian = gaussian; - fs.width = width; - fs.height = height; - fs.radius = radius; + out->xyz = convert_uchar3(clamp(blurredPixel, 0.f, 255.f)); + out->w = 0xff; +} - fs.ain = rsGetAllocation(ScratchPixel1); - rsForEach(hBlurScript, fs.ain, rsGetAllocation(ScratchPixel2), &fs, sizeof(fs)); +void horz(float4 *out, uint32_t x, uint32_t y) { + float3 blurredPixel = 0; + const float *gPtr = gaussian; + if ((x > radius) && (x < (width - radius))) { + for (int r = -radius; r <= radius; r ++) { + const float4 *i = (const float4 *)rsGetElementAt(ScratchPixel1, x + r, y); + blurredPixel += i->xyz * gPtr[0]; + gPtr++; + } + } 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)); + const float4 *i = (const float4 *)rsGetElementAt(ScratchPixel1, validX, y); + blurredPixel += i->xyz * gPtr[0]; + gPtr++; + } + } - fs.ain = rsGetAllocation(ScratchPixel2); - rsForEach(vBlurScript, fs.ain, rsGetAllocation(OutPixel), &fs, sizeof(fs)); - //rsSendToClientBlocking(CMD_FINISHED); + out->xyz = blurredPixel; } diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vertical_blur.rs b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vertical_blur.rs deleted file mode 100644 index 60fd71b..0000000 --- a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vertical_blur.rs +++ /dev/null @@ -1,59 +0,0 @@ -#pragma version(1) -#pragma rs_fp_relaxed - -#include "ip.rsh" - -static float saturation; -static rs_matrix3x3 colorMat; - -void setSaturation(float sat) { - saturation = sat; - - // Saturation - // Linear weights - //float rWeight = 0.3086f; - //float gWeight = 0.6094f; - //float bWeight = 0.0820f; - - // Gamma 2.2 weights (we haven't converted our image to linear space yet for perf reasons) - float rWeight = 0.299f; - float gWeight = 0.587f; - float bWeight = 0.114f; - - float oneMinusS = 1.0f - saturation; - rsMatrixSet(&colorMat, 0, 0, oneMinusS * rWeight + saturation); - rsMatrixSet(&colorMat, 0, 1, oneMinusS * rWeight); - rsMatrixSet(&colorMat, 0, 2, oneMinusS * rWeight); - rsMatrixSet(&colorMat, 1, 0, oneMinusS * gWeight); - rsMatrixSet(&colorMat, 1, 1, oneMinusS * gWeight + saturation); - rsMatrixSet(&colorMat, 1, 2, oneMinusS * gWeight); - rsMatrixSet(&colorMat, 2, 0, oneMinusS * bWeight); - rsMatrixSet(&colorMat, 2, 1, oneMinusS * bWeight); - rsMatrixSet(&colorMat, 2, 2, oneMinusS * bWeight + saturation); -} - -void root(uchar4 *out, const void *usrData, uint32_t x, uint32_t y) { - const FilterStruct *fs = (const FilterStruct *)usrData; - float3 blurredPixel = 0; - const float *gPtr = fs->gaussian; - if ((y > fs->radius) && (y < (fs->height - fs->radius))) { - for (int r = -fs->radius; r <= fs->radius; r ++) { - const float4 *i = (const float4 *)rsGetElementAt(fs->ain, x, y + r); - blurredPixel += i->xyz * gPtr[0]; - gPtr++; - } - } else { - for (int r = -fs->radius; r <= fs->radius; r ++) { - int validH = rsClamp((int)y + r, (int)0, (int)(fs->height - 1)); - const float4 *i = (const float4 *)rsGetElementAt(fs->ain, x, validH); - blurredPixel += i->xyz * gPtr[0]; - gPtr++; - } - } - - float3 temp = rsMatrixMultiply(&colorMat, blurredPixel); - temp = clamp(temp, 0.f, 255.f); - out->xyz = convert_uchar3(temp); - out->w = 0xff; -} - diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vignette_approx.rsh b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vignette_approx.rsh index 19d0117..7f7bdcf 100644 --- a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vignette_approx.rsh +++ b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vignette_approx.rsh @@ -49,9 +49,9 @@ void root(const uchar4 *in, uchar4 *out, uint32_t x, uint32_t y) { 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 = approx_length(axis_scale * coord) * sloped_inv_max_dist; - // TODO: add approx_exp once implemented - const float lumen = opp_shade + shade * approx_recip(1.f + sloped_neg_range * exp(sloped_dist_ratio)); + const float sloped_dist_ratio = fast_length(axis_scale * coord) * sloped_inv_max_dist; + // TODO: add half_exp once implemented + const float lumen = opp_shade + shade * half_recip(1.f + sloped_neg_range * exp(sloped_dist_ratio)); float4 fout; fout.rgb = fin.rgb * lumen; fout.w = fin.w; diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/RSTestCore.java b/tests/RenderScriptTests/tests/src/com/android/rs/test/RSTestCore.java index 4d6fd10..2a06491 100644 --- a/tests/RenderScriptTests/tests/src/com/android/rs/test/RSTestCore.java +++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/RSTestCore.java @@ -70,6 +70,8 @@ public class RSTestCore { unitTests.add(new UT_unsigned(this, mRes, mCtx)); unitTests.add(new UT_array_init(this, mRes, mCtx)); unitTests.add(new UT_array_alloc(this, mRes, mCtx)); + unitTests.add(new UT_kernel(this, mRes, mCtx)); + unitTests.add(new UT_kernel_struct(this, mRes, mCtx)); unitTests.add(new UT_clamp(this, mRes, mCtx)); unitTests.add(new UT_clamp_relaxed(this, mRes, mCtx)); unitTests.add(new UT_convert(this, mRes, mCtx)); diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_kernel.java b/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_kernel.java new file mode 100644 index 0000000..e0bd33e --- /dev/null +++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_kernel.java @@ -0,0 +1,60 @@ +/* + * 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.test; + +import android.content.Context; +import android.content.res.Resources; +import android.renderscript.*; +import android.util.Log; + +public class UT_kernel extends UnitTest { + private Resources mRes; + private Allocation A; + private Allocation B; + + protected UT_kernel(RSTestCore rstc, Resources res, Context ctx) { + super(rstc, "Kernels (pass-by-value)", ctx); + mRes = res; + } + + private void initializeGlobals(RenderScript RS, ScriptC_kernel s) { + Type.Builder typeBuilder = new Type.Builder(RS, Element.I32(RS)); + int X = 5; + s.set_dimX(X); + typeBuilder.setX(X); + A = Allocation.createTyped(RS, typeBuilder.create()); + s.bind_ain(A); + B = Allocation.createTyped(RS, typeBuilder.create()); + s.bind_aout(B); + + return; + } + + public void run() { + RenderScript pRS = RenderScript.create(mCtx); + ScriptC_kernel s = new ScriptC_kernel(pRS); + pRS.setMessageHandler(mRsMessage); + initializeGlobals(pRS, s); + s.forEach_init_vars(A); + s.forEach_root(A, B); + s.invoke_verify_root(); + s.invoke_kernel_test(); + pRS.finish(); + waitForMessage(); + pRS.destroy(); + } +} diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_kernel_struct.java b/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_kernel_struct.java new file mode 100644 index 0000000..8e22810 --- /dev/null +++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_kernel_struct.java @@ -0,0 +1,61 @@ +/* + * 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.test; + +import android.content.Context; +import android.content.res.Resources; +import android.renderscript.*; +import android.util.Log; + +public class UT_kernel_struct extends UnitTest { + private Resources mRes; + private Allocation A; + private Allocation B; + + protected UT_kernel_struct(RSTestCore rstc, Resources res, Context ctx) { + super(rstc, "Kernels (struct pass-by-value)", ctx); + mRes = res; + } + + private void initializeGlobals(RenderScript RS, ScriptC_kernel_struct s) { + int X = 5; + s.set_dimX(X); + ScriptField_simpleStruct t; + t = new ScriptField_simpleStruct(RS, X); + s.bind_ain(t); + A = t.getAllocation(); + t = new ScriptField_simpleStruct(RS, X); + s.bind_aout(t); + B = t.getAllocation(); + + return; + } + + public void run() { + RenderScript pRS = RenderScript.create(mCtx); + ScriptC_kernel_struct s = new ScriptC_kernel_struct(pRS); + pRS.setMessageHandler(mRsMessage); + initializeGlobals(pRS, s); + s.forEach_init_vars(A); + s.forEach_root(A, B); + s.invoke_verify_root(); + s.invoke_kernel_struct_test(); + pRS.finish(); + waitForMessage(); + pRS.destroy(); + } +} diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/kernel.rs b/tests/RenderScriptTests/tests/src/com/android/rs/test/kernel.rs new file mode 100644 index 0000000..d6c9df3 --- /dev/null +++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/kernel.rs @@ -0,0 +1,47 @@ +#include "shared.rsh" + +int *ain; +int *aout; +int dimX; +static bool failed = false; + +void init_vars(int *out) { + *out = 7; +} + + +int __attribute__((kernel)) root(int ain, uint32_t x) { + _RS_ASSERT(ain == 7); + return ain + x; +} + +static bool test_root_output() { + bool failed = false; + int i; + + for (i = 0; i < dimX; i++) { + _RS_ASSERT(aout[i] == (i + ain[i])); + } + + if (failed) { + rsDebug("test_root_output FAILED", 0); + } + else { + rsDebug("test_root_output PASSED", 0); + } + + return failed; +} + +void verify_root() { + failed |= test_root_output(); +} + +void kernel_test() { + if (failed) { + rsSendToClientBlocking(RS_MSG_TEST_FAILED); + } + else { + rsSendToClientBlocking(RS_MSG_TEST_PASSED); + } +} diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/kernel_struct.rs b/tests/RenderScriptTests/tests/src/com/android/rs/test/kernel_struct.rs new file mode 100644 index 0000000..62c30ae --- /dev/null +++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/kernel_struct.rs @@ -0,0 +1,66 @@ +#include "shared.rsh" + +struct simpleStruct { + int i1; + char ignored1; + float f1; + int i2; + char ignored2; + float f2; +}; + +struct simpleStruct *ain; +struct simpleStruct *aout; +int dimX; +static bool failed = false; + +void init_vars(struct simpleStruct *out, uint32_t x) { + out->i1 = 0; + out->f1 = 0.f; + out->i2 = 1; + out->f2 = 1.0f; +} + +struct simpleStruct __attribute__((kernel)) + root(struct simpleStruct in, uint32_t x) { + struct simpleStruct s; + s.i1 = in.i1 + x; + s.f1 = in.f1 + x; + s.i2 = in.i2 + x; + s.f2 = in.f2 + x; + return s; +} + +static bool test_root_output() { + bool failed = false; + int i; + + for (i = 0; i < dimX; i++) { + _RS_ASSERT(aout[i].i1 == (i + ain[i].i1)); + _RS_ASSERT(aout[i].f1 == (i + ain[i].f1)); + _RS_ASSERT(aout[i].i2 == (i + ain[i].i2)); + _RS_ASSERT(aout[i].f2 == (i + ain[i].f2)); + } + + if (failed) { + rsDebug("test_root_output FAILED", 0); + } + else { + rsDebug("test_root_output PASSED", 0); + } + + return failed; +} + +void verify_root() { + failed |= test_root_output(); +} + +void kernel_struct_test() { + if (failed) { + rsSendToClientBlocking(RS_MSG_TEST_FAILED); + } + else { + rsSendToClientBlocking(RS_MSG_TEST_PASSED); + } +} |