Skip to content

Commit 413baf8

Browse files
author
Romain Guy
committed
Don't draw onto a hw surface using the software renderer
Bug #6485955 If an invalidate gets scheduled right before the EGL surface is destroyed, the next draw pass is done in software. This causes the software renderer to connect to the surface forever which prevents the hardware renderer from coming back when the screen is turned back on. The fix here is to ignore the draw request when hw acceleration is requested but not yet available. Proper software fallback will still happen when an error is encountered with hardware rendering (in which case hw acceleration will not be marked as requested anymore.) Change-Id: I1edc4a51c8dd38240aa2345092a18a081a756fc1
1 parent 7a59c5a commit 413baf8

File tree

1 file changed

+12
-0
lines changed

1 file changed

+12
-0
lines changed

core/java/android/view/ViewRootImpl.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2183,6 +2183,18 @@ private void draw(boolean fullRedrawNeeded) {
21832183
private boolean drawSoftware(Surface surface, AttachInfo attachInfo, int yoff,
21842184
boolean scalingRequired, Rect dirty) {
21852185

2186+
// If we get here with a disabled & requested hardware renderer, something went
2187+
// wrong (an invalidate posted right before we destroyed the hardware surface
2188+
// for instance) so we should just bail out. Locking the surface with software
2189+
// rendering at this point would lock it forever and prevent hardware renderer
2190+
// from doing its job when it comes back.
2191+
if (attachInfo.mHardwareRenderer != null && !attachInfo.mHardwareRenderer.isEnabled() &&
2192+
attachInfo.mHardwareRenderer.isRequested()) {
2193+
mFullRedrawNeeded = true;
2194+
scheduleTraversals();
2195+
return false;
2196+
}
2197+
21862198
// Draw with software renderer.
21872199
Canvas canvas;
21882200
try {

0 commit comments

Comments
 (0)