1e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian/* 2e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * Copyright (C) 2007 The Android Open Source Project 3e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * 4e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 5e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * you may not use this file except in compliance with the License. 6e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * You may obtain a copy of the License at 7e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * 8e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 9e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * 10e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * Unless required by applicable law or agreed to in writing, software 11e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 12e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * See the License for the specific language governing permissions and 14e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * limitations under the License. 15e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian */ 16e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 17e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#define LOG_TAG "SurfaceControl" 18e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 19e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <stdint.h> 20e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <errno.h> 21e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <sys/types.h> 22e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <sys/stat.h> 23e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 24e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <android/native_window.h> 25e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 26e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <utils/Errors.h> 27e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <utils/Log.h> 28e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <utils/threads.h> 29e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 30e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <binder/IPCThreadState.h> 31e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 32e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <ui/DisplayInfo.h> 33e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <ui/GraphicBuffer.h> 34e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <ui/Rect.h> 35e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 361b3a9acb77ee12568fa19740d8eeab165a0dcd98Chong Zhang#include <gui/BufferQueueCore.h> 37e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/ISurfaceComposer.h> 38e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/Surface.h> 39e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/SurfaceComposerClient.h> 40e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/SurfaceControl.h> 41e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 42e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopiannamespace android { 43e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 44e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian// ============================================================================ 45e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian// SurfaceControl 46e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian// ============================================================================ 47e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 48e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias AgopianSurfaceControl::SurfaceControl( 4983cafffeac037ab2f9d00f98f8d2f3da8fc9b857Jesse Hall const sp<SurfaceComposerClient>& client, 504d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian const sp<IBinder>& handle, 514d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian const sp<IGraphicBufferProducer>& gbp) 524d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian : mClient(client), mHandle(handle), mGraphicBufferProducer(gbp) 53e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 54e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 5583cafffeac037ab2f9d00f98f8d2f3da8fc9b857Jesse Hall 56e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias AgopianSurfaceControl::~SurfaceControl() 57e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 58e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian destroy(); 59e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 60e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 61e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianvoid SurfaceControl::destroy() 62e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 63e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (isValid()) { 644d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mClient->destroySurface(mHandle); 65e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 66e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // clear all references and trigger an IPC now, to make sure things 67e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // happen without delay, since these resources are quite heavy. 68e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mClient.clear(); 694d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mHandle.clear(); 70e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mGraphicBufferProducer.clear(); 71e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian IPCThreadState::self()->flushCommands(); 72e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 73e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 7483cafffeac037ab2f9d00f98f8d2f3da8fc9b857Jesse Hallvoid SurfaceControl::clear() 75e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 76e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // here, the window manager tells us explicitly that we should destroy 77e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // the surface's resource. Soon after this call, it will also release 78e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // its last reference (which will call the dtor); however, it is possible 79e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // that a client living in the same process still holds references which 80e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // would delay the call to the dtor -- that is why we need this explicit 81e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // "clear()" call. 82e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian destroy(); 83e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 84e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 851b3a9acb77ee12568fa19740d8eeab165a0dcd98Chong Zhangvoid SurfaceControl::disconnect() { 861b3a9acb77ee12568fa19740d8eeab165a0dcd98Chong Zhang if (mGraphicBufferProducer != NULL) { 871b3a9acb77ee12568fa19740d8eeab165a0dcd98Chong Zhang mGraphicBufferProducer->disconnect( 881b3a9acb77ee12568fa19740d8eeab165a0dcd98Chong Zhang BufferQueueCore::CURRENTLY_CONNECTED_API); 891b3a9acb77ee12568fa19740d8eeab165a0dcd98Chong Zhang } 901b3a9acb77ee12568fa19740d8eeab165a0dcd98Chong Zhang} 911b3a9acb77ee12568fa19740d8eeab165a0dcd98Chong Zhang 92e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianbool SurfaceControl::isSameSurface( 9383cafffeac037ab2f9d00f98f8d2f3da8fc9b857Jesse Hall const sp<SurfaceControl>& lhs, const sp<SurfaceControl>& rhs) 94e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 95e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (lhs == 0 || rhs == 0) 96e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return false; 974d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian return lhs->mHandle == rhs->mHandle; 98e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 99e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 100d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stozastatus_t SurfaceControl::setLayerStack(uint32_t layerStack) { 101e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = validate(); 102e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err < 0) return err; 1033b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza return mClient->setLayerStack(mHandle, layerStack); 104e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 105d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stozastatus_t SurfaceControl::setLayer(uint32_t layer) { 106e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = validate(); 107e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err < 0) return err; 1083b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza return mClient->setLayer(mHandle, layer); 109e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 110d6480c020b050c777ec1db2dd9c16fccfc47b47bRamanan Rajeswaranstatus_t SurfaceControl::setPosition(float x, float y) { 111e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = validate(); 112e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err < 0) return err; 1133b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza return mClient->setPosition(mHandle, x, y); 114e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 11599e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carrstatus_t SurfaceControl::setGeometryAppliesWithResize() { 11682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr status_t err = validate(); 11782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr if (err < 0) return err; 11899e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr return mClient->setGeometryAppliesWithResize(mHandle); 11982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr} 120e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::setSize(uint32_t w, uint32_t h) { 121e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = validate(); 122e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err < 0) return err; 1233b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza return mClient->setSize(mHandle, w, h); 124e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 125e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::hide() { 126e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = validate(); 127e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err < 0) return err; 1283b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza return mClient->hide(mHandle); 129e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 130e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::show() { 131e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = validate(); 132e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err < 0) return err; 1333b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza return mClient->show(mHandle); 134e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 135e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::setFlags(uint32_t flags, uint32_t mask) { 136e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = validate(); 137e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err < 0) return err; 1383b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza return mClient->setFlags(mHandle, flags, mask); 139e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 140e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::setTransparentRegionHint(const Region& transparent) { 141e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = validate(); 142e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err < 0) return err; 1433b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza return mClient->setTransparentRegionHint(mHandle, transparent); 144e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 145e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::setAlpha(float alpha) { 146e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = validate(); 147e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err < 0) return err; 1483b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza return mClient->setAlpha(mHandle, alpha); 149e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 150e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::setMatrix(float dsdx, float dtdx, float dsdy, float dtdy) { 151e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = validate(); 152e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err < 0) return err; 1533b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza return mClient->setMatrix(mHandle, dsdx, dtdx, dsdy, dtdy); 154e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 155e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::setCrop(const Rect& crop) { 156e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = validate(); 157e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err < 0) return err; 1583b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza return mClient->setCrop(mHandle, crop); 159e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 160acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosstatus_t SurfaceControl::setFinalCrop(const Rect& crop) { 161acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos status_t err = validate(); 162acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (err < 0) return err; 163acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos return mClient->setFinalCrop(mHandle, crop); 164acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos} 165e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 1667dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozastatus_t SurfaceControl::deferTransactionUntil(sp<IBinder> handle, 1677dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza uint64_t frameNumber) { 1687dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza status_t err = validate(); 1697dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (err < 0) return err; 1707dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return mClient->deferTransactionUntil(mHandle, handle, frameNumber); 1717dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 1727dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 173c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carrstatus_t SurfaceControl::setOverrideScalingMode(int32_t overrideScalingMode) { 174c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr status_t err = validate(); 175c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr if (err < 0) return err; 176c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return mClient->setOverrideScalingMode(mHandle, overrideScalingMode); 177c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr} 178c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr 179d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavstatus_t SurfaceControl::clearLayerFrameStats() const { 180d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav status_t err = validate(); 181d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav if (err < 0) return err; 182d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav const sp<SurfaceComposerClient>& client(mClient); 183d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return client->clearLayerFrameStats(mHandle); 184d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav} 185d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 186d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavstatus_t SurfaceControl::getLayerFrameStats(FrameStats* outStats) const { 187d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav status_t err = validate(); 188d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav if (err < 0) return err; 189d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav const sp<SurfaceComposerClient>& client(mClient); 190d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return client->getLayerFrameStats(mHandle, outStats); 191d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav} 192d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 193367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carrstatus_t SurfaceControl::getTransformToDisplayInverse(bool* outTransformToDisplayInverse) const { 194367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr status_t err = validate(); 195367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr if (err < 0) return err; 196367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr const sp<SurfaceComposerClient>& client(mClient); 197367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr return client->getTransformToDisplayInverse(mHandle, outTransformToDisplayInverse); 198367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr} 199367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr 200e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::validate() const 201e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 2024d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian if (mHandle==0 || mClient==0) { 2034d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian ALOGE("invalid handle (%p) or client (%p)", 2044d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mHandle.get(), mClient.get()); 205e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_INIT; 206e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 207e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 208e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 209e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 210e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::writeSurfaceToParcel( 211e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const sp<SurfaceControl>& control, Parcel* parcel) 212e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 213e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian sp<IGraphicBufferProducer> bp; 214e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (control != NULL) { 215e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian bp = control->mGraphicBufferProducer; 216e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 2172ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen return parcel->writeStrongBinder(IInterface::asBinder(bp)); 218e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 219e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 220e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopiansp<Surface> SurfaceControl::getSurface() const 221e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 222e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock _l(mLock); 223e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (mSurfaceData == 0) { 22483cafffeac037ab2f9d00f98f8d2f3da8fc9b857Jesse Hall // This surface is always consumed by SurfaceFlinger, so the 22583cafffeac037ab2f9d00f98f8d2f3da8fc9b857Jesse Hall // producerControlledByApp value doesn't matter; using false. 22683cafffeac037ab2f9d00f98f8d2f3da8fc9b857Jesse Hall mSurfaceData = new Surface(mGraphicBufferProducer, false); 227e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 228e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return mSurfaceData; 229e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 230e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 2317dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozasp<IBinder> SurfaceControl::getHandle() const 2327dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza{ 2337dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza Mutex::Autolock lock(mLock); 2347dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return mHandle; 2357dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 2367dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 237e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian// ---------------------------------------------------------------------------- 238e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian}; // namespace android 239