143ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk/* 243ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk * Copyright (C) 2012 The Android Open Source Project 343ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk * 443ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License"); 543ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk * you may not use this file except in compliance with the License. 643ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk * You may obtain a copy of the License at 743ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk * 843ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk * http://www.apache.org/licenses/LICENSE-2.0 943ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk * 1043ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk * Unless required by applicable law or agreed to in writing, software 1143ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS, 1243ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1343ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk * See the License for the specific language governing permissions and 1443ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk * limitations under the License. 1543ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk */ 1643ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk 1743ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchoukpackage com.android.rs.sample; 1843ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk 1943ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchoukimport android.app.Activity; 2043ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchoukimport android.graphics.Bitmap; 2129e239203d427d977b298be7b68b75b6a4b29b51Alex Sakhartchoukimport android.graphics.Bitmap.Config; 2243ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchoukimport android.graphics.BitmapFactory; 2343ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchoukimport android.graphics.Canvas; 2443ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchoukimport android.graphics.SurfaceTexture; 2543ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchoukimport android.os.Bundle; 2643ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchoukimport android.renderscript.Allocation; 2743ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchoukimport android.renderscript.Element; 2843ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchoukimport android.renderscript.Matrix3f; 2943ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchoukimport android.renderscript.RenderScript; 3043ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchoukimport android.renderscript.Sampler; 3143ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchoukimport android.renderscript.Type; 3243ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchoukimport android.renderscript.Type.Builder; 3343ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchoukimport android.util.Log; 3443ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchoukimport android.view.TextureView; 35e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchoukimport android.view.TextureView.SurfaceTextureListener; 3643ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchoukimport android.view.View; 3743ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchoukimport android.widget.ImageView; 3843ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchoukimport android.widget.SeekBar; 3943ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchoukimport android.widget.TextView; 4043ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk 41e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchoukpublic class SampleRSActivity extends Activity { 42e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk class TextureViewUpdater implements TextureView.SurfaceTextureListener { 43e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk private Allocation mOutPixelsAllocation; 44e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk private Sampler mSampler; 45e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk 46e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk TextureViewUpdater(Allocation outAlloc, Sampler sampler) { 47e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk mOutPixelsAllocation = outAlloc; 48e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk mSampler = sampler; 49e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk } 50e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk 51e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk public void onSurfaceTextureUpdated(SurfaceTexture surface) { 52e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk } 53e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk 54e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { 55e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk mOutPixelsAllocation.setSurfaceTexture(surface); 56e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk } 57e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk 58e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { 59e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk mOutPixelsAllocation.setSurfaceTexture(surface); 60e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk filterAlloc(mOutPixelsAllocation, mSampler); 61e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk } 62e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk 63e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { 64e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk mOutPixelsAllocation.setSurfaceTexture(null); 65e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk return true; 66e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk } 67e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk } 68e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk 6943ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk private final String TAG = "Img"; 7029e239203d427d977b298be7b68b75b6a4b29b51Alex Sakhartchouk private Bitmap mBitmapTwoByTwo; 7129e239203d427d977b298be7b68b75b6a4b29b51Alex Sakhartchouk private Bitmap mBitmapCity; 7243ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk 7343ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk private TextView mBenchmarkResult; 7443ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk 7543ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk private RenderScript mRS; 7629e239203d427d977b298be7b68b75b6a4b29b51Alex Sakhartchouk private Allocation mTwoByTwoAlloc; 7729e239203d427d977b298be7b68b75b6a4b29b51Alex Sakhartchouk private Allocation mCityAlloc; 7843ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk private ScriptC_sample mScript; 7943ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk 8043ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk public void onStartTrackingTouch(SeekBar seekBar) { 8143ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk } 8243ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk 8343ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk public void onStopTrackingTouch(SeekBar seekBar) { 8443ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk } 8543ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk 8643ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk @Override 8743ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk protected void onCreate(Bundle savedInstanceState) { 8843ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk super.onCreate(savedInstanceState); 8943ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk setContentView(R.layout.rs); 9043ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk 9129e239203d427d977b298be7b68b75b6a4b29b51Alex Sakhartchouk mBitmapTwoByTwo = loadBitmap(R.drawable.twobytwo); 9229e239203d427d977b298be7b68b75b6a4b29b51Alex Sakhartchouk mBitmapCity = loadBitmap(R.drawable.city); 9343ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk 9443ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk mBenchmarkResult = (TextView) findViewById(R.id.benchmarkText); 9543ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk mBenchmarkResult.setText("Result: not run"); 9643ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk 9743ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk mRS = RenderScript.create(this); 9829e239203d427d977b298be7b68b75b6a4b29b51Alex Sakhartchouk mTwoByTwoAlloc = Allocation.createFromBitmap(mRS, mBitmapTwoByTwo, 9929e239203d427d977b298be7b68b75b6a4b29b51Alex Sakhartchouk Allocation.MipmapControl.MIPMAP_NONE, 10029e239203d427d977b298be7b68b75b6a4b29b51Alex Sakhartchouk Allocation.USAGE_SCRIPT); 10129e239203d427d977b298be7b68b75b6a4b29b51Alex Sakhartchouk 10229e239203d427d977b298be7b68b75b6a4b29b51Alex Sakhartchouk mCityAlloc = Allocation.createFromBitmap(mRS, mBitmapCity, 10343ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk Allocation.MipmapControl.MIPMAP_NONE, 10443ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk Allocation.USAGE_SCRIPT); 10543ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk 10643ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk Type.Builder b = new Type.Builder(mRS, Element.RGBA_8888(mRS)); 10743ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk 108e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk int usage = Allocation.USAGE_SCRIPT | Allocation.USAGE_IO_OUTPUT; 10943ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk 11029e239203d427d977b298be7b68b75b6a4b29b51Alex Sakhartchouk int outX = 256; 11129e239203d427d977b298be7b68b75b6a4b29b51Alex Sakhartchouk int outY = 256; 112e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk 113e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk // Wrap Linear 114e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk Allocation outAlloc = Allocation.createTyped(mRS, b.setX(outX).setY(outY).create(), usage); 115e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk TextureViewUpdater updater = new TextureViewUpdater(outAlloc, Sampler.WRAP_LINEAR(mRS)); 116e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk TextureView displayView = (TextureView) findViewById(R.id.display); 117e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk displayView.setSurfaceTextureListener(updater); 118e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk 119e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk // Clamp Linear 120e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk outAlloc = Allocation.createTyped(mRS, b.setX(outX).setY(outY).create(), usage); 121e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk updater = new TextureViewUpdater(outAlloc, Sampler.CLAMP_LINEAR(mRS)); 122e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk displayView = (TextureView) findViewById(R.id.display2); 123e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk displayView.setSurfaceTextureListener(updater); 12443ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk 125e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk // Wrap Nearest 126e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk outAlloc = Allocation.createTyped(mRS, b.setX(outX).setY(outY).create(), usage); 127e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk updater = new TextureViewUpdater(outAlloc, Sampler.WRAP_NEAREST(mRS)); 128e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk displayView = (TextureView) findViewById(R.id.display3); 129e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk displayView.setSurfaceTextureListener(updater); 130e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk 131e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk // Clamp Nearest 132e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk outAlloc = Allocation.createTyped(mRS, b.setX(outX).setY(outY).create(), usage); 133e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk updater = new TextureViewUpdater(outAlloc, Sampler.CLAMP_NEAREST(mRS)); 134e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk displayView = (TextureView) findViewById(R.id.display4); 135e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk displayView.setSurfaceTextureListener(updater); 136e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk 137e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk mScript = new ScriptC_sample(mRS, getResources(), R.raw.sample); 13843ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk } 13943ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk 14043ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk private Bitmap loadBitmap(int resource) { 14143ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk final BitmapFactory.Options options = new BitmapFactory.Options(); 14243ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk options.inPreferredConfig = Bitmap.Config.ARGB_8888; 14343ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk Bitmap b = BitmapFactory.decodeResource(getResources(), resource, options); 14443ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk Bitmap b2 = Bitmap.createBitmap(b.getWidth(), b.getHeight(), b.getConfig()); 14543ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk Canvas c = new Canvas(b2); 14643ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk c.drawBitmap(b, 0, 0, null); 14743ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk b.recycle(); 14843ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk return b2; 14943ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk } 15043ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk 151e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk private synchronized void filterAlloc(Allocation alloc, Sampler sampler) { 15243ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk long t = java.lang.System.currentTimeMillis(); 15329e239203d427d977b298be7b68b75b6a4b29b51Alex Sakhartchouk mScript.invoke_setSampleData(alloc, mTwoByTwoAlloc, sampler); 154e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk mScript.forEach_root(alloc); 155e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk alloc.ioSendOutput(); 15643ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk mRS.finish(); 15743ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk t = java.lang.System.currentTimeMillis() - t; 15843ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk Log.i(TAG, "Filter time is: " + t + " ms"); 15943ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk } 16043ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk 16143ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk public void benchmark(View v) { 162e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk /*filterAlloc(); 16343ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk long t = java.lang.System.currentTimeMillis(); 164e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk filterAlloc(); 16543ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk t = java.lang.System.currentTimeMillis() - t; 16643ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk mDisplayView.invalidate(); 167e51ae262824e2f88e143458baad71a38901c59ebAlex Sakhartchouk mBenchmarkResult.setText("Result: " + t + " ms");*/ 16843ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk } 16943ca3cfa8760ba945bb3dce3d7c1a23428b751d9Alex Sakhartchouk} 170