1572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams/*
2572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * Copyright (C) 2012 The Android Open Source Project
3572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams *
4572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * you may not use this file except in compliance with the License.
6572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * You may obtain a copy of the License at
7572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams *
8572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams *
10572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * Unless required by applicable law or agreed to in writing, software
11572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * See the License for the specific language governing permissions and
14572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * limitations under the License.
15572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams */
16572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
17572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samspackage com.android.rs.sample;
18572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
19572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.app.Activity;
20572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.graphics.Bitmap;
21572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.graphics.Bitmap.Config;
22572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.graphics.BitmapFactory;
23572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.graphics.Canvas;
24572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.graphics.SurfaceTexture;
25572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.os.Bundle;
26572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.Allocation;
27572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.Element;
28572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.Matrix3f;
29572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.RenderScript;
30572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.Sampler;
31572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.Type;
32572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.Type.Builder;
33572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.util.Log;
34bb7d2680714fc0ffdcd7342eed43966e8dcef85aStephen Hinesimport android.view.Surface;
35572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.view.TextureView;
36572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.view.TextureView.SurfaceTextureListener;
37572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.view.View;
38572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.ImageView;
39572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.SeekBar;
40572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.TextView;
41572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
42572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samspublic class SampleRSActivity extends Activity {
43572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    class TextureViewUpdater implements TextureView.SurfaceTextureListener {
44572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        private Allocation mOutPixelsAllocation;
45572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        private Sampler mSampler;
46572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
47572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        TextureViewUpdater(Allocation outAlloc, Sampler sampler) {
48572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mOutPixelsAllocation = outAlloc;
49572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mSampler = sampler;
50572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
51572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
52572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        public void onSurfaceTextureUpdated(SurfaceTexture surface) {
53572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
54572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
55572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
56bb7d2680714fc0ffdcd7342eed43966e8dcef85aStephen Hines            if (surface != null) {
57bb7d2680714fc0ffdcd7342eed43966e8dcef85aStephen Hines                mOutPixelsAllocation.setSurface(new Surface(surface));
58bb7d2680714fc0ffdcd7342eed43966e8dcef85aStephen Hines            }
59572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
60572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
61572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
62bb7d2680714fc0ffdcd7342eed43966e8dcef85aStephen Hines            if (surface != null) {
63bb7d2680714fc0ffdcd7342eed43966e8dcef85aStephen Hines                mOutPixelsAllocation.setSurface(new Surface(surface));
64bb7d2680714fc0ffdcd7342eed43966e8dcef85aStephen Hines            }
65572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            filterAlloc(mOutPixelsAllocation, mSampler);
66572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
67572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
68572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
69572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            return true;
70572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
71572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
72572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
73572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private final String TAG = "Img";
74572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private Bitmap mBitmapTwoByTwo;
75572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private Bitmap mBitmapCity;
76572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
77572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mBenchmarkResult;
78572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
79572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private RenderScript mRS;
80572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private Allocation mTwoByTwoAlloc;
81572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private Allocation mCityAlloc;
82572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private ScriptC_sample mScript;
83572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
84572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onStartTrackingTouch(SeekBar seekBar) {
85572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
86572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
87572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onStopTrackingTouch(SeekBar seekBar) {
88572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
89572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
90572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    @Override
91572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    protected void onCreate(Bundle savedInstanceState) {
92572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        super.onCreate(savedInstanceState);
93572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        setContentView(R.layout.rs);
94572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
95572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBitmapTwoByTwo = loadBitmap(R.drawable.twobytwo);
96572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBitmapCity = loadBitmap(R.drawable.city);
97572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
98572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBenchmarkResult = (TextView) findViewById(R.id.benchmarkText);
99572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBenchmarkResult.setText("Result: not run");
100572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
101572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mRS = RenderScript.create(this);
102572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTwoByTwoAlloc = Allocation.createFromBitmap(mRS, mBitmapTwoByTwo,
103572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                                                          Allocation.MipmapControl.MIPMAP_NONE,
104edf588ef6a97859d0b8f6e32e494db4a02a6e4cdXiaofei Wan                                                          Allocation.USAGE_SCRIPT | Allocation.USAGE_GRAPHICS_TEXTURE);
105572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
106572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mCityAlloc = Allocation.createFromBitmap(mRS, mBitmapCity,
107572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                                                          Allocation.MipmapControl.MIPMAP_NONE,
108edf588ef6a97859d0b8f6e32e494db4a02a6e4cdXiaofei Wan                                                          Allocation.USAGE_SCRIPT | Allocation.USAGE_GRAPHICS_TEXTURE);
109572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
110572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        Type.Builder b = new Type.Builder(mRS, Element.RGBA_8888(mRS));
111572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
112572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        int usage = Allocation.USAGE_SCRIPT | Allocation.USAGE_IO_OUTPUT;
113572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
114572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        int outX = 256;
115572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        int outY = 256;
116572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
117572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // Wrap Linear
118572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        Allocation outAlloc = Allocation.createTyped(mRS, b.setX(outX).setY(outY).create(), usage);
119572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        TextureViewUpdater updater = new TextureViewUpdater(outAlloc, Sampler.WRAP_LINEAR(mRS));
120572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        TextureView displayView = (TextureView) findViewById(R.id.display);
121572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        displayView.setSurfaceTextureListener(updater);
122572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
123572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // Clamp Linear
124572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        outAlloc = Allocation.createTyped(mRS, b.setX(outX).setY(outY).create(), usage);
125572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        updater = new TextureViewUpdater(outAlloc, Sampler.CLAMP_LINEAR(mRS));
126572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        displayView = (TextureView) findViewById(R.id.display2);
127572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        displayView.setSurfaceTextureListener(updater);
128572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
129572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // Wrap Nearest
130572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        outAlloc = Allocation.createTyped(mRS, b.setX(outX).setY(outY).create(), usage);
131572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        updater = new TextureViewUpdater(outAlloc, Sampler.WRAP_NEAREST(mRS));
132572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        displayView = (TextureView) findViewById(R.id.display3);
133572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        displayView.setSurfaceTextureListener(updater);
134572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
135572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // Clamp Nearest
136572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        outAlloc = Allocation.createTyped(mRS, b.setX(outX).setY(outY).create(), usage);
137572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        updater = new TextureViewUpdater(outAlloc, Sampler.CLAMP_NEAREST(mRS));
138572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        displayView = (TextureView) findViewById(R.id.display4);
139572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        displayView.setSurfaceTextureListener(updater);
140572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
141f1d97e536561b4731997c85873dde3b3fb721cb2Stephen Hines        mScript = new ScriptC_sample(mRS);
142572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
143572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
144572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private Bitmap loadBitmap(int resource) {
145572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        final BitmapFactory.Options options = new BitmapFactory.Options();
146572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        options.inPreferredConfig = Bitmap.Config.ARGB_8888;
147572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        Bitmap b = BitmapFactory.decodeResource(getResources(), resource, options);
148572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        Bitmap b2 = Bitmap.createBitmap(b.getWidth(), b.getHeight(), b.getConfig());
149572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        Canvas c = new Canvas(b2);
150572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        c.drawBitmap(b, 0, 0, null);
151572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        b.recycle();
152572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        return b2;
153572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
154572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
155572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private synchronized void filterAlloc(Allocation alloc, Sampler sampler) {
156572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        long t = java.lang.System.currentTimeMillis();
157572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScript.invoke_setSampleData(alloc, mTwoByTwoAlloc, sampler);
158572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScript.forEach_root(alloc);
159da26caa6eecf945ddcb4f6d65b250cbd5ba3a7fdJason Sams        alloc.ioSend();
160572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mRS.finish();
161572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        t = java.lang.System.currentTimeMillis() - t;
162572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        Log.i(TAG, "Filter time is: " + t + " ms");
163572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
164572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
165572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void benchmark(View v) {
166572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        /*filterAlloc();
167572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        long t = java.lang.System.currentTimeMillis();
168572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        filterAlloc();
169572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        t = java.lang.System.currentTimeMillis() - t;
170572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mDisplayView.invalidate();
171572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBenchmarkResult.setText("Result: " + t + " ms");*/
172572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
173572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams}
174