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