aboutsummaryrefslogtreecommitdiff
path: root/drm
diff options
context:
space:
mode:
authorRoman Stratiienko <roman.o.stratiienko@globallogic.com>2021-09-29 12:47:26 +0300
committerRoman Stratiienko <roman.o.stratiienko@globallogic.com>2021-09-29 12:47:26 +0300
commit4f1effa2d6bb8c7a56c1deee17ba604e615d6bf6 (patch)
treeacdc61721eed0231173dacc9a7b7fdfb2f6cf827 /drm
parent515da8f6265b47274c587d61561a2761d1386de6 (diff)
downloaddrm_hwcomposer-4f1effa2d6bb8c7a56c1deee17ba604e615d6bf6.tar.gz
drm_hwcomposer: Query color_encoding and color_range enums during init
Should slightly reduce CPU load at runtime + improve atomic commit readability. Signed-off-by: Roman Stratiienko <roman.o.stratiienko@globallogic.com>
Diffstat (limited to 'drm')
-rw-r--r--drm/DrmPlane.cpp88
-rw-r--r--drm/DrmPlane.h3
2 files changed, 44 insertions, 47 deletions
diff --git a/drm/DrmPlane.cpp b/drm/DrmPlane.cpp
index 1de1fce..78013fb 100644
--- a/drm/DrmPlane.cpp
+++ b/drm/DrmPlane.cpp
@@ -37,6 +37,7 @@ DrmPlane::DrmPlane(DrmDevice *drm, drmModePlanePtr p)
}
int DrmPlane::Init() {
+ uint64_t enum_value = UINT64_MAX;
DrmProperty p;
int ret = drm_->GetPlaneProperty(*this, "type", &p);
@@ -145,12 +146,41 @@ int DrmPlane::Init() {
if (HasNonRgbFormat()) {
ret = drm_->GetPlaneProperty(*this, "COLOR_ENCODING",
&color_encoding_propery_);
- if (ret)
+ if (ret == 0) {
+ std::tie(enum_value, ret) = color_encoding_propery_.GetEnumValueWithName(
+ "ITU-R BT.709 YCbCr");
+ if (ret == 0) {
+ color_encoding_enum_map_[DrmHwcColorSpace::kItuRec709] = enum_value;
+ }
+ std::tie(enum_value, ret) = color_encoding_propery_.GetEnumValueWithName(
+ "ITU-R BT.601 YCbCr");
+ if (ret == 0) {
+ color_encoding_enum_map_[DrmHwcColorSpace::kItuRec601] = enum_value;
+ }
+ std::tie(enum_value, ret) = color_encoding_propery_.GetEnumValueWithName(
+ "ITU-R BT.2020 YCbCr");
+ if (ret == 0) {
+ color_encoding_enum_map_[DrmHwcColorSpace::kItuRec2020] = enum_value;
+ }
+ } else {
ALOGI("Could not get COLOR_ENCODING property");
+ }
ret = drm_->GetPlaneProperty(*this, "COLOR_RANGE", &color_range_property_);
- if (ret)
+ if (ret == 0) {
+ std::tie(enum_value, ret) = color_range_property_.GetEnumValueWithName(
+ "YCbCr full range");
+ if (ret == 0) {
+ color_range_enum_map_[DrmHwcSampleRange::kFullRange] = enum_value;
+ }
+ std::tie(enum_value, ret) = color_range_property_.GetEnumValueWithName(
+ "YCbCr limited range");
+ if (ret == 0) {
+ color_range_enum_map_[DrmHwcSampleRange::kLimitedRange] = enum_value;
+ }
+ } else {
ALOGI("Could not get COLOR_RANGE property");
+ }
}
return 0;
@@ -267,8 +297,6 @@ auto DrmPlane::AtomicSetState(drmModeAtomicReq &pset, DrmHwcLayer &layer,
uint64_t rotation = 0;
uint64_t alpha = 0xFFFF;
uint64_t blend = UINT64_MAX;
- uint64_t color_encoding = UINT64_MAX;
- uint64_t color_range = UINT64_MAX;
if (!layer.FbIdHandle) {
ALOGE("Expected a valid framebuffer for pset");
@@ -336,41 +364,6 @@ auto DrmPlane::AtomicSetState(drmModeAtomicReq &pset, DrmHwcLayer &layer,
}
}
- if (color_encoding_propery_) {
- switch (layer.color_space) {
- case DrmHwcColorSpace::kItuRec709:
- std::tie(color_encoding,
- ret) = color_encoding_propery_
- .GetEnumValueWithName("ITU-R BT.709 YCbCr");
- break;
- case DrmHwcColorSpace::kItuRec601:
- std::tie(color_encoding,
- ret) = color_encoding_propery_
- .GetEnumValueWithName("ITU-R BT.601 YCbCr");
- break;
- case DrmHwcColorSpace::kItuRec2020:
- std::tie(color_encoding,
- ret) = color_encoding_propery_
- .GetEnumValueWithName("ITU-R BT.2020 YCbCr");
- break;
- default:
- break;
- }
- }
-
- switch (layer.sample_range) {
- case DrmHwcSampleRange::kFullRange:
- std::tie(color_range, ret) = color_range_property_.GetEnumValueWithName(
- "YCbCr full range");
- break;
- case DrmHwcSampleRange::kLimitedRange:
- std::tie(color_range, ret) = color_range_property_.GetEnumValueWithName(
- "YCbCr limited range");
- break;
- default:
- break;
- }
-
if (!crtc_property_.AtomicSet(pset, crtc_id) ||
!fb_property_.AtomicSet(pset, fb_id) ||
!crtc_x_property_.AtomicSet(pset, display_frame.left) ||
@@ -408,17 +401,18 @@ auto DrmPlane::AtomicSetState(drmModeAtomicReq &pset, DrmHwcLayer &layer,
}
}
- if (color_encoding_propery_ && color_encoding != UINT64_MAX) {
- if (!color_encoding_propery_.AtomicSet(pset, color_encoding)) {
- return -EINVAL;
- }
+ if (color_encoding_enum_map_.count(layer.color_space) != 0 &&
+ !color_encoding_propery_
+ .AtomicSet(pset, color_encoding_enum_map_[layer.color_space])) {
+ return -EINVAL;
}
- if (color_range_property_ && color_range != UINT64_MAX) {
- if (!color_range_property_.AtomicSet(pset, color_range)) {
- return -EINVAL;
- }
+ if (color_range_enum_map_.count(layer.sample_range) != 0 &&
+ !color_range_property_
+ .AtomicSet(pset, color_range_enum_map_[layer.sample_range])) {
+ return -EINVAL;
}
+
return 0;
}
diff --git a/drm/DrmPlane.h b/drm/DrmPlane.h
index 6c2d041..ee619b8 100644
--- a/drm/DrmPlane.h
+++ b/drm/DrmPlane.h
@@ -80,6 +80,9 @@ class DrmPlane {
DrmProperty in_fence_fd_property_;
DrmProperty color_encoding_propery_;
DrmProperty color_range_property_;
+
+ std::map<DrmHwcColorSpace, uint64_t> color_encoding_enum_map_;
+ std::map<DrmHwcSampleRange, uint64_t> color_range_enum_map_;
};
} // namespace android