Merge "hwc/overlay: If configRotator fails, mark all pipes as available."
diff --git a/libhwcomposer/hwc_utils.cpp b/libhwcomposer/hwc_utils.cpp
index 22cb220..8b8411b 100644
--- a/libhwcomposer/hwc_utils.cpp
+++ b/libhwcomposer/hwc_utils.cpp
@@ -908,6 +908,7 @@
//Configure rotator for pre-rotation
if(configRotator(*rot, whf, crop, mdpFlags, orient, downscale) < 0) {
ALOGE("%s: configRotator failed!", __FUNCTION__);
+ ctx->mOverlay->clear(dpy);
return -1;
}
whf.format = (*rot)->getDstFormat();
@@ -981,6 +982,7 @@
//Configure rotator for pre-rotation
if(configRotator(*rot, whf, crop, mdpFlagsL, orient, downscale) < 0) {
ALOGE("%s: configRotator failed!", __FUNCTION__);
+ ctx->mOverlay->clear(dpy);
return -1;
}
whf.format = (*rot)->getDstFormat();
diff --git a/liboverlay/overlay.cpp b/liboverlay/overlay.cpp
index 97905d5..9b91760 100644
--- a/liboverlay/overlay.cpp
+++ b/liboverlay/overlay.cpp
@@ -311,6 +311,16 @@
strncat(buf, str_pipes, strlen(str_pipes));
}
+void Overlay::clear(int dpy) {
+ for(int i = 0; i < PipeBook::NUM_PIPES; i++) {
+ if (mPipeBook[i].mDisplay == dpy) {
+ // Mark as available for this round
+ PipeBook::resetUse(i);
+ PipeBook::resetAllocation(i);
+ }
+ }
+}
+
void Overlay::PipeBook::init() {
mPipe = NULL;
mDisplay = DPY_UNUSED;
diff --git a/liboverlay/overlay.h b/liboverlay/overlay.h
index bf85b70..cfceaff 100644
--- a/liboverlay/overlay.h
+++ b/liboverlay/overlay.h
@@ -90,6 +90,8 @@
* to populate.
*/
void getDump(char *buf, size_t len);
+ /* Reset usage and allocation bits on all pipes for given display */
+ void clear(int dpy);
static void setDMAMode(const int& mode);
static int getDMAMode();