SurfaceControl.cpp revision 3b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0
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 36e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/ISurfaceComposer.h> 37e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/Surface.h> 38e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/SurfaceComposerClient.h> 39e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/SurfaceControl.h> 40e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 41e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopiannamespace android { 42e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 43e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian// ============================================================================ 44e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian// SurfaceControl 45e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian// ============================================================================ 46e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 47e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias AgopianSurfaceControl::SurfaceControl( 4883cafffeac037ab2f9d00f98f8d2f3da8fc9b857Jesse Hall const sp<SurfaceComposerClient>& client, 494d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian const sp<IBinder>& handle, 504d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian const sp<IGraphicBufferProducer>& gbp) 514d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian : mClient(client), mHandle(handle), mGraphicBufferProducer(gbp) 52e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 53e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 5483cafffeac037ab2f9d00f98f8d2f3da8fc9b857Jesse Hall 55e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias AgopianSurfaceControl::~SurfaceControl() 56e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 57e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian destroy(); 58e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 59e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 60e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianvoid SurfaceControl::destroy() 61e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 62e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (isValid()) { 634d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mClient->destroySurface(mHandle); 64e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 65e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // clear all references and trigger an IPC now, to make sure things 66e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // happen without delay, since these resources are quite heavy. 67e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mClient.clear(); 684d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mHandle.clear(); 69e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mGraphicBufferProducer.clear(); 70e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian IPCThreadState::self()->flushCommands(); 71e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 72e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 7383cafffeac037ab2f9d00f98f8d2f3da8fc9b857Jesse Hallvoid SurfaceControl::clear() 74e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 75e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // here, the window manager tells us explicitly that we should destroy 76e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // the surface's resource. Soon after this call, it will also release 77e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // its last reference (which will call the dtor); however, it is possible 78e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // that a client living in the same process still holds references which 79e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // would delay the call to the dtor -- that is why we need this explicit 80e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // "clear()" call. 81e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian destroy(); 82e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 83e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 84e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianbool SurfaceControl::isSameSurface( 8583cafffeac037ab2f9d00f98f8d2f3da8fc9b857Jesse Hall const sp<SurfaceControl>& lhs, const sp<SurfaceControl>& rhs) 86e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 87e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (lhs == 0 || rhs == 0) 88e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return false; 894d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian return lhs->mHandle == rhs->mHandle; 90e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 91e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 92e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::setLayerStack(int32_t layerStack) { 93e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = validate(); 94e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err < 0) return err; 953b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza return mClient->setLayerStack(mHandle, layerStack); 96e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 97e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::setLayer(int32_t layer) { 98e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = validate(); 99e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err < 0) return err; 1003b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza return mClient->setLayer(mHandle, layer); 101e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 102d6480c020b050c777ec1db2dd9c16fccfc47b47bRamanan Rajeswaranstatus_t SurfaceControl::setPosition(float x, float y) { 103e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = validate(); 104e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err < 0) return err; 1053b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza return mClient->setPosition(mHandle, x, y); 106e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 107e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::setSize(uint32_t w, uint32_t h) { 108e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = validate(); 109e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err < 0) return err; 1103b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza return mClient->setSize(mHandle, w, h); 111e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 112e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::hide() { 113e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = validate(); 114e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err < 0) return err; 1153b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza return mClient->hide(mHandle); 116e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 117e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::show() { 118e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = validate(); 119e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err < 0) return err; 1203b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza return mClient->show(mHandle); 121e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 122e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::setFlags(uint32_t flags, uint32_t mask) { 123e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = validate(); 124e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err < 0) return err; 1253b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza return mClient->setFlags(mHandle, flags, mask); 126e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 127e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::setTransparentRegionHint(const Region& transparent) { 128e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = validate(); 129e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err < 0) return err; 1303b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza return mClient->setTransparentRegionHint(mHandle, transparent); 131e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 132e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::setAlpha(float alpha) { 133e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = validate(); 134e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err < 0) return err; 1353b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza return mClient->setAlpha(mHandle, alpha); 136e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 137e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::setMatrix(float dsdx, float dtdx, float dsdy, float dtdy) { 138e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = validate(); 139e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err < 0) return err; 1403b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza return mClient->setMatrix(mHandle, dsdx, dtdx, dsdy, dtdy); 141e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 142e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::setCrop(const Rect& crop) { 143e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = validate(); 144e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err < 0) return err; 1453b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza return mClient->setCrop(mHandle, crop); 146e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 147e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 148e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::validate() const 149e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 1504d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian if (mHandle==0 || mClient==0) { 1514d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian ALOGE("invalid handle (%p) or client (%p)", 1524d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mHandle.get(), mClient.get()); 153e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_INIT; 154e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 155e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 156e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 157e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 158e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::writeSurfaceToParcel( 159e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const sp<SurfaceControl>& control, Parcel* parcel) 160e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 161e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian sp<IGraphicBufferProducer> bp; 162e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (control != NULL) { 163e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian bp = control->mGraphicBufferProducer; 164e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 165e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return parcel->writeStrongBinder(bp->asBinder()); 166e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 167e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 168e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopiansp<Surface> SurfaceControl::getSurface() const 169e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 170e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock _l(mLock); 171e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (mSurfaceData == 0) { 17283cafffeac037ab2f9d00f98f8d2f3da8fc9b857Jesse Hall // This surface is always consumed by SurfaceFlinger, so the 17383cafffeac037ab2f9d00f98f8d2f3da8fc9b857Jesse Hall // producerControlledByApp value doesn't matter; using false. 17483cafffeac037ab2f9d00f98f8d2f3da8fc9b857Jesse Hall mSurfaceData = new Surface(mGraphicBufferProducer, false); 175e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 176e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return mSurfaceData; 177e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 178e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 179e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian// ---------------------------------------------------------------------------- 180e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian}; // namespace android 181