@@ -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 ())
0 commit comments