ThreadedRenderer.java revision 57774a82f02c225941f81cf89c7a03bf899df2c1
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 1958c42c3596a2b79184c9a6b7beffc6e94cce112cAlan Viveretteimport com.android.internal.R; 2058c42c3596a2b79184c9a6b7beffc6e94cce112cAlan Viverette 21b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reckimport android.content.Context; 22b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reckimport android.content.res.Resources; 2358c42c3596a2b79184c9a6b7beffc6e94cce112cAlan Viveretteimport android.content.res.TypedArray; 2404fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reckimport android.graphics.Bitmap; 25ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viveretteimport android.graphics.Rect; 26b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reckimport android.graphics.drawable.Drawable; 2766f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reckimport android.os.IBinder; 2866f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reckimport android.os.RemoteException; 2966f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reckimport android.os.ServiceManager; 30fe5e7b7346a54537b980796ceeca66bfdbd05561John Reckimport android.os.SystemProperties; 31cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckimport android.os.Trace; 3266f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reckimport android.util.Log; 33b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reckimport android.util.LongSparseArray; 34315c329544d7c593d1072b071cbb92d9afe74021John Reckimport android.util.TimeUtils; 35cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckimport android.view.Surface.OutOfResourcesException; 36cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckimport android.view.View.AttachInfo; 37cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 38fe5e7b7346a54537b980796ceeca66bfdbd05561John Reckimport java.io.FileDescriptor; 39cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckimport java.io.PrintWriter; 40b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reckimport java.util.HashSet; 41cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 42cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck/** 43cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * Hardware renderer that proxies the rendering to a render thread. Most calls 444f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * are currently synchronous. 45cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * 46cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * The UI thread can block on the RenderThread, but RenderThread must never 47cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * block on the UI thread. 48cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * 494f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * ThreadedRenderer creates an instance of RenderProxy. RenderProxy in turn creates 504f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * and manages a CanvasContext on the RenderThread. The CanvasContext is fully managed 514f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * by the lifecycle of the RenderProxy. 524f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * 53cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * Note that although currently the EGL context & surfaces are created & managed 54cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * by the render thread, the goal is to move that into a shared structure that can 55cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * be managed by both threads. EGLSurface creation & deletion should ideally be 56cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * done on the UI thread and not the RenderThread to avoid stalling the 57cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * RenderThread with surface buffer allocation. 58cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * 59cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * @hide 60cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck */ 61cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckpublic class ThreadedRenderer extends HardwareRenderer { 62cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck private static final String LOGTAG = "ThreadedRenderer"; 63cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 64f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck // Keep in sync with DrawFrameTask.h SYNC_* flags 65f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck // Nothing interesting to report 66cd028f336e36b22dbe8cf623eb5bd2361314495cJohn Reck private static final int SYNC_OK = 0; 67f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck // Needs a ViewRoot invalidate 68cd028f336e36b22dbe8cf623eb5bd2361314495cJohn Reck private static final int SYNC_INVALIDATE_REQUIRED = 1 << 0; 69f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck 70fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck private static final String[] VISUALIZERS = { 71fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck PROFILE_PROPERTY_VISUALIZE_BARS, 72fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck }; 73fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck 74ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette // Size of the rendered content. 75cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck private int mWidth, mHeight; 76ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette 77ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette // Actual size of the drawing surface. 78ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette private int mSurfaceWidth, mSurfaceHeight; 79ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette 80ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette // Insets between the drawing surface and rendered content. These are 81ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette // applied as translation when updating the root render node. 82ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette private int mInsetTop, mInsetLeft; 83ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette 8457774a82f02c225941f81cf89c7a03bf899df2c1Alan Viverette // Whether the surface has insets. Used to protect opacity. 8557774a82f02c225941f81cf89c7a03bf899df2c1Alan Viverette private boolean mHasInsets; 8657774a82f02c225941f81cf89c7a03bf899df2c1Alan Viverette 8758c42c3596a2b79184c9a6b7beffc6e94cce112cAlan Viverette // Light and shadow properties specified by the theme. 8858c42c3596a2b79184c9a6b7beffc6e94cce112cAlan Viverette private final float mLightY; 8958c42c3596a2b79184c9a6b7beffc6e94cce112cAlan Viverette private final float mLightZ; 9058c42c3596a2b79184c9a6b7beffc6e94cce112cAlan Viverette private final float mLightRadius; 9158c42c3596a2b79184c9a6b7beffc6e94cce112cAlan Viverette private final float mAmbientShadowAlpha; 9258c42c3596a2b79184c9a6b7beffc6e94cce112cAlan Viverette private final float mSpotShadowAlpha; 9358c42c3596a2b79184c9a6b7beffc6e94cce112cAlan Viverette 944f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck private long mNativeProxy; 95f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck private boolean mInitialized = false; 96bc0cc0220b830df54c8ed41d0b53daffd7f6c991John Reck private RenderNode mRootNode; 9718f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck private Choreographer mChoreographer; 98fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck private boolean mProfilingEnabled; 99cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 100b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reck ThreadedRenderer(Context context, boolean translucent) { 10158c42c3596a2b79184c9a6b7beffc6e94cce112cAlan Viverette final TypedArray a = context.obtainStyledAttributes( 10258c42c3596a2b79184c9a6b7beffc6e94cce112cAlan Viverette null, R.styleable.Lighting, R.attr.lightingStyle, 0); 10358c42c3596a2b79184c9a6b7beffc6e94cce112cAlan Viverette mLightY = a.getDimension(R.styleable.Lighting_lightY, 0); 10458c42c3596a2b79184c9a6b7beffc6e94cce112cAlan Viverette mLightZ = a.getDimension(R.styleable.Lighting_lightZ, 0); 10558c42c3596a2b79184c9a6b7beffc6e94cce112cAlan Viverette mLightRadius = a.getDimension(R.styleable.Lighting_lightRadius, 0); 10658c42c3596a2b79184c9a6b7beffc6e94cce112cAlan Viverette mAmbientShadowAlpha = a.getFloat(R.styleable.Lighting_ambientShadowAlpha, 0); 10758c42c3596a2b79184c9a6b7beffc6e94cce112cAlan Viverette mSpotShadowAlpha = a.getFloat(R.styleable.Lighting_spotShadowAlpha, 0); 10858c42c3596a2b79184c9a6b7beffc6e94cce112cAlan Viverette a.recycle(); 10958c42c3596a2b79184c9a6b7beffc6e94cce112cAlan Viverette 110e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck long rootNodePtr = nCreateRootRenderNode(); 111e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck mRootNode = RenderNode.adopt(rootNodePtr); 112bc0cc0220b830df54c8ed41d0b53daffd7f6c991John Reck mRootNode.setClipToBounds(false); 113e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck mNativeProxy = nCreateProxy(translucent, rootNodePtr); 11418f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck 1153b20251a355c88193c439f928a84ae69483fb488John Reck AtlasInitializer.sInstance.init(context, mNativeProxy); 1163b20251a355c88193c439f928a84ae69483fb488John Reck 11718f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck // Setup timing 11818f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck mChoreographer = Choreographer.getInstance(); 11918f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck nSetFrameInterval(mNativeProxy, mChoreographer.getFrameIntervalNanos()); 120fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck 121fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck loadSystemProperties(); 122cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 123cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 124cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 125f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck void destroy() { 126f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck mInitialized = false; 127f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck updateEnabledState(null); 128fae904d63947fe1687d1d44be29234cc3d538f24John Reck nDestroyCanvasAndSurface(mNativeProxy); 129cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 130cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 131f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck private void updateEnabledState(Surface surface) { 132f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck if (surface == null || !surface.isValid()) { 133f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck setEnabled(false); 134f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck } else { 135f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck setEnabled(mInitialized); 136f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck } 137f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck } 138f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck 139cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 140cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck boolean initialize(Surface surface) throws OutOfResourcesException { 141f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck mInitialized = true; 142f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck updateEnabledState(surface); 1435795d6408d8bf44ffe2f49a25f9f333069b59a49Dan Stoza boolean status = nInitialize(mNativeProxy, surface); 1445795d6408d8bf44ffe2f49a25f9f333069b59a49Dan Stoza surface.allocateBuffers(); 1455795d6408d8bf44ffe2f49a25f9f333069b59a49Dan Stoza return status; 146cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 147cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 148cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 149cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck void updateSurface(Surface surface) throws OutOfResourcesException { 150f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck updateEnabledState(surface); 1514f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck nUpdateSurface(mNativeProxy, surface); 152cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 153cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 154cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 155f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck void pauseSurface(Surface surface) { 156f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck nPauseSurface(mNativeProxy, surface); 157f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck } 158f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck 159f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck @Override 160cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck void destroyHardwareResources(View view) { 1614f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck destroyResources(view); 162f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck nDestroyHardwareResources(mNativeProxy); 1634f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck } 1644f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 1654f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck private static void destroyResources(View view) { 1664f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck view.destroyHardwareResources(); 1674f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 1684f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck if (view instanceof ViewGroup) { 1694f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck ViewGroup group = (ViewGroup) view; 1704f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 1714f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck int count = group.getChildCount(); 1724f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck for (int i = 0; i < count; i++) { 1734f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck destroyResources(group.getChildAt(i)); 1744f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck } 1754f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck } 176cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 177cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 178cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 179cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck void invalidate(Surface surface) { 1804f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck updateSurface(surface); 181cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 182cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 183cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 184918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck void detachSurfaceTexture(long hardwareLayer) { 185918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck nDetachSurfaceTexture(mNativeProxy, hardwareLayer); 186cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 187cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 188cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 18958c42c3596a2b79184c9a6b7beffc6e94cce112cAlan Viverette void setup(int width, int height, Rect surfaceInsets) { 19058c42c3596a2b79184c9a6b7beffc6e94cce112cAlan Viverette final float lightX = width / 2.0f; 191cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck mWidth = width; 192cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck mHeight = height; 19357774a82f02c225941f81cf89c7a03bf899df2c1Alan Viverette if (surfaceInsets != null && !surfaceInsets.isEmpty()) { 19457774a82f02c225941f81cf89c7a03bf899df2c1Alan Viverette mHasInsets = true; 195ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette mInsetLeft = surfaceInsets.left; 196ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette mInsetTop = surfaceInsets.top; 197ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette mSurfaceWidth = width + mInsetLeft + surfaceInsets.right; 198ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette mSurfaceHeight = height + mInsetTop + surfaceInsets.bottom; 19957774a82f02c225941f81cf89c7a03bf899df2c1Alan Viverette 20057774a82f02c225941f81cf89c7a03bf899df2c1Alan Viverette // If the surface has insets, it can't be opaque. 20157774a82f02c225941f81cf89c7a03bf899df2c1Alan Viverette setOpaque(false); 202ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette } else { 20357774a82f02c225941f81cf89c7a03bf899df2c1Alan Viverette mHasInsets = false; 204ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette mInsetLeft = 0; 205ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette mInsetTop = 0; 206ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette mSurfaceWidth = width; 207ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette mSurfaceHeight = height; 208ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette } 209ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette mRootNode.setLeftTopRightBottom(-mInsetLeft, -mInsetTop, mSurfaceWidth, mSurfaceHeight); 21058c42c3596a2b79184c9a6b7beffc6e94cce112cAlan Viverette nSetup(mNativeProxy, mSurfaceWidth, mSurfaceHeight, lightX, mLightY, mLightZ, mLightRadius); 211cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 212cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 213cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 21463a06673253914510bbeebd500655008682dade1John Reck void setOpaque(boolean opaque) { 21557774a82f02c225941f81cf89c7a03bf899df2c1Alan Viverette nSetOpaque(mNativeProxy, opaque && !mHasInsets); 21663a06673253914510bbeebd500655008682dade1John Reck } 21763a06673253914510bbeebd500655008682dade1John Reck 21863a06673253914510bbeebd500655008682dade1John Reck @Override 219cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck int getWidth() { 220cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck return mWidth; 221cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 222cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 223cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 224cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck int getHeight() { 225cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck return mHeight; 226cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 227cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 228cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 229fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck void dumpGfxInfo(PrintWriter pw, FileDescriptor fd) { 230fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck pw.flush(); 231fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck nDumpProfileInfo(mNativeProxy, fd); 232cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 233cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 234fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck private static int search(String[] values, String value) { 235fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck for (int i = 0; i < values.length; i++) { 236fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck if (values[i].equals(value)) return i; 237fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck } 238fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck return -1; 239fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck } 240fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck 241fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck private static boolean checkIfProfilingRequested() { 242fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck String profiling = SystemProperties.get(HardwareRenderer.PROFILE_PROPERTY); 243fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck int graphType = search(VISUALIZERS, profiling); 244fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck return (graphType >= 0) || Boolean.parseBoolean(profiling); 245cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 246cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 247cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 248cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck boolean loadSystemProperties() { 249fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck boolean changed = nLoadSystemProperties(mNativeProxy); 250fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck boolean wantProfiling = checkIfProfilingRequested(); 251fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck if (wantProfiling != mProfilingEnabled) { 252fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck mProfilingEnabled = wantProfiling; 253fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck changed = true; 254fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck } 255fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck return changed; 256cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 257cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 258bc0cc0220b830df54c8ed41d0b53daffd7f6c991John Reck private void updateRootDisplayList(View view, HardwareDrawCallbacks callbacks) { 259cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck view.mPrivateFlags |= View.PFLAG_DRAWN; 260cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 261cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck view.mRecreateDisplayList = (view.mPrivateFlags & View.PFLAG_INVALIDATED) 262cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck == View.PFLAG_INVALIDATED; 263cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck view.mPrivateFlags &= ~View.PFLAG_INVALIDATED; 264cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 265cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck Trace.traceBegin(Trace.TRACE_TAG_VIEW, "getDisplayList"); 266ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette HardwareCanvas canvas = mRootNode.start(mSurfaceWidth, mSurfaceHeight); 26705e858400adee0f579b1e27e321b48bd55843fbdJohn Reck try { 26886faf9ec3edc24a9d04548e151bca3a2510396a4John Reck canvas.save(); 269ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette canvas.translate(mInsetLeft, mInsetTop); 270d5b2ec4ff15f828298290534c9d322c82f8d130cAlan Viverette callbacks.onHardwarePreDraw(canvas); 271a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik canvas.drawRenderNode(view.getDisplayList()); 27205e858400adee0f579b1e27e321b48bd55843fbdJohn Reck callbacks.onHardwarePostDraw(canvas); 27386faf9ec3edc24a9d04548e151bca3a2510396a4John Reck canvas.restore(); 27405e858400adee0f579b1e27e321b48bd55843fbdJohn Reck } finally { 27505e858400adee0f579b1e27e321b48bd55843fbdJohn Reck mRootNode.end(canvas); 27605e858400adee0f579b1e27e321b48bd55843fbdJohn Reck Trace.traceEnd(Trace.TRACE_TAG_VIEW); 27705e858400adee0f579b1e27e321b48bd55843fbdJohn Reck } 278cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 279cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck view.mRecreateDisplayList = false; 280bc0cc0220b830df54c8ed41d0b53daffd7f6c991John Reck } 281bc0cc0220b830df54c8ed41d0b53daffd7f6c991John Reck 282bc0cc0220b830df54c8ed41d0b53daffd7f6c991John Reck @Override 283e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck void draw(View view, AttachInfo attachInfo, HardwareDrawCallbacks callbacks) { 284bc0cc0220b830df54c8ed41d0b53daffd7f6c991John Reck attachInfo.mIgnoreDirtyState = true; 28518f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck long frameTimeNanos = mChoreographer.getFrameTimeNanos(); 286315c329544d7c593d1072b071cbb92d9afe74021John Reck attachInfo.mDrawingTime = frameTimeNanos / TimeUtils.NANOS_PER_MS; 287bc0cc0220b830df54c8ed41d0b53daffd7f6c991John Reck 288fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck long recordDuration = 0; 289fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck if (mProfilingEnabled) { 290fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck recordDuration = System.nanoTime(); 291fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck } 292fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck 293bc0cc0220b830df54c8ed41d0b53daffd7f6c991John Reck updateRootDisplayList(view, callbacks); 294cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 295fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck if (mProfilingEnabled) { 296fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck recordDuration = System.nanoTime() - recordDuration; 297fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck } 298fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck 2996313b9259d37b59f3402058e197637aa3014516cJohn Reck attachInfo.mIgnoreDirtyState = false; 3006313b9259d37b59f3402058e197637aa3014516cJohn Reck 301f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck int syncResult = nSyncAndDrawFrame(mNativeProxy, frameTimeNanos, 302e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck recordDuration, view.getResources().getDisplayMetrics().density); 303f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck if ((syncResult & SYNC_INVALIDATE_REQUIRED) != 0) { 304f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck attachInfo.mViewRootImpl.invalidate(); 305f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck } 306cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 307cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 3083b20251a355c88193c439f928a84ae69483fb488John Reck static void invokeFunctor(long functor, boolean waitForCompletion) { 3093b20251a355c88193c439f928a84ae69483fb488John Reck nInvokeFunctor(functor, waitForCompletion); 3100d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck } 3110d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck 3120d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck @Override 31319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck HardwareLayer createTextureLayer() { 31419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck long layer = nCreateTextureLayer(mNativeProxy); 31519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck return HardwareLayer.adoptTextureLayer(this, layer); 316cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 317cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 318cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 31919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck boolean copyLayerInto(final HardwareLayer layer, final Bitmap bitmap) { 32019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck return nCopyLayerInto(mNativeProxy, 32119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck layer.getDeferredLayerUpdater(), bitmap.mNativeBitmap); 322cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 323cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 324cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 32519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck void pushLayerUpdate(HardwareLayer layer) { 326d72e0a339b54af0c4e731513bbad120dff694723John Reck nPushLayerUpdate(mNativeProxy, layer.getDeferredLayerUpdater()); 32719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck } 32819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 32919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck @Override 33019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck void onLayerDestroyed(HardwareLayer layer) { 331d72e0a339b54af0c4e731513bbad120dff694723John Reck nCancelLayerUpdate(mNativeProxy, layer.getDeferredLayerUpdater()); 332cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 333cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 334cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck @Override 335cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck void setName(String name) { 336cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 337cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 3384f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck @Override 33928ad7b52e038ef0cdd89f753d9839444a434b299John Reck void fence() { 34028ad7b52e038ef0cdd89f753d9839444a434b299John Reck nFence(mNativeProxy); 34128ad7b52e038ef0cdd89f753d9839444a434b299John Reck } 34228ad7b52e038ef0cdd89f753d9839444a434b299John Reck 34328ad7b52e038ef0cdd89f753d9839444a434b299John Reck @Override 344f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck void stopDrawing() { 345f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck nStopDrawing(mNativeProxy); 346f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck } 347f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck 348f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck @Override 349a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck public void notifyFramePending() { 350a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck nNotifyFramePending(mNativeProxy); 351a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck } 352a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck 353a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck @Override 3544f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck protected void finalize() throws Throwable { 3554f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck try { 3564f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck nDeleteProxy(mNativeProxy); 3570ed751dd22a98f0c1f637570c5775b4f5e97d895John Reck mNativeProxy = 0; 3584f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck } finally { 3594f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck super.finalize(); 360cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 361cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck } 362cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 363f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck static void trimMemory(int level) { 364f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck nTrimMemory(level); 36584a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck } 36684a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck 36766f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck private static class AtlasInitializer { 36866f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck static AtlasInitializer sInstance = new AtlasInitializer(); 36966f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck 37066f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck private boolean mInitialized = false; 37166f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck 37266f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck private AtlasInitializer() {} 37366f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck 3743b20251a355c88193c439f928a84ae69483fb488John Reck synchronized void init(Context context, long renderProxy) { 37566f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck if (mInitialized) return; 37666f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck IBinder binder = ServiceManager.getService("assetatlas"); 37766f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck if (binder == null) return; 37866f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck 37966f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck IAssetAtlas atlas = IAssetAtlas.Stub.asInterface(binder); 38066f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck try { 38166f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck if (atlas.isCompatible(android.os.Process.myPpid())) { 38266f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck GraphicBuffer buffer = atlas.getBuffer(); 38366f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck if (buffer != null) { 38466f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck long[] map = atlas.getMap(); 38566f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck if (map != null) { 386b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reck // TODO Remove after fixing b/15425820 387b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reck validateMap(context, map); 3883b20251a355c88193c439f928a84ae69483fb488John Reck nSetAtlas(renderProxy, buffer, map); 38966f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck mInitialized = true; 39066f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck } 39166f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck // If IAssetAtlas is not the same class as the IBinder 39266f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck // we are using a remote service and we can safely 39366f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck // destroy the graphic buffer 39466f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck if (atlas.getClass() != binder.getClass()) { 39566f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck buffer.destroy(); 39666f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck } 39766f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck } 39866f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck } 39966f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck } catch (RemoteException e) { 40066f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck Log.w(LOG_TAG, "Could not acquire atlas", e); 40166f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck } 40266f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck } 403b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reck 404b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reck private static void validateMap(Context context, long[] map) { 405b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reck Log.d("Atlas", "Validating map..."); 406b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reck HashSet<Long> preloadedPointers = new HashSet<Long>(); 407b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reck 408b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reck // We only care about drawables that hold bitmaps 409b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reck final Resources resources = context.getResources(); 410b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reck final LongSparseArray<Drawable.ConstantState> drawables = resources.getPreloadedDrawables(); 411b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reck 412b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reck final int count = drawables.size(); 413b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reck for (int i = 0; i < count; i++) { 414b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reck final Bitmap bitmap = drawables.valueAt(i).getBitmap(); 415b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reck if (bitmap != null && bitmap.getConfig() == Bitmap.Config.ARGB_8888) { 416b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reck preloadedPointers.add(bitmap.mNativeBitmap); 417b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reck } 418b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reck } 419b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reck 420b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reck for (int i = 0; i < map.length; i += 4) { 421b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reck if (!preloadedPointers.contains(map[i])) { 422b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reck Log.w("Atlas", String.format("Pointer 0x%X, not in getPreloadedDrawables?", map[i])); 423b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reck map[i] = 0; 424b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reck } 425b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reck } 426b8802b1293c05a14399005aeaeb93b82ec2e2f27John Reck } 42766f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck } 42866f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck 42984a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck static native void setupShadersDiskCache(String cacheFile); 43084a4c887a07c1c2939443f4e0587d7f1ac109e4bJohn Reck 4313b20251a355c88193c439f928a84ae69483fb488John Reck private static native void nSetAtlas(long nativeProxy, GraphicBuffer buffer, long[] map); 432cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 433e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck private static native long nCreateRootRenderNode(); 434e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck private static native long nCreateProxy(boolean translucent, long rootRenderNode); 4354f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck private static native void nDeleteProxy(long nativeProxy); 436cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 43718f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck private static native void nSetFrameInterval(long nativeProxy, long frameIntervalNanos); 438e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck private static native boolean nLoadSystemProperties(long nativeProxy); 43918f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck 4404f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck private static native boolean nInitialize(long nativeProxy, Surface window); 4414f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck private static native void nUpdateSurface(long nativeProxy, Surface window); 442f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck private static native void nPauseSurface(long nativeProxy, Surface window); 443797b95b26bbb7557678af78b9a2a61830158920fChris Craik private static native void nSetup(long nativeProxy, int width, int height, 444797b95b26bbb7557678af78b9a2a61830158920fChris Craik float lightX, float lightY, float lightZ, float lightRadius); 44563a06673253914510bbeebd500655008682dade1John Reck private static native void nSetOpaque(long nativeProxy, boolean opaque); 446fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck private static native int nSyncAndDrawFrame(long nativeProxy, 447e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck long frameTimeNanos, long recordDuration, float density); 448fae904d63947fe1687d1d44be29234cc3d538f24John Reck private static native void nDestroyCanvasAndSurface(long nativeProxy); 449cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 4503b20251a355c88193c439f928a84ae69483fb488John Reck private static native void nInvokeFunctor(long functor, boolean waitForCompletion); 45119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 45219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck private static native long nCreateDisplayListLayer(long nativeProxy, int width, int height); 45319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck private static native long nCreateTextureLayer(long nativeProxy); 45419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck private static native boolean nCopyLayerInto(long nativeProxy, long layer, long bitmap); 455d72e0a339b54af0c4e731513bbad120dff694723John Reck private static native void nPushLayerUpdate(long nativeProxy, long layer); 456d72e0a339b54af0c4e731513bbad120dff694723John Reck private static native void nCancelLayerUpdate(long nativeProxy, long layer); 457918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck private static native void nDetachSurfaceTexture(long nativeProxy, long layer); 45828ad7b52e038ef0cdd89f753d9839444a434b299John Reck 459f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck private static native void nDestroyHardwareResources(long nativeProxy); 460f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck private static native void nTrimMemory(int level); 461e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck 46228ad7b52e038ef0cdd89f753d9839444a434b299John Reck private static native void nFence(long nativeProxy); 463f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck private static native void nStopDrawing(long nativeProxy); 464a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck private static native void nNotifyFramePending(long nativeProxy); 465fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck 466fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck private static native void nDumpProfileInfo(long nativeProxy, FileDescriptor fd); 467cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck} 468