From 5063d53ddf7db2c85ec06152be8ffcd0e2fa9639 Mon Sep 17 00:00:00 2001 From: Roman Stratiienko Date: Wed, 29 Sep 2021 12:47:31 +0300 Subject: [PATCH] drm_hwcomposer: Improve handling of blending mode 1. Convert to DrmHwcBlending inside HWC hook. 2. Use map for enum_values for cleaner atomic commit preparation. Signed-off-by: Roman Stratiienko --- DrmHwcTwo.cpp | 33 +++++++++++----------- DrmHwcTwo.h | 2 +- drm/DrmPlane.cpp | 75 ++++++++++++++++--------------------------------- drm/DrmPlane.h | 1 + include/drmhwcomposer.h | 6 ++-- 5 files changed, 45 insertions(+), 72 deletions(-) diff --git a/DrmHwcTwo.cpp b/DrmHwcTwo.cpp index 2e47083..cfa2f1c 100644 --- a/DrmHwcTwo.cpp +++ b/DrmHwcTwo.cpp @@ -1054,7 +1054,21 @@ HWC2::Error DrmHwcTwo::HwcLayer::SetCursorPosition(int32_t x, int32_t y) { HWC2::Error DrmHwcTwo::HwcLayer::SetLayerBlendMode(int32_t mode) { supported(__func__); - blending_ = static_cast(mode); + switch (static_cast(mode)) { + case HWC2::BlendMode::None: + blending_ = DrmHwcBlending::kNone; + break; + case HWC2::BlendMode::Premultiplied: + blending_ = DrmHwcBlending::kPreMult; + break; + case HWC2::BlendMode::Coverage: + blending_ = DrmHwcBlending::kCoverage; + break; + default: + ALOGE("Unknown blending mode b=%d", blending_); + blending_ = DrmHwcBlending::kNone; + break; + } return HWC2::Error::None; } @@ -1168,27 +1182,12 @@ HWC2::Error DrmHwcTwo::HwcLayer::SetLayerZOrder(uint32_t order) { void DrmHwcTwo::HwcLayer::PopulateDrmLayer(DrmHwcLayer *layer) { supported(__func__); - switch (blending_) { - case HWC2::BlendMode::None: - layer->blending = DrmHwcBlending::kNone; - break; - case HWC2::BlendMode::Premultiplied: - layer->blending = DrmHwcBlending::kPreMult; - break; - case HWC2::BlendMode::Coverage: - layer->blending = DrmHwcBlending::kCoverage; - break; - default: - ALOGE("Unknown blending mode b=%d", blending_); - layer->blending = DrmHwcBlending::kNone; - break; - } - layer->sf_handle = buffer_; // TODO(rsglobal): Avoid extra fd duplication layer->acquire_fence = UniqueFd(fcntl(acquire_fence_.Get(), F_DUPFD_CLOEXEC)); layer->display_frame = display_frame_; layer->alpha = lround(65535.0F * alpha_); + layer->blending = blending_; layer->source_crop = source_crop_; layer->SetTransform(static_cast(transform_)); layer->color_space = color_space_; diff --git a/DrmHwcTwo.h b/DrmHwcTwo.h index 807ad25..c2da62d 100644 --- a/DrmHwcTwo.h +++ b/DrmHwcTwo.h @@ -133,7 +133,6 @@ class DrmHwcTwo : public hwc2_device_t { HWC2::Composition sf_type_ = HWC2::Composition::Invalid; HWC2::Composition validated_type_ = HWC2::Composition::Invalid; - HWC2::BlendMode blending_ = HWC2::BlendMode::None; buffer_handle_t buffer_ = NULL; hwc_rect_t display_frame_; float alpha_ = 1.0f; @@ -143,6 +142,7 @@ class DrmHwcTwo : public hwc2_device_t { hwc_color_t layer_color_; HWC2::Transform transform_ = HWC2::Transform::None; uint32_t z_order_ = 0; + DrmHwcBlending blending_ = DrmHwcBlending::kNone; DrmHwcColorSpace color_space_ = DrmHwcColorSpace::kUndefined; DrmHwcSampleRange sample_range_ = DrmHwcSampleRange::kUndefined; }; diff --git a/drm/DrmPlane.cpp b/drm/DrmPlane.cpp index 78013fb..78b650c 100644 --- a/drm/DrmPlane.cpp +++ b/drm/DrmPlane.cpp @@ -136,8 +136,24 @@ int DrmPlane::Init() { ALOGI("Could not get alpha property"); ret = drm_->GetPlaneProperty(*this, "pixel blend mode", &blend_property_); - if (ret) + if (ret == 0) { + std::tie(enum_value, + ret) = blend_property_.GetEnumValueWithName("Pre-multiplied"); + if (ret == 0) { + blending_enum_map_[DrmHwcBlending::kPreMult] = enum_value; + } + std::tie(enum_value, + ret) = blend_property_.GetEnumValueWithName("Coverage"); + if (ret == 0) { + blending_enum_map_[DrmHwcBlending::kCoverage] = enum_value; + } + std::tie(enum_value, ret) = blend_property_.GetEnumValueWithName("None"); + if (ret == 0) { + blending_enum_map_[DrmHwcBlending::kNone] = enum_value; + } + } else { ALOGI("Could not get pixel blend mode property"); + } ret = drm_->GetPlaneProperty(*this, "IN_FENCE_FD", &in_fence_fd_property_); if (ret) @@ -231,34 +247,10 @@ bool DrmPlane::IsValidForLayer(DrmHwcLayer *layer) { return false; } - if (blend_property_.id() == 0) { - if ((layer->blending != DrmHwcBlending::kNone) && - (layer->blending != DrmHwcBlending::kPreMult)) { - ALOGV("Blending is not supported on plane %d", id_); - return false; - } - } else { - int ret = 0; - - switch (layer->blending) { - case DrmHwcBlending::kPreMult: - std::tie(std::ignore, - ret) = blend_property_.GetEnumValueWithName("Pre-multiplied"); - break; - case DrmHwcBlending::kCoverage: - std::tie(std::ignore, - ret) = blend_property_.GetEnumValueWithName("Coverage"); - break; - case DrmHwcBlending::kNone: - default: - std::tie(std::ignore, - ret) = blend_property_.GetEnumValueWithName("None"); - break; - } - if (ret) { - ALOGV("Expected a valid blend mode on plane %d", id_); - return false; - } + if (blending_enum_map_.count(layer->blending) == 0 && + layer->blending != DrmHwcBlending::kNone) { + ALOGV("Blending is not supported on plane %d", id_); + return false; } uint32_t format = layer->buffer_info.format; @@ -289,14 +281,12 @@ bool DrmPlane::HasNonRgbFormat() const { auto DrmPlane::AtomicSetState(drmModeAtomicReq &pset, DrmHwcLayer &layer, uint32_t zpos, uint32_t crtc_id) -> int { - int ret = 0; uint32_t fb_id = UINT32_MAX; int fence_fd = -1; hwc_rect_t display_frame; hwc_frect_t source_crop; uint64_t rotation = 0; uint64_t alpha = 0xFFFF; - uint64_t blend = UINT64_MAX; if (!layer.FbIdHandle) { ALOGE("Expected a valid framebuffer for pset"); @@ -317,22 +307,6 @@ auto DrmPlane::AtomicSetState(drmModeAtomicReq &pset, DrmHwcLayer &layer, return 0; } - if (blend_property_) { - switch (layer.blending) { - case DrmHwcBlending::kPreMult: - std::tie(blend, - ret) = blend_property_.GetEnumValueWithName("Pre-multiplied"); - break; - case DrmHwcBlending::kCoverage: - std::tie(blend, ret) = blend_property_.GetEnumValueWithName("Coverage"); - break; - case DrmHwcBlending::kNone: - default: - std::tie(blend, ret) = blend_property_.GetEnumValueWithName("None"); - break; - } - } - if (zpos_property_ && !zpos_property_.is_immutable()) { uint64_t min_zpos = 0; @@ -395,10 +369,9 @@ auto DrmPlane::AtomicSetState(drmModeAtomicReq &pset, DrmHwcLayer &layer, } } - if (blend_property_ && blend != UINT64_MAX) { - if (!blend_property_.AtomicSet(pset, blend)) { - return -EINVAL; - } + if (blending_enum_map_.count(layer.blending) != 0 && + !blend_property_.AtomicSet(pset, blending_enum_map_[layer.blending])) { + return -EINVAL; } if (color_encoding_enum_map_.count(layer.color_space) != 0 && diff --git a/drm/DrmPlane.h b/drm/DrmPlane.h index ee619b8..5782532 100644 --- a/drm/DrmPlane.h +++ b/drm/DrmPlane.h @@ -81,6 +81,7 @@ class DrmPlane { DrmProperty color_encoding_propery_; DrmProperty color_range_property_; + std::map blending_enum_map_; std::map color_encoding_enum_map_; std::map color_range_enum_map_; }; diff --git a/include/drmhwcomposer.h b/include/drmhwcomposer.h index 8abf840..01954a1 100644 --- a/include/drmhwcomposer.h +++ b/include/drmhwcomposer.h @@ -55,9 +55,9 @@ enum DrmHwcTransform { }; enum class DrmHwcBlending : int32_t { - kNone = HWC_BLENDING_NONE, - kPreMult = HWC_BLENDING_PREMULT, - kCoverage = HWC_BLENDING_COVERAGE, + kNone, + kPreMult, + kCoverage, }; struct DrmHwcLayer { -- 2.11.0