/**
* Notifies EGL that the frame is about to be rendered.
+ * @param size
*/
- private static void beginFrame() {
- nBeginFrame();
+ private static void beginFrame(int[] size) {
+ nBeginFrame(size);
}
- private static native void nBeginFrame();
+ private static native void nBeginFrame(int[] size);
/**
* Preserves the back buffer of the current surface after a buffer swap.
private boolean mDestroyed;
private final Rect mRedrawClip = new Rect();
+ private final int[] mSurfaceSize = new int[2];
GlRenderer(int glVersion, boolean translucent) {
mGlVersion = glVersion;
final int surfaceState = checkCurrent();
if (surfaceState != SURFACE_STATE_ERROR) {
+ HardwareCanvas canvas = mCanvas;
+ attachInfo.mHardwareCanvas = canvas;
+
// We had to change the current surface and/or context, redraw everything
if (surfaceState == SURFACE_STATE_UPDATED) {
dirty = null;
+ beginFrame(null);
+ } else {
+ int[] size = mSurfaceSize;
+ beginFrame(size);
+
+ if (size[1] != mHeight || size[0] != mWidth) {
+ mWidth = size[0];
+ mHeight = size[1];
+
+ canvas.setViewport(mWidth, mHeight);
+
+ dirty = null;
+ }
}
- beginFrame();
onPreDraw(dirty);
- HardwareCanvas canvas = mCanvas;
- attachInfo.mHardwareCanvas = canvas;
-
int saveCount = canvas.save();
callbacks.onHardwarePreDraw(canvas);
// Tracing and debugging
// ----------------------------------------------------------------------------
-static void android_view_HardwareRenderer_beginFrame(JNIEnv* env, jobject clazz) {
- EGLDisplay dpy = eglGetCurrentDisplay();
- EGLSurface surf = eglGetCurrentSurface(EGL_DRAW);
- eglBeginFrame(dpy, surf);
+static void android_view_HardwareRenderer_beginFrame(JNIEnv* env, jobject clazz,
+ jintArray size) {
+
+ EGLDisplay display = eglGetCurrentDisplay();
+ EGLSurface surface = eglGetCurrentSurface(EGL_DRAW);
+
+ if (size) {
+ EGLint value;
+ jint* storage = env->GetIntArrayElements(size, NULL);
+
+ eglQuerySurface(display, surface, EGL_WIDTH, &value);
+ storage[0] = value;
+
+ eglQuerySurface(display, surface, EGL_HEIGHT, &value);
+ storage[1] = value;
+
+ env->ReleaseIntArrayElements(size, storage, 0);
+ }
+
+ eglBeginFrame(display, surface);
}
#endif // USE_OPENGL_RENDERER
static JNINativeMethod gMethods[] = {
#ifdef USE_OPENGL_RENDERER
- { "nIsBackBufferPreserved", "()Z",
- (void*) android_view_HardwareRenderer_isBackBufferPreserved },
- { "nPreserveBackBuffer", "()Z",
- (void*) android_view_HardwareRenderer_preserveBackBuffer },
- { "nDisableVsync", "()V",
- (void*) android_view_HardwareRenderer_disableVsync },
-
- { "nBeginFrame", "()V",
- (void*) android_view_HardwareRenderer_beginFrame },
+ { "nIsBackBufferPreserved", "()Z", (void*) android_view_HardwareRenderer_isBackBufferPreserved },
+ { "nPreserveBackBuffer", "()Z", (void*) android_view_HardwareRenderer_preserveBackBuffer },
+ { "nDisableVsync", "()V", (void*) android_view_HardwareRenderer_disableVsync },
+
+ { "nBeginFrame", "([I)V", (void*) android_view_HardwareRenderer_beginFrame },
#endif
{ "nSetupShadersDiskCache", "(Ljava/lang/String;)V",