OSDN Git Service

drm_hwcomposer: allow to force mode by a property (v5) r-x86
authorMauro Rossi <issor.oruam@gmail.com>
Sun, 16 Jan 2022 14:19:42 +0000 (15:19 +0100)
committerMauro Rossi <issor.oruam@gmail.com>
Sun, 13 Mar 2022 22:24:08 +0000 (23:24 +0100)
The desired resolution can be set by property debug.drm.mode.force.
The other modes are ignored.

(v2) Resolve conflict after commit 13cc366
     "drm_hwcomposer: use CamelCase in source/header files related to class"

(v3) Changes due to commit a148f21
     "drm_hwcomposer: Rework display modes handling"

(v4) Changes due to commit 650299a2
     "drm_hwcomposer: Tidy-up DrmConnector class"

(v5) Changes due to commit 7d89911c
     "drm_hwcomposer: Tidy-up DrmDevice class"

drm/DrmConnector.cpp

index 4737316..bb4b5d3 100644 (file)
@@ -18,6 +18,7 @@
 
 #include "DrmConnector.h"
 
+#include <cutils/properties.h>
 #include <xf86drmMode.h>
 
 #include <array>
@@ -159,6 +160,19 @@ std::string DrmConnector::GetName() const {
 }
 
 int DrmConnector::UpdateModes() {
+  char value[PROPERTY_VALUE_MAX];
+  uint32_t xres = 0, yres = 0, rate = 0;
+  if (property_get("debug.drm.mode.force", value, NULL)) {
+    // parse <xres>x<yres>[@<refreshrate>]
+    if (sscanf(value, "%dx%d@%d", &xres, &yres, &rate) != 3) {
+      rate = 0;
+      if (sscanf(value, "%dx%d", &xres, &yres) != 2) {
+        xres = yres = 0;
+      }
+    }
+    ALOGI_IF(xres && yres, "force mode to %dx%d@%dHz", xres, yres, rate);
+  }
+
   auto conn = MakeDrmModeConnectorUnique(drm_->GetFd(), GetId());
   if (!conn) {
     ALOGE("Failed to get connector %d", GetId());
@@ -177,7 +191,14 @@ int DrmConnector::UpdateModes() {
     }
 
     if (!exists) {
+      DrmMode m(&connector_->modes[i]);
+      if (xres && yres) {
+        if (m.h_display() != xres || m.v_display() != yres ||
+              (rate && uint32_t(m.v_refresh()) != rate))
+          continue;
+      }
       modes_.emplace_back(DrmMode(&connector_->modes[i]));
+      ALOGD("add new mode %dx%d@%.1f for connector %d", m.h_display(), m.v_display(), m.v_refresh(), GetId());
     }
   }