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