blob: 31ab67822525587efea11cc2b027d5974826175c [file] [log] [blame]
Magnus Jedvert80cf97c2015-06-11 10:08:59 +02001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2015 The WebRTC project authors. All Rights Reserved.
Magnus Jedvert80cf97c2015-06-11 10:08:59 +02003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
Magnus Jedvert80cf97c2015-06-11 10:08:59 +02009 */
10
11package org.webrtc;
12
Magnus Jedvert1ab271c2015-09-28 11:05:44 +020013import android.graphics.SurfaceTexture;
Sami Kalliomäkie7592d82018-03-22 13:32:44 +010014import javax.annotation.Nullable;
magjed3e0f6022015-11-16 02:04:50 -080015import android.view.Surface;
magjed8c425aa2015-10-22 16:52:39 -070016import javax.microedition.khronos.egl.EGL10;
perkj96381432015-12-15 02:48:07 -080017
Magnus Jedvert80cf97c2015-06-11 10:08:59 +020018/**
perkj40455d62015-12-02 01:07:18 -080019 * Holds EGL state and utility methods for handling an egl 1.0 EGLContext, an EGLDisplay,
20 * and an EGLSurface.
Magnus Jedvert80cf97c2015-06-11 10:08:59 +020021 */
Sami Kalliomäkib9f3f9b2017-11-30 11:23:33 +010022public interface EglBase {
perkj96381432015-12-15 02:48:07 -080023 // EGL wrapper for an actual EGLContext.
Magnus Jedvertaa568a62017-09-18 11:26:30 +020024 public interface Context { long getNativeEglContext(); }
perkj96381432015-12-15 02:48:07 -080025
Magnus Jedvert3db6f9b2016-03-31 13:17:11 +020026 // According to the documentation, EGL can be used from multiple threads at the same time if each
27 // thread has its own EGLContext, but in practice it deadlocks on some devices when doing this.
28 // Therefore, synchronize on this global lock before calling dangerous EGL functions that might
29 // deadlock. See https://bugs.chromium.org/p/webrtc/issues/detail?id=5702 for more info.
30 public static final Object lock = new Object();
31
magjed8c425aa2015-10-22 16:52:39 -070032 // These constants are taken from EGL14.EGL_OPENGL_ES2_BIT and EGL14.EGL_CONTEXT_CLIENT_VERSION.
33 // https://android.googlesource.com/platform/frameworks/base/+/master/opengl/java/android/opengl/EGL14.java
34 // This is similar to how GlSurfaceView does:
35 // http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/opengl/GLSurfaceView.java#760
magjed47815522017-08-25 06:28:00 -070036 public static final int EGL_OPENGL_ES2_BIT = 4;
Magnus Jedvert80cf97c2015-06-11 10:08:59 +020037 // Android-specific extension.
magjed47815522017-08-25 06:28:00 -070038 public static final int EGL_RECORDABLE_ANDROID = 0x3142;
Magnus Jedvert80cf97c2015-06-11 10:08:59 +020039
sakalb6760f92016-09-29 04:12:44 -070040 // clang-format off
nisse03f80eb2015-12-07 01:17:16 -080041 public static final int[] CONFIG_PLAIN = {
42 EGL10.EGL_RED_SIZE, 8,
43 EGL10.EGL_GREEN_SIZE, 8,
44 EGL10.EGL_BLUE_SIZE, 8,
45 EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
46 EGL10.EGL_NONE
47 };
Magnus Jedvert51254332015-12-15 16:22:29 +010048 public static final int[] CONFIG_RGBA = {
49 EGL10.EGL_RED_SIZE, 8,
50 EGL10.EGL_GREEN_SIZE, 8,
51 EGL10.EGL_BLUE_SIZE, 8,
52 EGL10.EGL_ALPHA_SIZE, 8,
53 EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
54 EGL10.EGL_NONE
55 };
nisse03f80eb2015-12-07 01:17:16 -080056 public static final int[] CONFIG_PIXEL_BUFFER = {
57 EGL10.EGL_RED_SIZE, 8,
58 EGL10.EGL_GREEN_SIZE, 8,
59 EGL10.EGL_BLUE_SIZE, 8,
60 EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
61 EGL10.EGL_SURFACE_TYPE, EGL10.EGL_PBUFFER_BIT,
62 EGL10.EGL_NONE
63 };
nissec490e012015-12-10 06:23:33 -080064 public static final int[] CONFIG_PIXEL_RGBA_BUFFER = {
65 EGL10.EGL_RED_SIZE, 8,
66 EGL10.EGL_GREEN_SIZE, 8,
67 EGL10.EGL_BLUE_SIZE, 8,
68 EGL10.EGL_ALPHA_SIZE, 8,
69 EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
70 EGL10.EGL_SURFACE_TYPE, EGL10.EGL_PBUFFER_BIT,
71 EGL10.EGL_NONE
72 };
nisse03f80eb2015-12-07 01:17:16 -080073 public static final int[] CONFIG_RECORDABLE = {
74 EGL10.EGL_RED_SIZE, 8,
75 EGL10.EGL_GREEN_SIZE, 8,
76 EGL10.EGL_BLUE_SIZE, 8,
77 EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
78 EGL_RECORDABLE_ANDROID, 1,
79 EGL10.EGL_NONE
80 };
sakalb6760f92016-09-29 04:12:44 -070081 // clang-format on
Magnus Jedvert80cf97c2015-06-11 10:08:59 +020082
magjedb04646f2017-04-21 01:34:12 -070083 /**
84 * Create a new context with the specified config attributes, sharing data with |sharedContext|.
85 * If |sharedContext| is null, a root context is created. This function will try to create an EGL
86 * 1.4 context if possible, and an EGL 1.0 context otherwise.
87 */
Sami Kalliomäkie7592d82018-03-22 13:32:44 +010088 public static EglBase create(@Nullable Context sharedContext, int[] configAttributes) {
perkj40455d62015-12-02 01:07:18 -080089 return (EglBase14.isEGL14Supported()
sakalb6760f92016-09-29 04:12:44 -070090 && (sharedContext == null || sharedContext instanceof EglBase14.Context))
91 ? new EglBase14((EglBase14.Context) sharedContext, configAttributes)
92 : new EglBase10((EglBase10.Context) sharedContext, configAttributes);
perkj40455d62015-12-02 01:07:18 -080093 }
94
magjedb04646f2017-04-21 01:34:12 -070095 /**
96 * Helper function for creating a plain root context. This function will try to create an EGL 1.4
97 * context if possible, and an EGL 1.0 context otherwise.
98 */
perkj40455d62015-12-02 01:07:18 -080099 public static EglBase create() {
magjedb04646f2017-04-21 01:34:12 -0700100 return create(null /* shaderContext */, CONFIG_PLAIN);
perkj40455d62015-12-02 01:07:18 -0800101 }
102
magjedb04646f2017-04-21 01:34:12 -0700103 /**
104 * Helper function for creating a plain context, sharing data with |sharedContext|. This function
105 * will try to create an EGL 1.4 context if possible, and an EGL 1.0 context otherwise.
106 */
Perec2922f2016-01-27 15:25:46 +0100107 public static EglBase create(Context sharedContext) {
108 return create(sharedContext, CONFIG_PLAIN);
109 }
110
magjedb04646f2017-04-21 01:34:12 -0700111 /**
112 * Explicitly create a root EGl 1.0 context with the specified config attributes.
113 */
114 public static EglBase createEgl10(int[] configAttributes) {
115 return new EglBase10(null /* shaderContext */, configAttributes);
116 }
117
118 /**
deadbeefa615e172017-05-25 10:11:25 -0700119 * Explicitly create a root EGl 1.0 context with the specified config attributes
120 * and shared context.
121 */
122 public static EglBase createEgl10(
123 javax.microedition.khronos.egl.EGLContext sharedContext, int[] configAttributes) {
124 return new EglBase10(new EglBase10.Context(sharedContext), configAttributes);
125 }
126
127 /**
magjedb04646f2017-04-21 01:34:12 -0700128 * Explicitly create a root EGl 1.4 context with the specified config attributes.
129 */
130 public static EglBase createEgl14(int[] configAttributes) {
131 return new EglBase14(null /* shaderContext */, configAttributes);
132 }
133
deadbeefa615e172017-05-25 10:11:25 -0700134 /**
135 * Explicitly create a root EGl 1.4 context with the specified config attributes
136 * and shared context.
137 */
138 public static EglBase createEgl14(
139 android.opengl.EGLContext sharedContext, int[] configAttributes) {
140 return new EglBase14(new EglBase14.Context(sharedContext), configAttributes);
141 }
142
Sami Kalliomäkib9f3f9b2017-11-30 11:23:33 +0100143 void createSurface(Surface surface);
Magnus Jedvert1ab271c2015-09-28 11:05:44 +0200144
145 // Create EGLSurface from the Android SurfaceTexture.
Sami Kalliomäkib9f3f9b2017-11-30 11:23:33 +0100146 void createSurface(SurfaceTexture surfaceTexture);
Magnus Jedvert80cf97c2015-06-11 10:08:59 +0200147
148 // Create dummy 1x1 pixel buffer surface so the context can be made current.
Sami Kalliomäkib9f3f9b2017-11-30 11:23:33 +0100149 void createDummyPbufferSurface();
magjedb28678c2015-07-26 05:17:19 -0700150
Sami Kalliomäkib9f3f9b2017-11-30 11:23:33 +0100151 void createPbufferSurface(int width, int height);
Magnus Jedvert80cf97c2015-06-11 10:08:59 +0200152
Sami Kalliomäkib9f3f9b2017-11-30 11:23:33 +0100153 Context getEglBaseContext();
Magnus Jedvert80cf97c2015-06-11 10:08:59 +0200154
Sami Kalliomäkib9f3f9b2017-11-30 11:23:33 +0100155 boolean hasSurface();
Magnus Jedvert80cf97c2015-06-11 10:08:59 +0200156
Sami Kalliomäkib9f3f9b2017-11-30 11:23:33 +0100157 int surfaceWidth();
Magnus Jedvertd476b952015-08-20 09:58:31 +0200158
Sami Kalliomäkib9f3f9b2017-11-30 11:23:33 +0100159 int surfaceHeight();
Magnus Jedvertd476b952015-08-20 09:58:31 +0200160
Sami Kalliomäkib9f3f9b2017-11-30 11:23:33 +0100161 void releaseSurface();
Magnus Jedvert80cf97c2015-06-11 10:08:59 +0200162
Sami Kalliomäkib9f3f9b2017-11-30 11:23:33 +0100163 void release();
Magnus Jedvert80cf97c2015-06-11 10:08:59 +0200164
Sami Kalliomäkib9f3f9b2017-11-30 11:23:33 +0100165 void makeCurrent();
Magnus Jedvert80cf97c2015-06-11 10:08:59 +0200166
Magnus Jedvert4ae28a12015-09-15 09:44:07 +0200167 // Detach the current EGL context, so that it can be made current on another thread.
Sami Kalliomäkib9f3f9b2017-11-30 11:23:33 +0100168 void detachCurrent();
Magnus Jedvert4ae28a12015-09-15 09:44:07 +0200169
Sami Kalliomäkib9f3f9b2017-11-30 11:23:33 +0100170 void swapBuffers();
magjed47815522017-08-25 06:28:00 -0700171
Sami Kalliomäkib9f3f9b2017-11-30 11:23:33 +0100172 void swapBuffers(long presentationTimeStampNs);
Magnus Jedvert80cf97c2015-06-11 10:08:59 +0200173}