Surface.cpp revision edbf3b6af777b721cd2a1ef461947e51e88241e1
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define LOG_TAG "Surface"
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h>
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <unistd.h>
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <fcntl.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <errno.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/stat.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Atomic.h>
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h>
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/threads.h>
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/IPCThreadState.h>
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/IMemory.h>
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h>
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/ISurface.h>
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/Surface.h>
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/SurfaceComposerClient.h>
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/Rect.h>
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <private/ui/SharedState.h>
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <private/ui/LayerState.h>
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectSurface::Surface(const sp<SurfaceComposerClient>& client,
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const sp<ISurface>& surface,
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const ISurfaceFlingerClient::surface_data_t& data,
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        bool owner)
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : mClient(client), mSurface(surface),
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      mToken(data.token), mIdentity(data.identity),
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      mFormat(format), mFlags(flags), mOwner(owner)
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mSwapRectangle.makeInvalid();
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mSurfaceHeapBase[0] = 0;
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mSurfaceHeapBase[1] = 0;
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mHeap[0] = data.heap[0];
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mHeap[1] = data.heap[1];
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectSurface::Surface(Surface const* rhs)
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : mOwner(false)
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mToken   = rhs->mToken;
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mIdentity= rhs->mIdentity;
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mClient  = rhs->mClient;
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mSurface = rhs->mSurface;
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mHeap[0] = rhs->mHeap[0];
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mHeap[1] = rhs->mHeap[1];
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mFormat  = rhs->mFormat;
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mFlags   = rhs->mFlags;
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mSurfaceHeapBase[0] = rhs->mSurfaceHeapBase[0];
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mSurfaceHeapBase[1] = rhs->mSurfaceHeapBase[1];
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mSwapRectangle.makeInvalid();
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectSurface::~Surface()
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mOwner && mToken>=0 && mClient!=0) {
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mClient->destroySurface(mToken);
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mClient.clear();
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mSurface.clear();
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mHeap[0].clear();
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mHeap[1].clear();
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    IPCThreadState::self()->flushCommands();
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectsp<Surface> Surface::dup() const
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Surface const * r = this;
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (this && mOwner) {
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // the only reason we need to do this is because of Java's garbage
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // collector: because we're creating a copy of the Surface
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // instead of a reference, we can garantee that when our last
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // reference goes away, the real surface will be deleted.
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Without this hack (the code is correct too), we'd have to
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // wait for a GC for the surface to go away.
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        r = new Surface(this);
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return const_cast<Surface*>(r);
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t Surface::nextBuffer(SurfaceInfo* info) {
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mClient->nextBuffer(this, info);
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t Surface::lock(SurfaceInfo* info, bool blocking) {
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return Surface::lock(info, NULL, blocking);
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t Surface::lock(SurfaceInfo* info, Region* dirty, bool blocking) {
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (heapBase(0) == 0) return INVALID_OPERATION;
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (heapBase(1) == 0) return INVALID_OPERATION;
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mClient->lockSurface(this, info, dirty, blocking);
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t Surface::unlockAndPost() {
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (heapBase(0) == 0) return INVALID_OPERATION;
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (heapBase(1) == 0) return INVALID_OPERATION;
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mClient->unlockAndPostSurface(this);
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t Surface::unlock() {
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (heapBase(0) == 0) return INVALID_OPERATION;
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (heapBase(1) == 0) return INVALID_OPERATION;
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mClient->unlockSurface(this);
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t Surface::setLayer(int32_t layer) {
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mClient->setLayer(this, layer);
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t Surface::setPosition(int32_t x, int32_t y) {
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mClient->setPosition(this, x, y);
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t Surface::setSize(uint32_t w, uint32_t h) {
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mClient->setSize(this, w, h);
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t Surface::hide() {
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mClient->hide(this);
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t Surface::show(int32_t layer) {
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mClient->show(this, layer);
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t Surface::freeze() {
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mClient->freeze(this);
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t Surface::unfreeze() {
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mClient->unfreeze(this);
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t Surface::setFlags(uint32_t flags, uint32_t mask) {
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mClient->setFlags(this, flags, mask);
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t Surface::setTransparentRegionHint(const Region& transparent) {
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mClient->setTransparentRegionHint(this, transparent);
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t Surface::setAlpha(float alpha) {
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mClient->setAlpha(this, alpha);
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t Surface::setMatrix(float dsdx, float dtdx, float dsdy, float dtdy) {
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mClient->setMatrix(this, dsdx, dtdx, dsdy, dtdy);
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t Surface::setFreezeTint(uint32_t tint) {
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mClient->setFreezeTint(this, tint);
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion Surface::dirtyRegion() const  {
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mDirtyRegion;
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid Surface::setDirtyRegion(const Region& region) const {
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mDirtyRegion = region;
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst Rect& Surface::swapRectangle() const {
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mSwapRectangle;
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid Surface::setSwapRectangle(const Rect& r) {
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mSwapRectangle = r;
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectsp<Surface> Surface::readFromParcel(Parcel* parcel)
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    sp<SurfaceComposerClient> client;
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ISurfaceFlingerClient::surface_data_t data;
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    sp<IBinder> clientBinder= parcel->readStrongBinder();
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    sp<ISurface> surface    = interface_cast<ISurface>(parcel->readStrongBinder());
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    data.heap[0]            = interface_cast<IMemoryHeap>(parcel->readStrongBinder());
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    data.heap[1]            = interface_cast<IMemoryHeap>(parcel->readStrongBinder());
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    data.token              = parcel->readInt32();
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    data.identity           = parcel->readInt32();
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    PixelFormat format      = parcel->readInt32();
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t flags          = parcel->readInt32();
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (clientBinder != NULL)
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        client = SurfaceComposerClient::clientForConnection(clientBinder);
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return new Surface(client, surface, data, 0, 0, format, flags, false);
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t Surface::writeToParcel(const sp<Surface>& surface, Parcel* parcel)
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t flags=0;
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t format=0;
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    SurfaceID token = -1;
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t identity = 0;
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    sp<SurfaceComposerClient> client;
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    sp<ISurface> sur;
207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    sp<IMemoryHeap> heap[2];
208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (surface->isValid()) {
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        token = surface->mToken;
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        identity = surface->mIdentity;
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        client = surface->mClient;
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        sur = surface->mSurface;
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        heap[0] = surface->mHeap[0];
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        heap[1] = surface->mHeap[1];
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        format = surface->mFormat;
216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        flags = surface->mFlags;
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    parcel->writeStrongBinder(client!=0  ? client->connection() : NULL);
219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    parcel->writeStrongBinder(sur!=0     ? sur->asBinder()      : NULL);
220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    parcel->writeStrongBinder(heap[0]!=0 ? heap[0]->asBinder()  : NULL);
221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    parcel->writeStrongBinder(heap[1]!=0 ? heap[1]->asBinder()  : NULL);
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    parcel->writeInt32(token);
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    parcel->writeInt32(identity);
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    parcel->writeInt32(format);
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    parcel->writeInt32(flags);
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NO_ERROR;
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool Surface::isSameSurface(const sp<Surface>& lhs, const sp<Surface>& rhs)
230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (lhs == 0 || rhs == 0)
232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return lhs->mSurface->asBinder() == rhs->mSurface->asBinder();
234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid* Surface::heapBase(int i) const
237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void* heapBase = mSurfaceHeapBase[i];
239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // map lazily so it doesn't get mapped in clients that don't need it
240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (heapBase == 0) {
241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const sp<IMemoryHeap>& heap(mHeap[i]);
242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (heap != 0) {
243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            heapBase = static_cast<uint8_t*>(heap->base());
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (heapBase == MAP_FAILED) {
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                heapBase = NULL;
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                LOGE("Couldn't map Surface's heap (binder=%p, heap=%p)",
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        heap->asBinder().get(), heap.get());
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            mSurfaceHeapBase[i] = heapBase;
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return heapBase;
253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
257