RSTextureView.java revision d4ca9910982853e50429ea9233f2150ca619b3d8
1faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams/*
2faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams * Copyright (C) 2011 The Android Open Source Project
3faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams *
4faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams * you may not use this file except in compliance with the License.
6faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams * You may obtain a copy of the License at
7faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams *
8faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams *
10faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams * Unless required by applicable law or agreed to in writing, software
11faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams * See the License for the specific language governing permissions and
14faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams * limitations under the License.
15faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams */
16faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams
17faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Samspackage android.renderscript;
18faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams
19faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Samsimport java.io.Writer;
20faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Samsimport java.util.ArrayList;
21faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Samsimport java.util.concurrent.Semaphore;
22faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams
23faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Samsimport android.content.Context;
24faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Samsimport android.graphics.SurfaceTexture;
25faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Samsimport android.os.Handler;
26faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Samsimport android.os.Message;
27faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Samsimport android.util.AttributeSet;
28faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Samsimport android.util.Log;
29faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Samsimport android.view.TextureView;
30faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams
319c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines/**
32d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams * @deprecated in API 16
33684b23513c9137ddc04b06ac05a4b15be06ad2f4Jason Sams * The Texture View for a graphics renderscript (RenderScriptGL)
34684b23513c9137ddc04b06ac05a4b15be06ad2f4Jason Sams * to draw on.
35faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams *
36faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams */
37faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Samspublic class RSTextureView extends TextureView implements TextureView.SurfaceTextureListener {
38faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams    private RenderScriptGL mRS;
39faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams    private SurfaceTexture mSurfaceTexture;
40faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams
419c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
42d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams     * @deprecated in API 16
43faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     * Standard View constructor. In order to render something, you
44faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     * must call {@link android.opengl.GLSurfaceView#setRenderer} to
45faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     * register a renderer.
46faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     */
47faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams    public RSTextureView(Context context) {
48faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        super(context);
49faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        init();
50faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        //Log.v(RenderScript.LOG_TAG, "RSSurfaceView");
51faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams    }
52faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams
539c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
54d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams     * @deprecated in API 16
55faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     * Standard View constructor. In order to render something, you
56faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     * must call {@link android.opengl.GLSurfaceView#setRenderer} to
57faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     * register a renderer.
58faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     */
59faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams    public RSTextureView(Context context, AttributeSet attrs) {
60faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        super(context, attrs);
61faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        init();
62faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        //Log.v(RenderScript.LOG_TAG, "RSSurfaceView");
63faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams    }
64faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams
65faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams    private void init() {
66faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        setSurfaceTextureListener(this);
67faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        //android.util.Log.e("rs", "getSurfaceTextureListerner " + getSurfaceTextureListener());
68faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams    }
69faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams
70d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams    /**
71d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams     * @deprecated in API 16
72d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams     */
73faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams    @Override
74faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
75faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        //Log.e(RenderScript.LOG_TAG, "onSurfaceTextureAvailable");
76faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        mSurfaceTexture = surface;
77faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams
78faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        if (mRS != null) {
79faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams            mRS.setSurfaceTexture(mSurfaceTexture, width, height);
80faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        }
81faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams    }
82faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams
83d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams    /**
84d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams     * @deprecated in API 16
85d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams     */
86faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams    @Override
87faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
88faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        //Log.e(RenderScript.LOG_TAG, "onSurfaceTextureSizeChanged");
89faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        mSurfaceTexture = surface;
90faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams
91faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        if (mRS != null) {
92faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams            mRS.setSurfaceTexture(mSurfaceTexture, width, height);
93faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        }
94faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams    }
95faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams
96d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams    /**
97d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams     * @deprecated in API 16
98d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams     */
99faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams    @Override
100402f05530352f34d5320c2d23be43c274d97c4e2Grace Kloba    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
101faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        //Log.e(RenderScript.LOG_TAG, "onSurfaceTextureDestroyed");
102faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        mSurfaceTexture = surface;
103faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams
104faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        if (mRS != null) {
105faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams            mRS.setSurfaceTexture(null, 0, 0);
106faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        }
107402f05530352f34d5320c2d23be43c274d97c4e2Grace Kloba
108402f05530352f34d5320c2d23be43c274d97c4e2Grace Kloba        return true;
109faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams    }
110faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams
111d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams    /**
112d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams     * @deprecated in API 16
113d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams     */
114cf559377b750271472aa0a717bf3b7d34abc0b39Grace Kloba    @Override
115cf559377b750271472aa0a717bf3b7d34abc0b39Grace Kloba    public void onSurfaceTextureUpdated(SurfaceTexture surface) {
116cf559377b750271472aa0a717bf3b7d34abc0b39Grace Kloba        //Log.e(RenderScript.LOG_TAG, "onSurfaceTextureUpdated");
117cf559377b750271472aa0a717bf3b7d34abc0b39Grace Kloba        mSurfaceTexture = surface;
118cf559377b750271472aa0a717bf3b7d34abc0b39Grace Kloba    }
119cf559377b750271472aa0a717bf3b7d34abc0b39Grace Kloba
1209c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines   /**
121d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams     * @deprecated in API 16
122faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     * Inform the view that the activity is paused. The owner of this view must
123faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     * call this method when the activity is paused. Calling this method will
124faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     * pause the rendering thread.
125faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     * Must not be called before a renderer has been set.
126faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     */
127faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams    public void pause() {
128faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        if(mRS != null) {
129faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams            mRS.pause();
130faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        }
131faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams    }
132faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams
1339c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
134d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams     * @deprecated in API 16
135faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     * Inform the view that the activity is resumed. The owner of this view must
136faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     * call this method when the activity is resumed. Calling this method will
137faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     * recreate the OpenGL display and resume the rendering
138faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     * thread.
139faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     * Must not be called before a renderer has been set.
140faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     */
141faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams    public void resume() {
142faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        if(mRS != null) {
143faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams            mRS.resume();
144faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        }
145faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams    }
146faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams
1479c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
148d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams     * @deprecated in API 16
149faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     * Create a new RenderScriptGL object and attach it to the
150faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     * TextureView if present.
151faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     *
152faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     *
153faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     * @param sc The RS surface config to create.
154faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     *
155faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     * @return RenderScriptGL The new object created.
156faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     */
157faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams    public RenderScriptGL createRenderScriptGL(RenderScriptGL.SurfaceConfig sc) {
158faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        RenderScriptGL rs = new RenderScriptGL(this.getContext(), sc);
159faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        setRenderScriptGL(rs);
160faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        if (mSurfaceTexture != null) {
161faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams            mRS.setSurfaceTexture(mSurfaceTexture, getWidth(), getHeight());
162faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        }
163faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        return rs;
164faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams    }
165faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams
1669c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
167d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams     * @deprecated in API 16
168faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     * Destroy the RenderScriptGL object associated with this
169faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     * TextureView.
170faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     */
171faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams    public void destroyRenderScriptGL() {
172faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        mRS.destroy();
173faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        mRS = null;
174faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams    }
175faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams
1769c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
177d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams     * @deprecated in API 16
178faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     * Set a new RenderScriptGL object.  This also will attach the
179faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     * new object to the TextureView if present.
180faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     *
181faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     * @param rs The new RS object.
182faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     */
183faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams    public void setRenderScriptGL(RenderScriptGL rs) {
184faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        mRS = rs;
185faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        if (mSurfaceTexture != null) {
186faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams            mRS.setSurfaceTexture(mSurfaceTexture, getWidth(), getHeight());
187faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        }
188faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams    }
189faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams
1909c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
191d4ca9910982853e50429ea9233f2150ca619b3d8Jason Sams     * @deprecated in API 16
192faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     * Returns the previously set RenderScriptGL object.
193faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     *
194faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     * @return RenderScriptGL
195faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams     */
196faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams    public RenderScriptGL getRenderScriptGL() {
197faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams        return mRS;
198faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams    }
199faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams}
200faa32b33b50ad941f631716dd0915e936bdc3ac5Jason Sams
201