SampleRSActivity.java revision bb7d2680714fc0ffdcd7342eed43966e8dcef85a
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) {
69bb7d2680714fc0ffdcd7342eed43966e8dcef85aStephen Hines            mOutPixelsAllocation.setSurface(null);
70572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            return true;
71572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
72572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
73572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
74572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private final String TAG = "Img";
75572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private Bitmap mBitmapTwoByTwo;
76572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private Bitmap mBitmapCity;
77572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
78572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private TextView mBenchmarkResult;
79572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
80572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private RenderScript mRS;
81572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private Allocation mTwoByTwoAlloc;
82572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private Allocation mCityAlloc;
83572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private ScriptC_sample mScript;
84572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
85572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onStartTrackingTouch(SeekBar seekBar) {
86572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
87572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
88572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onStopTrackingTouch(SeekBar seekBar) {
89572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
90572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
91572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    @Override
92572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    protected void onCreate(Bundle savedInstanceState) {
93572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        super.onCreate(savedInstanceState);
94572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        setContentView(R.layout.rs);
95572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
96572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBitmapTwoByTwo = loadBitmap(R.drawable.twobytwo);
97572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBitmapCity = loadBitmap(R.drawable.city);
98572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
99572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBenchmarkResult = (TextView) findViewById(R.id.benchmarkText);
100572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBenchmarkResult.setText("Result: not run");
101572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
102572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mRS = RenderScript.create(this);
103572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mTwoByTwoAlloc = Allocation.createFromBitmap(mRS, mBitmapTwoByTwo,
104572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                                                          Allocation.MipmapControl.MIPMAP_NONE,
105572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                                                          Allocation.USAGE_SCRIPT);
106572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
107572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mCityAlloc = Allocation.createFromBitmap(mRS, mBitmapCity,
108572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                                                          Allocation.MipmapControl.MIPMAP_NONE,
109572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                                                          Allocation.USAGE_SCRIPT);
110572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
111572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        Type.Builder b = new Type.Builder(mRS, Element.RGBA_8888(mRS));
112572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
113572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        int usage = Allocation.USAGE_SCRIPT | Allocation.USAGE_IO_OUTPUT;
114572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
115572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        int outX = 256;
116572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        int outY = 256;
117572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
118572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // Wrap Linear
119572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        Allocation outAlloc = Allocation.createTyped(mRS, b.setX(outX).setY(outY).create(), usage);
120572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        TextureViewUpdater updater = new TextureViewUpdater(outAlloc, Sampler.WRAP_LINEAR(mRS));
121572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        TextureView displayView = (TextureView) findViewById(R.id.display);
122572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        displayView.setSurfaceTextureListener(updater);
123572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
124572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // Clamp Linear
125572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        outAlloc = Allocation.createTyped(mRS, b.setX(outX).setY(outY).create(), usage);
126572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        updater = new TextureViewUpdater(outAlloc, Sampler.CLAMP_LINEAR(mRS));
127572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        displayView = (TextureView) findViewById(R.id.display2);
128572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        displayView.setSurfaceTextureListener(updater);
129572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
130572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // Wrap Nearest
131572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        outAlloc = Allocation.createTyped(mRS, b.setX(outX).setY(outY).create(), usage);
132572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        updater = new TextureViewUpdater(outAlloc, Sampler.WRAP_NEAREST(mRS));
133572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        displayView = (TextureView) findViewById(R.id.display3);
134572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        displayView.setSurfaceTextureListener(updater);
135572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
136572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        // Clamp Nearest
137572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        outAlloc = Allocation.createTyped(mRS, b.setX(outX).setY(outY).create(), usage);
138572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        updater = new TextureViewUpdater(outAlloc, Sampler.CLAMP_NEAREST(mRS));
139572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        displayView = (TextureView) findViewById(R.id.display4);
140572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        displayView.setSurfaceTextureListener(updater);
141572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
142572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScript = new ScriptC_sample(mRS, getResources(), R.raw.sample);
143572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
144572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
145572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private Bitmap loadBitmap(int resource) {
146572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        final BitmapFactory.Options options = new BitmapFactory.Options();
147572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        options.inPreferredConfig = Bitmap.Config.ARGB_8888;
148572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        Bitmap b = BitmapFactory.decodeResource(getResources(), resource, options);
149572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        Bitmap b2 = Bitmap.createBitmap(b.getWidth(), b.getHeight(), b.getConfig());
150572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        Canvas c = new Canvas(b2);
151572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        c.drawBitmap(b, 0, 0, null);
152572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        b.recycle();
153572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        return b2;
154572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
155572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
156572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private synchronized void filterAlloc(Allocation alloc, Sampler sampler) {
157572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        long t = java.lang.System.currentTimeMillis();
158572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScript.invoke_setSampleData(alloc, mTwoByTwoAlloc, sampler);
159572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScript.forEach_root(alloc);
160572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        alloc.ioSendOutput();
161572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mRS.finish();
162572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        t = java.lang.System.currentTimeMillis() - t;
163572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        Log.i(TAG, "Filter time is: " + t + " ms");
164572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
165572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
166572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void benchmark(View v) {
167572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        /*filterAlloc();
168572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        long t = java.lang.System.currentTimeMillis();
169572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        filterAlloc();
170572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        t = java.lang.System.currentTimeMillis() - t;
171572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mDisplayView.invalidate();
172572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mBenchmarkResult.setText("Result: " + t + " ms");*/
173572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
174572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams}
175