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
53namespace android {
54
55// ---------------------------------------------------------------------------
56
57int32_t Layer::sSequence = 1;
58
59Layer::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
120void 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
142Layer::~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
155void 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
163void 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
174void 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
183void 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)
193void Layer::onRemoved() {
194    mSurfaceFlingerConsumer->abandon();
195}
196
197// ---------------------------------------------------------------------------
198// set-up
199// ---------------------------------------------------------------------------
200
201const String8& Layer::getName() const {
202    return mName;
203}
204
205status_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
232sp<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
260sp<IGraphicBufferProducer> Layer::getProducer() const {
261    return mProducer;
262}
263
264// ---------------------------------------------------------------------------
265// h/w composer set-up
266// ---------------------------------------------------------------------------
267
268Rect 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
285static 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
295Rect Layer::computeBounds() const {
296    const Layer::State& s(getDrawingState());
297    return computeBounds(s.activeTransparentRegion);
298}
299
300Rect 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
310FloatRect 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
410void 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
506void 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
526void 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
545Rect 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
569void Layer::draw(const sp<const DisplayDevice>& hw, const Region& clip) const {
570    onDraw(hw, clip, false);
571}
572
573void Layer::draw(const sp<const DisplayDevice>& hw,
574        bool useIdentityTransform) const {
575    onDraw(hw, Region(hw->bounds()), useIdentityTransform);
576}
577
578void Layer::draw(const sp<const DisplayDevice>& hw) const {
579    onDraw(hw, Region(hw->bounds()), false);
580}
581
582void 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
679void 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
689void Layer::clearWithOpenGL(
690        const sp<const DisplayDevice>& hw, const Region& clip) const {
691    clearWithOpenGL(hw, clip, 0,0,0,0);
692}
693
694void 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
736uint32_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
747void Layer::setFiltering(bool filtering) {
748    mFiltering = filtering;
749}
750
751bool 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
762bool 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
780void 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
804bool 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
817bool Layer::isProtected() const
818{
819    const sp<GraphicBuffer>& activeBuffer(mActiveBuffer);
820    return (activeBuffer != 0) &&
821            (activeBuffer->getUsage() & GRALLOC_USAGE_PROTECTED);
822}
823
824bool Layer::isFixedSize() const {
825    return mCurrentScalingMode != NATIVE_WINDOW_SCALING_MODE_FREEZE;
826}
827
828bool Layer::isCropped() const {
829    return !mCurrentCrop.isEmpty();
830}
831
832bool Layer::needsFiltering(const sp<const DisplayDevice>& hw) const {
833    return mNeedsFiltering || hw->needsFiltering();
834}
835
836void Layer::setVisibleRegion(const Region& visibleRegion) {
837    // always called from main thread
838    this->visibleRegion = visibleRegion;
839}
840
841void Layer::setCoveredRegion(const Region& coveredRegion) {
842    // always called from main thread
843    this->coveredRegion = coveredRegion;
844}
845
846void Layer::setVisibleNonTransparentRegion(const Region&
847        setVisibleNonTransparentRegion) {
848    // always called from main thread
849    this->visibleNonTransparentRegion = setVisibleNonTransparentRegion;
850}
851
852// ----------------------------------------------------------------------------
853// transaction
854// ----------------------------------------------------------------------------
855
856uint32_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
957void Layer::commitTransaction() {
958    mDrawingState = mCurrentState;
959}
960
961uint32_t Layer::getTransactionFlags(uint32_t flags) {
962    return android_atomic_and(~flags, &mTransactionFlags) & flags;
963}
964
965uint32_t Layer::setTransactionFlags(uint32_t flags) {
966    return android_atomic_or(flags, &mTransactionFlags);
967}
968
969bool 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}
977bool 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}
985bool 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}
993bool 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}
1001bool 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}
1008bool Layer::setTransparentRegionHint(const Region& transparent) {
1009    mCurrentState.requestedTransparentRegion = transparent;
1010    setTransactionFlags(eTransactionNeeded);
1011    return true;
1012}
1013bool 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}
1022bool 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
1031bool 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
1044bool 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
1052bool Layer::onPreComposition() {
1053    mRefreshPending = false;
1054    return mQueuedFrames > 0 || mSidebandStreamChanged;
1055}
1056
1057void 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
1087bool 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
1093Region 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
1310uint32_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
1324void 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
1343void 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
1391void Layer::dumpFrameStats(String8& result) const {
1392    mFrameTracker.dumpStats(result);
1393}
1394
1395void Layer::clearFrameStats() {
1396    mFrameTracker.clearStats();
1397}
1398
1399void Layer::logFrameStats() {
1400    mFrameTracker.logAndResetStats(mName);
1401}
1402
1403void Layer::getFrameStats(FrameStats* outStats) const {
1404    mFrameTracker.getStats(outStats);
1405}
1406
1407// ---------------------------------------------------------------------------
1408
1409Layer::LayerCleaner::LayerCleaner(const sp<SurfaceFlinger>& flinger,
1410        const sp<Layer>& layer)
1411    : mFlinger(flinger), mLayer(layer) {
1412}
1413
1414Layer::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