HWComposer.cpp revision d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3
1/*
2 * Copyright (C) 2010 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// Uncomment this to remove support for HWC_DEVICE_API_VERSION_0_3 and older
20// #define HWC_REMOVE_DEPRECATED_VERSIONS 1
21
22#include <stdint.h>
23#include <stdio.h>
24#include <stdlib.h>
25#include <string.h>
26#include <sys/types.h>
27
28#include <utils/Errors.h>
29#include <utils/String8.h>
30#include <utils/Thread.h>
31#include <utils/Trace.h>
32#include <utils/Vector.h>
33
34#include <ui/GraphicBuffer.h>
35
36#include <hardware/hardware.h>
37#include <hardware/hwcomposer.h>
38
39#include <cutils/log.h>
40#include <cutils/properties.h>
41
42#include "Layer.h"           // needed only for debugging
43#include "LayerBase.h"
44#include "HWComposer.h"
45#include "SurfaceFlinger.h"
46
47namespace android {
48
49// ---------------------------------------------------------------------------
50// Support for HWC_DEVICE_API_VERSION_0_3 and older:
51// Since v0.3 is deprecated and support will be dropped soon, as much as
52// possible the code is written to target v1.0. When using a v0.3 HWC, we
53// allocate v0.3 structures, but assign them to v1.0 pointers. Fields that
54// exist in both versions are located at the same offset, so in most cases we
55// can just use the v1.0 pointer without branches or casts.
56
57#if HWC_REMOVE_DEPRECATED_VERSIONS
58// We need complete types with to satisfy semantic checks, even though the
59// code paths that use these won't get executed at runtime (and will likely be
60// dead-code-eliminated). When we remove the code to support v0.3 we can remove
61// these as well.
62typedef hwc_layer_1_t hwc_layer_t;
63typedef hwc_layer_list_1_t hwc_layer_list_t;
64typedef hwc_composer_device_1_t hwc_composer_device_t;
65#endif
66
67// This function assumes we've already rejected HWC's with lower-than-required
68// versions. Don't use it for the initial "does HWC meet requirements" check!
69static bool hwcHasVersion(const hwc_composer_device_1_t* hwc, uint32_t version) {
70    if (HWC_REMOVE_DEPRECATED_VERSIONS &&
71            version <= HWC_DEVICE_API_VERSION_1_0) {
72        return true;
73    } else {
74        return hwc->common.version >= version;
75    }
76}
77
78static size_t sizeofHwcLayerList(const hwc_composer_device_1_t* hwc,
79        size_t numLayers) {
80    if (hwcHasVersion(hwc, HWC_DEVICE_API_VERSION_1_0)) {
81        return sizeof(hwc_layer_list_1_t) + numLayers*sizeof(hwc_layer_1_t);
82    } else {
83        return sizeof(hwc_layer_list_t) + numLayers*sizeof(hwc_layer_t);
84    }
85}
86
87// ---------------------------------------------------------------------------
88
89struct HWComposer::cb_context {
90    struct callbacks : public hwc_procs_t {
91        // these are here to facilitate the transition when adding
92        // new callbacks (an implementation can check for NULL before
93        // calling a new callback).
94        void (*zero[4])(void);
95    };
96    callbacks procs;
97    HWComposer* hwc;
98};
99
100// ---------------------------------------------------------------------------
101
102HWComposer::HWComposer(
103        const sp<SurfaceFlinger>& flinger,
104        EventHandler& handler,
105        nsecs_t refreshPeriod)
106    : mFlinger(flinger),
107      mModule(0), mHwc(0), mList(0), mCapacity(0),
108      mNumOVLayers(0), mNumFBLayers(0),
109      mCBContext(new cb_context),
110      mEventHandler(handler),
111      mRefreshPeriod(refreshPeriod),
112      mVSyncCount(0), mDebugForceFakeVSync(false)
113{
114    char value[PROPERTY_VALUE_MAX];
115    property_get("debug.sf.no_hw_vsync", value, "0");
116    mDebugForceFakeVSync = atoi(value);
117
118    bool needVSyncThread = true;
119    int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &mModule);
120    ALOGW_IF(err, "%s module not found", HWC_HARDWARE_MODULE_ID);
121    if (err == 0) {
122        err = hwc_open_1(mModule, &mHwc);
123        ALOGE_IF(err, "%s device failed to initialize (%s)",
124                HWC_HARDWARE_COMPOSER, strerror(-err));
125        if (err == 0) {
126            if (HWC_REMOVE_DEPRECATED_VERSIONS &&
127                    mHwc->common.version < HWC_DEVICE_API_VERSION_1_0) {
128                ALOGE("%s device version %#x too old, will not be used",
129                        HWC_HARDWARE_COMPOSER, mHwc->common.version);
130                hwc_close_1(mHwc);
131                mHwc = NULL;
132            }
133        }
134
135        if (mHwc) {
136            if (hwcHasVersion(mHwc, HWC_DEVICE_API_VERSION_0_3)) {
137                // always turn vsync off when we start
138                mHwc->methods->eventControl(mHwc, HWC_EVENT_VSYNC, 0);
139                needVSyncThread = false;
140            }
141            if (mHwc->registerProcs) {
142                mCBContext->hwc = this;
143                mCBContext->procs.invalidate = &hook_invalidate;
144                mCBContext->procs.vsync = &hook_vsync;
145                mHwc->registerProcs(mHwc, &mCBContext->procs);
146                memset(mCBContext->procs.zero, 0, sizeof(mCBContext->procs.zero));
147            }
148        }
149    }
150
151    if (needVSyncThread) {
152        // we don't have VSYNC support, we need to fake it
153        mVSyncThread = new VSyncThread(*this);
154    }
155}
156
157HWComposer::~HWComposer() {
158    eventControl(EVENT_VSYNC, 0);
159    free(mList);
160    if (mVSyncThread != NULL) {
161        mVSyncThread->requestExitAndWait();
162    }
163    if (mHwc) {
164        hwc_close_1(mHwc);
165    }
166    delete mCBContext;
167}
168
169status_t HWComposer::initCheck() const {
170    return mHwc ? NO_ERROR : NO_INIT;
171}
172
173void HWComposer::hook_invalidate(struct hwc_procs* procs) {
174    reinterpret_cast<cb_context *>(procs)->hwc->invalidate();
175}
176
177void HWComposer::hook_vsync(struct hwc_procs* procs, int dpy, int64_t timestamp) {
178    reinterpret_cast<cb_context *>(procs)->hwc->vsync(dpy, timestamp);
179}
180
181void HWComposer::invalidate() {
182    mFlinger->repaintEverything();
183}
184
185void HWComposer::vsync(int dpy, int64_t timestamp) {
186    ATRACE_INT("VSYNC", ++mVSyncCount&1);
187    mEventHandler.onVSyncReceived(dpy, timestamp);
188    Mutex::Autolock _l(mLock);
189    mLastHwVSync = timestamp;
190}
191
192nsecs_t HWComposer::getRefreshTimestamp() const {
193    // this returns the last refresh timestamp.
194    // if the last one is not available, we estimate it based on
195    // the refresh period and whatever closest timestamp we have.
196    Mutex::Autolock _l(mLock);
197    nsecs_t now = systemTime(CLOCK_MONOTONIC);
198    return now - ((now - mLastHwVSync) %  mRefreshPeriod);
199}
200
201void HWComposer::eventControl(int event, int enabled) {
202    status_t err = NO_ERROR;
203    if (mHwc && mHwc->common.version >= HWC_DEVICE_API_VERSION_0_3) {
204        if (!mDebugForceFakeVSync) {
205            err = mHwc->methods->eventControl(mHwc, event, enabled);
206            // error here should not happen -- not sure what we should
207            // do if it does.
208            ALOGE_IF(err, "eventControl(%d, %d) failed %s",
209                    event, enabled, strerror(-err));
210        }
211    }
212
213    if (err == NO_ERROR && mVSyncThread != NULL) {
214        mVSyncThread->setEnabled(enabled);
215    }
216}
217
218status_t HWComposer::createWorkList(size_t numLayers) {
219    if (mHwc) {
220        if (!mList || mCapacity < numLayers) {
221            free(mList);
222            size_t size = sizeofHwcLayerList(mHwc, numLayers);
223            mList = (hwc_layer_list_1_t*)malloc(size);
224            mCapacity = numLayers;
225        }
226        mList->flags = HWC_GEOMETRY_CHANGED;
227        mList->numHwLayers = numLayers;
228    }
229    return NO_ERROR;
230}
231
232status_t HWComposer::prepare() const {
233    int err = mHwc->prepare(mHwc, mList);
234    if (err == NO_ERROR) {
235        size_t numOVLayers = 0;
236        size_t numFBLayers = 0;
237        size_t count = mList->numHwLayers;
238        for (size_t i=0 ; i<count ; i++) {
239            hwc_layer_1_t* l = NULL;
240            if (hwcHasVersion(mHwc, HWC_DEVICE_API_VERSION_1_0)) {
241                l = &mList->hwLayers[i];
242            } else {
243                // mList really has hwc_layer_list_t memory layout
244                hwc_layer_list_t* list = (hwc_layer_list_t*)mList;
245                hwc_layer_t* layer = &list->hwLayers[i];
246                l = (hwc_layer_1_t*)layer;
247            }
248            if (l->flags & HWC_SKIP_LAYER) {
249                l->compositionType = HWC_FRAMEBUFFER;
250            }
251            switch (l->compositionType) {
252                case HWC_OVERLAY:
253                    numOVLayers++;
254                    break;
255                case HWC_FRAMEBUFFER:
256                    numFBLayers++;
257                    break;
258            }
259        }
260        mNumOVLayers = numOVLayers;
261        mNumFBLayers = numFBLayers;
262    }
263    return (status_t)err;
264}
265
266size_t HWComposer::getLayerCount(int type) const {
267    switch (type) {
268        case HWC_OVERLAY:
269            return mNumOVLayers;
270        case HWC_FRAMEBUFFER:
271            return mNumFBLayers;
272    }
273    return 0;
274}
275
276status_t HWComposer::commit(void* fbDisplay, void* fbSurface) const {
277    int err = NO_ERROR;
278    if (mHwc) {
279        err = mHwc->set(mHwc, fbDisplay, fbSurface, mList);
280        if (mList) {
281            mList->flags &= ~HWC_GEOMETRY_CHANGED;
282        }
283    }
284    return (status_t)err;
285}
286
287status_t HWComposer::release() const {
288    if (mHwc) {
289        if (hwcHasVersion(mHwc, HWC_DEVICE_API_VERSION_0_3)) {
290            mHwc->methods->eventControl(mHwc, HWC_EVENT_VSYNC, 0);
291        }
292        int err = mHwc->set(mHwc, NULL, NULL, NULL);
293        if (err < 0) {
294            return (status_t)err;
295        }
296
297        if (hwcHasVersion(mHwc, HWC_DEVICE_API_VERSION_1_0)) {
298            if (mHwc->methods && mHwc->methods->blank) {
299                err = mHwc->methods->blank(mHwc, 1);
300            }
301        }
302        return (status_t)err;
303    }
304    return NO_ERROR;
305}
306
307status_t HWComposer::acquire() const {
308    if (mHwc) {
309        if (hwcHasVersion(mHwc, HWC_DEVICE_API_VERSION_1_0)) {
310            if (mHwc->methods && mHwc->methods->blank) {
311                int err = mHwc->methods->blank(mHwc, 0);
312                return (status_t)err;
313            }
314        }
315    }
316
317    return NO_ERROR;
318}
319
320status_t HWComposer::disable() {
321    if (mHwc) {
322        free(mList);
323        mList = NULL;
324        int err = mHwc->prepare(mHwc, NULL);
325        return (status_t)err;
326    }
327    return NO_ERROR;
328}
329
330size_t HWComposer::getNumLayers() const {
331    return mList ? mList->numHwLayers : 0;
332}
333
334/*
335 * Helper template to implement a concrete HWCLayer
336 * This holds the pointer to the concrete hwc layer type
337 * and implements the "iterable" side of HWCLayer.
338 */
339template<typename CONCRETE, typename HWCTYPE>
340class Iterable : public HWComposer::HWCLayer {
341protected:
342    HWCTYPE* const mLayerList;
343    HWCTYPE* mCurrentLayer;
344    Iterable(HWCTYPE* layer) : mLayerList(layer), mCurrentLayer(layer) { }
345    inline HWCTYPE const * getLayer() const { return mCurrentLayer; }
346    inline HWCTYPE* getLayer() { return mCurrentLayer; }
347    virtual ~Iterable() { }
348private:
349    // returns a copy of ourselves
350    virtual HWComposer::HWCLayer* dup() {
351        return new CONCRETE( static_cast<const CONCRETE&>(*this) );
352    }
353    virtual status_t setLayer(size_t index) {
354        mCurrentLayer = &mLayerList[index];
355        return NO_ERROR;
356    }
357};
358
359// #if !HWC_REMOVE_DEPRECATED_VERSIONS
360/*
361 * Concrete implementation of HWCLayer for HWC_DEVICE_API_VERSION_0_3
362 * This implements the HWCLayer side of HWCIterableLayer.
363 */
364class HWCLayerVersion0 : public Iterable<HWCLayerVersion0, hwc_layer_t> {
365public:
366    HWCLayerVersion0(hwc_layer_t* layer)
367        : Iterable<HWCLayerVersion0, hwc_layer_t>(layer) { }
368
369    virtual int32_t getCompositionType() const {
370        return getLayer()->compositionType;
371    }
372    virtual uint32_t getHints() const {
373        return getLayer()->hints;
374    }
375    virtual int getAndResetReleaseFenceFd() {
376        // not supported on VERSION_03
377        return -1;
378    }
379    virtual void setAcquireFenceFd(int fenceFd) {
380        if (fenceFd != -1) {
381            ALOGE("HWC 0.x can't handle acquire fences");
382            close(fenceFd);
383        }
384    }
385
386    virtual void setDefaultState() {
387        getLayer()->compositionType = HWC_FRAMEBUFFER;
388        getLayer()->hints = 0;
389        getLayer()->flags = HWC_SKIP_LAYER;
390        getLayer()->transform = 0;
391        getLayer()->blending = HWC_BLENDING_NONE;
392        getLayer()->visibleRegionScreen.numRects = 0;
393        getLayer()->visibleRegionScreen.rects = NULL;
394    }
395    virtual void setSkip(bool skip) {
396        if (skip) {
397            getLayer()->flags |= HWC_SKIP_LAYER;
398        } else {
399            getLayer()->flags &= ~HWC_SKIP_LAYER;
400        }
401    }
402    virtual void setBlending(uint32_t blending) {
403        getLayer()->blending = blending;
404    }
405    virtual void setTransform(uint32_t transform) {
406        getLayer()->transform = transform;
407    }
408    virtual void setFrame(const Rect& frame) {
409        reinterpret_cast<Rect&>(getLayer()->displayFrame) = frame;
410    }
411    virtual void setCrop(const Rect& crop) {
412        reinterpret_cast<Rect&>(getLayer()->sourceCrop) = crop;
413    }
414    virtual void setVisibleRegionScreen(const Region& reg) {
415        getLayer()->visibleRegionScreen.rects =
416                reinterpret_cast<hwc_rect_t const *>(
417                        reg.getArray(&getLayer()->visibleRegionScreen.numRects));
418    }
419    virtual void setBuffer(const sp<GraphicBuffer>& buffer) {
420        if (buffer == 0 || buffer->handle == 0) {
421            getLayer()->compositionType = HWC_FRAMEBUFFER;
422            getLayer()->flags |= HWC_SKIP_LAYER;
423            getLayer()->handle = 0;
424        } else {
425            getLayer()->handle = buffer->handle;
426        }
427    }
428};
429// #endif // !HWC_REMOVE_DEPRECATED_VERSIONS
430
431/*
432 * Concrete implementation of HWCLayer for HWC_DEVICE_API_VERSION_1_0.
433 * This implements the HWCLayer side of HWCIterableLayer.
434 */
435class HWCLayerVersion1 : public Iterable<HWCLayerVersion1, hwc_layer_1_t> {
436public:
437    HWCLayerVersion1(hwc_layer_1_t* layer)
438        : Iterable<HWCLayerVersion1, hwc_layer_1_t>(layer) { }
439
440    virtual int32_t getCompositionType() const {
441        return getLayer()->compositionType;
442    }
443    virtual uint32_t getHints() const {
444        return getLayer()->hints;
445    }
446    virtual int getAndResetReleaseFenceFd() {
447        int fd = getLayer()->releaseFenceFd;
448        getLayer()->releaseFenceFd = -1;
449        return fd;
450    }
451    virtual void setAcquireFenceFd(int fenceFd) {
452        getLayer()->acquireFenceFd = fenceFd;
453    }
454
455    virtual void setDefaultState() {
456        getLayer()->compositionType = HWC_FRAMEBUFFER;
457        getLayer()->hints = 0;
458        getLayer()->flags = HWC_SKIP_LAYER;
459        getLayer()->transform = 0;
460        getLayer()->blending = HWC_BLENDING_NONE;
461        getLayer()->visibleRegionScreen.numRects = 0;
462        getLayer()->visibleRegionScreen.rects = NULL;
463        getLayer()->acquireFenceFd = -1;
464        getLayer()->releaseFenceFd = -1;
465    }
466    virtual void setSkip(bool skip) {
467        if (skip) {
468            getLayer()->flags |= HWC_SKIP_LAYER;
469        } else {
470            getLayer()->flags &= ~HWC_SKIP_LAYER;
471        }
472    }
473    virtual void setBlending(uint32_t blending) {
474        getLayer()->blending = blending;
475    }
476    virtual void setTransform(uint32_t transform) {
477        getLayer()->transform = transform;
478    }
479    virtual void setFrame(const Rect& frame) {
480        reinterpret_cast<Rect&>(getLayer()->displayFrame) = frame;
481    }
482    virtual void setCrop(const Rect& crop) {
483        reinterpret_cast<Rect&>(getLayer()->sourceCrop) = crop;
484    }
485    virtual void setVisibleRegionScreen(const Region& reg) {
486        getLayer()->visibleRegionScreen.rects =
487                reinterpret_cast<hwc_rect_t const *>(
488                        reg.getArray(&getLayer()->visibleRegionScreen.numRects));
489    }
490    virtual void setBuffer(const sp<GraphicBuffer>& buffer) {
491        if (buffer == 0 || buffer->handle == 0) {
492            getLayer()->compositionType = HWC_FRAMEBUFFER;
493            getLayer()->flags |= HWC_SKIP_LAYER;
494            getLayer()->handle = 0;
495        } else {
496            getLayer()->handle = buffer->handle;
497        }
498    }
499};
500
501/*
502 * returns an iterator initialized at a given index in the layer list
503 */
504HWComposer::LayerListIterator HWComposer::getLayerIterator(size_t index) {
505    if (!mList || index > mList->numHwLayers) {
506        return LayerListIterator();
507    }
508    if (hwcHasVersion(mHwc, HWC_DEVICE_API_VERSION_1_0)) {
509        return LayerListIterator(new HWCLayerVersion1(mList->hwLayers), index);
510    } else {
511        hwc_layer_list_t* list0 = (hwc_layer_list_t*)mList;
512        return LayerListIterator(new HWCLayerVersion0(list0->hwLayers), index);
513    }
514}
515
516/*
517 * returns an iterator on the beginning of the layer list
518 */
519HWComposer::LayerListIterator HWComposer::begin() {
520    return getLayerIterator(0);
521}
522
523/*
524 * returns an iterator on the end of the layer list
525 */
526HWComposer::LayerListIterator HWComposer::end() {
527    return getLayerIterator(getNumLayers());
528}
529
530
531
532void HWComposer::dump(String8& result, char* buffer, size_t SIZE,
533        const Vector< sp<LayerBase> >& visibleLayersSortedByZ) const {
534    if (mHwc && mList) {
535        result.append("Hardware Composer state:\n");
536        result.appendFormat("  mDebugForceFakeVSync=%d\n",
537                mDebugForceFakeVSync);
538        result.appendFormat("  numHwLayers=%u, flags=%08x\n",
539                mList->numHwLayers, mList->flags);
540        result.append(
541                "   type   |  handle  |   hints  |   flags  | tr | blend |  format  |       source crop         |           frame           name \n"
542                "----------+----------+----------+----------+----+-------+----------+---------------------------+--------------------------------\n");
543        //      " ________ | ________ | ________ | ________ | __ | _____ | ________ | [_____,_____,_____,_____] | [_____,_____,_____,_____]
544        for (size_t i=0 ; i<mList->numHwLayers ; i++) {
545            hwc_layer_1_t l;
546            if (hwcHasVersion(mHwc, HWC_DEVICE_API_VERSION_1_0)) {
547                l = mList->hwLayers[i];
548            } else {
549                hwc_layer_list_t* list0 = (hwc_layer_list_t*)mList;
550                *(hwc_layer_t*)&l = list0->hwLayers[i];
551                l.acquireFenceFd = l.releaseFenceFd = -1;
552            }
553            const sp<LayerBase> layer(visibleLayersSortedByZ[i]);
554            int32_t format = -1;
555            if (layer->getLayer() != NULL) {
556                const sp<GraphicBuffer>& buffer(layer->getLayer()->getActiveBuffer());
557                if (buffer != NULL) {
558                    format = buffer->getPixelFormat();
559                }
560            }
561            result.appendFormat(
562                    " %8s | %08x | %08x | %08x | %02x | %05x | %08x | [%5d,%5d,%5d,%5d] | [%5d,%5d,%5d,%5d] %s\n",
563                    l.compositionType ? "OVERLAY" : "FB",
564                    intptr_t(l.handle), l.hints, l.flags, l.transform, l.blending, format,
565                    l.sourceCrop.left, l.sourceCrop.top, l.sourceCrop.right, l.sourceCrop.bottom,
566                    l.displayFrame.left, l.displayFrame.top, l.displayFrame.right, l.displayFrame.bottom,
567                    layer->getName().string());
568        }
569    }
570    if (mHwc && hwcHasVersion(mHwc, HWC_DEVICE_API_VERSION_0_1) && mHwc->dump) {
571        mHwc->dump(mHwc, buffer, SIZE);
572        result.append(buffer);
573    }
574}
575
576// ---------------------------------------------------------------------------
577
578HWComposer::VSyncThread::VSyncThread(HWComposer& hwc)
579    : mHwc(hwc), mEnabled(false),
580      mNextFakeVSync(0),
581      mRefreshPeriod(hwc.mRefreshPeriod)
582{
583}
584
585void HWComposer::VSyncThread::setEnabled(bool enabled) {
586    Mutex::Autolock _l(mLock);
587    mEnabled = enabled;
588    mCondition.signal();
589}
590
591void HWComposer::VSyncThread::onFirstRef() {
592    run("VSyncThread", PRIORITY_URGENT_DISPLAY + PRIORITY_MORE_FAVORABLE);
593}
594
595bool HWComposer::VSyncThread::threadLoop() {
596    { // scope for lock
597        Mutex::Autolock _l(mLock);
598        while (!mEnabled) {
599            mCondition.wait(mLock);
600        }
601    }
602
603    const nsecs_t period = mRefreshPeriod;
604    const nsecs_t now = systemTime(CLOCK_MONOTONIC);
605    nsecs_t next_vsync = mNextFakeVSync;
606    nsecs_t sleep = next_vsync - now;
607    if (sleep < 0) {
608        // we missed, find where the next vsync should be
609        sleep = (period - ((now - next_vsync) % period));
610        next_vsync = now + sleep;
611    }
612    mNextFakeVSync = next_vsync + period;
613
614    struct timespec spec;
615    spec.tv_sec  = next_vsync / 1000000000;
616    spec.tv_nsec = next_vsync % 1000000000;
617
618    int err;
619    do {
620        err = clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &spec, NULL);
621    } while (err<0 && errno == EINTR);
622
623    if (err == 0) {
624        mHwc.mEventHandler.onVSyncReceived(0, next_vsync);
625    }
626
627    return true;
628}
629
630// ---------------------------------------------------------------------------
631}; // namespace android
632