Skip to content
This repository was archived by the owner on Oct 8, 2024. It is now read-only.

Commit 60e6009

Browse files
committed
Use VA-API blending for multilayer protected content.
Signed-off-by: Harish Krupo <harish.krupo.kps@intel.com>
1 parent 26ae912 commit 60e6009

File tree

4 files changed

+100
-73
lines changed

4 files changed

+100
-73
lines changed

common/compositor/compositor.cpp

Lines changed: 84 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ bool Compositor::Draw(DisplayPlaneStateList &comp_planes,
7373
plane.GetSourceLayers().begin(),
7474
plane.GetSourceLayers().end());
7575
}
76-
} else {
76+
} else if (plane.IsVideoPlane()) {
7777
media_state.emplace_back();
7878
plane.SwapSurfaceIfNeeded();
7979
DrawState &state = media_state.back();
@@ -84,79 +84,92 @@ bool Compositor::Draw(DisplayPlaneStateList &comp_planes,
8484
media_state.scaling_mode_ = scaling_mode_;
8585
media_state.deinterlace_ = deinterlace_;
8686
lock_.unlock();
87-
for (auto layer_id : plane.GetSourceLayers()) {
88-
OverlayLayer *layer = &(layers.at(layer_id));
89-
media_state.layers_.emplace_back(layer);
87+
OverlayLayer* layer = &(layers[plane.GetSourceLayers().at(0)]);
88+
media_state.layers_.emplace_back(layer);
89+
} else if (plane.NeedsOffScreenComposition()) {
90+
bool content_protected = false;
91+
92+
// If we have a video layer along with other layers then check
93+
// if any of the layers contain protected content.
94+
if (plane.HasVideoLayer()) {
95+
for (size_t l : plane.GetSourceLayers()) {
96+
OverlayLayer& layer = layers.at(l);
97+
if (layer.IsProtected()) {
98+
content_protected = true;
99+
break;
100+
}
101+
}
102+
}
103+
104+
if (content_protected) {
105+
// if we have protected content along with other layers, then we
106+
// need to use libva for the blending of the layers.
107+
media_state.emplace_back();
108+
plane.SwapSurfaceIfNeeded();
109+
DrawState &state = media_state.back();
110+
state.surface_ = plane.GetOffScreenTarget();
111+
MediaState &media_state = state.media_state_;
112+
lock_.lock();
113+
media_state.colors_ = colors_;
114+
media_state.scaling_mode_ = scaling_mode_;
115+
media_state.deinterlace_ = deinterlace_;
116+
lock_.unlock();
117+
for (auto layer_id : plane.GetSourceLayers()) {
118+
OverlayLayer *layer = &(layers.at(layer_id));
119+
media_state.layers_.emplace_back(layer);
120+
}
121+
} else {
122+
comp = &plane;
123+
plane.SwapSurfaceIfNeeded();
124+
std::vector<CompositionRegion> &comp_regions =
125+
plane.GetCompositionRegion();
126+
bool regions_empty = comp_regions.empty();
127+
NativeSurface *surface = plane.GetOffScreenTarget();
128+
if (surface == NULL) {
129+
ETRACE("GetOffScreenTarget() returned NULL pointer 'surface'.");
130+
return false;
131+
}
132+
if (!regions_empty &&
133+
(surface->ClearSurface() || surface->IsPartialClear() ||
134+
surface->IsSurfaceDamageChanged())) {
135+
plane.ResetCompositionRegion();
136+
regions_empty = true;
137+
}
138+
139+
if (surface->ClearSurface()) {
140+
plane.UpdateDamage(plane.GetDisplayFrame());
141+
}
142+
143+
if (regions_empty) {
144+
SeparateLayers(dedicated_layers, comp->GetSourceLayers(), display_frame,
145+
surface->GetSurfaceDamage(), comp_regions);
146+
}
147+
148+
std::vector<size_t>().swap(dedicated_layers);
149+
if (comp_regions.empty())
150+
continue;
151+
152+
draw_state.emplace_back();
153+
DrawState &state = draw_state.back();
154+
state.surface_ = surface;
155+
size_t num_regions = comp_regions.size();
156+
state.states_.reserve(num_regions);
157+
bool use_plane_transform = false;
158+
if (plane.GetRotationType() ==
159+
DisplayPlaneState::RotationType::kGPURotation) {
160+
use_plane_transform = true;
161+
}
162+
163+
CalculateRenderState(layers, comp_regions, state,
164+
plane.GetDownScalingFactor(),
165+
plane.IsUsingPlaneScalar(), use_plane_transform);
166+
167+
if (state.states_.empty()) {
168+
draw_state.pop_back();
169+
}
90170
}
91171
}
92172
}
93-
// } else if (plane.IsVideoPlane()) {
94-
// dedicated_layers.insert(dedicated_layers.end(),
95-
// plane.GetSourceLayers().begin(),
96-
// plane.GetSourceLayers().end());
97-
// media_state.emplace_back();
98-
// plane.SwapSurfaceIfNeeded();
99-
// DrawState &state = media_state.back();
100-
// state.surface_ = plane.GetOffScreenTarget();
101-
// MediaState &media_state = state.media_state_;
102-
// lock_.lock();
103-
// media_state.colors_ = colors_;
104-
// media_state.scaling_mode_ = scaling_mode_;
105-
// media_state.deinterlace_ = deinterlace_;
106-
// lock_.unlock();
107-
// const OverlayLayer &layer = layers[plane.GetSourceLayers().at(0)];
108-
// media_state.layer_ = &layer;
109-
// } else if (plane.NeedsOffScreenComposition()) {
110-
// comp = &plane;
111-
// plane.SwapSurfaceIfNeeded();
112-
// std::vector<CompositionRegion> &comp_regions =
113-
// plane.GetCompositionRegion();
114-
// bool regions_empty = comp_regions.empty();
115-
// NativeSurface *surface = plane.GetOffScreenTarget();
116-
// if (surface == NULL) {
117-
// ETRACE("GetOffScreenTarget() returned NULL pointer 'surface'.");
118-
// return false;
119-
// }
120-
// if (!regions_empty &&
121-
// (surface->ClearSurface() || surface->IsPartialClear() ||
122-
// surface->IsSurfaceDamageChanged())) {
123-
// plane.ResetCompositionRegion();
124-
// regions_empty = true;
125-
// }
126-
127-
// if (surface->ClearSurface()) {
128-
// plane.UpdateDamage(plane.GetDisplayFrame());
129-
// }
130-
131-
// if (regions_empty) {
132-
// SeparateLayers(dedicated_layers, comp->GetSourceLayers(), display_frame,
133-
// surface->GetSurfaceDamage(), comp_regions);
134-
// }
135-
136-
// std::vector<size_t>().swap(dedicated_layers);
137-
// if (comp_regions.empty())
138-
// continue;
139-
140-
// draw_state.emplace_back();
141-
// DrawState &state = draw_state.back();
142-
// state.surface_ = surface;
143-
// size_t num_regions = comp_regions.size();
144-
// state.states_.reserve(num_regions);
145-
// bool use_plane_transform = false;
146-
// if (plane.GetRotationType() ==
147-
// DisplayPlaneState::RotationType::kGPURotation) {
148-
// use_plane_transform = true;
149-
// }
150-
151-
// CalculateRenderState(layers, comp_regions, state,
152-
// plane.GetDownScalingFactor(),
153-
// plane.IsUsingPlaneScalar(), use_plane_transform);
154-
155-
// if (state.states_.empty()) {
156-
// draw_state.pop_back();
157-
// }
158-
// }
159-
// }
160173

161174
bool status = true;
162175
if (!draw_state.empty() || !media_state.empty())

common/display/displayplanemanager.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,9 @@ bool DisplayPlaneManager::ValidateLayers(
234234
validate_final_layers);
235235
#endif
236236
DisplayPlaneState &last_plane = composition.back();
237+
if (layer->IsVideoLayer()) {
238+
last_plane.SetVideoPlane(true);
239+
}
237240
ResetPlaneTarget(last_plane, commit_planes.back());
238241
validate_final_layers = true;
239242
if (display_transform_ != kIdentity) {
@@ -272,6 +275,9 @@ bool DisplayPlaneManager::ValidateLayers(
272275
}
273276

274277
DisplayPlaneState &last_plane = composition.back();
278+
if (layer->IsVideoLayer()) {
279+
last_plane.SetVideoPlane(true);
280+
}
275281
if (!validate_final_layers)
276282
validate_final_layers = !(last_plane.GetOffScreenTarget());
277283
ResetPlaneTarget(last_plane, commit_planes.back());
@@ -720,7 +726,7 @@ void DisplayPlaneManager::SetDisplayTransform(uint32_t transform) {
720726

721727
void DisplayPlaneManager::EnsureOffScreenTarget(DisplayPlaneState &plane) {
722728
NativeSurface *surface = NULL;
723-
bool video_separate = plane.IsVideoPlane();
729+
bool video_separate = plane.IsVideoPlane() && (plane.GetSourceLayers().size() == 1);
724730
uint32_t preferred_format = 0;
725731
uint32_t usage = hwcomposer::kLayerNormal;
726732
if (video_separate) {

common/display/displayplanestate.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -481,9 +481,15 @@ bool DisplayPlaneState::HasCursorLayer() const {
481481
}
482482

483483
bool DisplayPlaneState::IsVideoPlane() const {
484-
return private_data_->type_ == DisplayPlanePrivateState::PlaneType::kVideo;
484+
bool is_video = private_data_->type_ == DisplayPlanePrivateState::PlaneType::kVideo;
485+
bool single_layer = private_data_->source_layers_.size() == 1;
486+
return is_video && single_layer;
485487
}
486488

489+
bool DisplayPlaneState::HasVideoLayer() const {
490+
return private_data_->type_ == DisplayPlanePrivateState::PlaneType::kVideo;
491+
}
492+
487493
void DisplayPlaneState::SetVideoPlane(bool enable_video) {
488494
#ifndef DISABLE_VA
489495
if (enable_video) {

common/display/displayplanestate.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,8 @@ class DisplayPlaneState {
130130

131131
bool IsVideoPlane() const;
132132

133+
bool HasVideoLayer() const;
134+
133135
// Set true if this Plane State is handling Video layer and
134136
// needs to go through the Media Compositor for any
135137
// offscreen composition usage.

0 commit comments

Comments
 (0)