HWComposer.cpp revision 34a09ba1efd706323a15633da5044b352988eb5f
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}
189
190void HWComposer::eventControl(int event, int enabled) {
191    status_t err = NO_ERROR;
192    if (mHwc && mHwc->common.version >= HWC_DEVICE_API_VERSION_0_3) {
193        if (!mDebugForceFakeVSync) {
194            err = mHwc->methods->eventControl(mHwc, event, enabled);
195            // error here should not happen -- not sure what we should
196            // do if it does.
197            ALOGE_IF(err, "eventControl(%d, %d) failed %s",
198                    event, enabled, strerror(-err));
199        }
200    }
201
202    if (err == NO_ERROR && mVSyncThread != NULL) {
203        mVSyncThread->setEnabled(enabled);
204    }
205}
206
207status_t HWComposer::createWorkList(size_t numLayers) {
208    if (mHwc) {
209        if (!mList || mCapacity < numLayers) {
210            free(mList);
211            size_t size = sizeofHwcLayerList(mHwc, numLayers);
212            mList = (hwc_layer_list_1_t*)malloc(size);
213            mCapacity = numLayers;
214        }
215        mList->flags = HWC_GEOMETRY_CHANGED;
216        mList->numHwLayers = numLayers;
217    }
218    return NO_ERROR;
219}
220
221status_t HWComposer::prepare() const {
222    int err = mHwc->prepare(mHwc, mList);
223    if (err == NO_ERROR) {
224        size_t numOVLayers = 0;
225        size_t numFBLayers = 0;
226        size_t count = mList->numHwLayers;
227        for (size_t i=0 ; i<count ; i++) {
228            hwc_layer_1_t* l = NULL;
229            if (hwcHasVersion(mHwc, HWC_DEVICE_API_VERSION_1_0)) {
230                l = &mList->hwLayers[i];
231            } else {
232                // mList really has hwc_layer_list_t memory layout
233                hwc_layer_list_t* list = (hwc_layer_list_t*)mList;
234                hwc_layer_t* layer = &list->hwLayers[i];
235                l = (hwc_layer_1_t*)layer;
236            }
237            if (l->flags & HWC_SKIP_LAYER) {
238                l->compositionType = HWC_FRAMEBUFFER;
239            }
240            switch (l->compositionType) {
241                case HWC_OVERLAY:
242                    numOVLayers++;
243                    break;
244                case HWC_FRAMEBUFFER:
245                    numFBLayers++;
246                    break;
247            }
248        }
249        mNumOVLayers = numOVLayers;
250        mNumFBLayers = numFBLayers;
251    }
252    return (status_t)err;
253}
254
255size_t HWComposer::getLayerCount(int type) const {
256    switch (type) {
257        case HWC_OVERLAY:
258            return mNumOVLayers;
259        case HWC_FRAMEBUFFER:
260            return mNumFBLayers;
261    }
262    return 0;
263}
264
265status_t HWComposer::commit(void* fbDisplay, void* fbSurface) const {
266    int err = NO_ERROR;
267    if (mHwc) {
268        err = mHwc->set(mHwc, fbDisplay, fbSurface, mList);
269        if (mList) {
270            mList->flags &= ~HWC_GEOMETRY_CHANGED;
271        }
272    }
273    return (status_t)err;
274}
275
276status_t HWComposer::release() const {
277    if (mHwc) {
278        if (hwcHasVersion(mHwc, HWC_DEVICE_API_VERSION_0_3)) {
279            mHwc->methods->eventControl(mHwc, HWC_EVENT_VSYNC, 0);
280        }
281        int err = mHwc->set(mHwc, NULL, NULL, NULL);
282        if (err < 0) {
283            return (status_t)err;
284        }
285
286        if (hwcHasVersion(mHwc, HWC_DEVICE_API_VERSION_1_0)) {
287            if (mHwc->methods && mHwc->methods->blank) {
288                err = mHwc->methods->blank(mHwc, 1);
289            }
290        }
291        return (status_t)err;
292    }
293    return NO_ERROR;
294}
295
296status_t HWComposer::acquire() const {
297    if (mHwc) {
298        if (hwcHasVersion(mHwc, HWC_DEVICE_API_VERSION_1_0)) {
299            if (mHwc->methods && mHwc->methods->blank) {
300                int err = mHwc->methods->blank(mHwc, 0);
301                return (status_t)err;
302            }
303        }
304    }
305
306    return NO_ERROR;
307}
308
309status_t HWComposer::disable() {
310    if (mHwc) {
311        free(mList);
312        mList = NULL;
313        int err = mHwc->prepare(mHwc, NULL);
314        return (status_t)err;
315    }
316    return NO_ERROR;
317}
318
319size_t HWComposer::getNumLayers() const {
320    return mList ? mList->numHwLayers : 0;
321}
322
323/*
324 * Helper template to implement a concrete HWCLayer
325 * This holds the pointer to the concrete hwc layer type
326 * and implements the "iterable" side of HWCLayer.
327 */
328template<typename CONCRETE, typename HWCTYPE>
329class Iterable : public HWComposer::HWCLayer {
330protected:
331    HWCTYPE* const mLayerList;
332    HWCTYPE* mCurrentLayer;
333    Iterable(HWCTYPE* layer) : mLayerList(layer), mCurrentLayer(layer) { }
334    inline HWCTYPE const * getLayer() const { return mCurrentLayer; }
335    inline HWCTYPE* getLayer() { return mCurrentLayer; }
336    virtual ~Iterable() { }
337private:
338    // returns a copy of ourselves
339    virtual HWComposer::HWCLayer* dup() {
340        return new CONCRETE( static_cast<const CONCRETE&>(*this) );
341    }
342    virtual status_t setLayer(size_t index) {
343        mCurrentLayer = &mLayerList[index];
344        return NO_ERROR;
345    }
346};
347
348// #if !HWC_REMOVE_DEPRECATED_VERSIONS
349/*
350 * Concrete implementation of HWCLayer for HWC_DEVICE_API_VERSION_0_3
351 * This implements the HWCLayer side of HWCIterableLayer.
352 */
353class HWCLayerVersion0 : public Iterable<HWCLayerVersion0, hwc_layer_t> {
354public:
355    HWCLayerVersion0(hwc_layer_t* layer)
356        : Iterable<HWCLayerVersion0, hwc_layer_t>(layer) { }
357
358    virtual int32_t getCompositionType() const {
359        return getLayer()->compositionType;
360    }
361    virtual uint32_t getHints() const {
362        return getLayer()->hints;
363    }
364    virtual int getAndResetReleaseFenceFd() {
365        // not supported on VERSION_03
366        return -1;
367    }
368    virtual void setAcquireFenceFd(int fenceFd) {
369        if (fenceFd != -1) {
370            ALOGE("HWC 0.x can't handle acquire fences");
371            close(fenceFd);
372        }
373    }
374
375    virtual void setDefaultState() {
376        getLayer()->compositionType = HWC_FRAMEBUFFER;
377        getLayer()->hints = 0;
378        getLayer()->flags = HWC_SKIP_LAYER;
379        getLayer()->transform = 0;
380        getLayer()->blending = HWC_BLENDING_NONE;
381        getLayer()->visibleRegionScreen.numRects = 0;
382        getLayer()->visibleRegionScreen.rects = NULL;
383    }
384    virtual void setSkip(bool skip) {
385        if (skip) {
386            getLayer()->flags |= HWC_SKIP_LAYER;
387        } else {
388            getLayer()->flags &= ~HWC_SKIP_LAYER;
389        }
390    }
391    virtual void setBlending(uint32_t blending) {
392        getLayer()->blending = blending;
393    }
394    virtual void setTransform(uint32_t transform) {
395        getLayer()->transform = transform;
396    }
397    virtual void setFrame(const Rect& frame) {
398        reinterpret_cast<Rect&>(getLayer()->displayFrame) = frame;
399    }
400    virtual void setCrop(const Rect& crop) {
401        reinterpret_cast<Rect&>(getLayer()->sourceCrop) = crop;
402    }
403    virtual void setVisibleRegionScreen(const Region& reg) {
404        getLayer()->visibleRegionScreen.rects =
405                reinterpret_cast<hwc_rect_t const *>(
406                        reg.getArray(&getLayer()->visibleRegionScreen.numRects));
407    }
408    virtual void setBuffer(const sp<GraphicBuffer>& buffer) {
409        if (buffer == 0 || buffer->handle == 0) {
410            getLayer()->compositionType = HWC_FRAMEBUFFER;
411            getLayer()->flags |= HWC_SKIP_LAYER;
412            getLayer()->handle = 0;
413        } else {
414            getLayer()->handle = buffer->handle;
415        }
416    }
417};
418// #endif // !HWC_REMOVE_DEPRECATED_VERSIONS
419
420/*
421 * Concrete implementation of HWCLayer for HWC_DEVICE_API_VERSION_1_0.
422 * This implements the HWCLayer side of HWCIterableLayer.
423 */
424class HWCLayerVersion1 : public Iterable<HWCLayerVersion1, hwc_layer_1_t> {
425public:
426    HWCLayerVersion1(hwc_layer_1_t* layer)
427        : Iterable<HWCLayerVersion1, hwc_layer_1_t>(layer) { }
428
429    virtual int32_t getCompositionType() const {
430        return getLayer()->compositionType;
431    }
432    virtual uint32_t getHints() const {
433        return getLayer()->hints;
434    }
435    virtual int getAndResetReleaseFenceFd() {
436        int fd = getLayer()->releaseFenceFd;
437        getLayer()->releaseFenceFd = -1;
438        return fd;
439    }
440    virtual void setAcquireFenceFd(int fenceFd) {
441        getLayer()->acquireFenceFd = fenceFd;
442    }
443
444    virtual void setDefaultState() {
445        getLayer()->compositionType = HWC_FRAMEBUFFER;
446        getLayer()->hints = 0;
447        getLayer()->flags = HWC_SKIP_LAYER;
448        getLayer()->transform = 0;
449        getLayer()->blending = HWC_BLENDING_NONE;
450        getLayer()->visibleRegionScreen.numRects = 0;
451        getLayer()->visibleRegionScreen.rects = NULL;
452        getLayer()->acquireFenceFd = -1;
453        getLayer()->releaseFenceFd = -1;
454    }
455    virtual void setSkip(bool skip) {
456        if (skip) {
457            getLayer()->flags |= HWC_SKIP_LAYER;
458        } else {
459            getLayer()->flags &= ~HWC_SKIP_LAYER;
460        }
461    }
462    virtual void setBlending(uint32_t blending) {
463        getLayer()->blending = blending;
464    }
465    virtual void setTransform(uint32_t transform) {
466        getLayer()->transform = transform;
467    }
468    virtual void setFrame(const Rect& frame) {
469        reinterpret_cast<Rect&>(getLayer()->displayFrame) = frame;
470    }
471    virtual void setCrop(const Rect& crop) {
472        reinterpret_cast<Rect&>(getLayer()->sourceCrop) = crop;
473    }
474    virtual void setVisibleRegionScreen(const Region& reg) {
475        getLayer()->visibleRegionScreen.rects =
476                reinterpret_cast<hwc_rect_t const *>(
477                        reg.getArray(&getLayer()->visibleRegionScreen.numRects));
478    }
479    virtual void setBuffer(const sp<GraphicBuffer>& buffer) {
480        if (buffer == 0 || buffer->handle == 0) {
481            getLayer()->compositionType = HWC_FRAMEBUFFER;
482            getLayer()->flags |= HWC_SKIP_LAYER;
483            getLayer()->handle = 0;
484        } else {
485            getLayer()->handle = buffer->handle;
486        }
487    }
488};
489
490/*
491 * returns an iterator initialized at a given index in the layer list
492 */
493HWComposer::LayerListIterator HWComposer::getLayerIterator(size_t index) {
494    if (!mList || index > mList->numHwLayers) {
495        return LayerListIterator();
496    }
497    if (hwcHasVersion(mHwc, HWC_DEVICE_API_VERSION_1_0)) {
498        return LayerListIterator(new HWCLayerVersion1(mList->hwLayers), index);
499    } else {
500        hwc_layer_list_t* list0 = (hwc_layer_list_t*)mList;
501        return LayerListIterator(new HWCLayerVersion0(list0->hwLayers), index);
502    }
503}
504
505/*
506 * returns an iterator on the beginning of the layer list
507 */
508HWComposer::LayerListIterator HWComposer::begin() {
509    return getLayerIterator(0);
510}
511
512/*
513 * returns an iterator on the end of the layer list
514 */
515HWComposer::LayerListIterator HWComposer::end() {
516    return getLayerIterator(getNumLayers());
517}
518
519
520
521void HWComposer::dump(String8& result, char* buffer, size_t SIZE,
522        const Vector< sp<LayerBase> >& visibleLayersSortedByZ) const {
523    if (mHwc && mList) {
524        result.append("Hardware Composer state:\n");
525        result.appendFormat("  mDebugForceFakeVSync=%d\n",
526                mDebugForceFakeVSync);
527        result.appendFormat("  numHwLayers=%u, flags=%08x\n",
528                mList->numHwLayers, mList->flags);
529        result.append(
530                "   type   |  handle  |   hints  |   flags  | tr | blend |  format  |       source crop         |           frame           name \n"
531                "----------+----------+----------+----------+----+-------+----------+---------------------------+--------------------------------\n");
532        //      " ________ | ________ | ________ | ________ | __ | _____ | ________ | [_____,_____,_____,_____] | [_____,_____,_____,_____]
533        for (size_t i=0 ; i<mList->numHwLayers ; i++) {
534            hwc_layer_1_t l;
535            if (hwcHasVersion(mHwc, HWC_DEVICE_API_VERSION_1_0)) {
536                l = mList->hwLayers[i];
537            } else {
538                hwc_layer_list_t* list0 = (hwc_layer_list_t*)mList;
539                *(hwc_layer_t*)&l = list0->hwLayers[i];
540                l.acquireFenceFd = l.releaseFenceFd = -1;
541            }
542            const sp<LayerBase> layer(visibleLayersSortedByZ[i]);
543            int32_t format = -1;
544            if (layer->getLayer() != NULL) {
545                const sp<GraphicBuffer>& buffer(layer->getLayer()->getActiveBuffer());
546                if (buffer != NULL) {
547                    format = buffer->getPixelFormat();
548                }
549            }
550            result.appendFormat(
551                    " %8s | %08x | %08x | %08x | %02x | %05x | %08x | [%5d,%5d,%5d,%5d] | [%5d,%5d,%5d,%5d] %s\n",
552                    l.compositionType ? "OVERLAY" : "FB",
553                    intptr_t(l.handle), l.hints, l.flags, l.transform, l.blending, format,
554                    l.sourceCrop.left, l.sourceCrop.top, l.sourceCrop.right, l.sourceCrop.bottom,
555                    l.displayFrame.left, l.displayFrame.top, l.displayFrame.right, l.displayFrame.bottom,
556                    layer->getName().string());
557        }
558    }
559    if (mHwc && hwcHasVersion(mHwc, HWC_DEVICE_API_VERSION_0_1) && mHwc->dump) {
560        mHwc->dump(mHwc, buffer, SIZE);
561        result.append(buffer);
562    }
563}
564
565// ---------------------------------------------------------------------------
566
567HWComposer::VSyncThread::VSyncThread(HWComposer& hwc)
568    : mHwc(hwc), mEnabled(false),
569      mNextFakeVSync(0),
570      mRefreshPeriod(hwc.mRefreshPeriod)
571{
572}
573
574void HWComposer::VSyncThread::setEnabled(bool enabled) {
575    Mutex::Autolock _l(mLock);
576    mEnabled = enabled;
577    mCondition.signal();
578}
579
580void HWComposer::VSyncThread::onFirstRef() {
581    run("VSyncThread", PRIORITY_URGENT_DISPLAY + PRIORITY_MORE_FAVORABLE);
582}
583
584bool HWComposer::VSyncThread::threadLoop() {
585    { // scope for lock
586        Mutex::Autolock _l(mLock);
587        while (!mEnabled) {
588            mCondition.wait(mLock);
589        }
590    }
591
592    const nsecs_t period = mRefreshPeriod;
593    const nsecs_t now = systemTime(CLOCK_MONOTONIC);
594    nsecs_t next_vsync = mNextFakeVSync;
595    nsecs_t sleep = next_vsync - now;
596    if (sleep < 0) {
597        // we missed, find where the next vsync should be
598        sleep = (period - ((now - next_vsync) % period));
599        next_vsync = now + sleep;
600    }
601    mNextFakeVSync = next_vsync + period;
602
603    struct timespec spec;
604    spec.tv_sec  = next_vsync / 1000000000;
605    spec.tv_nsec = next_vsync % 1000000000;
606
607    int err;
608    do {
609        err = clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &spec, NULL);
610    } while (err<0 && errno == EINTR);
611
612    if (err == 0) {
613        mHwc.mEventHandler.onVSyncReceived(0, next_vsync);
614    }
615
616    return true;
617}
618
619// ---------------------------------------------------------------------------
620}; // namespace android
621