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
This commit is contained in:
Romain Guy
2013-09-26 14:57:30 -07:00
parent c449613ec6
commit 33ed738d49
2 changed files with 29 additions and 2 deletions

View File

@@ -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();

View File

@@ -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) {
}