Skip to content

Commit 9f0e0e5

Browse files
committed
Optimizes composition strategies for single HDR video layers
Backend::ValidateDisplay Check for a single HDR video layer via IsHdrVideoLayer(). If unique, attempt device composition and validate with a test commit. On success, keep as device; else, fallback to client. For multiple layers including HDR, force all layers to client. Tracked-On: OAM-134602 Change-Id: I5351421b9326c52b908810b2bd1f0f8bb27416b7 Signed-off-by: Kanli Hu <kanli.hu@intel.com>
1 parent 477701b commit 9f0e0e5

File tree

5 files changed

+44
-14
lines changed

5 files changed

+44
-14
lines changed

backend/Backend.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,12 +127,21 @@ std::tuple<int, size_t> Backend::GetClientLayers(
127127
}
128128

129129
bool Backend::IsClientLayer(HwcDisplay *display, HwcLayer *layer) {
130+
// if display has hdr layer
131+
if (display->HasHdrLayer()) {
132+
auto [has_single_hdr_video, hdr_layer] = display->HasSingleHdrVideoLayer();
133+
// if display have single hdr layer, try to set layer to device mode
134+
// else set all layers to client
135+
if (!(has_single_hdr_video && layer == hdr_layer)) {
136+
return true;
137+
}
138+
//only single hdr video layer passthrough
139+
}
130140
return !HardwareSupportsLayerType(layer->GetSfType()) ||
131141
!layer->IsLayerUsableAsDevice() || display->CtmByGpu() ||
132142
(layer->GetLayerData().pi.RequireScalingOrPhasing() &&
133143
display->GetHwc()->GetResMan().ForcedScalingWithGpu()) ||
134-
(!display->IsInHeadlessMode() && display->GetPipe().device->IsIvshmDev()) ||
135-
(!display->isSingleDeviceHdrLayer().first && layer->IsHDRLayer()); // only single hdrlayer will use device
144+
(!display->IsInHeadlessMode() && display->GetPipe().device->IsIvshmDev());
136145
}
137146

138147
bool Backend::IsVideoLayer(HwcLayer *layer) {

hwc2_device/HwcDisplay.cpp

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -782,14 +782,14 @@ AtomicCommitArgs HwcDisplay::CreateModesetCommit(
782782
return args;
783783
}
784784

785-
auto HwcDisplay::isSingleDeviceHdrLayer() -> std::pair<bool, HwcLayer*> const {
785+
auto HwcDisplay::HasSingleHdrVideoLayer() -> std::pair<bool, HwcLayer*> const {
786786
uint32_t hdr_layer_count = 0;
787787
uint32_t total_layer_count = 0;
788788
HwcLayer* hdr_layer = nullptr;
789789
for (auto& pair : layers_) {
790790
auto& layer = pair.second;
791791
total_layer_count++;
792-
if (layer.IsHDRLayer()) {
792+
if (layer.IsHdrVideoLayer()) {
793793
hdr_layer_count++;
794794
hdr_layer = &layer;
795795
} else {
@@ -803,13 +803,28 @@ auto HwcDisplay::isSingleDeviceHdrLayer() -> std::pair<bool, HwcLayer*> const {
803803
);
804804
}
805805

806-
void HwcDisplay::resetHdrPipeLineWhenSingleDeviceHDRLayer(
806+
auto HwcDisplay::HasHdrLayer() -> bool {
807+
for (auto& pair : layers_) {
808+
auto& layer = pair.second;
809+
if (layer.IsHdrLayer()) {
810+
return true;
811+
}
812+
}
813+
return false;
814+
}
815+
816+
/*
817+
* reset HDR color pipeline when there is single video layer
818+
* The kernel driver will handle HDR video YUV10 pq gamma output
819+
*
820+
* a_args: args that build commit pipeline
821+
*/
822+
void HwcDisplay::TryResetHdrPipeline(
807823
AtomicCommitArgs &a_args) {
808-
// HDR video layer logic
809-
auto only_hdr_layer = isSingleDeviceHdrLayer();
824+
auto [only_hdr_layer, hdr_layer] = HasSingleHdrVideoLayer();
810825

811-
if (only_hdr_layer.first && only_hdr_layer.second
812-
&& only_hdr_layer.second->GetValidatedType() == HWC2::Composition::Device) {
826+
if (only_hdr_layer && hdr_layer
827+
&& hdr_layer->GetValidatedType() == HWC2::Composition::Device) {
813828
// Disable all HDR pipeline for direct device scanout
814829
a_args.color_matrix = HdrPipeline::BuildCtmIdentity();
815830
a_args.degamma_lut.reset();
@@ -899,7 +914,7 @@ HWC2::Error HwcDisplay::CreateComposition(AtomicCommitArgs &a_args) {
899914
if (z_map.empty())
900915
return HWC2::Error::BadLayer;
901916

902-
resetHdrPipeLineWhenSingleDeviceHDRLayer(a_args);
917+
TryResetHdrPipeline(a_args);
903918
std::vector<LayerData> composition_layers;
904919

905920
/* Import & populate */

hwc2_device/HwcDisplay.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -252,8 +252,9 @@ class HwcDisplay {
252252

253253
bool NeedsClientLayerUpdate() const;
254254

255-
auto isSingleDeviceHdrLayer() -> std::pair<bool, HwcLayer*> const;
256-
void resetHdrPipeLineWhenSingleDeviceHDRLayer(AtomicCommitArgs &a_args);
255+
auto HasSingleHdrVideoLayer() -> std::pair<bool, HwcLayer*> const;
256+
auto HasHdrLayer() -> bool;
257+
void TryResetHdrPipeline(AtomicCommitArgs &a_args);
257258

258259
private:
259260
AtomicCommitArgs CreateModesetCommit(

hwc2_device/HwcLayer.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,12 +112,16 @@ bool HwcLayer::IsVideoLayer() {
112112
slots_[*active_slot_id_].bi.usage & GRALLOC_USAGE_HW_VIDEO_ENCODER;
113113
}
114114

115-
bool HwcLayer::IsHDRLayer() {
115+
bool HwcLayer::IsHdrVideoLayer() {
116116
return active_slot_id_.has_value() &&
117117
(slots_[*active_slot_id_].bi.format == DRM_FORMAT_P010_INTEL ||
118118
slots_[*active_slot_id_].bi.format == DRM_FORMAT_P010);
119119
}
120120

121+
bool HwcLayer::IsHdrLayer() {
122+
return color_space_ == BufferColorSpace::kItuRec2020;
123+
}
124+
121125
void HwcLayer::ImportFb() {
122126
if (!IsLayerUsableAsDevice() || !buffer_updated_ ||
123127
!active_slot_id_.has_value()) {

hwc2_device/HwcLayer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,8 @@ class HwcLayer {
155155
void PopulateLayerData();
156156
void ClearSlots();
157157
bool IsVideoLayer();
158-
bool IsHDRLayer();
158+
bool IsHdrVideoLayer();
159+
bool IsHdrLayer();
159160
bool IsLayerUsableAsDevice() const {
160161
return !fb_import_failed_ && active_slot_id_.has_value() &&
161162
slots_.count(*active_slot_id_) > 0;

0 commit comments

Comments
 (0)