From 1ebb7202b68d18025de8755d4f1df0c6544397e3 Mon Sep 17 00:00:00 2001 From: Jason Sams Date: Fri, 28 Sep 2012 18:17:47 -0700 Subject: Lighten grain and make live preview gpu friendly. Preview now does yuv->rgb using the intrinsic script. Grain uses a smaller wrapped rand buffer so it is not just rand test. bug 7216044 Change-Id: If74eedc7d3cf264895133671edc546af9b1527f2 --- .../src/com/android/rs/image/Grain.java | 29 +++++++++++++++++++--- .../src/com/android/rs/image/grain.rs | 14 +++++------ .../rs/livepreview/CameraPreviewActivity.java | 3 +-- .../src/com/android/rs/livepreview/RsYuv.java | 29 ++++++---------------- .../src/com/android/rs/livepreview/yuv.rs | 12 +++------ 5 files changed, 43 insertions(+), 44 deletions(-) diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/Grain.java b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/Grain.java index cd54c2e..8618cc8 100644 --- a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/Grain.java +++ b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/Grain.java @@ -45,19 +45,40 @@ public class Grain extends TestBase { 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(width); - tb.setY(height); + 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_gWidth(width); - mScript.set_gHeight(height); + mScript.set_gWMask(noiseW - 1); + mScript.set_gHMask(noiseH - 1); mScript.set_gNoiseStrength(0.5f); mScript.set_gBlendSource(mNoise); mScript.set_gNoise(mNoise2); diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/grain.rs b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/grain.rs index ea42524..c8531f3 100644 --- a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/grain.rs +++ b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/grain.rs @@ -38,15 +38,15 @@ void genRand(uchar *out) { * 1 2 1 */ -int32_t gWidth; -int32_t gHeight; +int32_t gWMask; +int32_t gHMask; rs_allocation gBlendSource; void blend9(uchar *out, uint32_t x, uint32_t y) { - uint32_t x1 = min((int32_t)x+1, (int32_t)(gWidth -1)); - uint32_t x2 = max((int32_t)x-1, (int32_t)0); - uint32_t y1 = min((int32_t)y+1, (int32_t)(gHeight -1)); - uint32_t y2 = max((int32_t)y-1, (int32_t)0); + 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); @@ -78,7 +78,7 @@ float gNoiseStrength; rs_allocation gNoise; void root(const uchar4 *in, uchar4 *out, uint32_t x, uint32_t y) { float4 ip = convert_float4(*in); - float pnoise = (float) rsGetElementAt_uchar(gNoise, x, y); + 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; diff --git a/tests/RenderScriptTests/LivePreview/src/com/android/rs/livepreview/CameraPreviewActivity.java b/tests/RenderScriptTests/LivePreview/src/com/android/rs/livepreview/CameraPreviewActivity.java index f21331f..89eec2c 100644 --- a/tests/RenderScriptTests/LivePreview/src/com/android/rs/livepreview/CameraPreviewActivity.java +++ b/tests/RenderScriptTests/LivePreview/src/com/android/rs/livepreview/CameraPreviewActivity.java @@ -305,8 +305,7 @@ public class CameraPreviewActivity extends Activity long t1 = java.lang.System.currentTimeMillis(); - mFilterYuv.execute(data); - mFilterYuv.copyOut(mCallbackBitmap); + mFilterYuv.execute(data, mCallbackBitmap); long t2 = java.lang.System.currentTimeMillis(); mTiming[mTimingSlot++] = t2 - t1; diff --git a/tests/RenderScriptTests/LivePreview/src/com/android/rs/livepreview/RsYuv.java b/tests/RenderScriptTests/LivePreview/src/com/android/rs/livepreview/RsYuv.java index cced198..978ae12 100644 --- a/tests/RenderScriptTests/LivePreview/src/com/android/rs/livepreview/RsYuv.java +++ b/tests/RenderScriptTests/LivePreview/src/com/android/rs/livepreview/RsYuv.java @@ -42,6 +42,7 @@ public class RsYuv private Allocation mAllocationOut; private Allocation mAllocationIn; private ScriptC_yuv mScript; + private ScriptIntrinsicYuvToRGB mYuv; RsYuv(RenderScript rs, Resources res, int width, int height) { mHeight = height; @@ -50,6 +51,8 @@ public class RsYuv mScript = new ScriptC_yuv(mRS, res, R.raw.yuv); mScript.invoke_setSize(mWidth, mHeight); + mYuv = ScriptIntrinsicYuvToRGB.create(rs, Element.RGBA_8888(mRS)); + Type.Builder tb = new Type.Builder(mRS, Element.RGBA_8888(mRS)); tb.setX(mWidth); tb.setY(mHeight); @@ -58,34 +61,16 @@ public class RsYuv mAllocationIn = Allocation.createSized(rs, Element.U8(mRS), (mHeight * mWidth) + ((mHeight / 2) * (mWidth / 2) * 2)); - mScript.bind_gYuvIn(mAllocationIn); + mYuv.setInput(mAllocationIn); } private long mTiming[] = new long[50]; private int mTimingSlot = 0; - void execute(byte[] yuv) { + void execute(byte[] yuv, Bitmap b) { mAllocationIn.copyFrom(yuv); - mRS.finish(); - - long t1 = java.lang.System.currentTimeMillis(); - mScript.forEach_root(mAllocationOut); - mRS.finish(); - long t2 = java.lang.System.currentTimeMillis(); - - mTiming[mTimingSlot++] = t2 - t1; - if (mTimingSlot >= mTiming.length) { - float total = 0; - for (int i=0; i