From ccf00a2007a363f5847636f7b53c0c89311e09d4 Mon Sep 17 00:00:00 2001 From: Tianjie Xu Date: Tue, 5 Jun 2018 17:10:23 -0700 Subject: minui: Handle the failures from the drm backend in gr_init In a charger mode manual test, we encounter failures from the MinuiBackendDrm when calling DrmEnableCrtc and Flip. To make the minui more robust, we should fall back to another backend if drm's SetCrtc fails. And check the value of gr_draw before dereferencing. Bug: 80249440 Test: boot to recovery Change-Id: Ibd1ca1fb1115fe1132684586c54eccd8fb4c3ad9 --- minui/graphics.cpp | 4 ++++ minui/graphics_drm.cpp | 17 +++++++++++------ minui/graphics_drm.h | 2 +- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/minui/graphics.cpp b/minui/graphics.cpp index 3b386015a..c1aab412d 100644 --- a/minui/graphics.cpp +++ b/minui/graphics.cpp @@ -356,6 +356,10 @@ int gr_init() { gr_flip(); gr_flip(); + if (!gr_draw) { + printf("gr_init: gr_draw becomes nullptr after gr_flip\n"); + return -1; + } gr_rotate(DEFAULT_ROTATION); diff --git a/minui/graphics_drm.cpp b/minui/graphics_drm.cpp index e7d4b38ef..4c98507f6 100644 --- a/minui/graphics_drm.cpp +++ b/minui/graphics_drm.cpp @@ -45,15 +45,17 @@ void MinuiBackendDrm::DrmDisableCrtc(int drm_fd, drmModeCrtc* crtc) { } } -void MinuiBackendDrm::DrmEnableCrtc(int drm_fd, drmModeCrtc* crtc, GRSurfaceDrm* surface) { - int32_t ret = drmModeSetCrtc(drm_fd, crtc->crtc_id, surface->fb_id, 0, 0, // x,y - &main_monitor_connector->connector_id, - 1, // connector_count - &main_monitor_crtc->mode); +int MinuiBackendDrm::DrmEnableCrtc(int drm_fd, drmModeCrtc* crtc, GRSurfaceDrm* surface) { + int ret = drmModeSetCrtc(drm_fd, crtc->crtc_id, surface->fb_id, 0, 0, // x,y + &main_monitor_connector->connector_id, + 1, // connector_count + &main_monitor_crtc->mode); if (ret) { printf("drmModeSetCrtc failed ret=%d\n", ret); } + + return ret; } void MinuiBackendDrm::Blank(bool blank) { @@ -368,7 +370,10 @@ GRSurface* MinuiBackendDrm::Init() { current_buffer = 0; - DrmEnableCrtc(drm_fd, main_monitor_crtc, GRSurfaceDrms[1]); + // We will likely encounter errors in the backend functions (i.e. Flip) if EnableCrtc fails. + if (DrmEnableCrtc(drm_fd, main_monitor_crtc, GRSurfaceDrms[1]) != 0) { + return nullptr; + } return GRSurfaceDrms[0]; } diff --git a/minui/graphics_drm.h b/minui/graphics_drm.h index de9621205..756625b03 100644 --- a/minui/graphics_drm.h +++ b/minui/graphics_drm.h @@ -42,7 +42,7 @@ class MinuiBackendDrm : public MinuiBackend { private: void DrmDisableCrtc(int drm_fd, drmModeCrtc* crtc); - void DrmEnableCrtc(int drm_fd, drmModeCrtc* crtc, GRSurfaceDrm* surface); + int DrmEnableCrtc(int drm_fd, drmModeCrtc* crtc, GRSurfaceDrm* surface); GRSurfaceDrm* DrmCreateSurface(int width, int height); void DrmDestroySurface(GRSurfaceDrm* surface); void DisableNonMainCrtcs(int fd, drmModeRes* resources, drmModeCrtc* main_crtc); -- cgit v1.2.3