SurfaceFlinger.cpp revision 0795272aa226f4e965968a03daddc53ce30b7cda
154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project/*
254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *
454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * you may not use this file except in compliance with the License.
654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * You may obtain a copy of the License at
754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *
854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *
1054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * See the License for the specific language governing permissions and
1454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * limitations under the License.
1554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */
1654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
1754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#define LOG_TAG "SurfaceFlinger"
1854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
1954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <stdlib.h>
2054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <stdio.h>
2154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <stdint.h>
2254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <unistd.h>
2354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <fcntl.h>
2454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <errno.h>
2554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <math.h>
26207637327511c960805713971e2e7dd11cb9c290Jean-Baptiste Queru#include <limits.h>
2754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <sys/types.h>
2854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <sys/stat.h>
2954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <sys/ioctl.h>
3054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
3154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <cutils/log.h>
3254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <cutils/properties.h>
3354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
340795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IPCThreadState.h>
350795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IServiceManager.h>
360795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/MemoryDealer.h>
370795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/MemoryBase.h>
3854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <utils/String8.h>
3954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <utils/String16.h>
4054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <utils/StopWatch.h>
4154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
4254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <ui/PixelFormat.h>
4354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <ui/DisplayInfo.h>
4454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <ui/EGLDisplaySurface.h>
4554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
4654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <pixelflinger/pixelflinger.h>
4754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <GLES/gl.h>
4854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
4954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "clz.h"
5054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "CPUGauge.h"
5154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "Layer.h"
5254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "LayerBlur.h"
5354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "LayerBuffer.h"
5454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "LayerDim.h"
5554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "LayerBitmap.h"
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "LayerOrientationAnim.h"
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "OrientationAnimation.h"
5854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "SurfaceFlinger.h"
5954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "VRamHeap.h"
6054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
6154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "DisplayHardware/DisplayHardware.h"
6254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "GPUHardware/GPUHardware.h"
6354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
6454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
6554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#define DISPLAY_COUNT       1
6654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
6754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectnamespace android {
6854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
6954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project// ---------------------------------------------------------------------------
7054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
7154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::instantiate() {
7254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    defaultServiceManager()->addService(
7354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            String16("SurfaceFlinger"), new SurfaceFlinger());
7454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
7554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
7654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::shutdown() {
7754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // we should unregister here, but not really because
7854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // when (if) the service manager goes away, all the services
7954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // it has a reference to will leave too.
8054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
8154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
8254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project// ---------------------------------------------------------------------------
8354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
8454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectSurfaceFlinger::LayerVector::LayerVector(const SurfaceFlinger::LayerVector& rhs)
8554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    : lookup(rhs.lookup), layers(rhs.layers)
8654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
8754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
8854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
8954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectssize_t SurfaceFlinger::LayerVector::indexOf(
9054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        LayerBase* key, size_t guess) const
9154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
9254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (guess<size() && lookup.keyAt(guess) == key)
9354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return guess;
9454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const ssize_t i = lookup.indexOfKey(key);
9554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (i>=0) {
9654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const size_t idx = lookup.valueAt(i);
9754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        LOG_ASSERT(layers[idx]==key,
9854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "LayerVector[%p]: layers[%d]=%p, key=%p",
9954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            this, int(idx), layers[idx], key);
10054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return idx;
10154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
10254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return i;
10354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
10454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
10554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectssize_t SurfaceFlinger::LayerVector::add(
10654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        LayerBase* layer,
10754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        Vector<LayerBase*>::compar_t cmp)
10854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
10954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    size_t count = layers.size();
11054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    ssize_t l = 0;
11154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    ssize_t h = count-1;
11254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    ssize_t mid;
11354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    LayerBase* const* a = layers.array();
11454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    while (l <= h) {
11554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mid = l + (h - l)/2;
11654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const int c = cmp(a+mid, &layer);
11754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (c == 0)     { l = mid; break; }
11854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        else if (c<0)   { l = mid+1; }
11954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        else            { h = mid-1; }
12054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
12154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    size_t order = l;
12254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    while (order<count && !cmp(&layer, a+order)) {
12354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        order++;
12454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
12554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    count = lookup.size();
12654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    for (size_t i=0 ; i<count ; i++) {
12754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (lookup.valueAt(i) >= order) {
12854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            lookup.editValueAt(i)++;
12954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
13054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
13154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    layers.insertAt(layer, order);
13254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    lookup.add(layer, order);
13354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return order;
13454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
13554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
13654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectssize_t SurfaceFlinger::LayerVector::remove(LayerBase* layer)
13754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
13854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const ssize_t keyIndex = lookup.indexOfKey(layer);
13954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (keyIndex >= 0) {
14054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const size_t index = lookup.valueAt(keyIndex);
14154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        LOG_ASSERT(layers[index]==layer,
14254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                "LayerVector[%p]: layers[%u]=%p, layer=%p",
14354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                this, int(index), layers[index], layer);
14454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        layers.removeItemsAt(index);
14554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        lookup.removeItemsAt(keyIndex);
14654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const size_t count = lookup.size();
14754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        for (size_t i=0 ; i<count ; i++) {
14854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (lookup.valueAt(i) >= size_t(index)) {
14954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                lookup.editValueAt(i)--;
15054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
15154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
15254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return index;
15354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
15454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return NAME_NOT_FOUND;
15554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
15654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
15754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectssize_t SurfaceFlinger::LayerVector::reorder(
15854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        LayerBase* layer,
15954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        Vector<LayerBase*>::compar_t cmp)
16054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
16154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // XXX: it's a little lame. but oh well...
16254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    ssize_t err = remove(layer);
16354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (err >=0)
16454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        err = add(layer, cmp);
16554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return err;
16654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
16754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
16854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project// ---------------------------------------------------------------------------
16954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#if 0
17054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#pragma mark -
17154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#endif
17254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
17354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectSurfaceFlinger::SurfaceFlinger()
17454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    :   BnSurfaceComposer(), Thread(false),
17554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mTransactionFlags(0),
17654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mTransactionCount(0),
17754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mBootTime(systemTime()),
17854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mLastScheduledBroadcast(NULL),
17954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mVisibleRegionsDirty(false),
18054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mDeferReleaseConsole(false),
18154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mFreezeDisplay(false),
18254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mFreezeCount(0),
183c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        mFreezeDisplayTime(0),
18454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mDebugRegion(0),
18554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mDebugCpu(0),
18654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mDebugFps(0),
18754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mDebugBackground(0),
18854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mDebugNoBootAnimation(0),
18954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mSyncObject(),
19054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mDeplayedTransactionPending(0),
19154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mConsoleSignals(0),
19254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mSecureFrameBuffer(0)
19354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
19454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    init();
19554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
19654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
19754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::init()
19854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
19954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    LOGI("SurfaceFlinger is starting");
20054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
20154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // debugging stuff...
20254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    char value[PROPERTY_VALUE_MAX];
20354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    property_get("debug.sf.showupdates", value, "0");
20454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mDebugRegion = atoi(value);
20554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    property_get("debug.sf.showcpu", value, "0");
20654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mDebugCpu = atoi(value);
20754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    property_get("debug.sf.showbackground", value, "0");
20854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mDebugBackground = atoi(value);
20954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    property_get("debug.sf.showfps", value, "0");
21054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mDebugFps = atoi(value);
21154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    property_get("debug.sf.nobootanimation", value, "0");
21254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mDebugNoBootAnimation = atoi(value);
21354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
21454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    LOGI_IF(mDebugRegion,           "showupdates enabled");
21554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    LOGI_IF(mDebugCpu,              "showcpu enabled");
21654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    LOGI_IF(mDebugBackground,       "showbackground enabled");
21754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    LOGI_IF(mDebugFps,              "showfps enabled");
21854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    LOGI_IF(mDebugNoBootAnimation,  "boot animation disabled");
21954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
22054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
22154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectSurfaceFlinger::~SurfaceFlinger()
22254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
22354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glDeleteTextures(1, &mWormholeTexName);
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    delete mOrientationAnimation;
22554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
22654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
227f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Projectcopybit_device_t* SurfaceFlinger::getBlitEngine() const
22854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
22954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return graphicPlane(0).displayHardware().getBlitEngine();
23054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
23154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
232b798689749c64baba81f02e10cf2157c747d6b46The Android Open Source Projectoverlay_control_device_t* SurfaceFlinger::getOverlayEngine() const
233f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project{
234f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    return graphicPlane(0).displayHardware().getOverlayEngine();
235f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project}
236f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project
23754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectsp<IMemory> SurfaceFlinger::getCblk() const
23854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
23954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return mServerCblkMemory;
24054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
24154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
24254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatus_t SurfaceFlinger::requestGPU(const sp<IGPUCallback>& callback,
24354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        gpu_info_t* gpu)
24454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
2450c6b5f6ec38b14add24c44360aa60d91ab61ff34Mathias Agopian    if (mGPU == 0)
2460c6b5f6ec38b14add24c44360aa60d91ab61ff34Mathias Agopian        return INVALID_OPERATION;
2470c6b5f6ec38b14add24c44360aa60d91ab61ff34Mathias Agopian
248f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    IPCThreadState* ipc = IPCThreadState::self();
249f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    const int pid = ipc->getCallingPid();
250f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    status_t err = mGPU->request(pid, callback, gpu);
25154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return err;
25254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
25354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
25454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatus_t SurfaceFlinger::revokeGPU()
25554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
2560c6b5f6ec38b14add24c44360aa60d91ab61ff34Mathias Agopian    if (mGPU == 0)
2570c6b5f6ec38b14add24c44360aa60d91ab61ff34Mathias Agopian        return INVALID_OPERATION;
2580c6b5f6ec38b14add24c44360aa60d91ab61ff34Mathias Agopian
25954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return mGPU->friendlyRevoke();
26054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
26154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
26254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectsp<ISurfaceFlingerClient> SurfaceFlinger::createConnection()
26354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
26454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    Mutex::Autolock _l(mStateLock);
26554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    uint32_t token = mTokens.acquire();
26654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
26754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    Client* client = new Client(token, this);
26854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if ((client == 0) || (client->ctrlblk == 0)) {
26954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mTokens.release(token);
27054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return 0;
27154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
27254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    status_t err = mClientsMap.add(token, client);
27354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (err < 0) {
27454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        delete client;
27554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mTokens.release(token);
27654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return 0;
27754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
27854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    sp<BClient> bclient =
27954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        new BClient(this, token, client->controlBlockMemory());
28054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return bclient;
28154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
28254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
28354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::destroyConnection(ClientID cid)
28454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
28554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    Mutex::Autolock _l(mStateLock);
28654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    Client* const client = mClientsMap.valueFor(cid);
28754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (client) {
28854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // free all the layers this client owns
28954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const Vector<LayerBaseClient*>& layers = client->getLayers();
29054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const size_t count = layers.size();
29154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        for (size_t i=0 ; i<count ; i++) {
29254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            LayerBaseClient* const layer = layers[i];
29354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            removeLayer_l(layer);
29454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
29554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
29654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // the resources associated with this client will be freed
29754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // during the next transaction, after these surfaces have been
29854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // properly removed from the screen
29954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
30054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // remove this client from our ClientID->Client mapping.
30154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mClientsMap.removeItem(cid);
30254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
30354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // and add it to the list of disconnected clients
30454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mDisconnectedClients.add(client);
30554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
30654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // request a transaction
30754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        setTransactionFlags(eTransactionNeeded);
30854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
30954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
31054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
31154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectconst GraphicPlane& SurfaceFlinger::graphicPlane(int dpy) const
31254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
31354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    LOGE_IF(uint32_t(dpy) >= DISPLAY_COUNT, "Invalid DisplayID %d", dpy);
31454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const GraphicPlane& plane(mGraphicPlanes[dpy]);
31554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return plane;
31654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
31754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
31854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectGraphicPlane& SurfaceFlinger::graphicPlane(int dpy)
31954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
32054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return const_cast<GraphicPlane&>(
32154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const_cast<SurfaceFlinger const *>(this)->graphicPlane(dpy));
32254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
32354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
32454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::bootFinished()
32554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
32654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const nsecs_t now = systemTime();
32754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const nsecs_t duration = now - mBootTime;
32854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    LOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
32954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (mBootAnimation != 0) {
33054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mBootAnimation->requestExit();
33154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mBootAnimation.clear();
33254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
33354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
33454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
33554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::onFirstRef()
33654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
33754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    run("SurfaceFlinger", PRIORITY_URGENT_DISPLAY);
33854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
33954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // Wait for the main thread to be done with its initialization
34054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mReadyToRunBarrier.wait();
34154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
34254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
34354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
34454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatic inline uint16_t pack565(int r, int g, int b) {
34554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return (r<<11)|(g<<5)|b;
34654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
34754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
34854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project// this is defined in libGLES_CM.so
34954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectextern ISurfaceComposer* GLES_localSurfaceManager;
35054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
35154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatus_t SurfaceFlinger::readyToRun()
35254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
35354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    LOGI(   "SurfaceFlinger's main thread ready to run. "
35454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "Initializing graphics H/W...");
35554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
356f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    // create the shared control-block
357f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    mServerHeap = new MemoryDealer(4096, MemoryDealer::READ_ONLY);
358f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    LOGE_IF(mServerHeap==0, "can't create shared memory dealer");
359f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project
360f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    mServerCblkMemory = mServerHeap->allocate(4096);
361f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    LOGE_IF(mServerCblkMemory==0, "can't create shared control block");
362f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project
363f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    mServerCblk = static_cast<surface_flinger_cblk_t *>(mServerCblkMemory->pointer());
364f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    LOGE_IF(mServerCblk==0, "can't get to shared control block's address");
365f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    new(mServerCblk) surface_flinger_cblk_t;
366f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project
367f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    // get a reference to the GPU if we have one
368f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    mGPU = GPUFactory::getGPU();
369f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project
370f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    // create the surface Heap manager, which manages the heaps
371f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    // (be it in RAM or VRAM) where surfaces are allocated
372f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    // We give 8 MB per client.
373f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    mSurfaceHeapManager = new SurfaceHeapManager(this, 8 << 20);
374f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project
375f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project
37654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    GLES_localSurfaceManager = static_cast<ISurfaceComposer*>(this);
37754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
37854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // we only support one display currently
37954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    int dpy = 0;
38054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
38154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    {
38254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // initialize the main display
38354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        GraphicPlane& plane(graphicPlane(dpy));
38454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        DisplayHardware* const hw = new DisplayHardware(this, dpy);
38554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        plane.setDisplayHardware(hw);
38654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
38754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
38854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // initialize primary screen
38954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // (other display should be initialized in the same manner, but
39054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // asynchronously, as they could come and go. None of this is supported
39154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // yet).
39254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const GraphicPlane& plane(graphicPlane(dpy));
39354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const DisplayHardware& hw = plane.displayHardware();
39454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const uint32_t w = hw.getWidth();
39554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const uint32_t h = hw.getHeight();
39654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const uint32_t f = hw.getFormat();
39754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    hw.makeCurrent();
39854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
39954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // initialize the shared control block
40054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mServerCblk->connected |= 1<<dpy;
40154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    display_cblk_t* dcblk = mServerCblk->displays + dpy;
40254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    memset(dcblk, 0, sizeof(display_cblk_t));
40354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    dcblk->w            = w;
40454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    dcblk->h            = h;
40554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    dcblk->format       = f;
40654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    dcblk->orientation  = ISurfaceComposer::eOrientationDefault;
40754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    dcblk->xdpi         = hw.getDpiX();
40854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    dcblk->ydpi         = hw.getDpiY();
40954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    dcblk->fps          = hw.getRefreshRate();
410f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    dcblk->density      = hw.getDensity();
41154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    asm volatile ("":::"memory");
41254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
41354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // Initialize OpenGL|ES
41454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glActiveTexture(GL_TEXTURE0);
41554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glBindTexture(GL_TEXTURE_2D, 0);
41654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
41754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
41854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
41954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
42054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
42154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
422f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    glPixelStorei(GL_PACK_ALIGNMENT, 4);
42354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glEnableClientState(GL_VERTEX_ARRAY);
42454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glEnable(GL_SCISSOR_TEST);
42554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glShadeModel(GL_FLAT);
42654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glDisable(GL_DITHER);
42754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glDisable(GL_CULL_FACE);
42854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
42954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const uint16_t g0 = pack565(0x0F,0x1F,0x0F);
43054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const uint16_t g1 = pack565(0x17,0x2f,0x17);
43154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const uint16_t textureData[4] = { g0, g1, g1, g0 };
43254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glGenTextures(1, &mWormholeTexName);
43354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glBindTexture(GL_TEXTURE_2D, mWormholeTexName);
43454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
43554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
43654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
43754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
43854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0,
43954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            GL_RGB, GL_UNSIGNED_SHORT_5_6_5, textureData);
44054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
44154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glViewport(0, 0, w, h);
44254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glMatrixMode(GL_PROJECTION);
44354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glLoadIdentity();
44454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glOrthof(0, w, h, 0, 0, 1);
44554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
44654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project   LayerDim::initDimmer(this, w, h);
44754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
44854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mReadyToRunBarrier.open();
44954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
45054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    /*
45154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     *  We're now ready to accept clients...
45254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     */
45354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mOrientationAnimation = new OrientationAnimation(this);
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // start CPU gauge display
45754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (mDebugCpu)
45854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mCpuGauge = new CPUGauge(this, ms2ns(500));
45954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
46054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // the boot animation!
46154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (mDebugNoBootAnimation == false)
46254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mBootAnimation = new BootAnimation(this);
46354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
46454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return NO_ERROR;
46554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
46654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
46754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project// ----------------------------------------------------------------------------
46854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#if 0
46954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#pragma mark -
47054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#pragma mark Events Handler
47154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#endif
47254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
47354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::waitForEvent()
47454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
47554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // wait for something to do
47654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (UNLIKELY(isFrozen())) {
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // wait 5 seconds
478c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        const nsecs_t freezeDisplayTimeout = ms2ns(5000);
479c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        const nsecs_t now = systemTime();
480c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        if (mFreezeDisplayTime == 0) {
481c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            mFreezeDisplayTime = now;
482c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        }
483c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        nsecs_t waitTime = freezeDisplayTimeout - (now - mFreezeDisplayTime);
484c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        int err = (waitTime > 0) ? mSyncObject.wait(waitTime) : TIMED_OUT;
48554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (err != NO_ERROR) {
48654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (isFrozen()) {
48754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                // we timed out and are still frozen
48854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                LOGW("timeout expired mFreezeDisplay=%d, mFreezeCount=%d",
48954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                        mFreezeDisplay, mFreezeCount);
49054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                mFreezeCount = 0;
491c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                mFreezeDisplay = false;
49254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
49354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
49454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    } else {
495c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        mFreezeDisplayTime = 0;
49654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mSyncObject.wait();
49754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
49854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
49954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
50054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::signalEvent() {
50154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mSyncObject.open();
50254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
50354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
50454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::signal() const {
50554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mSyncObject.open();
50654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
50754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
50854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::signalDelayedEvent(nsecs_t delay)
50954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
51054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (android_atomic_or(1, &mDeplayedTransactionPending) == 0) {
51154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        sp<DelayedTransaction> delayedEvent(new DelayedTransaction(this, delay));
51254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        delayedEvent->run("DelayedeEvent", PRIORITY_URGENT_DISPLAY);
51354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
51454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
51554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
51654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project// ----------------------------------------------------------------------------
51754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#if 0
51854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#pragma mark -
51954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#pragma mark Main loop
52054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#endif
52154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
52254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectbool SurfaceFlinger::threadLoop()
52354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
52454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    waitForEvent();
52554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
52654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // check for transactions
52754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (UNLIKELY(mConsoleSignals)) {
52854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        handleConsoleEvents();
52954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
53054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
53154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (LIKELY(mTransactionCount == 0)) {
53254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // if we're in a global transaction, don't do anything.
53354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const uint32_t mask = eTransactionNeeded | eTraversalNeeded;
53454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        uint32_t transactionFlags = getTransactionFlags(mask);
53554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (LIKELY(transactionFlags)) {
53654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            handleTransaction(transactionFlags);
53754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
53854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
53954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
54054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // post surfaces (if needed)
54154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    handlePageFlip();
54254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
54354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const DisplayHardware& hw(graphicPlane(0).displayHardware());
54454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (LIKELY(hw.canDraw())) {
54554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // repaint the framebuffer (if needed)
54654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        handleRepaint();
54754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
54854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // release the clients before we flip ('cause flip might block)
54954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        unlockClients();
55054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        executeScheduledBroadcasts();
55154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
55254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // sample the cpu gauge
55354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (UNLIKELY(mDebugCpu)) {
55454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            handleDebugCpu();
55554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
55654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
55754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        postFramebuffer();
55854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    } else {
55954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // pretend we did the post
56054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        unlockClients();
56154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        executeScheduledBroadcasts();
56254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        usleep(16667); // 60 fps period
56354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
56454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return true;
56554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
56654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
56754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::postFramebuffer()
56854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const bool skip = mOrientationAnimation->run();
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (UNLIKELY(skip)) {
57154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return;
57254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
57354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
57454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (!mInvalidRegion.isEmpty()) {
57554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const DisplayHardware& hw(graphicPlane(0).displayHardware());
57654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
57754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (UNLIKELY(mDebugFps)) {
57854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            debugShowFPS();
57954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
58054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
58154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        hw.flip(mInvalidRegion);
58254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
58354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mInvalidRegion.clear();
58454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
58554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (Layer::deletedTextures.size()) {
58654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            glDeleteTextures(
58754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    Layer::deletedTextures.size(),
58854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    Layer::deletedTextures.array());
58954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            Layer::deletedTextures.clear();
59054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
59154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
59254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
59354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
59454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::handleConsoleEvents()
59554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
59654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // something to do with the console
59754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const DisplayHardware& hw = graphicPlane(0).displayHardware();
59854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
59954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    int what = android_atomic_and(0, &mConsoleSignals);
60054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (what & eConsoleAcquired) {
60154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        hw.acquireScreen();
60254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
60354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
60454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (mDeferReleaseConsole && hw.canDraw()) {
60554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // We got the release signal before the aquire signal
60654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mDeferReleaseConsole = false;
60754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        revokeGPU();
60854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        hw.releaseScreen();
60954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
61054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
61154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (what & eConsoleReleased) {
61254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (hw.canDraw()) {
61354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            revokeGPU();
61454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            hw.releaseScreen();
61554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        } else {
61654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            mDeferReleaseConsole = true;
61754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
61854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
61954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
62054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mDirtyRegion.set(hw.bounds());
62154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
62254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
62354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
62454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
62554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    Mutex::Autolock _l(mStateLock);
62654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
62754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
62854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const size_t count = currentLayers.size();
62954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
63054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    /*
63154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * Traversal of the children
63254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * (perform the transaction for each of them if needed)
63354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     */
63454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
63554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const bool layersNeedTransaction = transactionFlags & eTraversalNeeded;
63654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (layersNeedTransaction) {
63754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        for (size_t i=0 ; i<count ; i++) {
63854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            LayerBase* const layer = currentLayers[i];
63954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
64054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (!trFlags) continue;
64154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
64254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            const uint32_t flags = layer->doTransaction(0);
64354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (flags & Layer::eVisibleRegion)
64454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                mVisibleRegionsDirty = true;
64554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
64654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (flags & Layer::eRestartTransaction) {
64754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                // restart the transaction, but back-off a little
64854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                layer->setTransactionFlags(eTransactionNeeded);
64954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                setTransactionFlags(eTraversalNeeded, ms2ns(8));
65054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
65154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
65254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
65354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
65454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    /*
65554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     * Perform our own transaction if needed
65654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project     */
65754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
65854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (transactionFlags & eTransactionNeeded) {
65954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (mCurrentState.orientation != mDrawingState.orientation) {
66054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            // the orientation has changed, recompute all visible regions
66154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            // and invalidate everything.
66254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
66354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            const int dpy = 0;
66454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            const int orientation = mCurrentState.orientation;
665c75c4364eae030a9ea6db658c4d1e38cdb05ab4cMathias Agopian            const uint32_t type = mCurrentState.orientationType;
66654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            GraphicPlane& plane(graphicPlane(dpy));
66754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            plane.setOrientation(orientation);
66854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
66954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            // update the shared control block
67054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            const DisplayHardware& hw(plane.displayHardware());
67154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            volatile display_cblk_t* dcblk = mServerCblk->displays + dpy;
67254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            dcblk->orientation = orientation;
67354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (orientation & eOrientationSwapMask) {
67454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                // 90 or 270 degrees orientation
67554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                dcblk->w = hw.getHeight();
67654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                dcblk->h = hw.getWidth();
67754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            } else {
67854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                dcblk->w = hw.getWidth();
67954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                dcblk->h = hw.getHeight();
68054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
68154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
68254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            mVisibleRegionsDirty = true;
68354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            mDirtyRegion.set(hw.bounds());
684c75c4364eae030a9ea6db658c4d1e38cdb05ab4cMathias Agopian            mFreezeDisplayTime = 0;
685c75c4364eae030a9ea6db658c4d1e38cdb05ab4cMathias Agopian            mOrientationAnimation->onOrientationChanged(type);
68654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
68754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
68854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (mCurrentState.freezeDisplay != mDrawingState.freezeDisplay) {
68954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            // freezing or unfreezing the display -> trigger animation if needed
69054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            mFreezeDisplay = mCurrentState.freezeDisplay;
69154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
69254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
69354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // some layers might have been removed, so
69454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // we need to update the regions they're exposing.
69554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        size_t c = mRemovedLayers.size();
69654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (c) {
69754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            mVisibleRegionsDirty = true;
69854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
69954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
70054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
70154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (currentLayers.size() > mDrawingState.layersSortedByZ.size()) {
70254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            // layers have been added
70354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            mVisibleRegionsDirty = true;
70454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
70554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
70654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // get rid of all resources we don't need anymore
70754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // (layers and clients)
70854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        free_resources_l();
70954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
71054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
71154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    commitTransaction();
71254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
71354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
71454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectsp<FreezeLock> SurfaceFlinger::getFreezeLock() const
71554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
71654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return new FreezeLock(const_cast<SurfaceFlinger *>(this));
71754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
71854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
71954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::computeVisibleRegions(
72054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    LayerVector& currentLayers, Region& dirtyRegion, Region& opaqueRegion)
72154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
72254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const GraphicPlane& plane(graphicPlane(0));
72354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const Transform& planeTransform(plane.transform());
72454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
72554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    Region aboveOpaqueLayers;
72654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    Region aboveCoveredLayers;
72754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    Region dirty;
72854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
72954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    bool secureFrameBuffer = false;
73054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
73154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    size_t i = currentLayers.size();
73254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    while (i--) {
73354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        LayerBase* const layer = currentLayers[i];
73454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        layer->validateVisibility(planeTransform);
73554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
73654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // start with the whole surface at its current location
73754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const Layer::State& s = layer->drawingState();
73854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const Rect bounds(layer->visibleBounds());
73954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
74054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // handle hidden surfaces by setting the visible region to empty
74154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        Region opaqueRegion;
74254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        Region visibleRegion;
74354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        Region coveredRegion;
74454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (UNLIKELY((s.flags & ISurfaceComposer::eLayerHidden) || !s.alpha)) {
74554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            visibleRegion.clear();
74654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        } else {
74754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            const bool translucent = layer->needsBlending();
74854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            visibleRegion.set(bounds);
74954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            coveredRegion = visibleRegion;
75054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
75154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            // Remove the transparent area from the visible region
75254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (translucent) {
75354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                visibleRegion.subtractSelf(layer->transparentRegionScreen);
75454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
75554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
75654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            // compute the opaque region
75754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (s.alpha==255 && !translucent && layer->getOrientation()>=0) {
75854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                // the opaque region is the visible region
75954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                opaqueRegion = visibleRegion;
76054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
76154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
76254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
76354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // subtract the opaque region covered by the layers above us
76454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        visibleRegion.subtractSelf(aboveOpaqueLayers);
76554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        coveredRegion.andSelf(aboveCoveredLayers);
76654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
76754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // compute this layer's dirty region
768b798689749c64baba81f02e10cf2157c747d6b46The Android Open Source Project        if (layer->contentDirty) {
76954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            // we need to invalidate the whole region
77054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            dirty = visibleRegion;
77154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            // as well, as the old visible region
77254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            dirty.orSelf(layer->visibleRegionScreen);
773b798689749c64baba81f02e10cf2157c747d6b46The Android Open Source Project            layer->contentDirty = false;
77454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        } else {
77554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            // compute the exposed region
77654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            // dirty = what's visible now - what's wasn't covered before
77754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            //       = what's visible now & what's was covered before
77854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            dirty = visibleRegion.intersect(layer->coveredRegionScreen);
77954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
78054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        dirty.subtractSelf(aboveOpaqueLayers);
78154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
78254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // accumulate to the screen dirty region
78354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        dirtyRegion.orSelf(dirty);
78454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
78554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // updade aboveOpaqueLayers/aboveCoveredLayers for next (lower) layer
78654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        aboveOpaqueLayers.orSelf(opaqueRegion);
78754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        aboveCoveredLayers.orSelf(bounds);
78854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
78954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // Store the visible region is screen space
79054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        layer->setVisibleRegion(visibleRegion);
79154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        layer->setCoveredRegion(coveredRegion);
79254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
79354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // If a secure layer is partially visible, lockdown the screen!
79454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (layer->isSecure() && !visibleRegion.isEmpty()) {
79554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            secureFrameBuffer = true;
79654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
79754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
79854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
79954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mSecureFrameBuffer = secureFrameBuffer;
80054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    opaqueRegion = aboveOpaqueLayers;
80154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
80254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
80354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
80454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::commitTransaction()
80554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
80654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mDrawingState = mCurrentState;
80754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mTransactionCV.signal();
80854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
80954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
81054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::handlePageFlip()
81154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
81254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    bool visibleRegions = mVisibleRegionsDirty;
81354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    LayerVector& currentLayers = const_cast<LayerVector&>(mDrawingState.layersSortedByZ);
81454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    visibleRegions |= lockPageFlip(currentLayers);
81554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
81654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const DisplayHardware& hw = graphicPlane(0).displayHardware();
81754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const Region screenRegion(hw.bounds());
81854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (visibleRegions) {
81954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            Region opaqueRegion;
82054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            computeVisibleRegions(currentLayers, mDirtyRegion, opaqueRegion);
82154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            mWormholeRegion = screenRegion.subtract(opaqueRegion);
82254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            mVisibleRegionsDirty = false;
82354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
82454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
82554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    unlockPageFlip(currentLayers);
82654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mDirtyRegion.andSelf(screenRegion);
82754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
82854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
82954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectbool SurfaceFlinger::lockPageFlip(const LayerVector& currentLayers)
83054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
83154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    bool recomputeVisibleRegions = false;
83254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    size_t count = currentLayers.size();
83354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    LayerBase* const* layers = currentLayers.array();
83454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    for (size_t i=0 ; i<count ; i++) {
83554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        LayerBase* const layer = layers[i];
83654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        layer->lockPageFlip(recomputeVisibleRegions);
83754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
83854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return recomputeVisibleRegions;
83954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
84054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
84154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::unlockPageFlip(const LayerVector& currentLayers)
84254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
84354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const GraphicPlane& plane(graphicPlane(0));
84454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const Transform& planeTransform(plane.transform());
84554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    size_t count = currentLayers.size();
84654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    LayerBase* const* layers = currentLayers.array();
84754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    for (size_t i=0 ; i<count ; i++) {
84854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        LayerBase* const layer = layers[i];
84954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        layer->unlockPageFlip(planeTransform, mDirtyRegion);
85054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
85154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
85254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
85354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::handleRepaint()
85454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
85554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // set the frame buffer
85654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const DisplayHardware& hw(graphicPlane(0).displayHardware());
85754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glMatrixMode(GL_MODELVIEW);
85854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glLoadIdentity();
85954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
86054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (UNLIKELY(mDebugRegion)) {
86154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        debugFlashRegions();
86254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
86354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
86454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // compute the invalid region
86554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mInvalidRegion.orSelf(mDirtyRegion);
86654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
86754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    uint32_t flags = hw.getFlags();
86854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (flags & DisplayHardware::BUFFER_PRESERVED) {
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // here we assume DisplayHardware::flip()'s  implementation
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // performs the copy-back optimization.
87154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    } else {
87254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (flags & DisplayHardware::UPDATE_ON_DEMAND) {
87354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            // we need to fully redraw the part that will be updated
87454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            mDirtyRegion.set(mInvalidRegion.bounds());
87554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        } else {
87654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            // we need to redraw everything
87754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            mDirtyRegion.set(hw.bounds());
87854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            mInvalidRegion = mDirtyRegion;
87954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
88054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
88154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
88254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // compose all surfaces
88354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    composeSurfaces(mDirtyRegion);
88454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
88554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // clear the dirty regions
88654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mDirtyRegion.clear();
88754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
88854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
88954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::composeSurfaces(const Region& dirty)
89054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
89154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (UNLIKELY(!mWormholeRegion.isEmpty())) {
89254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // should never happen unless the window manager has a bug
89354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // draw something...
89454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        drawWormhole();
89554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
89654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const SurfaceFlinger& flinger(*this);
89754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const LayerVector& drawingLayers(mDrawingState.layersSortedByZ);
89854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const size_t count = drawingLayers.size();
89954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    LayerBase const* const* const layers = drawingLayers.array();
90054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    for (size_t i=0 ; i<count ; ++i) {
90154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        LayerBase const * const layer = layers[i];
90254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const Region& visibleRegion(layer->visibleRegionScreen);
90354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (!visibleRegion.isEmpty())  {
90454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            const Region clip(dirty.intersect(visibleRegion));
90554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (!clip.isEmpty()) {
90654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                layer->draw(clip);
90754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
90854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
90954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
91054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
91154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
91254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::unlockClients()
91354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
91454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const LayerVector& drawingLayers(mDrawingState.layersSortedByZ);
91554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const size_t count = drawingLayers.size();
91654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    LayerBase* const* const layers = drawingLayers.array();
91754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    for (size_t i=0 ; i<count ; ++i) {
91854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        LayerBase* const layer = layers[i];
91954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        layer->finishPageFlip();
92054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
92154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
92254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
92354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::scheduleBroadcast(Client* client)
92454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
92554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (mLastScheduledBroadcast != client) {
92654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mLastScheduledBroadcast = client;
92754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mScheduledBroadcasts.add(client);
92854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
92954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
93054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
93154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::executeScheduledBroadcasts()
93254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
93354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    SortedVector<Client*>& list = mScheduledBroadcasts;
93454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    size_t count = list.size();
93554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    while (count--) {
93654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        per_client_cblk_t* const cblk = list[count]->ctrlblk;
93754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (cblk->lock.tryLock() == NO_ERROR) {
93854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            cblk->cv.broadcast();
93954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            list.removeAt(count);
94054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            cblk->lock.unlock();
94154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        } else {
94254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            // schedule another round
94354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            LOGW("executeScheduledBroadcasts() skipped, "
94454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                "contention on the client. We'll try again later...");
94554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            signalDelayedEvent(ms2ns(4));
94654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
94754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
94854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mLastScheduledBroadcast = 0;
94954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
95054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
95154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::handleDebugCpu()
95254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
95354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    Mutex::Autolock _l(mDebugLock);
95454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (mCpuGauge != 0)
95554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mCpuGauge->sample();
95654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
95754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
95854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::debugFlashRegions()
95954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
96054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (UNLIKELY(!mDirtyRegion.isRect())) {
96154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // TODO: do this only if we don't have preserving
96254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // swapBuffer. If we don't have update-on-demand,
96354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // redraw everything.
96454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        composeSurfaces(Region(mDirtyRegion.bounds()));
96554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
96654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
96754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glDisable(GL_TEXTURE_2D);
96854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glDisable(GL_BLEND);
96954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glDisable(GL_DITHER);
97054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glDisable(GL_SCISSOR_TEST);
97154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
97254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glColor4x(0x10000, 0, 0x10000, 0x10000);
97354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
97454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    Rect r;
97554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    Region::iterator iterator(mDirtyRegion);
97654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    while (iterator.iterate(&r)) {
97754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        GLfloat vertices[][2] = {
97854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                { r.left,  r.top },
97954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                { r.left,  r.bottom },
98054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                { r.right, r.bottom },
98154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                { r.right, r.top }
98254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        };
98354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        glVertexPointer(2, GL_FLOAT, 0, vertices);
98454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
98554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
98654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
98754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const DisplayHardware& hw(graphicPlane(0).displayHardware());
98854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    hw.flip(mDirtyRegion.merge(mInvalidRegion));
98954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mInvalidRegion.clear();
99054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
99154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (mDebugRegion > 1)
99254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project       usleep(mDebugRegion * 1000);
99354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
99454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glEnable(GL_SCISSOR_TEST);
99554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    //mDirtyRegion.dump("mDirtyRegion");
99654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
99754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
99854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::drawWormhole() const
99954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
100054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const Region region(mWormholeRegion.intersect(mDirtyRegion));
100154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (region.isEmpty())
100254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return;
100354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
100454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const DisplayHardware& hw(graphicPlane(0).displayHardware());
100554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const int32_t width = hw.getWidth();
100654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const int32_t height = hw.getHeight();
100754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
100854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glDisable(GL_BLEND);
100954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    glDisable(GL_DITHER);
101054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
101154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (LIKELY(!mDebugBackground)) {
101254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        glClearColorx(0,0,0,0);
101354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        Rect r;
101454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        Region::iterator iterator(region);
101554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        while (iterator.iterate(&r)) {
101654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            const GLint sy = height - (r.top + r.height());
101754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            glScissor(r.left, sy, r.width(), r.height());
101854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            glClear(GL_COLOR_BUFFER_BIT);
101954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
102054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    } else {
102154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const GLshort vertices[][2] = { { 0, 0 }, { width, 0 },
102254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                { width, height }, { 0, height }  };
102354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const GLshort tcoords[][2] = { { 0, 0 }, { 1, 0 },  { 1, 1 }, { 0, 1 } };
102454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        glVertexPointer(2, GL_SHORT, 0, vertices);
102554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        glTexCoordPointer(2, GL_SHORT, 0, tcoords);
102654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
102754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        glEnable(GL_TEXTURE_2D);
102854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        glBindTexture(GL_TEXTURE_2D, mWormholeTexName);
102954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
103054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        glMatrixMode(GL_TEXTURE);
103154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        glLoadIdentity();
103254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        glScalef(width*(1.0f/32.0f), height*(1.0f/32.0f), 1);
103354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        Rect r;
103454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        Region::iterator iterator(region);
103554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        while (iterator.iterate(&r)) {
103654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            const GLint sy = height - (r.top + r.height());
103754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            glScissor(r.left, sy, r.width(), r.height());
103854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
103954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
104054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
104154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
104254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
104354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
104454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::debugShowFPS() const
104554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
104654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    static int mFrameCount;
104754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    static int mLastFrameCount = 0;
104854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    static nsecs_t mLastFpsTime = 0;
104954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    static float mFps = 0;
105054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mFrameCount++;
105154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    nsecs_t now = systemTime();
105254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    nsecs_t diff = now - mLastFpsTime;
105354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (diff > ms2ns(250)) {
105454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mFps =  ((mFrameCount - mLastFrameCount) * float(s2ns(1))) / diff;
105554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mLastFpsTime = now;
105654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mLastFrameCount = mFrameCount;
105754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
105854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // XXX: mFPS has the value we want
105954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project }
106054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t SurfaceFlinger::addLayer(LayerBase* layer)
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Mutex::Autolock _l(mStateLock);
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    addLayer_l(layer);
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    setTransactionFlags(eTransactionNeeded|eTraversalNeeded);
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NO_ERROR;
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t SurfaceFlinger::removeLayer(LayerBase* layer)
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Mutex::Autolock _l(mStateLock);
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    removeLayer_l(layer);
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    setTransactionFlags(eTransactionNeeded);
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NO_ERROR;
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t SurfaceFlinger::invalidateLayerVisibility(LayerBase* layer)
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    layer->forceVisibilityTransaction();
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    setTransactionFlags(eTraversalNeeded);
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NO_ERROR;
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
108454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatus_t SurfaceFlinger::addLayer_l(LayerBase* layer)
108554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
108654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    ssize_t i = mCurrentState.layersSortedByZ.add(
108754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                layer, &LayerBase::compareCurrentStateZ);
108854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    LayerBaseClient* lbc = LayerBase::dynamicCast<LayerBaseClient*>(layer);
108954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (lbc) {
109054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mLayerMap.add(lbc->serverIndex(), lbc);
109154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
109254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mRemovedLayers.remove(layer);
109354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return NO_ERROR;
109454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
109554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
109654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatus_t SurfaceFlinger::removeLayer_l(LayerBase* layerBase)
109754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
109854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    ssize_t index = mCurrentState.layersSortedByZ.remove(layerBase);
109954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (index >= 0) {
110054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mRemovedLayers.add(layerBase);
110154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        LayerBaseClient* layer = LayerBase::dynamicCast<LayerBaseClient*>(layerBase);
110254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (layer) {
110354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            mLayerMap.removeItem(layer->serverIndex());
110454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
110554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return NO_ERROR;
110654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
110754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // it's possible that we don't find a layer, because it might
110854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // have been destroyed already -- this is not technically an error
110954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // from the user because there is a race between destroySurface,
111054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // destroyclient and destroySurface-from-a-transaction.
111154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return (index == NAME_NOT_FOUND) ? status_t(NO_ERROR) : index;
111254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
111354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
111454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::free_resources_l()
111554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
111654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // Destroy layers that were removed
111754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    destroy_all_removed_layers_l();
111854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
111954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // free resources associated with disconnected clients
112054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    SortedVector<Client*>& scheduledBroadcasts(mScheduledBroadcasts);
112154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    Vector<Client*>& disconnectedClients(mDisconnectedClients);
112254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const size_t count = disconnectedClients.size();
112354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    for (size_t i=0 ; i<count ; i++) {
112454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        Client* client = disconnectedClients[i];
112554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // if this client is the scheduled broadcast list,
112654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // remove it from there (and we don't need to signal it
112754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // since it is dead).
112854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        int32_t index = scheduledBroadcasts.indexOf(client);
112954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (index >= 0) {
113054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            scheduledBroadcasts.removeItemsAt(index);
113154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
113254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mTokens.release(client->cid);
113354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        delete client;
113454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
113554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    disconnectedClients.clear();
113654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
113754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
113854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::destroy_all_removed_layers_l()
113954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
114054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    size_t c = mRemovedLayers.size();
114154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    while (c--) {
114254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        LayerBase* const removed_layer = mRemovedLayers[c];
114354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
114454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        LOGE_IF(mCurrentState.layersSortedByZ.indexOf(removed_layer) >= 0,
114554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "layer %p removed but still in the current state list",
114654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            removed_layer);
114754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
114854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        delete removed_layer;
114954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
115054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mRemovedLayers.clear();
115154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
115254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
115354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
115454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectuint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags)
115554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
115654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return android_atomic_and(~flags, &mTransactionFlags) & flags;
115754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
115854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
115954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectuint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags, nsecs_t delay)
116054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
116154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    uint32_t old = android_atomic_or(flags, &mTransactionFlags);
116254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if ((old & flags)==0) { // wake the server up
116354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (delay > 0) {
116454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            signalDelayedEvent(delay);
116554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        } else {
116654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            signalEvent();
116754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
116854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
116954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return old;
117054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
117154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
117254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::openGlobalTransaction()
117354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
117454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    android_atomic_inc(&mTransactionCount);
117554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
117654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
117754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::closeGlobalTransaction()
117854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
117954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (android_atomic_dec(&mTransactionCount) == 1) {
118054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        signalEvent();
118154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
118254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
118354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
118454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatus_t SurfaceFlinger::freezeDisplay(DisplayID dpy, uint32_t flags)
118554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
118654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (UNLIKELY(uint32_t(dpy) >= DISPLAY_COUNT))
118754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return BAD_VALUE;
118854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
118954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    Mutex::Autolock _l(mStateLock);
119054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mCurrentState.freezeDisplay = 1;
119154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    setTransactionFlags(eTransactionNeeded);
119254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
119354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // flags is intended to communicate some sort of animation behavior
119454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // (for instance fadding)
119554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return NO_ERROR;
119654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
119754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
119854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatus_t SurfaceFlinger::unfreezeDisplay(DisplayID dpy, uint32_t flags)
119954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
120054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (UNLIKELY(uint32_t(dpy) >= DISPLAY_COUNT))
120154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return BAD_VALUE;
120254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
120354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    Mutex::Autolock _l(mStateLock);
120454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mCurrentState.freezeDisplay = 0;
120554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    setTransactionFlags(eTransactionNeeded);
120654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
120754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // flags is intended to communicate some sort of animation behavior
120854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // (for instance fadding)
120954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return NO_ERROR;
121054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
121154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
1212c75c4364eae030a9ea6db658c4d1e38cdb05ab4cMathias Agopianint SurfaceFlinger::setOrientation(DisplayID dpy,
1213c75c4364eae030a9ea6db658c4d1e38cdb05ab4cMathias Agopian        int orientation, uint32_t flags)
121454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
121554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (UNLIKELY(uint32_t(dpy) >= DISPLAY_COUNT))
121654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return BAD_VALUE;
121754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
121854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    Mutex::Autolock _l(mStateLock);
121954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (mCurrentState.orientation != orientation) {
122054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (uint32_t(orientation)<=eOrientation270 || orientation==42) {
1221c75c4364eae030a9ea6db658c4d1e38cdb05ab4cMathias Agopian            mCurrentState.orientationType = flags;
122254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            mCurrentState.orientation = orientation;
122354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            setTransactionFlags(eTransactionNeeded);
122454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            mTransactionCV.wait(mStateLock);
122554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        } else {
122654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            orientation = BAD_VALUE;
122754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
122854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
122954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return orientation;
123054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
123154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
123254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectsp<ISurface> SurfaceFlinger::createSurface(ClientID clientId, int pid,
123354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        ISurfaceFlingerClient::surface_data_t* params,
123454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        DisplayID d, uint32_t w, uint32_t h, PixelFormat format,
123554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        uint32_t flags)
123654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
123754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    LayerBaseClient* layer = 0;
123854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    sp<LayerBaseClient::Surface> surfaceHandle;
123954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    Mutex::Autolock _l(mStateLock);
124054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    Client* const c = mClientsMap.valueFor(clientId);
124154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (UNLIKELY(!c)) {
124254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        LOGE("createSurface() failed, client not found (id=%d)", clientId);
124354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return surfaceHandle;
124454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
124554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
124654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    //LOGD("createSurface for pid %d (%d x %d)", pid, w, h);
124754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    int32_t id = c->generateId(pid);
124854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (uint32_t(id) >= NUM_LAYERS_MAX) {
124954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        LOGE("createSurface() failed, generateId = %d", id);
125054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return surfaceHandle;
125154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
125254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
125354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    switch (flags & eFXSurfaceMask) {
125454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        case eFXSurfaceNormal:
125554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (UNLIKELY(flags & ePushBuffers)) {
125654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                layer = createPushBuffersSurfaceLocked(c, d, id, w, h, flags);
125754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            } else {
125854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                layer = createNormalSurfaceLocked(c, d, id, w, h, format, flags);
125954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
126054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            break;
126154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        case eFXSurfaceBlur:
126254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            layer = createBlurSurfaceLocked(c, d, id, w, h, flags);
126354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            break;
126454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        case eFXSurfaceDim:
126554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            layer = createDimSurfaceLocked(c, d, id, w, h, flags);
126654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            break;
126754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
126854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
126954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (layer) {
127054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        setTransactionFlags(eTransactionNeeded);
127154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        surfaceHandle = layer->getSurface();
127254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (surfaceHandle != 0)
127354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            surfaceHandle->getSurfaceData(params);
127454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
127554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
127654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return surfaceHandle;
127754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
127854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
127954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectLayerBaseClient* SurfaceFlinger::createNormalSurfaceLocked(
128054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        Client* client, DisplayID display,
128154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        int32_t id, uint32_t w, uint32_t h, PixelFormat format, uint32_t flags)
128254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
128354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // initialize the surfaces
128454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    switch (format) { // TODO: take h/w into account
128554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    case PIXEL_FORMAT_TRANSPARENT:
128654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    case PIXEL_FORMAT_TRANSLUCENT:
128754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        format = PIXEL_FORMAT_RGBA_8888;
128854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        break;
128954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    case PIXEL_FORMAT_OPAQUE:
129054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        format = PIXEL_FORMAT_RGB_565;
129154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        break;
129254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
129354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
129454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    Layer* layer = new Layer(this, display, client, id);
129554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    status_t err = layer->setBuffers(client, w, h, format, flags);
129654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (LIKELY(err == NO_ERROR)) {
129754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        layer->initStates(w, h, flags);
129854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        addLayer_l(layer);
129954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    } else {
130054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        LOGE("createNormalSurfaceLocked() failed (%s)", strerror(-err));
130154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        delete layer;
130254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return 0;
130354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
130454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return layer;
130554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
130654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
130754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectLayerBaseClient* SurfaceFlinger::createBlurSurfaceLocked(
130854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        Client* client, DisplayID display,
130954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        int32_t id, uint32_t w, uint32_t h, uint32_t flags)
131054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
131154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    LayerBlur* layer = new LayerBlur(this, display, client, id);
131254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    layer->initStates(w, h, flags);
131354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    addLayer_l(layer);
131454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return layer;
131554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
131654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
131754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectLayerBaseClient* SurfaceFlinger::createDimSurfaceLocked(
131854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        Client* client, DisplayID display,
131954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        int32_t id, uint32_t w, uint32_t h, uint32_t flags)
132054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
132154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    LayerDim* layer = new LayerDim(this, display, client, id);
132254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    layer->initStates(w, h, flags);
132354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    addLayer_l(layer);
132454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return layer;
132554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
132654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
132754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectLayerBaseClient* SurfaceFlinger::createPushBuffersSurfaceLocked(
132854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        Client* client, DisplayID display,
132954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        int32_t id, uint32_t w, uint32_t h, uint32_t flags)
133054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
133154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    LayerBuffer* layer = new LayerBuffer(this, display, client, id);
133254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    layer->initStates(w, h, flags);
133354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    addLayer_l(layer);
133454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return layer;
133554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
133654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
133754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatus_t SurfaceFlinger::destroySurface(SurfaceID index)
133854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
133954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    Mutex::Autolock _l(mStateLock);
134054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    LayerBaseClient* const layer = getLayerUser_l(index);
134154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    status_t err = removeLayer_l(layer);
134254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (err < 0)
134354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return err;
134454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    setTransactionFlags(eTransactionNeeded);
134554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return NO_ERROR;
134654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
134754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
134854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatus_t SurfaceFlinger::setClientState(
134954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        ClientID cid,
135054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        int32_t count,
135154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const layer_state_t* states)
135254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
135354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    Mutex::Autolock _l(mStateLock);
135454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    uint32_t flags = 0;
135554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    cid <<= 16;
135654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    for (int i=0 ; i<count ; i++) {
135754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const layer_state_t& s = states[i];
135854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        LayerBaseClient* layer = getLayerUser_l(s.surface | cid);
135954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (layer) {
136054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            const uint32_t what = s.what;
136154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            // check if it has been destroyed first
136254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (what & eDestroyed) {
136354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                if (removeLayer_l(layer) == NO_ERROR) {
136454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    flags |= eTransactionNeeded;
136554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    // we skip everything else... well, no, not really
136654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    // we skip ONLY that transaction.
136754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    continue;
136854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                }
136954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
137054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (what & ePositionChanged) {
137154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                if (layer->setPosition(s.x, s.y))
137254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    flags |= eTraversalNeeded;
137354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
137454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (what & eLayerChanged) {
137554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                if (layer->setLayer(s.z)) {
137654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    mCurrentState.layersSortedByZ.reorder(
137754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                            layer, &Layer::compareCurrentStateZ);
137854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    // we need traversal (state changed)
137954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    // AND transaction (list changed)
138054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    flags |= eTransactionNeeded|eTraversalNeeded;
138154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                }
138254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
138354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (what & eSizeChanged) {
138454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                if (layer->setSize(s.w, s.h))
138554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    flags |= eTraversalNeeded;
138654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
138754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (what & eAlphaChanged) {
138854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f)))
138954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    flags |= eTraversalNeeded;
139054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
139154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (what & eMatrixChanged) {
139254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                if (layer->setMatrix(s.matrix))
139354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    flags |= eTraversalNeeded;
139454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
139554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (what & eTransparentRegionChanged) {
139654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                if (layer->setTransparentRegionHint(s.transparentRegion))
139754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    flags |= eTraversalNeeded;
139854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
139954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (what & eVisibilityChanged) {
140054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                if (layer->setFlags(s.flags, s.mask))
140154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    flags |= eTraversalNeeded;
140254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
140354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
140454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
140554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (flags) {
140654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        setTransactionFlags(flags);
140754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
140854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return NO_ERROR;
140954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
141054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
141154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectLayerBaseClient* SurfaceFlinger::getLayerUser_l(SurfaceID s) const
141254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
141354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return mLayerMap.valueFor(s);
141454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
141554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
141654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::screenReleased(int dpy)
141754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
141854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // this may be called by a signal handler, we can't do too much in here
141954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    android_atomic_or(eConsoleReleased, &mConsoleSignals);
142054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    signalEvent();
142154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
142254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
142354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid SurfaceFlinger::screenAcquired(int dpy)
142454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
142554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // this may be called by a signal handler, we can't do too much in here
142654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    android_atomic_or(eConsoleAcquired, &mConsoleSignals);
142754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    signalEvent();
142854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
142954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
143054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatus_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
143154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
143254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const size_t SIZE = 1024;
143354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    char buffer[SIZE];
143454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    String8 result;
143554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (checkCallingPermission(
143654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            String16("android.permission.DUMP")) == false)
143754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    { // not allowed
143854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        snprintf(buffer, SIZE, "Permission Denial: "
143954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                "can't dump SurfaceFlinger from pid=%d, uid=%d\n",
144054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                IPCThreadState::self()->getCallingPid(),
144154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                IPCThreadState::self()->getCallingUid());
144254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        result.append(buffer);
144354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    } else {
144454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        Mutex::Autolock _l(mStateLock);
144554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        size_t s = mClientsMap.size();
144654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        char name[64];
144754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        for (size_t i=0 ; i<s ; i++) {
144854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            Client* client = mClientsMap.valueAt(i);
144954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            sprintf(name, "  Client (id=0x%08x)", client->cid);
145054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            client->dump(name);
145154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
145254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
145354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const size_t count = currentLayers.size();
145454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        for (size_t i=0 ; i<count ; i++) {
145554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            /*** LayerBase ***/
145654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            LayerBase const * const layer = currentLayers[i];
145754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            const Layer::State& s = layer->drawingState();
145854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            snprintf(buffer, SIZE,
145954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    "+ %s %p\n"
146054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    "      "
146154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    "z=%9d, pos=(%4d,%4d), size=(%4d,%4d), "
146254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    "needsBlending=%1d, invalidate=%1d, "
146354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n",
146454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    layer->getTypeID(), layer,
146554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    s.z, layer->tx(), layer->ty(), s.w, s.h,
1466b798689749c64baba81f02e10cf2157c747d6b46The Android Open Source Project                    layer->needsBlending(), layer->contentDirty,
146754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    s.alpha, s.flags,
146854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    s.transform[0], s.transform[1],
146954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    s.transform[2], s.transform[3]);
147054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            result.append(buffer);
147154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            buffer[0] = 0;
147254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            /*** LayerBaseClient ***/
147354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            LayerBaseClient* const lbc =
147454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                LayerBase::dynamicCast<LayerBaseClient*>((LayerBase*)layer);
147554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (lbc) {
147654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                snprintf(buffer, SIZE,
147754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                        "      "
147854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                        "id=0x%08x, client=0x%08x, identity=%u\n",
147954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                        lbc->clientIndex(), lbc->client ? lbc->client->cid : 0,
148054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                        lbc->getIdentity());
148154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
148254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            result.append(buffer);
148354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            buffer[0] = 0;
148454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            /*** Layer ***/
148554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            Layer* const l = LayerBase::dynamicCast<Layer*>((LayerBase*)layer);
148654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (l) {
148754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                const LayerBitmap& buf0(l->getBuffer(0));
148854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                const LayerBitmap& buf1(l->getBuffer(1));
148954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                snprintf(buffer, SIZE,
149054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                        "      "
149154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                        "format=%2d, [%3ux%3u:%3u] [%3ux%3u:%3u], mTextureName=%d,"
149254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                        " freezeLock=%p, swapState=0x%08x\n",
149354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                        l->pixelFormat(),
149454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                        buf0.width(), buf0.height(), buf0.stride(),
149554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                        buf1.width(), buf1.height(), buf1.stride(),
149654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                        l->getTextureName(), l->getFreezeLock().get(),
149754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                        l->lcblk->swapState);
149854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
149954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            result.append(buffer);
150054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            buffer[0] = 0;
150154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            s.transparentRegion.dump(result, "transparentRegion");
150254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            layer->transparentRegionScreen.dump(result, "transparentRegionScreen");
150354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            layer->visibleRegionScreen.dump(result, "visibleRegionScreen");
150454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
150554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mWormholeRegion.dump(result, "WormholeRegion");
150654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const DisplayHardware& hw(graphicPlane(0).displayHardware());
150754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        snprintf(buffer, SIZE,
150854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                "  display frozen: %s, freezeCount=%d, orientation=%d, canDraw=%d\n",
150954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                mFreezeDisplay?"yes":"no", mFreezeCount,
151054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                mCurrentState.orientation, hw.canDraw());
151154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        result.append(buffer);
151254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
151354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        sp<AllocatorInterface> allocator;
151454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (mGPU != 0) {
151554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            snprintf(buffer, SIZE, "  GPU owner: %d\n", mGPU->getOwner());
151654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            result.append(buffer);
151754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            allocator = mGPU->getAllocator();
151854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (allocator != 0) {
151954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                allocator->dump(result, "GPU Allocator");
152054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
152154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
152254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        allocator = mSurfaceHeapManager->getAllocator(NATIVE_MEMORY_TYPE_PMEM);
152354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (allocator != 0) {
152454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            allocator->dump(result, "PMEM Allocator");
152554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
152654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
152754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    write(fd, result.string(), result.size());
152854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return NO_ERROR;
152954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
153054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
153154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatus_t SurfaceFlinger::onTransact(
153254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
153354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
153454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    switch (code) {
153554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        case CREATE_CONNECTION:
153654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        case OPEN_GLOBAL_TRANSACTION:
153754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        case CLOSE_GLOBAL_TRANSACTION:
153854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        case SET_ORIENTATION:
153954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        case FREEZE_DISPLAY:
154054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        case UNFREEZE_DISPLAY:
154154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        case BOOT_FINISHED:
154254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        case REVOKE_GPU:
154354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        {
154454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            // codes that require permission check
154554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            IPCThreadState* ipc = IPCThreadState::self();
154654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            const int pid = ipc->getCallingPid();
154754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            const int self_pid = getpid();
154854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (UNLIKELY(pid != self_pid)) {
154954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                // we're called from a different process, do the real check
155054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                if (!checkCallingPermission(
155154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                        String16("android.permission.ACCESS_SURFACE_FLINGER")))
155254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                {
155354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    const int uid = ipc->getCallingUid();
155454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    LOGE("Permission Denial: "
155554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                            "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
155654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    return PERMISSION_DENIED;
155754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                }
155854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
155954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
156054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
156154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
156254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
156354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // HARDWARE_TEST stuff...
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (UNLIKELY(checkCallingPermission(
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String16("android.permission.HARDWARE_TEST")) == false))
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { // not allowed
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            LOGE("Permission Denial: pid=%d, uid=%d\n",
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    IPCThreadState::self()->getCallingPid(),
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    IPCThreadState::self()->getCallingUid());
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PERMISSION_DENIED;
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int n;
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (code) {
157554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            case 1000: // SHOW_CPU
157654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                n = data.readInt32();
157754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                mDebugCpu = n ? 1 : 0;
157854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                if (mDebugCpu) {
157954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    if (mCpuGauge == 0) {
158054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                        mCpuGauge = new CPUGauge(this, ms2ns(500));
158154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    }
158254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                } else {
158354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    if (mCpuGauge != 0) {
158454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                        mCpuGauge->requestExitAndWait();
158554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                        Mutex::Autolock _l(mDebugLock);
158654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                        mCpuGauge.clear();
158754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    }
158854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                }
158954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                return NO_ERROR;
159054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            case 1001:  // SHOW_FPS
159154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                n = data.readInt32();
159254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                mDebugFps = n ? 1 : 0;
159354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                return NO_ERROR;
159454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            case 1002:  // SHOW_UPDATES
159554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                n = data.readInt32();
159654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
159754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                return NO_ERROR;
159854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            case 1003:  // SHOW_BACKGROUND
159954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                n = data.readInt32();
160054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                mDebugBackground = n ? 1 : 0;
160154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                return NO_ERROR;
160254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            case 1004:{ // repaint everything
160354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                Mutex::Autolock _l(mStateLock);
160454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                const DisplayHardware& hw(graphicPlane(0).displayHardware());
160554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                mDirtyRegion.set(hw.bounds()); // careful that's not thread-safe
160654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                signalEvent();
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
160954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            case 1005: // ask GPU revoke
16100c6b5f6ec38b14add24c44360aa60d91ab61ff34Mathias Agopian                if (mGPU != 0) {
16110c6b5f6ec38b14add24c44360aa60d91ab61ff34Mathias Agopian                    mGPU->friendlyRevoke();
16120c6b5f6ec38b14add24c44360aa60d91ab61ff34Mathias Agopian                }
161354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                return NO_ERROR;
161454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            case 1006: // revoke GPU
16150c6b5f6ec38b14add24c44360aa60d91ab61ff34Mathias Agopian                if (mGPU != 0) {
16160c6b5f6ec38b14add24c44360aa60d91ab61ff34Mathias Agopian                    mGPU->unconditionalRevoke();
16170c6b5f6ec38b14add24c44360aa60d91ab61ff34Mathias Agopian                }
161854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                return NO_ERROR;
161954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            case 1007: // set mFreezeCount
162054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                mFreezeCount = data.readInt32();
162154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                return NO_ERROR;
162254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            case 1010:  // interrogate.
162354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                reply->writeInt32(mDebugCpu);
162454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                reply->writeInt32(0);
162554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                reply->writeInt32(mDebugRegion);
162654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                reply->writeInt32(mDebugBackground);
162754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                return NO_ERROR;
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 1013: {
162954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                Mutex::Autolock _l(mStateLock);
163054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                const DisplayHardware& hw(graphicPlane(0).displayHardware());
163154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                reply->writeInt32(hw.getPageFlipCount());
163254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
163354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            return NO_ERROR;
163454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
163554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
163654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return err;
163754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
163854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
163954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project// ---------------------------------------------------------------------------
164054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#if 0
164154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#pragma mark -
164254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#endif
164354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
164454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectClient::Client(ClientID clientID, const sp<SurfaceFlinger>& flinger)
164554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    : ctrlblk(0), cid(clientID), mPid(0), mBitmap(0), mFlinger(flinger)
164654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
1647f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    mSharedHeapAllocator = getSurfaceHeapManager()->createHeap();
164854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const int pgsize = getpagesize();
164954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const int cblksize=((sizeof(per_client_cblk_t)+(pgsize-1))&~(pgsize-1));
165054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mCblkHeap = new MemoryDealer(cblksize);
165154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mCblkMemory = mCblkHeap->allocate(cblksize);
165254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (mCblkMemory != 0) {
165354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        ctrlblk = static_cast<per_client_cblk_t *>(mCblkMemory->pointer());
165454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (ctrlblk) { // construct the shared structure in-place.
165554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            new(ctrlblk) per_client_cblk_t;
165654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
165754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
165854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
165954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
166054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectClient::~Client() {
166154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (ctrlblk) {
166254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const int pgsize = getpagesize();
166354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        ctrlblk->~per_client_cblk_t();  // destroy our shared-structure.
166454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
166554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
166654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
166754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectconst sp<SurfaceHeapManager>& Client::getSurfaceHeapManager() const {
166854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return mFlinger->getSurfaceHeapManager();
166954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
167054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
167154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectint32_t Client::generateId(int pid)
167254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
167354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const uint32_t i = clz( ~mBitmap );
167454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (i >= NUM_LAYERS_MAX) {
167554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return NO_MEMORY;
167654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
167754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mPid = pid;
167854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mInUse.add(uint8_t(i));
167954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mBitmap |= 1<<(31-i);
168054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return i;
168154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
168254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatus_t Client::bindLayer(LayerBaseClient* layer, int32_t id)
168354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
168454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    ssize_t idx = mInUse.indexOf(id);
168554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (idx < 0)
168654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return NAME_NOT_FOUND;
168754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return mLayers.insertAt(layer, idx);
168854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
168954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid Client::free(int32_t id)
169054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
169154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    ssize_t idx = mInUse.remove(uint8_t(id));
169254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (idx >= 0) {
169354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mBitmap &= ~(1<<(31-id));
169454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mLayers.removeItemsAt(idx);
169554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
169654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
169754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
1698f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Projectsp<MemoryDealer> Client::createAllocator(uint32_t flags)
169954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
170054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    sp<MemoryDealer> allocator;
1701f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project    allocator = getSurfaceHeapManager()->createHeap(
1702f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project            flags, getClientPid(), mSharedHeapAllocator);
170354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return allocator;
170454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
170554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
170654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectbool Client::isValid(int32_t i) const {
170754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return (uint32_t(i)<NUM_LAYERS_MAX) && (mBitmap & (1<<(31-i)));
170854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
170954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectconst uint8_t* Client::inUseArray() const {
171054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return mInUse.array();
171154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
171254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectsize_t Client::numActiveLayers() const {
171354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return mInUse.size();
171454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
171554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectLayerBaseClient* Client::getLayerUser(int32_t i) const {
171654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    ssize_t idx = mInUse.indexOf(uint8_t(i));
171754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (idx<0) return 0;
171854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return mLayers[idx];
171954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
172054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
172154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid Client::dump(const char* what)
172254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
172354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
172454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
172554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project// ---------------------------------------------------------------------------
172654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#if 0
172754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#pragma mark -
172854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#endif
172954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
173054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectBClient::BClient(SurfaceFlinger *flinger, ClientID cid, const sp<IMemory>& cblk)
173154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    : mId(cid), mFlinger(flinger), mCblk(cblk)
173254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
173354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
173454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
173554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectBClient::~BClient() {
173654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // destroy all resources attached to this client
173754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mFlinger->destroyConnection(mId);
173854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
173954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
174054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid BClient::getControlBlocks(sp<IMemory>* ctrl) const {
174154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    *ctrl = mCblk;
174254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
174354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
174454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectsp<ISurface> BClient::createSurface(
174554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        ISurfaceFlingerClient::surface_data_t* params, int pid,
174654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        DisplayID display, uint32_t w, uint32_t h, PixelFormat format,
174754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        uint32_t flags)
174854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
174954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return mFlinger->createSurface(mId, pid, params, display, w, h, format, flags);
175054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
175154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
175254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatus_t BClient::destroySurface(SurfaceID sid)
175354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
175454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    sid |= (mId << 16); // add the client-part to id
175554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return mFlinger->destroySurface(sid);
175654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
175754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
175854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatus_t BClient::setState(int32_t count, const layer_state_t* states)
175954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
176054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return mFlinger->setClientState(mId, count, states);
176154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
176254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
176354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project// ---------------------------------------------------------------------------
176454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
176554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectGraphicPlane::GraphicPlane()
176654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    : mHw(0)
176754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
176854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
176954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
177054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectGraphicPlane::~GraphicPlane() {
177154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    delete mHw;
177254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
177354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
177454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectbool GraphicPlane::initialized() const {
177554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return mHw ? true : false;
177654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
177754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
177854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid GraphicPlane::setDisplayHardware(DisplayHardware *hw) {
177954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mHw = hw;
178054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
178154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
178254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid GraphicPlane::setTransform(const Transform& tr) {
178354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mTransform = tr;
178454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mGlobalTransform = mOrientationTransform * mTransform;
178554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
178654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t GraphicPlane::orientationToTransfrom(
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int orientation, int w, int h, Transform* tr)
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
179054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    float a, b, c, d, x, y;
17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (orientation) {
17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case ISurfaceComposer::eOrientationDefault:
17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a=1; b=0; c=0; d=1; x=0; y=0;
17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case ISurfaceComposer::eOrientation90:
17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a=0; b=-1; c=1; d=0; x=w; y=0;
17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case ISurfaceComposer::eOrientation180:
17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a=-1; b=0; c=0; d=-1; x=w; y=h;
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case ISurfaceComposer::eOrientation270:
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a=0; b=1; c=-1; d=0; x=0; y=h;
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    default:
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return BAD_VALUE;
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    tr->set(a, b, c, d);
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    tr->set(x, y);
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NO_ERROR;
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
181154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t GraphicPlane::setOrientation(int orientation)
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
181454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const DisplayHardware& hw(displayHardware());
181554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const float w = hw.getWidth();
181654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const float h = hw.getHeight();
181754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
181854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (orientation == ISurfaceComposer::eOrientationDefault) {
181954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // make sure the default orientation is optimal
182054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mOrientationTransform.reset();
1821d2f34e5fd6c20854b45c76f2a514fb8864277ea2Mathias Agopian        mOrientation = orientation;
182254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        mGlobalTransform = mTransform;
182354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return NO_ERROR;
182454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
182554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
182654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // If the rotation can be handled in hardware, this is where
182754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // the magic should happen.
18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (UNLIKELY(orientation == 42)) {
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float a, b, c, d, x, y;
183054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const float r = (3.14159265f / 180.0f) * 42.0f;
183154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const float si = sinf(r);
183254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const float co = cosf(r);
183354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        a=co; b=-si; c=si; d=co;
183454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        x = si*(h*0.5f) + (1-co)*(w*0.5f);
183554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        y =-si*(w*0.5f) + (1-co)*(h*0.5f);
18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOrientationTransform.set(a, b, c, d);
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOrientationTransform.set(x, y);
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GraphicPlane::orientationToTransfrom(orientation, w, h,
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                &mOrientationTransform);
184154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
1842d2f34e5fd6c20854b45c76f2a514fb8864277ea2Mathias Agopian    mOrientation = orientation;
184354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    mGlobalTransform = mOrientationTransform * mTransform;
184454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return NO_ERROR;
184554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
184654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
184754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectconst DisplayHardware& GraphicPlane::displayHardware() const {
184854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return *mHw;
184954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
185054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
185154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectconst Transform& GraphicPlane::transform() const {
185254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return mGlobalTransform;
185354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
185454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
185554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project// ---------------------------------------------------------------------------
185654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
185754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}; // namespace android
1858