2017-03-23 11 views
1

はデフォルトでGLContextに手動で作成すると添付されますか?もしそうなら、どうですか?ここでGLConsumerは新しいサーフェステクスチャのコンテキストに既に添付されています

は一例であり、私は自分のSurfaceTextureを作成し、TextureViewに設定しようとしている:

public class MainActivity extends AppCompatActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     TextView textView = (TextView) findViewById(R.id.version); 
     TextureView textureView = (TextureView) findViewById(R.id.texture); 

     int[] arr = new int[1]; 
     GLES20.glGenTextures(1, arr, 0); 
     int texName = arr[1]; 

     SurfaceTexture surfaceTexture = new SurfaceTexture(texName); 
     textureView.setSurfaceTexture(surfaceTexture); 
    } 
} 

私は常に取得しています:

E/GLConsumer:[unnamed- 29058-0] attachToContext:GLConsumerは既に がコンテキストに添付されています

例外:

E/AndroidRuntime:致命的な例外:メイン プロセス:com.example.dkarmazin.openglesversion、PID:29058 java.lang.RuntimeException:attachToGLContext中のエラー(詳細はlogcat 参照) アンドロイドで 。 android.view.HardwareRenderer $ Gl20Renderer.setSurfaceTexture(HardwareRenderer.java:2でgraphics.SurfaceTexture.attachToGLContext(SurfaceTexture.java:215) でandroid.view.GLES20TextureLayer.setSurfaceTexture(GLES20TextureLayer.java:86) 228) android.view.TextureView.getHardwareLayer(TextureView.java:401) (android.view.View.java:13443) android.view.View.getDisplayList(View.java:13519) android.view.ViewGroup.dispatchDrawでandroid.view.ViewGroup.drawChild(ViewGroup.java:3115) でandroid.view.View.draw(View.java:14297) (ViewGroup.java:2952) ででandroid.view.View.getDisplayList(View.java:13472) android.view.View.getDisplayList(View.java:13519) android.view.View.draw(View.java:14297)android.view.View.View.drawChild(ViewGroup.java:3115)のとandroid.view.View.ViewGroup.dispatchDraw(ViewGroup.java:2952)の android.view.View.draw(View.java:14583) at android.widget.FrameLayout.draw(FrameLayout.java:472) android.view.View.getDisplayList(View.java:13477) (android.view.View.getDisplayList(View.java:13519)) (android)にあります。 view.View.draw(View.java:14297) android.view.ViewGroup.drawChild(ViewGroup.java:3115) android.view.ViewGroup.dispatchDraw(ViewGroup.java:2952) android.view.View.View.draw(View.java:14583) at android.support.v7.widget.ActionBarOverlayLayout.draw(ActionBarOverlayLayout.java:444) at android.view.ViewDisplayList(View.java: android.view.View.getDisplayList(View.java:13519)android.view.View.draw(View.java:14297)android.view.ViewGroup.drawChildで でで13477) (ViewGroup.java:3115) android.viewの ViewGroup.dispatchDraw(ViewGroup.java:2952)android.view.View.getDisplayList(View.java:13472)の とandroid.view.View.View.View.java:13519の android.view.Viewの です。ドロー(View.java:14297) android.view.ViewGroup.drawChild(ViewGroup.java:3115) android.view.ViewGroup.dispatchDraw(ViewGroup.java:2952) at android.view.ViewDisplayList View.java:13472)android.view.ViewGroup.drawChildでandroid.view.View.draw(View.java:14297) でandroid.view.View.getDisplayList(View.java:13519) で(のViewGroup。 java:3115) android.view.ViewGroup.dispatchDraw(ViewGroup.java:2952) at android.view.View.draw(View.java:14583) at android.widget.FrameLayout.draw(FrameLayout.java: 472) at com.android.internal.policy.impl.PhoneWindow $ DecorView.draw(PhoneWindow.java:2326) at android.view.View.getDisplayList(View.java:13477) android.view.View .getDisplayList(View.java:13519) at android.view.HardwareRenderer $ GlRenderer.buildDisplayList(HardwareRenderer.java:1577) at android.v android.view.ViewRootImpl.performDrawでandroid.view.ViewRootImpl.draw(ViewRootImpl.java:2530) でiew.HardwareRenderer $ GlRenderer.draw(HardwareRenderer.java:1449) (ViewRootImpl.java:2402)アンドロイドで 。 で android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:5948) でview.ViewRootImpl.performTraversals(ViewRootImpl.java:2019)android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1079) で android.view.Choreographer $ callbackRecord.run(Choreographer.java:761) android.view.Choreographer.doCallbacks(Choreographer.java:574) android.view.Choreographer.doFrame(Choreographer.java:544) at android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:747) at android.os.Handler.handleCallback(Handler.java:733) android.app.ActivityThread.main(ActivityThread.java:5102)でandroid.os.Handler.dispatchMessage android.os.Looper.loopで(Handler.java:95) (Looper.java:136) で) (ネイティブメソッド) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:785) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) at dalvik.system.NativeStart.main (ネイティブメソッド)は、新しく作成されたSurfaceTextureオブジェクト上detachFromGLContextを呼び出す

は、問題を解決するが、それは私がattachToGLContextは、このシナリオで呼び出されないことを確認することができますよう、むしろ混乱を招くのです。

P.S.私は、TextureViewにはそれが自分自身のSurfaceTextureであることを知っています。このシナリオでは、SurfaceTextureから拡張する独自の実装を使用する必要があります。

答えて

1

他の誰かが同じ問題に直面している場合に備えて、自分の質問に答えを投稿します。 https://android.googlesource.com/platform/frameworks/base.git/+/android-4.4.4_r2.0.1/core/jni/android/graphics/SurfaceTexture.cpp#337

  • SurfaceTexture_initは、新たに作成されます。

    1. SurfaceTextureコンストラクタnativeInitがSurfaceTexture_initに対応

    2. nativeInit

      への呼び出し:おそらく、新しいSurfaceTextureが原因には、デフォルトでGLContextに取り付けられている。

      GLConsumerここ:https://android.googlesource.com/platform/frameworks/base.git/+/android-4.4.4_r2.0.1/core/jni/android/graphics/SurfaceTexture.cpp#239

    スーパーコンストラクタの呼び出しの直後に、この新しく作成されたSurfaceTexture をGLContextから手動で切り離すことができます。

    public class MySurfaceTexture extends SurfaceTexture { 
        public MySurfaceTexture(int texName) { 
         super(texName); 
         init(); 
        } 
    
        private void init() { 
         super.detachFromGLContext(); 
        } 
    } 
    

    私は特にAPI-19用のドキュメントを検索しましたが、他のAPIレベルでも同じ方法を使用できます。

  • 1

    Android Oにはすぐに添付されないnew constructorがあります。それはあなたが望むものなのです。あなたの自己回答が言うように、前のコンストラクタは自動的に現在のスレッドのGLコンテキストにアタッチします。

    関連する問題