static jboolean android_view_HardwareRenderer_preserveBackBuffer(JNIEnv* env, jobject clazz) { EGLDisplay display = eglGetCurrentDisplay(); EGLSurface surface = eglGetCurrentSurface(EGL_DRAW); eglGetError(); eglSurfaceAttrib(display, surface, EGL_SWAP_BEHAVIOR, EGL_BUFFER_PRESERVED); EGLint error = eglGetError(); if (error != EGL_SUCCESS) { RENDERER_LOGD("Could not enable buffer preserved swap behavior (%x)", error); } return error == EGL_SUCCESS; }
static jboolean android_view_HardwareRenderer_isBackBufferPreserved(JNIEnv* env, jobject clazz) { EGLDisplay display = eglGetCurrentDisplay(); EGLSurface surface = eglGetCurrentSurface(EGL_DRAW); EGLint value; eglGetError(); eglQuerySurface(display, surface, EGL_SWAP_BEHAVIOR, &value); EGLint error = eglGetError(); if (error != EGL_SUCCESS) { RENDERER_LOGD("Could not query buffer preserved swap behavior (%x)", error); } return error == EGL_SUCCESS && value == EGL_BUFFER_PRESERVED; }
void DeferredLayerUpdater::doUpdateTexImage() { if (mSurfaceTexture->updateTexImage() == NO_ERROR) { float transform[16]; int64_t frameNumber = mSurfaceTexture->getFrameNumber(); // If the GLConsumer queue is in synchronous mode, need to discard all // but latest frame, using the frame number to tell when we no longer // have newer frames to target. Since we can't tell which mode it is in, // do this unconditionally. int dropCounter = 0; while (mSurfaceTexture->updateTexImage() == NO_ERROR) { int64_t newFrameNumber = mSurfaceTexture->getFrameNumber(); if (newFrameNumber == frameNumber) break; frameNumber = newFrameNumber; dropCounter++; } bool forceFilter = false; sp<GraphicBuffer> buffer = mSurfaceTexture->getCurrentBuffer(); if (buffer != NULL) { // force filtration if buffer size != layer size forceFilter = mWidth != buffer->getWidth() || mHeight != buffer->getHeight(); } #if DEBUG_RENDERER if (dropCounter > 0) { RENDERER_LOGD("Dropped %d frames on texture layer update", dropCounter); } #endif mSurfaceTexture->getTransformMatrix(transform); GLenum renderTarget = mSurfaceTexture->getCurrentTextureTarget(); LayerRenderer::updateTextureLayer(mLayer, mWidth, mHeight, !mBlend, forceFilter, renderTarget, transform); } }