1 /*
2  * Copyright (C) 2007 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #define ATRACE_TAG ATRACE_TAG_GRAPHICS
18 
19 #include <stdlib.h>
20 #include <stdint.h>
21 #include <sys/types.h>
22 #include <math.h>
23 
24 #include <cutils/compiler.h>
25 #include <cutils/native_handle.h>
26 #include <cutils/properties.h>
27 
28 #include <utils/Errors.h>
29 #include <utils/Log.h>
30 #include <utils/NativeHandle.h>
31 #include <utils/StopWatch.h>
32 #include <utils/Trace.h>
33 
34 #include <ui/GraphicBuffer.h>
35 #include <ui/PixelFormat.h>
36 
37 #include <gui/BufferItem.h>
38 #include <gui/Surface.h>
39 
40 #include "clz.h"
41 #include "Colorizer.h"
42 #include "DisplayDevice.h"
43 #include "Layer.h"
44 #include "MonitoredProducer.h"
45 #include "SurfaceFlinger.h"
46 
47 #include "DisplayHardware/HWComposer.h"
48 
49 #include "RenderEngine/RenderEngine.h"
50 
51 #define DEBUG_RESIZE    0
52 
53 namespace android {
54 
55 // ---------------------------------------------------------------------------
56 
57 int32_t Layer::sSequence = 1;
58 
Layer(SurfaceFlinger * flinger,const sp<Client> & client,const String8 & name,uint32_t w,uint32_t h,uint32_t flags)59 Layer::Layer(SurfaceFlinger* flinger, const sp<Client>& client,
60         const String8& name, uint32_t w, uint32_t h, uint32_t flags)
61     :   contentDirty(false),
62         sequence(uint32_t(android_atomic_inc(&sSequence))),
63         mFlinger(flinger),
64         mTextureName(-1U),
65         mPremultipliedAlpha(true),
66         mName("unnamed"),
67         mFormat(PIXEL_FORMAT_NONE),
68         mTransactionFlags(0),
69         mQueuedFrames(0),
70         mSidebandStreamChanged(false),
71         mCurrentTransform(0),
72         mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE),
73         mCurrentOpacity(true),
74         mRefreshPending(false),
75         mFrameLatencyNeeded(false),
76         mFiltering(false),
77         mNeedsFiltering(false),
78         mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2),
79         mProtectedByApp(false),
80         mHasSurface(false),
81         mClientRef(client),
82         mPotentialCursor(false),
83         mQueueItemLock(),
84         mQueueItemCondition(),
85         mQueueItems(),
86         mLastFrameNumberReceived(0),
87         mUpdateTexImageFailed(false)
88 {
89     mCurrentCrop.makeInvalid();
90     mFlinger->getRenderEngine().genTextures(1, &mTextureName);
91     mTexture.init(Texture::TEXTURE_EXTERNAL, mTextureName);
92 
93     uint32_t layerFlags = 0;
94     if (flags & ISurfaceComposerClient::eHidden)
95         layerFlags |= layer_state_t::eLayerHidden;
96     if (flags & ISurfaceComposerClient::eOpaque)
97         layerFlags |= layer_state_t::eLayerOpaque;
98     if (flags & ISurfaceComposerClient::eSecure)
99         layerFlags |= layer_state_t::eLayerSecure;
100 
101     if (flags & ISurfaceComposerClient::eNonPremultiplied)
102         mPremultipliedAlpha = false;
103 
104     mName = name;
105 
106     mCurrentState.active.w = w;
107     mCurrentState.active.h = h;
108     mCurrentState.active.crop.makeInvalid();
109     mCurrentState.z = 0;
110     mCurrentState.alpha = 0xFF;
111     mCurrentState.layerStack = 0;
112     mCurrentState.flags = layerFlags;
113     mCurrentState.sequence = 0;
114     mCurrentState.transform.set(0, 0);
115     mCurrentState.requested = mCurrentState.active;
116 
117     // drawing state & current state are identical
118     mDrawingState = mCurrentState;
119 
120     nsecs_t displayPeriod =
121             flinger->getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
122     mFrameTracker.setDisplayRefreshPeriod(displayPeriod);
123 }
124 
onFirstRef()125 void Layer::onFirstRef() {
126     // Creates a custom BufferQueue for SurfaceFlingerConsumer to use
127     sp<IGraphicBufferProducer> producer;
128     sp<IGraphicBufferConsumer> consumer;
129     BufferQueue::createBufferQueue(&producer, &consumer);
130     mProducer = new MonitoredProducer(producer, mFlinger);
131     mSurfaceFlingerConsumer = new SurfaceFlingerConsumer(consumer, mTextureName);
132     mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0));
133     mSurfaceFlingerConsumer->setContentsChangedListener(this);
134     mSurfaceFlingerConsumer->setName(mName);
135 
136 #ifdef TARGET_DISABLE_TRIPLE_BUFFERING
137 #warning "disabling triple buffering"
138     mSurfaceFlingerConsumer->setDefaultMaxBufferCount(2);
139 #else
140     mSurfaceFlingerConsumer->setDefaultMaxBufferCount(3);
141 #endif
142 
143     const sp<const DisplayDevice> hw(mFlinger->getDefaultDisplayDevice());
144     updateTransformHint(hw);
145 }
146 
~Layer()147 Layer::~Layer() {
148     sp<Client> c(mClientRef.promote());
149     if (c != 0) {
150         c->detachLayer(this);
151     }
152     mFlinger->deleteTextureAsync(mTextureName);
153     mFrameTracker.logAndResetStats(mName);
154 }
155 
156 // ---------------------------------------------------------------------------
157 // callbacks
158 // ---------------------------------------------------------------------------
159 
onLayerDisplayed(const sp<const DisplayDevice> &,HWComposer::HWCLayerInterface * layer)160 void Layer::onLayerDisplayed(const sp<const DisplayDevice>& /* hw */,
161         HWComposer::HWCLayerInterface* layer) {
162     if (layer) {
163         layer->onDisplayed();
164         mSurfaceFlingerConsumer->setReleaseFence(layer->getAndResetReleaseFence());
165     }
166 }
167 
onFrameAvailable(const BufferItem & item)168 void Layer::onFrameAvailable(const BufferItem& item) {
169     // Add this buffer from our internal queue tracker
170     { // Autolock scope
171         Mutex::Autolock lock(mQueueItemLock);
172 
173         // Reset the frame number tracker when we receive the first buffer after
174         // a frame number reset
175         if (item.mFrameNumber == 1) {
176             mLastFrameNumberReceived = 0;
177         }
178 
179         // Ensure that callbacks are handled in order
180         while (item.mFrameNumber != mLastFrameNumberReceived + 1) {
181             status_t result = mQueueItemCondition.waitRelative(mQueueItemLock,
182                     ms2ns(500));
183             if (result != NO_ERROR) {
184                 ALOGE("[%s] Timed out waiting on callback", mName.string());
185             }
186         }
187 
188         mQueueItems.push_back(item);
189         android_atomic_inc(&mQueuedFrames);
190 
191         // Wake up any pending callbacks
192         mLastFrameNumberReceived = item.mFrameNumber;
193         mQueueItemCondition.broadcast();
194     }
195 
196     mFlinger->signalLayerUpdate();
197 }
198 
onFrameReplaced(const BufferItem & item)199 void Layer::onFrameReplaced(const BufferItem& item) {
200     Mutex::Autolock lock(mQueueItemLock);
201 
202     // Ensure that callbacks are handled in order
203     while (item.mFrameNumber != mLastFrameNumberReceived + 1) {
204         status_t result = mQueueItemCondition.waitRelative(mQueueItemLock,
205                 ms2ns(500));
206         if (result != NO_ERROR) {
207             ALOGE("[%s] Timed out waiting on callback", mName.string());
208         }
209     }
210 
211     if (mQueueItems.empty()) {
212         ALOGE("Can't replace a frame on an empty queue");
213         return;
214     }
215     mQueueItems.editItemAt(0) = item;
216 
217     // Wake up any pending callbacks
218     mLastFrameNumberReceived = item.mFrameNumber;
219     mQueueItemCondition.broadcast();
220 }
221 
onSidebandStreamChanged()222 void Layer::onSidebandStreamChanged() {
223     if (android_atomic_release_cas(false, true, &mSidebandStreamChanged) == 0) {
224         // mSidebandStreamChanged was false
225         mFlinger->signalLayerUpdate();
226     }
227 }
228 
229 // called with SurfaceFlinger::mStateLock from the drawing thread after
230 // the layer has been remove from the current state list (and just before
231 // it's removed from the drawing state list)
onRemoved()232 void Layer::onRemoved() {
233     mSurfaceFlingerConsumer->abandon();
234 }
235 
236 // ---------------------------------------------------------------------------
237 // set-up
238 // ---------------------------------------------------------------------------
239 
getName() const240 const String8& Layer::getName() const {
241     return mName;
242 }
243 
setBuffers(uint32_t w,uint32_t h,PixelFormat format,uint32_t flags)244 status_t Layer::setBuffers( uint32_t w, uint32_t h,
245                             PixelFormat format, uint32_t flags)
246 {
247     uint32_t const maxSurfaceDims = min(
248             mFlinger->getMaxTextureSize(), mFlinger->getMaxViewportDims());
249 
250     // never allow a surface larger than what our underlying GL implementation
251     // can handle.
252     if ((uint32_t(w)>maxSurfaceDims) || (uint32_t(h)>maxSurfaceDims)) {
253         ALOGE("dimensions too large %u x %u", uint32_t(w), uint32_t(h));
254         return BAD_VALUE;
255     }
256 
257     mFormat = format;
258 
259     mPotentialCursor = (flags & ISurfaceComposerClient::eCursorWindow) ? true : false;
260     mProtectedByApp = (flags & ISurfaceComposerClient::eProtectedByApp) ? true : false;
261     mCurrentOpacity = getOpacityForFormat(format);
262 
263     mSurfaceFlingerConsumer->setDefaultBufferSize(w, h);
264     mSurfaceFlingerConsumer->setDefaultBufferFormat(format);
265     mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0));
266 
267     return NO_ERROR;
268 }
269 
getHandle()270 sp<IBinder> Layer::getHandle() {
271     Mutex::Autolock _l(mLock);
272 
273     LOG_ALWAYS_FATAL_IF(mHasSurface,
274             "Layer::getHandle() has already been called");
275 
276     mHasSurface = true;
277 
278     /*
279      * The layer handle is just a BBinder object passed to the client
280      * (remote process) -- we don't keep any reference on our side such that
281      * the dtor is called when the remote side let go of its reference.
282      *
283      * LayerCleaner ensures that mFlinger->onLayerDestroyed() is called for
284      * this layer when the handle is destroyed.
285      */
286 
287     class Handle : public BBinder, public LayerCleaner {
288         wp<const Layer> mOwner;
289     public:
290         Handle(const sp<SurfaceFlinger>& flinger, const sp<Layer>& layer)
291             : LayerCleaner(flinger, layer), mOwner(layer) {
292         }
293     };
294 
295     return new Handle(mFlinger, this);
296 }
297 
getProducer() const298 sp<IGraphicBufferProducer> Layer::getProducer() const {
299     return mProducer;
300 }
301 
302 // ---------------------------------------------------------------------------
303 // h/w composer set-up
304 // ---------------------------------------------------------------------------
305 
getContentCrop() const306 Rect Layer::getContentCrop() const {
307     // this is the crop rectangle that applies to the buffer
308     // itself (as opposed to the window)
309     Rect crop;
310     if (!mCurrentCrop.isEmpty()) {
311         // if the buffer crop is defined, we use that
312         crop = mCurrentCrop;
313     } else if (mActiveBuffer != NULL) {
314         // otherwise we use the whole buffer
315         crop = mActiveBuffer->getBounds();
316     } else {
317         // if we don't have a buffer yet, we use an empty/invalid crop
318         crop.makeInvalid();
319     }
320     return crop;
321 }
322 
reduce(const Rect & win,const Region & exclude)323 static Rect reduce(const Rect& win, const Region& exclude) {
324     if (CC_LIKELY(exclude.isEmpty())) {
325         return win;
326     }
327     if (exclude.isRect()) {
328         return win.reduce(exclude.getBounds());
329     }
330     return Region(win).subtract(exclude).getBounds();
331 }
332 
computeBounds() const333 Rect Layer::computeBounds() const {
334     const Layer::State& s(getDrawingState());
335     return computeBounds(s.activeTransparentRegion);
336 }
337 
computeBounds(const Region & activeTransparentRegion) const338 Rect Layer::computeBounds(const Region& activeTransparentRegion) const {
339     const Layer::State& s(getDrawingState());
340     Rect win(s.active.w, s.active.h);
341     if (!s.active.crop.isEmpty()) {
342         win.intersect(s.active.crop, &win);
343     }
344     // subtract the transparent region and snap to the bounds
345     return reduce(win, activeTransparentRegion);
346 }
347 
computeCrop(const sp<const DisplayDevice> & hw) const348 FloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const {
349     // the content crop is the area of the content that gets scaled to the
350     // layer's size.
351     FloatRect crop(getContentCrop());
352 
353     // the active.crop is the area of the window that gets cropped, but not
354     // scaled in any ways.
355     const State& s(getDrawingState());
356 
357     // apply the projection's clipping to the window crop in
358     // layerstack space, and convert-back to layer space.
359     // if there are no window scaling involved, this operation will map to full
360     // pixels in the buffer.
361     // FIXME: the 3 lines below can produce slightly incorrect clipping when we have
362     // a viewport clipping and a window transform. we should use floating point to fix this.
363 
364     Rect activeCrop(s.active.w, s.active.h);
365     if (!s.active.crop.isEmpty()) {
366         activeCrop = s.active.crop;
367     }
368 
369     activeCrop = s.transform.transform(activeCrop);
370     activeCrop.intersect(hw->getViewport(), &activeCrop);
371     activeCrop = s.transform.inverse().transform(activeCrop);
372 
373     // This needs to be here as transform.transform(Rect) computes the
374     // transformed rect and then takes the bounding box of the result before
375     // returning. This means
376     // transform.inverse().transform(transform.transform(Rect)) != Rect
377     // in which case we need to make sure the final rect is clipped to the
378     // display bounds.
379     activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop);
380 
381     // subtract the transparent region and snap to the bounds
382     activeCrop = reduce(activeCrop, s.activeTransparentRegion);
383 
384     if (!activeCrop.isEmpty()) {
385         // Transform the window crop to match the buffer coordinate system,
386         // which means using the inverse of the current transform set on the
387         // SurfaceFlingerConsumer.
388         uint32_t invTransform = mCurrentTransform;
389         if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) {
390             /*
391              * the code below applies the display's inverse transform to the buffer
392              */
393             uint32_t invTransformOrient = hw->getOrientationTransform();
394             // calculate the inverse transform
395             if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) {
396                 invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
397                         NATIVE_WINDOW_TRANSFORM_FLIP_H;
398                 // If the transform has been rotated the axis of flip has been swapped
399                 // so we need to swap which flip operations we are performing
400                 bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0;
401                 bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0;
402                 if (is_h_flipped != is_v_flipped) {
403                     invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
404                             NATIVE_WINDOW_TRANSFORM_FLIP_H;
405                 }
406             }
407             // and apply to the current transform
408             invTransform = (Transform(invTransform) * Transform(invTransformOrient)).getOrientation();
409         }
410 
411         int winWidth = s.active.w;
412         int winHeight = s.active.h;
413         if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
414             // If the activeCrop has been rotate the ends are rotated but not
415             // the space itself so when transforming ends back we can't rely on
416             // a modification of the axes of rotation. To account for this we
417             // need to reorient the inverse rotation in terms of the current
418             // axes of rotation.
419             bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0;
420             bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0;
421             if (is_h_flipped == is_v_flipped) {
422                 invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
423                         NATIVE_WINDOW_TRANSFORM_FLIP_H;
424             }
425             winWidth = s.active.h;
426             winHeight = s.active.w;
427         }
428         const Rect winCrop = activeCrop.transform(
429                 invTransform, s.active.w, s.active.h);
430 
431         // below, crop is intersected with winCrop expressed in crop's coordinate space
432         float xScale = crop.getWidth()  / float(winWidth);
433         float yScale = crop.getHeight() / float(winHeight);
434 
435         float insetL = winCrop.left                 * xScale;
436         float insetT = winCrop.top                  * yScale;
437         float insetR = (winWidth - winCrop.right )  * xScale;
438         float insetB = (winHeight - winCrop.bottom) * yScale;
439 
440         crop.left   += insetL;
441         crop.top    += insetT;
442         crop.right  -= insetR;
443         crop.bottom -= insetB;
444     }
445     return crop;
446 }
447 
setGeometry(const sp<const DisplayDevice> & hw,HWComposer::HWCLayerInterface & layer)448 void Layer::setGeometry(
449     const sp<const DisplayDevice>& hw,
450         HWComposer::HWCLayerInterface& layer)
451 {
452     layer.setDefaultState();
453 
454     // enable this layer
455     layer.setSkip(false);
456 
457     if (isSecure() && !hw->isSecure()) {
458         layer.setSkip(true);
459     }
460 
461     // this gives us only the "orientation" component of the transform
462     const State& s(getDrawingState());
463     if (!isOpaque(s) || s.alpha != 0xFF) {
464         layer.setBlending(mPremultipliedAlpha ?
465                 HWC_BLENDING_PREMULT :
466                 HWC_BLENDING_COVERAGE);
467     }
468 
469     // apply the layer's transform, followed by the display's global transform
470     // here we're guaranteed that the layer's transform preserves rects
471     Region activeTransparentRegion(s.activeTransparentRegion);
472     if (!s.active.crop.isEmpty()) {
473         Rect activeCrop(s.active.crop);
474         activeCrop = s.transform.transform(activeCrop);
475         activeCrop.intersect(hw->getViewport(), &activeCrop);
476         activeCrop = s.transform.inverse().transform(activeCrop);
477         // This needs to be here as transform.transform(Rect) computes the
478         // transformed rect and then takes the bounding box of the result before
479         // returning. This means
480         // transform.inverse().transform(transform.transform(Rect)) != Rect
481         // in which case we need to make sure the final rect is clipped to the
482         // display bounds.
483         activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop);
484         // mark regions outside the crop as transparent
485         activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top));
486         activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom,
487                 s.active.w, s.active.h));
488         activeTransparentRegion.orSelf(Rect(0, activeCrop.top,
489                 activeCrop.left, activeCrop.bottom));
490         activeTransparentRegion.orSelf(Rect(activeCrop.right, activeCrop.top,
491                 s.active.w, activeCrop.bottom));
492     }
493     Rect frame(s.transform.transform(computeBounds(activeTransparentRegion)));
494     frame.intersect(hw->getViewport(), &frame);
495     const Transform& tr(hw->getTransform());
496     layer.setFrame(tr.transform(frame));
497     layer.setCrop(computeCrop(hw));
498     layer.setPlaneAlpha(s.alpha);
499 
500     /*
501      * Transformations are applied in this order:
502      * 1) buffer orientation/flip/mirror
503      * 2) state transformation (window manager)
504      * 3) layer orientation (screen orientation)
505      * (NOTE: the matrices are multiplied in reverse order)
506      */
507 
508     const Transform bufferOrientation(mCurrentTransform);
509     Transform transform(tr * s.transform * bufferOrientation);
510 
511     if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) {
512         /*
513          * the code below applies the display's inverse transform to the buffer
514          */
515         uint32_t invTransform = hw->getOrientationTransform();
516         uint32_t t_orientation = transform.getOrientation();
517         // calculate the inverse transform
518         if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
519             invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
520                     NATIVE_WINDOW_TRANSFORM_FLIP_H;
521             // If the transform has been rotated the axis of flip has been swapped
522             // so we need to swap which flip operations we are performing
523             bool is_h_flipped = (t_orientation & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0;
524             bool is_v_flipped = (t_orientation & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0;
525             if (is_h_flipped != is_v_flipped) {
526                 t_orientation ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
527                         NATIVE_WINDOW_TRANSFORM_FLIP_H;
528             }
529         }
530         // and apply to the current transform
531         transform = Transform(t_orientation) * Transform(invTransform);
532     }
533 
534     // this gives us only the "orientation" component of the transform
535     const uint32_t orientation = transform.getOrientation();
536     if (orientation & Transform::ROT_INVALID) {
537         // we can only handle simple transformation
538         layer.setSkip(true);
539     } else {
540         layer.setTransform(orientation);
541     }
542 }
543 
setPerFrameData(const sp<const DisplayDevice> & hw,HWComposer::HWCLayerInterface & layer)544 void Layer::setPerFrameData(const sp<const DisplayDevice>& hw,
545         HWComposer::HWCLayerInterface& layer) {
546     // we have to set the visible region on every frame because
547     // we currently free it during onLayerDisplayed(), which is called
548     // after HWComposer::commit() -- every frame.
549     // Apply this display's projection's viewport to the visible region
550     // before giving it to the HWC HAL.
551     const Transform& tr = hw->getTransform();
552     Region visible = tr.transform(visibleRegion.intersect(hw->getViewport()));
553     layer.setVisibleRegionScreen(visible);
554     layer.setSurfaceDamage(surfaceDamageRegion);
555 
556     if (mSidebandStream.get()) {
557         layer.setSidebandStream(mSidebandStream);
558     } else {
559         // NOTE: buffer can be NULL if the client never drew into this
560         // layer yet, or if we ran out of memory
561         layer.setBuffer(mActiveBuffer);
562     }
563 }
564 
setAcquireFence(const sp<const DisplayDevice> &,HWComposer::HWCLayerInterface & layer)565 void Layer::setAcquireFence(const sp<const DisplayDevice>& /* hw */,
566         HWComposer::HWCLayerInterface& layer) {
567     int fenceFd = -1;
568 
569     // TODO: there is a possible optimization here: we only need to set the
570     // acquire fence the first time a new buffer is acquired on EACH display.
571 
572     if (layer.getCompositionType() == HWC_OVERLAY || layer.getCompositionType() == HWC_CURSOR_OVERLAY) {
573         sp<Fence> fence = mSurfaceFlingerConsumer->getCurrentFence();
574         if (fence->isValid()) {
575             fenceFd = fence->dup();
576             if (fenceFd == -1) {
577                 ALOGW("failed to dup layer fence, skipping sync: %d", errno);
578             }
579         }
580     }
581     layer.setAcquireFenceFd(fenceFd);
582 }
583 
getPosition(const sp<const DisplayDevice> & hw)584 Rect Layer::getPosition(
585     const sp<const DisplayDevice>& hw)
586 {
587     // this gives us only the "orientation" component of the transform
588     const State& s(getCurrentState());
589 
590     // apply the layer's transform, followed by the display's global transform
591     // here we're guaranteed that the layer's transform preserves rects
592     Rect win(s.active.w, s.active.h);
593     if (!s.active.crop.isEmpty()) {
594         win.intersect(s.active.crop, &win);
595     }
596     // subtract the transparent region and snap to the bounds
597     Rect bounds = reduce(win, s.activeTransparentRegion);
598     Rect frame(s.transform.transform(bounds));
599     frame.intersect(hw->getViewport(), &frame);
600     const Transform& tr(hw->getTransform());
601     return Rect(tr.transform(frame));
602 }
603 
604 // ---------------------------------------------------------------------------
605 // drawing...
606 // ---------------------------------------------------------------------------
607 
draw(const sp<const DisplayDevice> & hw,const Region & clip) const608 void Layer::draw(const sp<const DisplayDevice>& hw, const Region& clip) const {
609     onDraw(hw, clip, false);
610 }
611 
draw(const sp<const DisplayDevice> & hw,bool useIdentityTransform) const612 void Layer::draw(const sp<const DisplayDevice>& hw,
613         bool useIdentityTransform) const {
614     onDraw(hw, Region(hw->bounds()), useIdentityTransform);
615 }
616 
draw(const sp<const DisplayDevice> & hw) const617 void Layer::draw(const sp<const DisplayDevice>& hw) const {
618     onDraw(hw, Region(hw->bounds()), false);
619 }
620 
onDraw(const sp<const DisplayDevice> & hw,const Region & clip,bool useIdentityTransform) const621 void Layer::onDraw(const sp<const DisplayDevice>& hw, const Region& clip,
622         bool useIdentityTransform) const
623 {
624     ATRACE_CALL();
625 
626     if (CC_UNLIKELY(mActiveBuffer == 0)) {
627         // the texture has not been created yet, this Layer has
628         // in fact never been drawn into. This happens frequently with
629         // SurfaceView because the WindowManager can't know when the client
630         // has drawn the first time.
631 
632         // If there is nothing under us, we paint the screen in black, otherwise
633         // we just skip this update.
634 
635         // figure out if there is something below us
636         Region under;
637         const SurfaceFlinger::LayerVector& drawingLayers(
638                 mFlinger->mDrawingState.layersSortedByZ);
639         const size_t count = drawingLayers.size();
640         for (size_t i=0 ; i<count ; ++i) {
641             const sp<Layer>& layer(drawingLayers[i]);
642             if (layer.get() == static_cast<Layer const*>(this))
643                 break;
644             under.orSelf( hw->getTransform().transform(layer->visibleRegion) );
645         }
646         // if not everything below us is covered, we plug the holes!
647         Region holes(clip.subtract(under));
648         if (!holes.isEmpty()) {
649             clearWithOpenGL(hw, holes, 0, 0, 0, 1);
650         }
651         return;
652     }
653 
654     // Bind the current buffer to the GL texture, and wait for it to be
655     // ready for us to draw into.
656     status_t err = mSurfaceFlingerConsumer->bindTextureImage();
657     if (err != NO_ERROR) {
658         ALOGW("onDraw: bindTextureImage failed (err=%d)", err);
659         // Go ahead and draw the buffer anyway; no matter what we do the screen
660         // is probably going to have something visibly wrong.
661     }
662 
663     bool blackOutLayer = isProtected() || (isSecure() && !hw->isSecure());
664 
665     RenderEngine& engine(mFlinger->getRenderEngine());
666 
667     if (!blackOutLayer) {
668         // TODO: we could be more subtle with isFixedSize()
669         const bool useFiltering = getFiltering() || needsFiltering(hw) || isFixedSize();
670 
671         // Query the texture matrix given our current filtering mode.
672         float textureMatrix[16];
673         mSurfaceFlingerConsumer->setFilteringEnabled(useFiltering);
674         mSurfaceFlingerConsumer->getTransformMatrix(textureMatrix);
675 
676         if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) {
677 
678             /*
679              * the code below applies the display's inverse transform to the texture transform
680              */
681 
682             // create a 4x4 transform matrix from the display transform flags
683             const mat4 flipH(-1,0,0,0,  0,1,0,0, 0,0,1,0, 1,0,0,1);
684             const mat4 flipV( 1,0,0,0, 0,-1,0,0, 0,0,1,0, 0,1,0,1);
685             const mat4 rot90( 0,1,0,0, -1,0,0,0, 0,0,1,0, 1,0,0,1);
686 
687             mat4 tr;
688             uint32_t transform = hw->getOrientationTransform();
689             if (transform & NATIVE_WINDOW_TRANSFORM_ROT_90)
690                 tr = tr * rot90;
691             if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_H)
692                 tr = tr * flipH;
693             if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_V)
694                 tr = tr * flipV;
695 
696             // calculate the inverse
697             tr = inverse(tr);
698 
699             // and finally apply it to the original texture matrix
700             const mat4 texTransform(mat4(static_cast<const float*>(textureMatrix)) * tr);
701             memcpy(textureMatrix, texTransform.asArray(), sizeof(textureMatrix));
702         }
703 
704         // Set things up for texturing.
705         mTexture.setDimensions(mActiveBuffer->getWidth(), mActiveBuffer->getHeight());
706         mTexture.setFiltering(useFiltering);
707         mTexture.setMatrix(textureMatrix);
708 
709         engine.setupLayerTexturing(mTexture);
710     } else {
711         engine.setupLayerBlackedOut();
712     }
713     drawWithOpenGL(hw, clip, useIdentityTransform);
714     engine.disableTexturing();
715 }
716 
717 
clearWithOpenGL(const sp<const DisplayDevice> & hw,const Region &,float red,float green,float blue,float alpha) const718 void Layer::clearWithOpenGL(const sp<const DisplayDevice>& hw,
719         const Region& /* clip */, float red, float green, float blue,
720         float alpha) const
721 {
722     RenderEngine& engine(mFlinger->getRenderEngine());
723     computeGeometry(hw, mMesh, false);
724     engine.setupFillWithColor(red, green, blue, alpha);
725     engine.drawMesh(mMesh);
726 }
727 
clearWithOpenGL(const sp<const DisplayDevice> & hw,const Region & clip) const728 void Layer::clearWithOpenGL(
729         const sp<const DisplayDevice>& hw, const Region& clip) const {
730     clearWithOpenGL(hw, clip, 0,0,0,0);
731 }
732 
drawWithOpenGL(const sp<const DisplayDevice> & hw,const Region &,bool useIdentityTransform) const733 void Layer::drawWithOpenGL(const sp<const DisplayDevice>& hw,
734         const Region& /* clip */, bool useIdentityTransform) const {
735     const State& s(getDrawingState());
736 
737     computeGeometry(hw, mMesh, useIdentityTransform);
738 
739     /*
740      * NOTE: the way we compute the texture coordinates here produces
741      * different results than when we take the HWC path -- in the later case
742      * the "source crop" is rounded to texel boundaries.
743      * This can produce significantly different results when the texture
744      * is scaled by a large amount.
745      *
746      * The GL code below is more logical (imho), and the difference with
747      * HWC is due to a limitation of the HWC API to integers -- a question
748      * is suspend is whether we should ignore this problem or revert to
749      * GL composition when a buffer scaling is applied (maybe with some
750      * minimal value)? Or, we could make GL behave like HWC -- but this feel
751      * like more of a hack.
752      */
753     const Rect win(computeBounds());
754 
755     float left   = float(win.left)   / float(s.active.w);
756     float top    = float(win.top)    / float(s.active.h);
757     float right  = float(win.right)  / float(s.active.w);
758     float bottom = float(win.bottom) / float(s.active.h);
759 
760     // TODO: we probably want to generate the texture coords with the mesh
761     // here we assume that we only have 4 vertices
762     Mesh::VertexArray<vec2> texCoords(mMesh.getTexCoordArray<vec2>());
763     texCoords[0] = vec2(left, 1.0f - top);
764     texCoords[1] = vec2(left, 1.0f - bottom);
765     texCoords[2] = vec2(right, 1.0f - bottom);
766     texCoords[3] = vec2(right, 1.0f - top);
767 
768     RenderEngine& engine(mFlinger->getRenderEngine());
769     engine.setupLayerBlending(mPremultipliedAlpha, isOpaque(s), s.alpha);
770     engine.drawMesh(mMesh);
771     engine.disableBlending();
772 }
773 
getProducerStickyTransform() const774 uint32_t Layer::getProducerStickyTransform() const {
775     int producerStickyTransform = 0;
776     int ret = mProducer->query(NATIVE_WINDOW_STICKY_TRANSFORM, &producerStickyTransform);
777     if (ret != OK) {
778         ALOGW("%s: Error %s (%d) while querying window sticky transform.", __FUNCTION__,
779                 strerror(-ret), ret);
780         return 0;
781     }
782     return static_cast<uint32_t>(producerStickyTransform);
783 }
784 
setFiltering(bool filtering)785 void Layer::setFiltering(bool filtering) {
786     mFiltering = filtering;
787 }
788 
getFiltering() const789 bool Layer::getFiltering() const {
790     return mFiltering;
791 }
792 
793 // As documented in libhardware header, formats in the range
794 // 0x100 - 0x1FF are specific to the HAL implementation, and
795 // are known to have no alpha channel
796 // TODO: move definition for device-specific range into
797 // hardware.h, instead of using hard-coded values here.
798 #define HARDWARE_IS_DEVICE_FORMAT(f) ((f) >= 0x100 && (f) <= 0x1FF)
799 
getOpacityForFormat(uint32_t format)800 bool Layer::getOpacityForFormat(uint32_t format) {
801     if (HARDWARE_IS_DEVICE_FORMAT(format)) {
802         return true;
803     }
804     switch (format) {
805         case HAL_PIXEL_FORMAT_RGBA_8888:
806         case HAL_PIXEL_FORMAT_BGRA_8888:
807             return false;
808     }
809     // in all other case, we have no blending (also for unknown formats)
810     return true;
811 }
812 
813 // ----------------------------------------------------------------------------
814 // local state
815 // ----------------------------------------------------------------------------
816 
computeGeometry(const sp<const DisplayDevice> & hw,Mesh & mesh,bool useIdentityTransform) const817 void Layer::computeGeometry(const sp<const DisplayDevice>& hw, Mesh& mesh,
818         bool useIdentityTransform) const
819 {
820     const Layer::State& s(getDrawingState());
821     const Transform tr(useIdentityTransform ?
822             hw->getTransform() : hw->getTransform() * s.transform);
823     const uint32_t hw_h = hw->getHeight();
824     Rect win(s.active.w, s.active.h);
825     if (!s.active.crop.isEmpty()) {
826         win.intersect(s.active.crop, &win);
827     }
828     // subtract the transparent region and snap to the bounds
829     win = reduce(win, s.activeTransparentRegion);
830 
831     Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>());
832     position[0] = tr.transform(win.left,  win.top);
833     position[1] = tr.transform(win.left,  win.bottom);
834     position[2] = tr.transform(win.right, win.bottom);
835     position[3] = tr.transform(win.right, win.top);
836     for (size_t i=0 ; i<4 ; i++) {
837         position[i].y = hw_h - position[i].y;
838     }
839 }
840 
isOpaque(const Layer::State & s) const841 bool Layer::isOpaque(const Layer::State& s) const
842 {
843     // if we don't have a buffer yet, we're translucent regardless of the
844     // layer's opaque flag.
845     if (mActiveBuffer == 0) {
846         return false;
847     }
848 
849     // if the layer has the opaque flag, then we're always opaque,
850     // otherwise we use the current buffer's format.
851     return ((s.flags & layer_state_t::eLayerOpaque) != 0) || mCurrentOpacity;
852 }
853 
isSecure() const854 bool Layer::isSecure() const
855 {
856     const Layer::State& s(mDrawingState);
857     return (s.flags & layer_state_t::eLayerSecure);
858 }
859 
isProtected() const860 bool Layer::isProtected() const
861 {
862     const sp<GraphicBuffer>& activeBuffer(mActiveBuffer);
863     return (activeBuffer != 0) &&
864             (activeBuffer->getUsage() & GRALLOC_USAGE_PROTECTED);
865 }
866 
isFixedSize() const867 bool Layer::isFixedSize() const {
868     return mCurrentScalingMode != NATIVE_WINDOW_SCALING_MODE_FREEZE;
869 }
870 
isCropped() const871 bool Layer::isCropped() const {
872     return !mCurrentCrop.isEmpty();
873 }
874 
needsFiltering(const sp<const DisplayDevice> & hw) const875 bool Layer::needsFiltering(const sp<const DisplayDevice>& hw) const {
876     return mNeedsFiltering || hw->needsFiltering();
877 }
878 
setVisibleRegion(const Region & visibleRegion)879 void Layer::setVisibleRegion(const Region& visibleRegion) {
880     // always called from main thread
881     this->visibleRegion = visibleRegion;
882 }
883 
setCoveredRegion(const Region & coveredRegion)884 void Layer::setCoveredRegion(const Region& coveredRegion) {
885     // always called from main thread
886     this->coveredRegion = coveredRegion;
887 }
888 
setVisibleNonTransparentRegion(const Region & setVisibleNonTransparentRegion)889 void Layer::setVisibleNonTransparentRegion(const Region&
890         setVisibleNonTransparentRegion) {
891     // always called from main thread
892     this->visibleNonTransparentRegion = setVisibleNonTransparentRegion;
893 }
894 
895 // ----------------------------------------------------------------------------
896 // transaction
897 // ----------------------------------------------------------------------------
898 
doTransaction(uint32_t flags)899 uint32_t Layer::doTransaction(uint32_t flags) {
900     ATRACE_CALL();
901 
902     const Layer::State& s(getDrawingState());
903     const Layer::State& c(getCurrentState());
904 
905     const bool sizeChanged = (c.requested.w != s.requested.w) ||
906                              (c.requested.h != s.requested.h);
907 
908     if (sizeChanged) {
909         // the size changed, we need to ask our client to request a new buffer
910         ALOGD_IF(DEBUG_RESIZE,
911                 "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n"
912                 "  current={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
913                 "            requested={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }}\n"
914                 "  drawing={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
915                 "            requested={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }}\n",
916                 this, getName().string(), mCurrentTransform, mCurrentScalingMode,
917                 c.active.w, c.active.h,
918                 c.active.crop.left,
919                 c.active.crop.top,
920                 c.active.crop.right,
921                 c.active.crop.bottom,
922                 c.active.crop.getWidth(),
923                 c.active.crop.getHeight(),
924                 c.requested.w, c.requested.h,
925                 c.requested.crop.left,
926                 c.requested.crop.top,
927                 c.requested.crop.right,
928                 c.requested.crop.bottom,
929                 c.requested.crop.getWidth(),
930                 c.requested.crop.getHeight(),
931                 s.active.w, s.active.h,
932                 s.active.crop.left,
933                 s.active.crop.top,
934                 s.active.crop.right,
935                 s.active.crop.bottom,
936                 s.active.crop.getWidth(),
937                 s.active.crop.getHeight(),
938                 s.requested.w, s.requested.h,
939                 s.requested.crop.left,
940                 s.requested.crop.top,
941                 s.requested.crop.right,
942                 s.requested.crop.bottom,
943                 s.requested.crop.getWidth(),
944                 s.requested.crop.getHeight());
945 
946         // record the new size, form this point on, when the client request
947         // a buffer, it'll get the new size.
948         mSurfaceFlingerConsumer->setDefaultBufferSize(
949                 c.requested.w, c.requested.h);
950     }
951 
952     if (!isFixedSize()) {
953 
954         const bool resizePending = (c.requested.w != c.active.w) ||
955                                    (c.requested.h != c.active.h);
956 
957         if (resizePending && mSidebandStream == NULL) {
958             // don't let Layer::doTransaction update the drawing state
959             // if we have a pending resize, unless we are in fixed-size mode.
960             // the drawing state will be updated only once we receive a buffer
961             // with the correct size.
962             //
963             // in particular, we want to make sure the clip (which is part
964             // of the geometry state) is latched together with the size but is
965             // latched immediately when no resizing is involved.
966             //
967             // If a sideband stream is attached, however, we want to skip this
968             // optimization so that transactions aren't missed when a buffer
969             // never arrives
970 
971             flags |= eDontUpdateGeometryState;
972         }
973     }
974 
975     // always set active to requested, unless we're asked not to
976     // this is used by Layer, which special cases resizes.
977     if (flags & eDontUpdateGeometryState)  {
978     } else {
979         Layer::State& editCurrentState(getCurrentState());
980         editCurrentState.active = c.requested;
981     }
982 
983     if (s.active != c.active) {
984         // invalidate and recompute the visible regions if needed
985         flags |= Layer::eVisibleRegion;
986     }
987 
988     if (c.sequence != s.sequence) {
989         // invalidate and recompute the visible regions if needed
990         flags |= eVisibleRegion;
991         this->contentDirty = true;
992 
993         // we may use linear filtering, if the matrix scales us
994         const uint8_t type = c.transform.getType();
995         mNeedsFiltering = (!c.transform.preserveRects() ||
996                 (type >= Transform::SCALE));
997     }
998 
999     // Commit the transaction
1000     commitTransaction();
1001     return flags;
1002 }
1003 
commitTransaction()1004 void Layer::commitTransaction() {
1005     mDrawingState = mCurrentState;
1006 }
1007 
getTransactionFlags(uint32_t flags)1008 uint32_t Layer::getTransactionFlags(uint32_t flags) {
1009     return android_atomic_and(~flags, &mTransactionFlags) & flags;
1010 }
1011 
setTransactionFlags(uint32_t flags)1012 uint32_t Layer::setTransactionFlags(uint32_t flags) {
1013     return android_atomic_or(flags, &mTransactionFlags);
1014 }
1015 
setPosition(float x,float y)1016 bool Layer::setPosition(float x, float y) {
1017     if (mCurrentState.transform.tx() == x && mCurrentState.transform.ty() == y)
1018         return false;
1019     mCurrentState.sequence++;
1020     mCurrentState.transform.set(x, y);
1021     setTransactionFlags(eTransactionNeeded);
1022     return true;
1023 }
setLayer(uint32_t z)1024 bool Layer::setLayer(uint32_t z) {
1025     if (mCurrentState.z == z)
1026         return false;
1027     mCurrentState.sequence++;
1028     mCurrentState.z = z;
1029     setTransactionFlags(eTransactionNeeded);
1030     return true;
1031 }
setSize(uint32_t w,uint32_t h)1032 bool Layer::setSize(uint32_t w, uint32_t h) {
1033     if (mCurrentState.requested.w == w && mCurrentState.requested.h == h)
1034         return false;
1035     mCurrentState.requested.w = w;
1036     mCurrentState.requested.h = h;
1037     setTransactionFlags(eTransactionNeeded);
1038     return true;
1039 }
setAlpha(uint8_t alpha)1040 bool Layer::setAlpha(uint8_t alpha) {
1041     if (mCurrentState.alpha == alpha)
1042         return false;
1043     mCurrentState.sequence++;
1044     mCurrentState.alpha = alpha;
1045     setTransactionFlags(eTransactionNeeded);
1046     return true;
1047 }
setMatrix(const layer_state_t::matrix22_t & matrix)1048 bool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) {
1049     mCurrentState.sequence++;
1050     mCurrentState.transform.set(
1051             matrix.dsdx, matrix.dsdy, matrix.dtdx, matrix.dtdy);
1052     setTransactionFlags(eTransactionNeeded);
1053     return true;
1054 }
setTransparentRegionHint(const Region & transparent)1055 bool Layer::setTransparentRegionHint(const Region& transparent) {
1056     mCurrentState.requestedTransparentRegion = transparent;
1057     setTransactionFlags(eTransactionNeeded);
1058     return true;
1059 }
setFlags(uint8_t flags,uint8_t mask)1060 bool Layer::setFlags(uint8_t flags, uint8_t mask) {
1061     const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask);
1062     if (mCurrentState.flags == newFlags)
1063         return false;
1064     mCurrentState.sequence++;
1065     mCurrentState.flags = newFlags;
1066     setTransactionFlags(eTransactionNeeded);
1067     return true;
1068 }
setCrop(const Rect & crop)1069 bool Layer::setCrop(const Rect& crop) {
1070     if (mCurrentState.requested.crop == crop)
1071         return false;
1072     mCurrentState.sequence++;
1073     mCurrentState.requested.crop = crop;
1074     setTransactionFlags(eTransactionNeeded);
1075     return true;
1076 }
1077 
setLayerStack(uint32_t layerStack)1078 bool Layer::setLayerStack(uint32_t layerStack) {
1079     if (mCurrentState.layerStack == layerStack)
1080         return false;
1081     mCurrentState.sequence++;
1082     mCurrentState.layerStack = layerStack;
1083     setTransactionFlags(eTransactionNeeded);
1084     return true;
1085 }
1086 
useSurfaceDamage()1087 void Layer::useSurfaceDamage() {
1088     if (mFlinger->mForceFullDamage) {
1089         surfaceDamageRegion = Region::INVALID_REGION;
1090     } else {
1091         surfaceDamageRegion = mSurfaceFlingerConsumer->getSurfaceDamage();
1092     }
1093 }
1094 
useEmptyDamage()1095 void Layer::useEmptyDamage() {
1096     surfaceDamageRegion.clear();
1097 }
1098 
1099 // ----------------------------------------------------------------------------
1100 // pageflip handling...
1101 // ----------------------------------------------------------------------------
1102 
shouldPresentNow(const DispSync & dispSync) const1103 bool Layer::shouldPresentNow(const DispSync& dispSync) const {
1104     if (mSidebandStreamChanged) {
1105         return true;
1106     }
1107 
1108     Mutex::Autolock lock(mQueueItemLock);
1109     if (mQueueItems.empty()) {
1110         return false;
1111     }
1112     auto timestamp = mQueueItems[0].mTimestamp;
1113     nsecs_t expectedPresent =
1114             mSurfaceFlingerConsumer->computeExpectedPresent(dispSync);
1115 
1116     // Ignore timestamps more than a second in the future
1117     bool isPlausible = timestamp < (expectedPresent + s2ns(1));
1118     ALOGW_IF(!isPlausible, "[%s] Timestamp %" PRId64 " seems implausible "
1119             "relative to expectedPresent %" PRId64, mName.string(), timestamp,
1120             expectedPresent);
1121 
1122     bool isDue = timestamp < expectedPresent;
1123     return isDue || !isPlausible;
1124 }
1125 
onPreComposition()1126 bool Layer::onPreComposition() {
1127     mRefreshPending = false;
1128     return mQueuedFrames > 0 || mSidebandStreamChanged;
1129 }
1130 
onPostComposition()1131 void Layer::onPostComposition() {
1132     if (mFrameLatencyNeeded) {
1133         nsecs_t desiredPresentTime = mSurfaceFlingerConsumer->getTimestamp();
1134         mFrameTracker.setDesiredPresentTime(desiredPresentTime);
1135 
1136         sp<Fence> frameReadyFence = mSurfaceFlingerConsumer->getCurrentFence();
1137         if (frameReadyFence->isValid()) {
1138             mFrameTracker.setFrameReadyFence(frameReadyFence);
1139         } else {
1140             // There was no fence for this frame, so assume that it was ready
1141             // to be presented at the desired present time.
1142             mFrameTracker.setFrameReadyTime(desiredPresentTime);
1143         }
1144 
1145         const HWComposer& hwc = mFlinger->getHwComposer();
1146         sp<Fence> presentFence = hwc.getDisplayFence(HWC_DISPLAY_PRIMARY);
1147         if (presentFence->isValid()) {
1148             mFrameTracker.setActualPresentFence(presentFence);
1149         } else {
1150             // The HWC doesn't support present fences, so use the refresh
1151             // timestamp instead.
1152             nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
1153             mFrameTracker.setActualPresentTime(presentTime);
1154         }
1155 
1156         mFrameTracker.advanceFrame();
1157         mFrameLatencyNeeded = false;
1158     }
1159 }
1160 
isVisible() const1161 bool Layer::isVisible() const {
1162     const Layer::State& s(mDrawingState);
1163     return !(s.flags & layer_state_t::eLayerHidden) && s.alpha
1164             && (mActiveBuffer != NULL || mSidebandStream != NULL);
1165 }
1166 
latchBuffer(bool & recomputeVisibleRegions)1167 Region Layer::latchBuffer(bool& recomputeVisibleRegions)
1168 {
1169     ATRACE_CALL();
1170 
1171     if (android_atomic_acquire_cas(true, false, &mSidebandStreamChanged) == 0) {
1172         // mSidebandStreamChanged was true
1173         mSidebandStream = mSurfaceFlingerConsumer->getSidebandStream();
1174         if (mSidebandStream != NULL) {
1175             setTransactionFlags(eTransactionNeeded);
1176             mFlinger->setTransactionFlags(eTraversalNeeded);
1177         }
1178         recomputeVisibleRegions = true;
1179 
1180         const State& s(getDrawingState());
1181         return s.transform.transform(Region(Rect(s.active.w, s.active.h)));
1182     }
1183 
1184     Region outDirtyRegion;
1185     if (mQueuedFrames > 0) {
1186 
1187         // if we've already called updateTexImage() without going through
1188         // a composition step, we have to skip this layer at this point
1189         // because we cannot call updateTeximage() without a corresponding
1190         // compositionComplete() call.
1191         // we'll trigger an update in onPreComposition().
1192         if (mRefreshPending) {
1193             return outDirtyRegion;
1194         }
1195 
1196         // Capture the old state of the layer for comparisons later
1197         const State& s(getDrawingState());
1198         const bool oldOpacity = isOpaque(s);
1199         sp<GraphicBuffer> oldActiveBuffer = mActiveBuffer;
1200 
1201         struct Reject : public SurfaceFlingerConsumer::BufferRejecter {
1202             Layer::State& front;
1203             Layer::State& current;
1204             bool& recomputeVisibleRegions;
1205             bool stickyTransformSet;
1206             Reject(Layer::State& front, Layer::State& current,
1207                     bool& recomputeVisibleRegions, bool stickySet)
1208                 : front(front), current(current),
1209                   recomputeVisibleRegions(recomputeVisibleRegions),
1210                   stickyTransformSet(stickySet) {
1211             }
1212 
1213             virtual bool reject(const sp<GraphicBuffer>& buf,
1214                     const BufferItem& item) {
1215                 if (buf == NULL) {
1216                     return false;
1217                 }
1218 
1219                 uint32_t bufWidth  = buf->getWidth();
1220                 uint32_t bufHeight = buf->getHeight();
1221 
1222                 // check that we received a buffer of the right size
1223                 // (Take the buffer's orientation into account)
1224                 if (item.mTransform & Transform::ROT_90) {
1225                     swap(bufWidth, bufHeight);
1226                 }
1227 
1228                 bool isFixedSize = item.mScalingMode != NATIVE_WINDOW_SCALING_MODE_FREEZE;
1229                 if (front.active != front.requested) {
1230 
1231                     if (isFixedSize ||
1232                             (bufWidth == front.requested.w &&
1233                              bufHeight == front.requested.h))
1234                     {
1235                         // Here we pretend the transaction happened by updating the
1236                         // current and drawing states. Drawing state is only accessed
1237                         // in this thread, no need to have it locked
1238                         front.active = front.requested;
1239 
1240                         // We also need to update the current state so that
1241                         // we don't end-up overwriting the drawing state with
1242                         // this stale current state during the next transaction
1243                         //
1244                         // NOTE: We don't need to hold the transaction lock here
1245                         // because State::active is only accessed from this thread.
1246                         current.active = front.active;
1247 
1248                         // recompute visible region
1249                         recomputeVisibleRegions = true;
1250                     }
1251 
1252                     ALOGD_IF(DEBUG_RESIZE,
1253                             "latchBuffer/reject: buffer (%ux%u, tr=%02x), scalingMode=%d\n"
1254                             "  drawing={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
1255                             "            requested={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }}\n",
1256                             bufWidth, bufHeight, item.mTransform, item.mScalingMode,
1257                             front.active.w, front.active.h,
1258                             front.active.crop.left,
1259                             front.active.crop.top,
1260                             front.active.crop.right,
1261                             front.active.crop.bottom,
1262                             front.active.crop.getWidth(),
1263                             front.active.crop.getHeight(),
1264                             front.requested.w, front.requested.h,
1265                             front.requested.crop.left,
1266                             front.requested.crop.top,
1267                             front.requested.crop.right,
1268                             front.requested.crop.bottom,
1269                             front.requested.crop.getWidth(),
1270                             front.requested.crop.getHeight());
1271                 }
1272 
1273                 if (!isFixedSize && !stickyTransformSet) {
1274                     if (front.active.w != bufWidth ||
1275                         front.active.h != bufHeight) {
1276                         // reject this buffer
1277                         ALOGE("rejecting buffer: bufWidth=%d, bufHeight=%d, front.active.{w=%d, h=%d}",
1278                                 bufWidth, bufHeight, front.active.w, front.active.h);
1279                         return true;
1280                     }
1281                 }
1282 
1283                 // if the transparent region has changed (this test is
1284                 // conservative, but that's fine, worst case we're doing
1285                 // a bit of extra work), we latch the new one and we
1286                 // trigger a visible-region recompute.
1287                 if (!front.activeTransparentRegion.isTriviallyEqual(
1288                         front.requestedTransparentRegion)) {
1289                     front.activeTransparentRegion = front.requestedTransparentRegion;
1290 
1291                     // We also need to update the current state so that
1292                     // we don't end-up overwriting the drawing state with
1293                     // this stale current state during the next transaction
1294                     //
1295                     // NOTE: We don't need to hold the transaction lock here
1296                     // because State::active is only accessed from this thread.
1297                     current.activeTransparentRegion = front.activeTransparentRegion;
1298 
1299                     // recompute visible region
1300                     recomputeVisibleRegions = true;
1301                 }
1302 
1303                 return false;
1304             }
1305         };
1306 
1307         Reject r(mDrawingState, getCurrentState(), recomputeVisibleRegions,
1308                 getProducerStickyTransform() != 0);
1309 
1310         uint64_t maxFrameNumber = 0;
1311         {
1312             Mutex::Autolock lock(mQueueItemLock);
1313             maxFrameNumber = mLastFrameNumberReceived;
1314         }
1315 
1316         status_t updateResult = mSurfaceFlingerConsumer->updateTexImage(&r,
1317                 mFlinger->mPrimaryDispSync, maxFrameNumber);
1318         if (updateResult == BufferQueue::PRESENT_LATER) {
1319             // Producer doesn't want buffer to be displayed yet.  Signal a
1320             // layer update so we check again at the next opportunity.
1321             mFlinger->signalLayerUpdate();
1322             return outDirtyRegion;
1323         } else if (updateResult == SurfaceFlingerConsumer::BUFFER_REJECTED) {
1324             // If the buffer has been rejected, remove it from the shadow queue
1325             // and return early
1326             Mutex::Autolock lock(mQueueItemLock);
1327             mQueueItems.removeAt(0);
1328             android_atomic_dec(&mQueuedFrames);
1329             return outDirtyRegion;
1330         } else if (updateResult != NO_ERROR || mUpdateTexImageFailed) {
1331             // This can occur if something goes wrong when trying to create the
1332             // EGLImage for this buffer. If this happens, the buffer has already
1333             // been released, so we need to clean up the queue and bug out
1334             // early.
1335             {
1336                 Mutex::Autolock lock(mQueueItemLock);
1337                 mQueueItems.clear();
1338                 android_atomic_and(0, &mQueuedFrames);
1339             }
1340 
1341             // Once we have hit this state, the shadow queue may no longer
1342             // correctly reflect the incoming BufferQueue's contents, so even if
1343             // updateTexImage starts working, the only safe course of action is
1344             // to continue to ignore updates.
1345             mUpdateTexImageFailed = true;
1346 
1347             return outDirtyRegion;
1348         }
1349 
1350         { // Autolock scope
1351             auto currentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber();
1352 
1353             Mutex::Autolock lock(mQueueItemLock);
1354 
1355             // Remove any stale buffers that have been dropped during
1356             // updateTexImage
1357             while (mQueueItems[0].mFrameNumber != currentFrameNumber) {
1358                 mQueueItems.removeAt(0);
1359                 android_atomic_dec(&mQueuedFrames);
1360             }
1361 
1362             mQueueItems.removeAt(0);
1363         }
1364 
1365 
1366         // Decrement the queued-frames count.  Signal another event if we
1367         // have more frames pending.
1368         if (android_atomic_dec(&mQueuedFrames) > 1) {
1369             mFlinger->signalLayerUpdate();
1370         }
1371 
1372         if (updateResult != NO_ERROR) {
1373             // something happened!
1374             recomputeVisibleRegions = true;
1375             return outDirtyRegion;
1376         }
1377 
1378         // update the active buffer
1379         mActiveBuffer = mSurfaceFlingerConsumer->getCurrentBuffer();
1380         if (mActiveBuffer == NULL) {
1381             // this can only happen if the very first buffer was rejected.
1382             return outDirtyRegion;
1383         }
1384 
1385         mRefreshPending = true;
1386         mFrameLatencyNeeded = true;
1387         if (oldActiveBuffer == NULL) {
1388              // the first time we receive a buffer, we need to trigger a
1389              // geometry invalidation.
1390             recomputeVisibleRegions = true;
1391          }
1392 
1393         Rect crop(mSurfaceFlingerConsumer->getCurrentCrop());
1394         const uint32_t transform(mSurfaceFlingerConsumer->getCurrentTransform());
1395         const uint32_t scalingMode(mSurfaceFlingerConsumer->getCurrentScalingMode());
1396         if ((crop != mCurrentCrop) ||
1397             (transform != mCurrentTransform) ||
1398             (scalingMode != mCurrentScalingMode))
1399         {
1400             mCurrentCrop = crop;
1401             mCurrentTransform = transform;
1402             mCurrentScalingMode = scalingMode;
1403             recomputeVisibleRegions = true;
1404         }
1405 
1406         if (oldActiveBuffer != NULL) {
1407             uint32_t bufWidth  = mActiveBuffer->getWidth();
1408             uint32_t bufHeight = mActiveBuffer->getHeight();
1409             if (bufWidth != uint32_t(oldActiveBuffer->width) ||
1410                 bufHeight != uint32_t(oldActiveBuffer->height)) {
1411                 recomputeVisibleRegions = true;
1412             }
1413         }
1414 
1415         mCurrentOpacity = getOpacityForFormat(mActiveBuffer->format);
1416         if (oldOpacity != isOpaque(s)) {
1417             recomputeVisibleRegions = true;
1418         }
1419 
1420         // FIXME: postedRegion should be dirty & bounds
1421         Region dirtyRegion(Rect(s.active.w, s.active.h));
1422 
1423         // transform the dirty region to window-manager space
1424         outDirtyRegion = (s.transform.transform(dirtyRegion));
1425     }
1426     return outDirtyRegion;
1427 }
1428 
getEffectiveUsage(uint32_t usage) const1429 uint32_t Layer::getEffectiveUsage(uint32_t usage) const
1430 {
1431     // TODO: should we do something special if mSecure is set?
1432     if (mProtectedByApp) {
1433         // need a hardware-protected path to external video sink
1434         usage |= GraphicBuffer::USAGE_PROTECTED;
1435     }
1436     if (mPotentialCursor) {
1437         usage |= GraphicBuffer::USAGE_CURSOR;
1438     }
1439     usage |= GraphicBuffer::USAGE_HW_COMPOSER;
1440     return usage;
1441 }
1442 
updateTransformHint(const sp<const DisplayDevice> & hw) const1443 void Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const {
1444     uint32_t orientation = 0;
1445     if (!mFlinger->mDebugDisableTransformHint) {
1446         // The transform hint is used to improve performance, but we can
1447         // only have a single transform hint, it cannot
1448         // apply to all displays.
1449         const Transform& planeTransform(hw->getTransform());
1450         orientation = planeTransform.getOrientation();
1451         if (orientation & Transform::ROT_INVALID) {
1452             orientation = 0;
1453         }
1454     }
1455     mSurfaceFlingerConsumer->setTransformHint(orientation);
1456 }
1457 
1458 // ----------------------------------------------------------------------------
1459 // debugging
1460 // ----------------------------------------------------------------------------
1461 
dump(String8 & result,Colorizer & colorizer) const1462 void Layer::dump(String8& result, Colorizer& colorizer) const
1463 {
1464     const Layer::State& s(getDrawingState());
1465 
1466     colorizer.colorize(result, Colorizer::GREEN);
1467     result.appendFormat(
1468             "+ %s %p (%s)\n",
1469             getTypeId(), this, getName().string());
1470     colorizer.reset(result);
1471 
1472     s.activeTransparentRegion.dump(result, "transparentRegion");
1473     visibleRegion.dump(result, "visibleRegion");
1474     surfaceDamageRegion.dump(result, "surfaceDamageRegion");
1475     sp<Client> client(mClientRef.promote());
1476 
1477     result.appendFormat(            "      "
1478             "layerStack=%4d, z=%9d, pos=(%g,%g), size=(%4d,%4d), crop=(%4d,%4d,%4d,%4d), "
1479             "isOpaque=%1d, invalidate=%1d, "
1480             "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n"
1481             "      client=%p\n",
1482             s.layerStack, s.z, s.transform.tx(), s.transform.ty(), s.active.w, s.active.h,
1483             s.active.crop.left, s.active.crop.top,
1484             s.active.crop.right, s.active.crop.bottom,
1485             isOpaque(s), contentDirty,
1486             s.alpha, s.flags,
1487             s.transform[0][0], s.transform[0][1],
1488             s.transform[1][0], s.transform[1][1],
1489             client.get());
1490 
1491     sp<const GraphicBuffer> buf0(mActiveBuffer);
1492     uint32_t w0=0, h0=0, s0=0, f0=0;
1493     if (buf0 != 0) {
1494         w0 = buf0->getWidth();
1495         h0 = buf0->getHeight();
1496         s0 = buf0->getStride();
1497         f0 = buf0->format;
1498     }
1499     result.appendFormat(
1500             "      "
1501             "format=%2d, activeBuffer=[%4ux%4u:%4u,%3X],"
1502             " queued-frames=%d, mRefreshPending=%d\n",
1503             mFormat, w0, h0, s0,f0,
1504             mQueuedFrames, mRefreshPending);
1505 
1506     if (mSurfaceFlingerConsumer != 0) {
1507         mSurfaceFlingerConsumer->dump(result, "            ");
1508     }
1509 }
1510 
dumpFrameStats(String8 & result) const1511 void Layer::dumpFrameStats(String8& result) const {
1512     mFrameTracker.dumpStats(result);
1513 }
1514 
clearFrameStats()1515 void Layer::clearFrameStats() {
1516     mFrameTracker.clearStats();
1517 }
1518 
logFrameStats()1519 void Layer::logFrameStats() {
1520     mFrameTracker.logAndResetStats(mName);
1521 }
1522 
getFrameStats(FrameStats * outStats) const1523 void Layer::getFrameStats(FrameStats* outStats) const {
1524     mFrameTracker.getStats(outStats);
1525 }
1526 
1527 // ---------------------------------------------------------------------------
1528 
LayerCleaner(const sp<SurfaceFlinger> & flinger,const sp<Layer> & layer)1529 Layer::LayerCleaner::LayerCleaner(const sp<SurfaceFlinger>& flinger,
1530         const sp<Layer>& layer)
1531     : mFlinger(flinger), mLayer(layer) {
1532 }
1533 
~LayerCleaner()1534 Layer::LayerCleaner::~LayerCleaner() {
1535     // destroy client resources
1536     mFlinger->onLayerDestroyed(mLayer);
1537 }
1538 
1539 // ---------------------------------------------------------------------------
1540 }; // namespace android
1541 
1542 #if defined(__gl_h_)
1543 #error "don't include gl/gl.h in this file"
1544 #endif
1545 
1546 #if defined(__gl2_h_)
1547 #error "don't include gl2/gl2.h in this file"
1548 #endif
1549