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