From 33ed738d49dce3af5851d0566739e9ed593057a5 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Thu, 26 Sep 2013 14:57:30 -0700 Subject: [PATCH] Expose View.executeHardwareAction() Bug #10911502 Views creating hardware resources need a way to safely interact with the hardware. This new method invokes HardwareRenderer.safelyRun() which executes a Runnable after making sure the hardawre rendering context is in a valid state. With the OpenGL backend, executeHardwareAction() tries to call eglMakeCurrent() if needed. This method is not guaranteed to work. Change-Id: I38ec65132eeba85605cffb1a6de12b7a0184e213 --- core/java/android/view/TextureView.java | 4 ++-- core/java/android/view/View.java | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/core/java/android/view/TextureView.java b/core/java/android/view/TextureView.java index b2c9f8c6d37c..47f7628f8e88 100644 --- a/core/java/android/view/TextureView.java +++ b/core/java/android/view/TextureView.java @@ -213,8 +213,8 @@ public class TextureView extends View { @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); - if (mLayer != null && mAttachInfo != null && mAttachInfo.mHardwareRenderer != null) { - boolean success = mAttachInfo.mHardwareRenderer.safelyRun(new Runnable() { + if (mLayer != null) { + boolean success = executeHardwareAction(new Runnable() { @Override public void run() { destroySurface(); diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 4680e769f050..c67e0366d251 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -12368,6 +12368,33 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } } + /** + * This method ensures the hardware renderer is in a valid state + * before executing the specified action. + * + * This method will attempt to set a valid state even if the window + * the renderer is attached to was destroyed. + * + * This method is not guaranteed to work. If the hardware renderer + * does not exist or cannot be put in a valid state, this method + * will not executed the specified action. + * + * The specified action is executed synchronously. + * + * @param action The action to execute after the renderer is in a valid state + * + * @return True if the specified Runnable was executed, false otherwise + * + * @hide + */ + public boolean executeHardwareAction(Runnable action) { + //noinspection SimplifiableIfStatement + if (mAttachInfo != null && mAttachInfo.mHardwareRenderer != null) { + return mAttachInfo.mHardwareRenderer.safelyRun(action); + } + return false; + } + void invalidateInheritedLayoutMode(int layoutModeOfRoot) { } -- 2.11.0