ThreadedRenderer.java revision e1628b7c6fc3822fa83cf02028ce8ad67abb0afe
1cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck/* 2cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * Copyright (C) 2013 The Android Open Source Project 3cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * 4cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * Licensed under the Apache License, Version 2.0 (the "License"); 5cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * you may not use this file except in compliance with the License. 6cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * You may obtain a copy of the License at 7cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * 8cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * http://www.apache.org/licenses/LICENSE-2.0 9cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * 10cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * Unless required by applicable law or agreed to in writing, software 11cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * distributed under the License is distributed on an "AS IS" BASIS, 12cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * See the License for the specific language governing permissions and 14cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * limitations under the License. 15cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck */ 16cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 17cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckpackage android.view; 18cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 1904fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckimport android.graphics.Bitmap; 20cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckimport android.graphics.Rect; 21cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckimport android.graphics.SurfaceTexture; 2266f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reckimport android.os.IBinder; 2366f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reckimport android.os.RemoteException; 2466f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reckimport android.os.ServiceManager; 25cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckimport android.os.Trace; 2666f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reckimport android.util.Log; 27315c329544d7c593d1072b071cbb92d9afe74021John Reckimport android.util.TimeUtils; 28cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckimport android.view.Surface.OutOfResourcesException; 29cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckimport android.view.View.AttachInfo; 30cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 31cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckimport java.io.PrintWriter; 32cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 33cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck/** 34cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * Hardware renderer that proxies the rendering to a render thread. Most calls 354f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * are currently synchronous. 36cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * 37cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * The UI thread can block on the RenderThread, but RenderThread must never 38cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * block on the UI thread. 39cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * 404f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * ThreadedRenderer creates an instance of RenderProxy. RenderProxy in turn creates 414f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * and manages a CanvasContext on the RenderThread. The CanvasContext is fully managed 424f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * by the lifecycle of the RenderProxy. 434f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * 44cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * Note that although currently the EGL context & surfaces are created & managed 45cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * by the render thread, the goal is to move that into a shared structure that can 46cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * be managed by both threads. EGLSurface creation & deletion should ideally be 47cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * done on the UI thread and not the RenderThread to avoid stalling the 48cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * RenderThread with surface buffer allocation. 49cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * 50cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * @hide 51cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck */ 52cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckpublic class ThreadedRenderer extends HardwareRenderer { 53cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck private static final String LOGTAG = "ThreadedRenderer"; 54cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 55e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck private static final Rect NULL_RECT = new Rect(); 56cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 57f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck // Keep in sync with DrawFrameTask.h SYNC_* flags 58f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck // Nothing interesting to report 59f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck private static final int SYNC_OK = 0x0; 60f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck // Needs a ViewRoot invalidate 61f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck private static final int SYNC_INVALIDATE_REQUIRED = 0x1; 62f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck 63cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck private int mWidth, mHeight; 644f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck private long mNativeProxy; 65f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck private boolean mInitialized = false; 66bc0cc0220b830df54c8ed41d0b53daffd7f6c991John Reck private RenderNode mRootNode; 6718f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck private Choreographer mChoreographer; 68cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 693dfe19f72cbd95b201e89376ae1810c5c9229b00John Reck ThreadedRenderer(boolean translucent) { 7066f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck AtlasInitializer.sInstance.init(); 7166f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck 72e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck long rootNodePtr = nCreateRootRenderNode(); 73e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck mRootNode = RenderNode.adopt(rootNodePtr); 74bc0cc0220b830df54c8ed41d0b53daffd7f6c991John Reck mRootNode.setClipToBounds(false); 75e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck mNativeProxy = nCreateProxy(translucent, rootNodePtr); 7618f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck 7718f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck // Setup timing 7818f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck mChoreographer = Choreographer.getInstance(); 7918f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck nSetFrameInterval(mNativeProxy, mChoreographer.getFrameIntervalNanos()); 80cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 81cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 82cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 83cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck void destroy(boolean full) { 84f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck mInitialized = false; 85f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck updateEnabledState(null); 86fae904d63947fe1687d1d44be29234cc3d538f24John Reck nDestroyCanvasAndSurface(mNativeProxy); 87cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 88cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 89f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck private void updateEnabledState(Surface surface) { 90f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck if (surface == null || !surface.isValid()) { 91f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck setEnabled(false); 92f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck } else { 93f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck setEnabled(mInitialized); 94f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck } 95f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck } 96f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck 97cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 98cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck boolean initialize(Surface surface) throws OutOfResourcesException { 99f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck mInitialized = true; 100f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck updateEnabledState(surface); 1014f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck return nInitialize(mNativeProxy, surface); 102cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 103cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 104cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 105cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck void updateSurface(Surface surface) throws OutOfResourcesException { 106f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck updateEnabledState(surface); 1074f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck nUpdateSurface(mNativeProxy, surface); 108cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 109cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 110cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 111f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck void pauseSurface(Surface surface) { 112f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck nPauseSurface(mNativeProxy, surface); 113f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck } 114f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck 115f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck @Override 116cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck void destroyHardwareResources(View view) { 1174f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck destroyResources(view); 118e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck nFlushCaches(mNativeProxy, GLES20Canvas.FLUSH_CACHES_LAYERS); 1194f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck } 1204f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 1214f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck private static void destroyResources(View view) { 1224f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck view.destroyHardwareResources(); 1234f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 1244f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck if (view instanceof ViewGroup) { 1254f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck ViewGroup group = (ViewGroup) view; 1264f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 1274f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck int count = group.getChildCount(); 1284f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck for (int i = 0; i < count; i++) { 1294f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck destroyResources(group.getChildAt(i)); 1304f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck } 1314f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck } 132cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 133cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 134cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 135cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck void invalidate(Surface surface) { 1364f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck updateSurface(surface); 137cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 138cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 139cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 140cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck boolean safelyRun(Runnable action) { 141fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck nRunWithGlContext(mNativeProxy, action); 142fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck return true; 143cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 144cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 145cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 146797b95b26bbb7557678af78b9a2a61830158920fChris Craik void setup(int width, int height, float lightX, float lightY, float lightZ, float lightRadius) { 147cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck mWidth = width; 148cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck mHeight = height; 149bc0cc0220b830df54c8ed41d0b53daffd7f6c991John Reck mRootNode.setLeftTopRightBottom(0, 0, mWidth, mHeight); 150797b95b26bbb7557678af78b9a2a61830158920fChris Craik nSetup(mNativeProxy, width, height, lightX, lightY, lightZ, lightRadius); 151cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 152cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 153cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 15463a06673253914510bbeebd500655008682dade1John Reck void setOpaque(boolean opaque) { 15563a06673253914510bbeebd500655008682dade1John Reck nSetOpaque(mNativeProxy, opaque); 15663a06673253914510bbeebd500655008682dade1John Reck } 15763a06673253914510bbeebd500655008682dade1John Reck 15863a06673253914510bbeebd500655008682dade1John Reck @Override 159cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck int getWidth() { 160cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck return mWidth; 161cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 162cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 163cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 164cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck int getHeight() { 165cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck return mHeight; 166cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 167cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 168cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 169cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck void dumpGfxInfo(PrintWriter pw) { 170cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck // TODO Auto-generated method stub 171cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 172cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 173cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 174cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck long getFrameCount() { 175cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck // TODO Auto-generated method stub 176cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck return 0; 177cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 178cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 179cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 180cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck boolean loadSystemProperties() { 181e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck return nLoadSystemProperties(mNativeProxy); 182cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 183cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 184bc0cc0220b830df54c8ed41d0b53daffd7f6c991John Reck private void updateRootDisplayList(View view, HardwareDrawCallbacks callbacks) { 185cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck view.mPrivateFlags |= View.PFLAG_DRAWN; 186cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 187cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck view.mRecreateDisplayList = (view.mPrivateFlags & View.PFLAG_INVALIDATED) 188cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck == View.PFLAG_INVALIDATED; 189cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck view.mPrivateFlags &= ~View.PFLAG_INVALIDATED; 190cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 191cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck Trace.traceBegin(Trace.TRACE_TAG_VIEW, "getDisplayList"); 192bc0cc0220b830df54c8ed41d0b53daffd7f6c991John Reck HardwareCanvas canvas = mRootNode.start(mWidth, mHeight); 19305e858400adee0f579b1e27e321b48bd55843fbdJohn Reck try { 19486faf9ec3edc24a9d04548e151bca3a2510396a4John Reck canvas.save(); 195d5b2ec4ff15f828298290534c9d322c82f8d130cAlan Viverette callbacks.onHardwarePreDraw(canvas); 19605e858400adee0f579b1e27e321b48bd55843fbdJohn Reck canvas.drawDisplayList(view.getDisplayList()); 19705e858400adee0f579b1e27e321b48bd55843fbdJohn Reck callbacks.onHardwarePostDraw(canvas); 19886faf9ec3edc24a9d04548e151bca3a2510396a4John Reck canvas.restore(); 19905e858400adee0f579b1e27e321b48bd55843fbdJohn Reck } finally { 20005e858400adee0f579b1e27e321b48bd55843fbdJohn Reck mRootNode.end(canvas); 20105e858400adee0f579b1e27e321b48bd55843fbdJohn Reck Trace.traceEnd(Trace.TRACE_TAG_VIEW); 20205e858400adee0f579b1e27e321b48bd55843fbdJohn Reck } 203cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 204cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck view.mRecreateDisplayList = false; 205bc0cc0220b830df54c8ed41d0b53daffd7f6c991John Reck } 206bc0cc0220b830df54c8ed41d0b53daffd7f6c991John Reck 207bc0cc0220b830df54c8ed41d0b53daffd7f6c991John Reck @Override 208bc0cc0220b830df54c8ed41d0b53daffd7f6c991John Reck void draw(View view, AttachInfo attachInfo, HardwareDrawCallbacks callbacks, Rect dirty) { 209bc0cc0220b830df54c8ed41d0b53daffd7f6c991John Reck attachInfo.mIgnoreDirtyState = true; 21018f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck long frameTimeNanos = mChoreographer.getFrameTimeNanos(); 211315c329544d7c593d1072b071cbb92d9afe74021John Reck attachInfo.mDrawingTime = frameTimeNanos / TimeUtils.NANOS_PER_MS; 212bc0cc0220b830df54c8ed41d0b53daffd7f6c991John Reck 213bc0cc0220b830df54c8ed41d0b53daffd7f6c991John Reck updateRootDisplayList(view, callbacks); 214cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 2156313b9259d37b59f3402058e197637aa3014516cJohn Reck attachInfo.mIgnoreDirtyState = false; 2166313b9259d37b59f3402058e197637aa3014516cJohn Reck 2174f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck if (dirty == null) { 2184f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck dirty = NULL_RECT; 2194f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck } 220f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck int syncResult = nSyncAndDrawFrame(mNativeProxy, frameTimeNanos, 22118f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck dirty.left, dirty.top, dirty.right, dirty.bottom); 222f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck if ((syncResult & SYNC_INVALIDATE_REQUIRED) != 0) { 223f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck attachInfo.mViewRootImpl.invalidate(); 224f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck } 225cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 226cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 227cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 228ae738a7a45d710115f8aedacf218d4bfa0b25698Bo Liu void invokeFunctor(long functor, boolean waitForCompletion) { 2290d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck nInvokeFunctor(mNativeProxy, functor, waitForCompletion); 2300d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck } 2310d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck 2320d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck @Override 23304fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck HardwareLayer createDisplayListLayer(int width, int height) { 23419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck long layer = nCreateDisplayListLayer(mNativeProxy, width, height); 23519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck return HardwareLayer.adoptDisplayListLayer(this, layer); 236cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 237cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 238cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 23919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck HardwareLayer createTextureLayer() { 24019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck long layer = nCreateTextureLayer(mNativeProxy); 24119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck return HardwareLayer.adoptTextureLayer(this, layer); 242cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 243cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 244cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 24519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck SurfaceTexture createSurfaceTexture(final HardwareLayer layer) { 24619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck final SurfaceTexture[] ret = new SurfaceTexture[1]; 24719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck nRunWithGlContext(mNativeProxy, new Runnable() { 24819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck @Override 24919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck public void run() { 25019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck ret[0] = layer.createSurfaceTexture(); 25119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck } 25219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck }); 25319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck return ret[0]; 254cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 255cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 256cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 25719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck boolean copyLayerInto(final HardwareLayer layer, final Bitmap bitmap) { 25819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck return nCopyLayerInto(mNativeProxy, 25919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck layer.getDeferredLayerUpdater(), bitmap.mNativeBitmap); 260cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 261cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 262cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 26319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck void pushLayerUpdate(HardwareLayer layer) { 26419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck // TODO: Remove this, it's not needed outside of GLRenderer 26519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck } 26619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 26719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck @Override 26819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck void onLayerCreated(HardwareLayer layer) { 26919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck // TODO: Is this actually useful? 27019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck } 27119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 27219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck @Override 27319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck void flushLayerUpdates() { 27419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck // TODO: Figure out what this should do or remove it 27519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck } 27619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 27719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck @Override 27819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck void onLayerDestroyed(HardwareLayer layer) { 27919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck nDestroyLayer(mNativeProxy, layer.getDeferredLayerUpdater()); 280cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 281cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 282cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 283cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck void setName(String name) { 284cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 285cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 2864f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck @Override 28728ad7b52e038ef0cdd89f753d9839444a434b299John Reck void fence() { 28828ad7b52e038ef0cdd89f753d9839444a434b299John Reck nFence(mNativeProxy); 28928ad7b52e038ef0cdd89f753d9839444a434b299John Reck } 29028ad7b52e038ef0cdd89f753d9839444a434b299John Reck 29128ad7b52e038ef0cdd89f753d9839444a434b299John Reck @Override 292a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck public void notifyFramePending() { 293a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck nNotifyFramePending(mNativeProxy); 294a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck } 295a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck 296a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck @Override 2974f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck protected void finalize() throws Throwable { 2984f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck try { 2994f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck nDeleteProxy(mNativeProxy); 3000ed751dd22a98f0c1f637570c5775b4f5e97d895John Reck mNativeProxy = 0; 3014f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck } finally { 3024f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck super.finalize(); 303cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 304cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 305cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 30666f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck private static class AtlasInitializer { 30766f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck static AtlasInitializer sInstance = new AtlasInitializer(); 30866f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck 30966f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck private boolean mInitialized = false; 31066f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck 31166f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck private AtlasInitializer() {} 31266f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck 31366f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck synchronized void init() { 31466f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck if (mInitialized) return; 31566f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck IBinder binder = ServiceManager.getService("assetatlas"); 31666f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck if (binder == null) return; 31766f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck 31866f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck IAssetAtlas atlas = IAssetAtlas.Stub.asInterface(binder); 31966f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck try { 32066f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck if (atlas.isCompatible(android.os.Process.myPpid())) { 32166f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck GraphicBuffer buffer = atlas.getBuffer(); 32266f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck if (buffer != null) { 32366f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck long[] map = atlas.getMap(); 32466f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck if (map != null) { 32566f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck nSetAtlas(buffer, map); 32666f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck mInitialized = true; 32766f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck } 32866f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck // If IAssetAtlas is not the same class as the IBinder 32966f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck // we are using a remote service and we can safely 33066f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck // destroy the graphic buffer 33166f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck if (atlas.getClass() != binder.getClass()) { 33266f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck buffer.destroy(); 33366f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck } 33466f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck } 33566f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck } 33666f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck } catch (RemoteException e) { 33766f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck Log.w(LOG_TAG, "Could not acquire atlas", e); 33866f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck } 33966f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck } 34066f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck } 34166f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck 34266f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck private static native void nSetAtlas(GraphicBuffer buffer, long[] map); 343cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 344e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck private static native long nCreateRootRenderNode(); 345e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck private static native long nCreateProxy(boolean translucent, long rootRenderNode); 3464f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck private static native void nDeleteProxy(long nativeProxy); 347cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 34818f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck private static native void nSetFrameInterval(long nativeProxy, long frameIntervalNanos); 349e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck private static native boolean nLoadSystemProperties(long nativeProxy); 35018f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck 3514f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck private static native boolean nInitialize(long nativeProxy, Surface window); 3524f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck private static native void nUpdateSurface(long nativeProxy, Surface window); 353f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck private static native void nPauseSurface(long nativeProxy, Surface window); 354797b95b26bbb7557678af78b9a2a61830158920fChris Craik private static native void nSetup(long nativeProxy, int width, int height, 355797b95b26bbb7557678af78b9a2a61830158920fChris Craik float lightX, float lightY, float lightZ, float lightRadius); 35663a06673253914510bbeebd500655008682dade1John Reck private static native void nSetOpaque(long nativeProxy, boolean opaque); 357f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck private static native int nSyncAndDrawFrame(long nativeProxy, long frameTimeNanos, 3584f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck int dirtyLeft, int dirtyTop, int dirtyRight, int dirtyBottom); 359fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck private static native void nRunWithGlContext(long nativeProxy, Runnable runnable); 360fae904d63947fe1687d1d44be29234cc3d538f24John Reck private static native void nDestroyCanvasAndSurface(long nativeProxy); 361cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 3620d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck private static native void nInvokeFunctor(long nativeProxy, long functor, boolean waitForCompletion); 36319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 36419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck private static native long nCreateDisplayListLayer(long nativeProxy, int width, int height); 36519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck private static native long nCreateTextureLayer(long nativeProxy); 36619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck private static native boolean nCopyLayerInto(long nativeProxy, long layer, long bitmap); 36719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck private static native void nDestroyLayer(long nativeProxy, long layer); 36828ad7b52e038ef0cdd89f753d9839444a434b299John Reck 369e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck private static native void nFlushCaches(long nativeProxy, int flushMode); 370e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck 37128ad7b52e038ef0cdd89f753d9839444a434b299John Reck private static native void nFence(long nativeProxy); 372a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck private static native void nNotifyFramePending(long nativeProxy); 373cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck} 374