summaryrefslogtreecommitdiff
path: root/libhwc2.1/libdrmresource/drm/drmmode.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libhwc2.1/libdrmresource/drm/drmmode.cpp')
-rw-r--r--libhwc2.1/libdrmresource/drm/drmmode.cpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/libhwc2.1/libdrmresource/drm/drmmode.cpp b/libhwc2.1/libdrmresource/drm/drmmode.cpp
index c3ab385..a883a20 100644
--- a/libhwc2.1/libdrmresource/drm/drmmode.cpp
+++ b/libhwc2.1/libdrmresource/drm/drmmode.cpp
@@ -23,6 +23,12 @@
namespace android {
+namespace {
+inline bool HasFlag(const int value, const int &flag) {
+ return ((value & flag) == flag);
+}
+}; // namespace
+
DrmMode::DrmMode(drmModeModeInfoPtr m)
: id_(0),
clock_(m->clock),
@@ -123,9 +129,52 @@ uint32_t DrmMode::v_scan() const {
float DrmMode::v_refresh() const {
// Always recalculate refresh to report correct float rate
+ if (v_total_ == 0 || h_total_ == 0) {
+ return 0.0f;
+ }
return clock_ / (float)(v_total_ * h_total_) * 1000.0f;
}
+float DrmMode::te_frequency() const {
+ auto freq = v_refresh();
+ if (is_vrr_mode()) {
+ if (HasFlag(flags_, DRM_MODE_FLAG_TE_FREQ_X2)) {
+ freq *= 2;
+ } else if (HasFlag(flags_, DRM_MODE_FLAG_TE_FREQ_X4)) {
+ freq *= 4;
+ } else {
+ if (!HasFlag(flags_, DRM_MODE_FLAG_TE_FREQ_X1)) {
+ return 0.0f;
+ }
+ }
+ }
+ return freq;
+}
+
+// vertical refresh period.
+float DrmMode::v_period(int64_t unit) const {
+ auto frequency = v_refresh();
+ if (frequency == 0.0f) {
+ return 0.0f;
+ }
+ return (1.0 / frequency) * unit;
+}
+
+float DrmMode::te_period(int64_t unit) const {
+ auto frequency = te_frequency();
+ if (frequency == 0.0f) {
+ return 0.0f;
+ }
+ return (1.0 / frequency) * unit;
+}
+
+bool DrmMode::is_operation_rate_to_bts() const {
+ if (!is_vrr_mode()) {
+ return HasFlag(flags_, DRM_MODE_FLAG_BTS_OP_RATE);
+ }
+ return false;
+}
+
uint32_t DrmMode::flags() const {
return flags_;
}