Skip to content

Commit 001dd0c

Browse files
Romain GuyAndroid (Google) Code Review
authored andcommitted
Merge "Refactor GLES20Canvas/HardwareRenderer JNI layers"
2 parents b2a331e + 244ada1 commit 001dd0c

File tree

4 files changed

+143
-112
lines changed

4 files changed

+143
-112
lines changed

core/java/android/view/GLES20Canvas.java

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -214,49 +214,6 @@ public void setViewport(int width, int height) {
214214

215215
private static native void nSetViewport(int renderer, int width, int height);
216216

217-
/**
218-
* Preserves the back buffer of the current surface after a buffer swap.
219-
* Calling this method sets the EGL_SWAP_BEHAVIOR attribute of the current
220-
* surface to EGL_BUFFER_PRESERVED. Calling this method requires an EGL
221-
* config that supports EGL_SWAP_BEHAVIOR_PRESERVED_BIT.
222-
*
223-
* @return True if the swap behavior was successfully changed,
224-
* false otherwise.
225-
*
226-
* @hide
227-
*/
228-
public static boolean preserveBackBuffer() {
229-
return nPreserveBackBuffer();
230-
}
231-
232-
private static native boolean nPreserveBackBuffer();
233-
234-
/**
235-
* Indicates whether the current surface preserves its back buffer
236-
* after a buffer swap.
237-
*
238-
* @return True, if the surface's EGL_SWAP_BEHAVIOR is EGL_BUFFER_PRESERVED,
239-
* false otherwise
240-
*
241-
* @hide
242-
*/
243-
public static boolean isBackBufferPreserved() {
244-
return nIsBackBufferPreserved();
245-
}
246-
247-
private static native boolean nIsBackBufferPreserved();
248-
249-
/**
250-
* Disables v-sync. For performance testing only.
251-
*
252-
* @hide
253-
*/
254-
public static void disableVsync() {
255-
nDisableVsync();
256-
}
257-
258-
private static native void nDisableVsync();
259-
260217
@Override
261218
public void onPreDraw(Rect dirty) {
262219
if (dirty != null) {

core/java/android/view/HardwareRenderer.java

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,43 @@ private static void beginFrame() {
281281

282282
private static native void nBeginFrame();
283283

284+
/**
285+
* Preserves the back buffer of the current surface after a buffer swap.
286+
* Calling this method sets the EGL_SWAP_BEHAVIOR attribute of the current
287+
* surface to EGL_BUFFER_PRESERVED. Calling this method requires an EGL
288+
* config that supports EGL_SWAP_BEHAVIOR_PRESERVED_BIT.
289+
*
290+
* @return True if the swap behavior was successfully changed,
291+
* false otherwise.
292+
*/
293+
static boolean preserveBackBuffer() {
294+
return nPreserveBackBuffer();
295+
}
296+
297+
private static native boolean nPreserveBackBuffer();
298+
299+
/**
300+
* Indicates whether the current surface preserves its back buffer
301+
* after a buffer swap.
302+
*
303+
* @return True, if the surface's EGL_SWAP_BEHAVIOR is EGL_BUFFER_PRESERVED,
304+
* false otherwise
305+
*/
306+
static boolean isBackBufferPreserved() {
307+
return nIsBackBufferPreserved();
308+
}
309+
310+
private static native boolean nIsBackBufferPreserved();
311+
312+
/**
313+
* Disables v-sync. For performance testing only.
314+
*/
315+
static void disableVsync() {
316+
nDisableVsync();
317+
}
318+
319+
private static native void nDisableVsync();
320+
284321
/**
285322
* Interface used to receive callbacks whenever a view is drawn by
286323
* a hardware renderer instance.
@@ -777,7 +814,7 @@ private void enableDirtyRegions() {
777814
// If mDirtyRegions is set, this means we have an EGL configuration
778815
// with EGL_SWAP_BEHAVIOR_PRESERVED_BIT set
779816
if (sDirtyRegions) {
780-
if (!(mDirtyRegionsEnabled = GLES20Canvas.preserveBackBuffer())) {
817+
if (!(mDirtyRegionsEnabled = preserveBackBuffer())) {
781818
Log.w(LOG_TAG, "Backbuffer cannot be preserved");
782819
}
783820
} else if (sDirtyRegionsRequested) {
@@ -787,7 +824,7 @@ private void enableDirtyRegions() {
787824
// want to set mDirtyRegions. We try to do this only if dirty
788825
// regions were initially requested as part of the device
789826
// configuration (see RENDER_DIRTY_REGIONS)
790-
mDirtyRegionsEnabled = GLES20Canvas.isBackBufferPreserved();
827+
mDirtyRegionsEnabled = isBackBufferPreserved();
791828
}
792829
}
793830

@@ -926,7 +963,6 @@ boolean draw(View view, View.AttachInfo attachInfo, HardwareDrawCallbacks callba
926963
}
927964

928965
beginFrame();
929-
930966
onPreDraw(dirty);
931967

932968
HardwareCanvas canvas = mCanvas;
@@ -1203,7 +1239,7 @@ void destroy(boolean full) {
12031239
void setup(int width, int height) {
12041240
super.setup(width, height);
12051241
if (mVsyncDisabled) {
1206-
GLES20Canvas.disableVsync();
1242+
disableVsync();
12071243
}
12081244
}
12091245

@@ -1247,7 +1283,7 @@ private static void destroyHardwareLayer(View view) {
12471283
}
12481284
}
12491285
}
1250-
1286+
12511287
@Override
12521288
void destroyHardwareResources(View view) {
12531289
if (view != null) {
@@ -1265,7 +1301,7 @@ void destroyHardwareResources(View view) {
12651301
GLES20Canvas.flushCaches(GLES20Canvas.FLUSH_CACHES_LAYERS);
12661302
}
12671303
}
1268-
1304+
12691305
private static void destroyResources(View view) {
12701306
view.destroyHardwareResources();
12711307

core/jni/android_view_GLES20Canvas.cpp

Lines changed: 5 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,9 @@ using namespace uirenderer;
6262
*/
6363
#ifdef USE_OPENGL_RENDERER
6464

65-
///////////////////////////////////////////////////////////////////////////////
65+
// ----------------------------------------------------------------------------
6666
// Defines
67-
///////////////////////////////////////////////////////////////////////////////
67+
// ----------------------------------------------------------------------------
6868

6969
// Debug
7070
#define DEBUG_RENDERER 0
@@ -87,52 +87,9 @@ static struct {
8787
} gRectClassInfo;
8888

8989
// ----------------------------------------------------------------------------
90-
// Misc
90+
// Caching
9191
// ----------------------------------------------------------------------------
9292

93-
static jboolean android_view_GLES20Canvas_preserveBackBuffer(JNIEnv* env, jobject clazz) {
94-
EGLDisplay display = eglGetCurrentDisplay();
95-
EGLSurface surface = eglGetCurrentSurface(EGL_DRAW);
96-
97-
eglGetError();
98-
eglSurfaceAttrib(display, surface, EGL_SWAP_BEHAVIOR, EGL_BUFFER_PRESERVED);
99-
100-
EGLint error = eglGetError();
101-
if (error != EGL_SUCCESS) {
102-
RENDERER_LOGD("Could not enable buffer preserved swap behavior (%x)", error);
103-
}
104-
105-
return error == EGL_SUCCESS;
106-
}
107-
108-
static jboolean android_view_GLES20Canvas_isBackBufferPreserved(JNIEnv* env, jobject clazz) {
109-
EGLDisplay display = eglGetCurrentDisplay();
110-
EGLSurface surface = eglGetCurrentSurface(EGL_DRAW);
111-
EGLint value;
112-
113-
eglGetError();
114-
eglQuerySurface(display, surface, EGL_SWAP_BEHAVIOR, &value);
115-
116-
EGLint error = eglGetError();
117-
if (error != EGL_SUCCESS) {
118-
RENDERER_LOGD("Could not query buffer preserved swap behavior (%x)", error);
119-
}
120-
121-
return error == EGL_SUCCESS && value == EGL_BUFFER_PRESERVED;
122-
}
123-
124-
static void android_view_GLES20Canvas_disableVsync(JNIEnv* env, jobject clazz) {
125-
EGLDisplay display = eglGetCurrentDisplay();
126-
127-
eglGetError();
128-
eglSwapInterval(display, 0);
129-
130-
EGLint error = eglGetError();
131-
if (error != EGL_SUCCESS) {
132-
RENDERER_LOGD("Could not disable v-sync (%x)", error);
133-
}
134-
}
135-
13693
static void android_view_GLES20Canvas_flushCaches(JNIEnv* env, jobject clazz,
13794
Caches::FlushMode mode) {
13895
if (Caches::hasInstance()) {
@@ -853,9 +810,6 @@ static JNINativeMethod gMethods[] = {
853810
{ "nIsAvailable", "()Z", (void*) android_view_GLES20Canvas_isAvailable },
854811

855812
#ifdef USE_OPENGL_RENDERER
856-
{ "nIsBackBufferPreserved", "()Z", (void*) android_view_GLES20Canvas_isBackBufferPreserved },
857-
{ "nPreserveBackBuffer", "()Z", (void*) android_view_GLES20Canvas_preserveBackBuffer },
858-
{ "nDisableVsync", "()V", (void*) android_view_GLES20Canvas_disableVsync },
859813
{ "nFlushCaches", "(I)V", (void*) android_view_GLES20Canvas_flushCaches },
860814
{ "nInitCaches", "()V", (void*) android_view_GLES20Canvas_initCaches },
861815
{ "nTerminateCaches", "()V", (void*) android_view_GLES20Canvas_terminateCaches },
@@ -869,8 +823,7 @@ static JNINativeMethod gMethods[] = {
869823

870824
{ "nGetStencilSize", "()I", (void*) android_view_GLES20Canvas_getStencilSize },
871825

872-
{ "nCallDrawGLFunction", "(II)I",
873-
(void*) android_view_GLES20Canvas_callDrawGLFunction },
826+
{ "nCallDrawGLFunction", "(II)I", (void*) android_view_GLES20Canvas_callDrawGLFunction },
874827

875828
{ "nSave", "(II)I", (void*) android_view_GLES20Canvas_save },
876829
{ "nRestore", "(I)V", (void*) android_view_GLES20Canvas_restore },
@@ -962,7 +915,7 @@ static JNINativeMethod gMethods[] = {
962915
{ "nResizeLayer", "(III[I)V" , (void*) android_view_GLES20Canvas_resizeLayer },
963916
{ "nCreateTextureLayer", "(Z[I)I", (void*) android_view_GLES20Canvas_createTextureLayer },
964917
{ "nUpdateTextureLayer", "(IIIZLandroid/graphics/SurfaceTexture;)V",
965-
(void*) android_view_GLES20Canvas_updateTextureLayer },
918+
(void*) android_view_GLES20Canvas_updateTextureLayer },
966919
{ "nUpdateRenderLayer", "(IIIIIII)V", (void*) android_view_GLES20Canvas_updateRenderLayer },
967920
{ "nDestroyLayer", "(I)V", (void*) android_view_GLES20Canvas_destroyLayer },
968921
{ "nDestroyLayerDeferred", "(I)V", (void*) android_view_GLES20Canvas_destroyLayerDeferred },

core/jni/android_view_HardwareRenderer.cpp

Lines changed: 96 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,41 +20,126 @@
2020
#include <nativehelper/JNIHelp.h>
2121
#include <android_runtime/AndroidRuntime.h>
2222

23-
#include <EGL/egl_cache.h>
24-
25-
EGLAPI void EGLAPIENTRY eglBeginFrame(EGLDisplay dpy, EGLSurface surface);
23+
#ifdef USE_OPENGL_RENDERER
24+
#include <EGL/egl_cache.h>
25+
EGLAPI void EGLAPIENTRY eglBeginFrame(EGLDisplay dpy, EGLSurface surface);
26+
#endif
2627

2728
namespace android {
2829

30+
/**
31+
* Note: OpenGLRenderer JNI layer is generated and compiled only on supported
32+
* devices. This means all the logic must be compiled only when the
33+
* preprocessor variable USE_OPENGL_RENDERER is defined.
34+
*/
35+
#ifdef USE_OPENGL_RENDERER
36+
2937
// ----------------------------------------------------------------------------
30-
// Misc
38+
// Defines
3139
// ----------------------------------------------------------------------------
3240

33-
static void android_view_HardwareRenderer_setupShadersDiskCache(JNIEnv* env, jobject clazz,
34-
jstring diskCachePath) {
41+
// Debug
42+
#define DEBUG_RENDERER 0
3543

36-
const char* cacheArray = env->GetStringUTFChars(diskCachePath, NULL);
37-
egl_cache_t::get()->setCacheFilename(cacheArray);
38-
env->ReleaseStringUTFChars(diskCachePath, cacheArray);
44+
// Debug
45+
#if DEBUG_RENDERER
46+
#define RENDERER_LOGD(...) ALOGD(__VA_ARGS__)
47+
#else
48+
#define RENDERER_LOGD(...)
49+
#endif
50+
51+
// ----------------------------------------------------------------------------
52+
// Surface and display management
53+
// ----------------------------------------------------------------------------
54+
55+
static jboolean android_view_HardwareRenderer_preserveBackBuffer(JNIEnv* env, jobject clazz) {
56+
EGLDisplay display = eglGetCurrentDisplay();
57+
EGLSurface surface = eglGetCurrentSurface(EGL_DRAW);
58+
59+
eglGetError();
60+
eglSurfaceAttrib(display, surface, EGL_SWAP_BEHAVIOR, EGL_BUFFER_PRESERVED);
61+
62+
EGLint error = eglGetError();
63+
if (error != EGL_SUCCESS) {
64+
RENDERER_LOGD("Could not enable buffer preserved swap behavior (%x)", error);
65+
}
66+
67+
return error == EGL_SUCCESS;
3968
}
4069

70+
static jboolean android_view_HardwareRenderer_isBackBufferPreserved(JNIEnv* env, jobject clazz) {
71+
EGLDisplay display = eglGetCurrentDisplay();
72+
EGLSurface surface = eglGetCurrentSurface(EGL_DRAW);
73+
EGLint value;
74+
75+
eglGetError();
76+
eglQuerySurface(display, surface, EGL_SWAP_BEHAVIOR, &value);
77+
78+
EGLint error = eglGetError();
79+
if (error != EGL_SUCCESS) {
80+
RENDERER_LOGD("Could not query buffer preserved swap behavior (%x)", error);
81+
}
82+
83+
return error == EGL_SUCCESS && value == EGL_BUFFER_PRESERVED;
84+
}
85+
86+
static void android_view_HardwareRenderer_disableVsync(JNIEnv* env, jobject clazz) {
87+
EGLDisplay display = eglGetCurrentDisplay();
88+
89+
eglGetError();
90+
eglSwapInterval(display, 0);
91+
92+
EGLint error = eglGetError();
93+
if (error != EGL_SUCCESS) {
94+
RENDERER_LOGD("Could not disable v-sync (%x)", error);
95+
}
96+
}
97+
98+
// ----------------------------------------------------------------------------
99+
// Tracing and debugging
100+
// ----------------------------------------------------------------------------
101+
41102
static void android_view_HardwareRenderer_beginFrame(JNIEnv* env, jobject clazz) {
42103
EGLDisplay dpy = eglGetCurrentDisplay();
43104
EGLSurface surf = eglGetCurrentSurface(EGL_DRAW);
44105
eglBeginFrame(dpy, surf);
45106
}
46107

108+
#endif // USE_OPENGL_RENDERER
109+
110+
// ----------------------------------------------------------------------------
111+
// Shaders
112+
// ----------------------------------------------------------------------------
113+
114+
static void android_view_HardwareRenderer_setupShadersDiskCache(JNIEnv* env, jobject clazz,
115+
jstring diskCachePath) {
116+
117+
const char* cacheArray = env->GetStringUTFChars(diskCachePath, NULL);
118+
egl_cache_t::get()->setCacheFilename(cacheArray);
119+
env->ReleaseStringUTFChars(diskCachePath, cacheArray);
120+
}
121+
47122
// ----------------------------------------------------------------------------
48123
// JNI Glue
49124
// ----------------------------------------------------------------------------
50125

51126
const char* const kClassPathName = "android/view/HardwareRenderer";
52127

53128
static JNINativeMethod gMethods[] = {
54-
{ "nSetupShadersDiskCache", "(Ljava/lang/String;)V",
55-
(void*) android_view_HardwareRenderer_setupShadersDiskCache },
129+
#ifdef USE_OPENGL_RENDERER
130+
{ "nIsBackBufferPreserved", "()Z",
131+
(void*) android_view_HardwareRenderer_isBackBufferPreserved },
132+
{ "nPreserveBackBuffer", "()Z",
133+
(void*) android_view_HardwareRenderer_preserveBackBuffer },
134+
{ "nDisableVsync", "()V",
135+
(void*) android_view_HardwareRenderer_disableVsync },
136+
56137
{ "nBeginFrame", "()V",
57138
(void*) android_view_HardwareRenderer_beginFrame },
139+
#endif
140+
141+
{ "nSetupShadersDiskCache", "(Ljava/lang/String;)V",
142+
(void*) android_view_HardwareRenderer_setupShadersDiskCache },
58143
};
59144

60145
int register_android_view_HardwareRenderer(JNIEnv* env) {

0 commit comments

Comments
 (0)