SurfaceComposerClient.cpp revision 3ca76f416bc8665a97636ca8a2d0128b9da9d92c
1ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/* 2ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Copyright (C) 2007 The Android Open Source Project 3a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * 4ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 5ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * you may not use this file except in compliance with the License. 6ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * You may obtain a copy of the License at 7ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * 8ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * http://www.apache.org/licenses/LICENSE-2.0 9ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * 10ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Unless required by applicable law or agreed to in writing, software 11ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * distributed under the License is distributed on an "AS IS" BASIS, 12ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * See the License for the specific language governing permissions and 14ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * limitations under the License. 15ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson */ 16ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 17ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define LOG_TAG "SurfaceComposerClient" 18ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 19ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <stdint.h> 20ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <sys/types.h> 21ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 22ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <utils/Errors.h> 23a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#include <utils/Log.h> 24a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#include <utils/Singleton.h> 25ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <utils/SortedVector.h> 26ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <utils/String8.h> 27ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <utils/threads.h> 28ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 29ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <binder/IMemory.h> 30ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <binder/IServiceManager.h> 31ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 32ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <ui/DisplayInfo.h> 33ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 34ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <gui/CpuConsumer.h> 35ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <gui/IGraphicBufferProducer.h> 36a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#include <gui/ISurfaceComposer.h> 37a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#include <gui/ISurfaceComposerClient.h> 38a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#include <gui/SurfaceComposerClient.h> 39a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 40a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#include <private/gui/ComposerService.h> 41a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#include <private/gui/LayerState.h> 42a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 43ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonnamespace android { 44ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson// --------------------------------------------------------------------------- 45ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 46ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon WilsonANDROID_SINGLETON_STATIC_INSTANCE(ComposerService); 47ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 48ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon WilsonComposerService::ComposerService() 49a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson: Singleton<ComposerService>() { 50ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson Mutex::Autolock _l(mLock); 51ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson connectLocked(); 52ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 53ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 54ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid ComposerService::connectLocked() { 55ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const String16 name("SurfaceFlinger"); 56ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson while (getService(name, &mComposerService) != NO_ERROR) { 57a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson usleep(250000); 58ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 59ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson assert(mComposerService != NULL); 60ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 61ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // Create the death listener. 62ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson class DeathObserver : public IBinder::DeathRecipient { 63ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ComposerService& mComposerService; 64ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson virtual void binderDied(const wp<IBinder>& who) { 65ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGW("ComposerService remote (surfaceflinger) died [%p]", 66ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson who.unsafe_get()); 67ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mComposerService.composerServiceDied(); 68ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 69ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson public: 70ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson DeathObserver(ComposerService& mgr) : mComposerService(mgr) { } 71ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson }; 72ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 73ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mDeathObserver = new DeathObserver(*const_cast<ComposerService*>(this)); 74ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mComposerService->asBinder()->linkToDeath(mDeathObserver); 75ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 76ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 77ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/*static*/ sp<ISurfaceComposer> ComposerService::getComposerService() { 78ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ComposerService& instance = ComposerService::getInstance(); 79ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson Mutex::Autolock _l(instance.mLock); 80ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (instance.mComposerService == NULL) { 81ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ComposerService::getInstance().connectLocked(); 82ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson assert(instance.mComposerService != NULL); 83ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGD("ComposerService reconnected"); 84ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 85ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return instance.mComposerService; 86ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 87ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 88ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid ComposerService::composerServiceDied() 89ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 90ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson Mutex::Autolock _l(mLock); 91ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mComposerService = NULL; 92ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mDeathObserver = NULL; 93ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 94ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 95ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson// --------------------------------------------------------------------------- 96ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 97ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic inline 98ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint compare_type(const ComposerState& lhs, const ComposerState& rhs) { 99ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (lhs.client < rhs.client) return -1; 100ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (lhs.client > rhs.client) return 1; 101ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (lhs.state.surface < rhs.state.surface) return -1; 102ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (lhs.state.surface > rhs.state.surface) return 1; 103ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return 0; 104ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 105ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 106ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic inline 107ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint compare_type(const DisplayState& lhs, const DisplayState& rhs) { 108a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return compare_type(lhs.token, rhs.token); 109a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 110a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 111a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonclass Composer : public Singleton<Composer> 112ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 113ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson friend class Singleton<Composer>; 114ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 115ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mutable Mutex mLock; 116ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson SortedVector<ComposerState> mComposerStates; 117ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson SortedVector<DisplayState > mDisplayStates; 118ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson uint32_t mForceSynchronous; 119ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson uint32_t mTransactionNestCount; 120ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson bool mAnimation; 121ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 122ab05b00fefd34a761dfaf1ccaf8ad14d325873f4radhakrishna Composer() : Singleton<Composer>(), 123ab05b00fefd34a761dfaf1ccaf8ad14d325873f4radhakrishna mForceSynchronous(0), mTransactionNestCount(0), 124ab05b00fefd34a761dfaf1ccaf8ad14d325873f4radhakrishna mAnimation(false) 125ab05b00fefd34a761dfaf1ccaf8ad14d325873f4radhakrishna { } 126ab05b00fefd34a761dfaf1ccaf8ad14d325873f4radhakrishna 127ab05b00fefd34a761dfaf1ccaf8ad14d325873f4radhakrishna void openGlobalTransactionImpl(); 128ab05b00fefd34a761dfaf1ccaf8ad14d325873f4radhakrishna void closeGlobalTransactionImpl(bool synchronous); 129ab05b00fefd34a761dfaf1ccaf8ad14d325873f4radhakrishna void setAnimationTransactionImpl(); 130ab05b00fefd34a761dfaf1ccaf8ad14d325873f4radhakrishna 131ab05b00fefd34a761dfaf1ccaf8ad14d325873f4radhakrishna layer_state_t* getLayerStateLocked( 132ab05b00fefd34a761dfaf1ccaf8ad14d325873f4radhakrishna const sp<SurfaceComposerClient>& client, const sp<IBinder>& id); 133ab05b00fefd34a761dfaf1ccaf8ad14d325873f4radhakrishna 134ab05b00fefd34a761dfaf1ccaf8ad14d325873f4radhakrishna DisplayState& getDisplayStateLocked(const sp<IBinder>& token); 135ab05b00fefd34a761dfaf1ccaf8ad14d325873f4radhakrishna 136ab05b00fefd34a761dfaf1ccaf8ad14d325873f4radhakrishnapublic: 137ab05b00fefd34a761dfaf1ccaf8ad14d325873f4radhakrishna sp<IBinder> createDisplay(const String8& displayName, bool secure); 138ab05b00fefd34a761dfaf1ccaf8ad14d325873f4radhakrishna sp<IBinder> getBuiltInDisplay(int32_t id); 139ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 140ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson status_t setPosition(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 141ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson float x, float y); 142ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson status_t setSize(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 143ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson uint32_t w, uint32_t h); 144ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson status_t setLayer(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 145ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int32_t z); 146ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson status_t setFlags(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 147ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson uint32_t flags, uint32_t mask); 148ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson status_t setTransparentRegionHint( 1494a84a77c6de89fc12b727bf41661aa2314dfba8fSaurabh Shah const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 150ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const Region& transparentRegion); 15174e109a6891def0f55250476bc28aa2098027606Saurabh Shah status_t setAlpha(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 15274e109a6891def0f55250476bc28aa2098027606Saurabh Shah float alpha); 153ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson status_t setMatrix(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 154ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson float dsdx, float dtdx, float dsdy, float dtdy); 155ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson status_t setOrientation(int orientation); 156ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson status_t setCrop(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 157ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const Rect& crop); 158ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson status_t setLayerStack(const sp<SurfaceComposerClient>& client, 159ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const sp<IBinder>& id, uint32_t layerStack); 160ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 161ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson void setDisplaySurface(const sp<IBinder>& token, 162ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const sp<IGraphicBufferProducer>& bufferProducer); 163ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson void setDisplayLayerStack(const sp<IBinder>& token, uint32_t layerStack); 164ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson void setDisplayProjection(const sp<IBinder>& token, 165ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson uint32_t orientation, 166ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const Rect& layerStackRect, 167ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const Rect& displayRect); 168ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 169ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson static void setAnimationTransaction() { 170ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson Composer::getInstance().setAnimationTransactionImpl(); 171ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 172b1ea812a6fe4cd723291c2cd226ed5f26e38f8d9Sravan Kumar D.V.N 173b1ea812a6fe4cd723291c2cd226ed5f26e38f8d9Sravan Kumar D.V.N static void openGlobalTransaction() { 174b1ea812a6fe4cd723291c2cd226ed5f26e38f8d9Sravan Kumar D.V.N Composer::getInstance().openGlobalTransactionImpl(); 175b1ea812a6fe4cd723291c2cd226ed5f26e38f8d9Sravan Kumar D.V.N } 176ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 177ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson static void closeGlobalTransaction(bool synchronous) { 178ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson Composer::getInstance().closeGlobalTransactionImpl(synchronous); 179ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 180ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}; 181ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 182ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon WilsonANDROID_SINGLETON_STATIC_INSTANCE(Composer); 183ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 184ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson// --------------------------------------------------------------------------- 185ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 186ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonsp<IBinder> Composer::createDisplay(const String8& displayName, bool secure) { 187ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return ComposerService::getComposerService()->createDisplay(displayName, 188ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson secure); 189ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 190ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 191ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonsp<IBinder> Composer::getBuiltInDisplay(int32_t id) { 192ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return ComposerService::getComposerService()->getBuiltInDisplay(id); 193ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 194ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 195ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid Composer::openGlobalTransactionImpl() { 196ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson { // scope for the lock 197ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson Mutex::Autolock _l(mLock); 198ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mTransactionNestCount += 1; 199ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 200ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 201ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 202ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid Composer::closeGlobalTransactionImpl(bool synchronous) { 203ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson sp<ISurfaceComposer> sm(ComposerService::getComposerService()); 204ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 205ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson Vector<ComposerState> transaction; 206ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson Vector<DisplayState> displayTransaction; 207ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson uint32_t flags = 0; 208ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 209ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson { // scope for the lock 210ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson Mutex::Autolock _l(mLock); 211ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mForceSynchronous |= synchronous; 212ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (!mTransactionNestCount) { 213ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGW("At least one call to closeGlobalTransaction() was not matched by a prior " 214ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson "call to openGlobalTransaction()."); 215ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } else if (--mTransactionNestCount) { 216ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return; 217ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 218ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 219ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson transaction = mComposerStates; 220ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mComposerStates.clear(); 221a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 222ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson displayTransaction = mDisplayStates; 223a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson mDisplayStates.clear(); 224ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 225ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (mForceSynchronous) { 226ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson flags |= ISurfaceComposer::eSynchronous; 227ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 228ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (mAnimation) { 229ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson flags |= ISurfaceComposer::eAnimation; 230ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 231ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 232ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mForceSynchronous = false; 233ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mAnimation = false; 234ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 235ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 236ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson sm->setTransactionState(transaction, displayTransaction, flags); 237ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 238ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 239ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid Composer::setAnimationTransactionImpl() { 240ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson Mutex::Autolock _l(mLock); 241ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mAnimation = true; 242ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 243ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 244ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonlayer_state_t* Composer::getLayerStateLocked( 245ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const sp<SurfaceComposerClient>& client, const sp<IBinder>& id) { 246ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 247ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ComposerState s; 248ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson s.client = client->mClient; 249ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson s.state.surface = id; 250ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 251ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ssize_t index = mComposerStates.indexOf(s); 252ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (index < 0) { 253ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // we don't have it, add an initialized layer_state to our list 254ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson index = mComposerStates.add(s); 255ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 256ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 257ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ComposerState* const out = mComposerStates.editArray(); 258ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return &(out[index].state); 259ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 260ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 261ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatus_t Composer::setPosition(const sp<SurfaceComposerClient>& client, 262ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const sp<IBinder>& id, float x, float y) { 263ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson Mutex::Autolock _l(mLock); 264ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson layer_state_t* s = getLayerStateLocked(client, id); 265ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (!s) 266ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return BAD_INDEX; 267ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson s->what |= layer_state_t::ePositionChanged; 268ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson s->x = x; 269ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson s->y = y; 270ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return NO_ERROR; 271ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 272ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 273ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatus_t Composer::setSize(const sp<SurfaceComposerClient>& client, 274ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const sp<IBinder>& id, uint32_t w, uint32_t h) { 275ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson Mutex::Autolock _l(mLock); 276ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson layer_state_t* s = getLayerStateLocked(client, id); 277ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (!s) 278ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return BAD_INDEX; 279ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson s->what |= layer_state_t::eSizeChanged; 280ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson s->w = w; 281ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson s->h = h; 282ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 283ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // Resizing a surface makes the transaction synchronous. 284ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mForceSynchronous = true; 285ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 286ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return NO_ERROR; 287ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 288ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 289ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatus_t Composer::setLayer(const sp<SurfaceComposerClient>& client, 290ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const sp<IBinder>& id, int32_t z) { 291ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson Mutex::Autolock _l(mLock); 292ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson layer_state_t* s = getLayerStateLocked(client, id); 293ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (!s) 294ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return BAD_INDEX; 295ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson s->what |= layer_state_t::eLayerChanged; 296ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson s->z = z; 297ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return NO_ERROR; 298ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 299ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 300ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatus_t Composer::setFlags(const sp<SurfaceComposerClient>& client, 301ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const sp<IBinder>& id, uint32_t flags, 302ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson uint32_t mask) { 303ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson Mutex::Autolock _l(mLock); 304ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson layer_state_t* s = getLayerStateLocked(client, id); 305ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (!s) 306ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return BAD_INDEX; 307ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson s->what |= layer_state_t::eVisibilityChanged; 308ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson s->flags &= ~mask; 309ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson s->flags |= (flags & mask); 310ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson s->mask |= mask; 311ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return NO_ERROR; 312ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 313ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 314ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatus_t Composer::setTransparentRegionHint( 315ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, 316ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const Region& transparentRegion) { 317ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson Mutex::Autolock _l(mLock); 318ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson layer_state_t* s = getLayerStateLocked(client, id); 319ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (!s) 320ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return BAD_INDEX; 321ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson s->what |= layer_state_t::eTransparentRegionChanged; 322ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson s->transparentRegion = transparentRegion; 323ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return NO_ERROR; 324ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 325ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 326ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatus_t Composer::setAlpha(const sp<SurfaceComposerClient>& client, 327ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const sp<IBinder>& id, float alpha) { 328ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson Mutex::Autolock _l(mLock); 329ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson layer_state_t* s = getLayerStateLocked(client, id); 330ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (!s) 331ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return BAD_INDEX; 332ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson s->what |= layer_state_t::eAlphaChanged; 333ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson s->alpha = alpha; 334ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return NO_ERROR; 335ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 336a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 337a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonstatus_t Composer::setLayerStack(const sp<SurfaceComposerClient>& client, 338a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson const sp<IBinder>& id, uint32_t layerStack) { 339a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson Mutex::Autolock _l(mLock); 340a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson layer_state_t* s = getLayerStateLocked(client, id); 341a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (!s) 342a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return BAD_INDEX; 343a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson s->what |= layer_state_t::eLayerStackChanged; 344a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson s->layerStack = layerStack; 345a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return NO_ERROR; 346a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 347a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 348a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonstatus_t Composer::setMatrix(const sp<SurfaceComposerClient>& client, 349a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson const sp<IBinder>& id, float dsdx, float dtdx, 3503f38b62b3d70dfea36d63c814abaed4da1fcd01cSaurabh Shah float dsdy, float dtdy) { 3513f38b62b3d70dfea36d63c814abaed4da1fcd01cSaurabh Shah Mutex::Autolock _l(mLock); 3523f38b62b3d70dfea36d63c814abaed4da1fcd01cSaurabh Shah layer_state_t* s = getLayerStateLocked(client, id); 3533f38b62b3d70dfea36d63c814abaed4da1fcd01cSaurabh Shah if (!s) 354a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return BAD_INDEX; 355a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson s->what |= layer_state_t::eMatrixChanged; 356a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson layer_state_t::matrix22_t matrix; 357c2039d4a4ad6ddc2dbc66e7d8a993a794a6bf3a9Jeykumar Sankaran matrix.dsdx = dsdx; 358c2039d4a4ad6ddc2dbc66e7d8a993a794a6bf3a9Jeykumar Sankaran matrix.dtdx = dtdx; 359a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson matrix.dsdy = dsdy; 360a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson matrix.dtdy = dtdy; 361a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson s->matrix = matrix; 362a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return NO_ERROR; 363a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 364a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 365a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonstatus_t Composer::setCrop(const sp<SurfaceComposerClient>& client, 366a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson const sp<IBinder>& id, const Rect& crop) { 367a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson Mutex::Autolock _l(mLock); 368a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson layer_state_t* s = getLayerStateLocked(client, id); 369a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (!s) 370a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return BAD_INDEX; 371a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson s->what |= layer_state_t::eCropChanged; 372a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson s->crop = crop; 373a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return NO_ERROR; 374a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 375a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 376a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson// --------------------------------------------------------------------------- 377a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 378a653efede03423aa840da24634f1ec6f20796f1eSimon WilsonDisplayState& Composer::getDisplayStateLocked(const sp<IBinder>& token) { 379a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson DisplayState s; 380a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson s.token = token; 381a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ssize_t index = mDisplayStates.indexOf(s); 382a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (index < 0) { 383a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // we don't have it, add an initialized layer_state to our list 384a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson s.what = 0; 385ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson index = mDisplayStates.add(s); 386 } 387 return mDisplayStates.editItemAt(index); 388} 389 390void Composer::setDisplaySurface(const sp<IBinder>& token, 391 const sp<IGraphicBufferProducer>& bufferProducer) { 392 Mutex::Autolock _l(mLock); 393 DisplayState& s(getDisplayStateLocked(token)); 394 s.surface = bufferProducer; 395 s.what |= DisplayState::eSurfaceChanged; 396} 397 398void Composer::setDisplayLayerStack(const sp<IBinder>& token, 399 uint32_t layerStack) { 400 Mutex::Autolock _l(mLock); 401 DisplayState& s(getDisplayStateLocked(token)); 402 s.layerStack = layerStack; 403 s.what |= DisplayState::eLayerStackChanged; 404} 405 406void Composer::setDisplayProjection(const sp<IBinder>& token, 407 uint32_t orientation, 408 const Rect& layerStackRect, 409 const Rect& displayRect) { 410 Mutex::Autolock _l(mLock); 411 DisplayState& s(getDisplayStateLocked(token)); 412 s.orientation = orientation; 413 s.viewport = layerStackRect; 414 s.frame = displayRect; 415 s.what |= DisplayState::eDisplayProjectionChanged; 416 mForceSynchronous = true; // TODO: do we actually still need this? 417} 418 419// --------------------------------------------------------------------------- 420 421SurfaceComposerClient::SurfaceComposerClient() 422 : mStatus(NO_INIT), mComposer(Composer::getInstance()) 423{ 424} 425 426void SurfaceComposerClient::onFirstRef() { 427 sp<ISurfaceComposer> sm(ComposerService::getComposerService()); 428 if (sm != 0) { 429 sp<ISurfaceComposerClient> conn = sm->createConnection(); 430 if (conn != 0) { 431 mClient = conn; 432 mStatus = NO_ERROR; 433 } 434 } 435} 436 437SurfaceComposerClient::~SurfaceComposerClient() { 438 dispose(); 439} 440 441status_t SurfaceComposerClient::initCheck() const { 442 return mStatus; 443} 444 445sp<IBinder> SurfaceComposerClient::connection() const { 446 return (mClient != 0) ? mClient->asBinder() : 0; 447} 448 449status_t SurfaceComposerClient::linkToComposerDeath( 450 const sp<IBinder::DeathRecipient>& recipient, 451 void* cookie, uint32_t flags) { 452 sp<ISurfaceComposer> sm(ComposerService::getComposerService()); 453 return sm->asBinder()->linkToDeath(recipient, cookie, flags); 454} 455 456void SurfaceComposerClient::dispose() { 457 // this can be called more than once. 458 sp<ISurfaceComposerClient> client; 459 Mutex::Autolock _lm(mLock); 460 if (mClient != 0) { 461 client = mClient; // hold ref while lock is held 462 mClient.clear(); 463 } 464 mStatus = NO_INIT; 465} 466 467sp<SurfaceControl> SurfaceComposerClient::createSurface( 468 const String8& name, 469 uint32_t w, 470 uint32_t h, 471 PixelFormat format, 472 uint32_t flags) 473{ 474 sp<SurfaceControl> sur; 475 if (mStatus == NO_ERROR) { 476 sp<IBinder> handle; 477 sp<IGraphicBufferProducer> gbp; 478 status_t err = mClient->createSurface(name, w, h, format, flags, 479 &handle, &gbp); 480 ALOGE_IF(err, "SurfaceComposerClient::createSurface error %s", strerror(-err)); 481 if (err == NO_ERROR) { 482 sur = new SurfaceControl(this, handle, gbp); 483 } 484 } 485 return sur; 486} 487 488sp<IBinder> SurfaceComposerClient::createDisplay(const String8& displayName, 489 bool secure) { 490 return Composer::getInstance().createDisplay(displayName, secure); 491} 492 493sp<IBinder> SurfaceComposerClient::getBuiltInDisplay(int32_t id) { 494 return Composer::getInstance().getBuiltInDisplay(id); 495} 496 497status_t SurfaceComposerClient::destroySurface(const sp<IBinder>& sid) { 498 if (mStatus != NO_ERROR) 499 return mStatus; 500 status_t err = mClient->destroySurface(sid); 501 return err; 502} 503 504inline Composer& SurfaceComposerClient::getComposer() { 505 return mComposer; 506} 507 508// ---------------------------------------------------------------------------- 509 510void SurfaceComposerClient::openGlobalTransaction() { 511 Composer::openGlobalTransaction(); 512} 513 514void SurfaceComposerClient::closeGlobalTransaction(bool synchronous) { 515 Composer::closeGlobalTransaction(synchronous); 516} 517 518void SurfaceComposerClient::setAnimationTransaction() { 519 Composer::setAnimationTransaction(); 520} 521 522// ---------------------------------------------------------------------------- 523 524status_t SurfaceComposerClient::setCrop(const sp<IBinder>& id, const Rect& crop) { 525 return getComposer().setCrop(this, id, crop); 526} 527 528status_t SurfaceComposerClient::setPosition(const sp<IBinder>& id, float x, float y) { 529 return getComposer().setPosition(this, id, x, y); 530} 531 532status_t SurfaceComposerClient::setSize(const sp<IBinder>& id, uint32_t w, uint32_t h) { 533 return getComposer().setSize(this, id, w, h); 534} 535 536status_t SurfaceComposerClient::setLayer(const sp<IBinder>& id, int32_t z) { 537 return getComposer().setLayer(this, id, z); 538} 539 540status_t SurfaceComposerClient::hide(const sp<IBinder>& id) { 541 return getComposer().setFlags(this, id, 542 layer_state_t::eLayerHidden, 543 layer_state_t::eLayerHidden); 544} 545 546status_t SurfaceComposerClient::show(const sp<IBinder>& id) { 547 return getComposer().setFlags(this, id, 548 0, 549 layer_state_t::eLayerHidden); 550} 551 552status_t SurfaceComposerClient::setFlags(const sp<IBinder>& id, uint32_t flags, 553 uint32_t mask) { 554 return getComposer().setFlags(this, id, flags, mask); 555} 556 557status_t SurfaceComposerClient::setTransparentRegionHint(const sp<IBinder>& id, 558 const Region& transparentRegion) { 559 return getComposer().setTransparentRegionHint(this, id, transparentRegion); 560} 561 562status_t SurfaceComposerClient::setAlpha(const sp<IBinder>& id, float alpha) { 563 return getComposer().setAlpha(this, id, alpha); 564} 565 566status_t SurfaceComposerClient::setLayerStack(const sp<IBinder>& id, uint32_t layerStack) { 567 return getComposer().setLayerStack(this, id, layerStack); 568} 569 570status_t SurfaceComposerClient::setMatrix(const sp<IBinder>& id, float dsdx, float dtdx, 571 float dsdy, float dtdy) { 572 return getComposer().setMatrix(this, id, dsdx, dtdx, dsdy, dtdy); 573} 574 575// ---------------------------------------------------------------------------- 576 577void SurfaceComposerClient::setDisplaySurface(const sp<IBinder>& token, 578 const sp<IGraphicBufferProducer>& bufferProducer) { 579 Composer::getInstance().setDisplaySurface(token, bufferProducer); 580} 581 582void SurfaceComposerClient::setDisplayLayerStack(const sp<IBinder>& token, 583 uint32_t layerStack) { 584 Composer::getInstance().setDisplayLayerStack(token, layerStack); 585} 586 587void SurfaceComposerClient::setDisplayProjection(const sp<IBinder>& token, 588 uint32_t orientation, 589 const Rect& layerStackRect, 590 const Rect& displayRect) { 591 Composer::getInstance().setDisplayProjection(token, orientation, 592 layerStackRect, displayRect); 593} 594 595// ---------------------------------------------------------------------------- 596 597status_t SurfaceComposerClient::getDisplayInfo( 598 const sp<IBinder>& display, DisplayInfo* info) 599{ 600 return ComposerService::getComposerService()->getDisplayInfo(display, info); 601} 602 603void SurfaceComposerClient::blankDisplay(const sp<IBinder>& token) { 604 ComposerService::getComposerService()->blank(token); 605} 606 607void SurfaceComposerClient::unblankDisplay(const sp<IBinder>& token) { 608 ComposerService::getComposerService()->unblank(token); 609} 610 611// ---------------------------------------------------------------------------- 612 613status_t ScreenshotClient::capture( 614 const sp<IBinder>& display, 615 const sp<IGraphicBufferProducer>& producer, 616 uint32_t reqWidth, uint32_t reqHeight, 617 uint32_t minLayerZ, uint32_t maxLayerZ) { 618 sp<ISurfaceComposer> s(ComposerService::getComposerService()); 619 if (s == NULL) return NO_INIT; 620 return s->captureScreen(display, producer, 621 reqWidth, reqHeight, minLayerZ, maxLayerZ); 622} 623 624ScreenshotClient::ScreenshotClient() 625 : mHaveBuffer(false) { 626 memset(&mBuffer, 0, sizeof(mBuffer)); 627} 628 629ScreenshotClient::~ScreenshotClient() { 630 ScreenshotClient::release(); 631} 632 633sp<CpuConsumer> ScreenshotClient::getCpuConsumer() const { 634 if (mCpuConsumer == NULL) { 635 mBufferQueue = new BufferQueue(); 636 mCpuConsumer = new CpuConsumer(mBufferQueue, 1); 637 mCpuConsumer->setName(String8("ScreenshotClient")); 638 } 639 return mCpuConsumer; 640} 641 642status_t ScreenshotClient::update(const sp<IBinder>& display, 643 uint32_t reqWidth, uint32_t reqHeight, 644 uint32_t minLayerZ, uint32_t maxLayerZ) { 645 sp<ISurfaceComposer> s(ComposerService::getComposerService()); 646 if (s == NULL) return NO_INIT; 647 sp<CpuConsumer> cpuConsumer = getCpuConsumer(); 648 649 if (mHaveBuffer) { 650 mCpuConsumer->unlockBuffer(mBuffer); 651 memset(&mBuffer, 0, sizeof(mBuffer)); 652 mHaveBuffer = false; 653 } 654 655 status_t err = s->captureScreen(display, mBufferQueue, 656 reqWidth, reqHeight, minLayerZ, maxLayerZ); 657 658 if (err == NO_ERROR) { 659 err = mCpuConsumer->lockNextBuffer(&mBuffer); 660 if (err == NO_ERROR) { 661 mHaveBuffer = true; 662 } 663 } 664 return err; 665} 666 667status_t ScreenshotClient::update(const sp<IBinder>& display) { 668 return ScreenshotClient::update(display, 0, 0, 0, -1UL); 669} 670 671status_t ScreenshotClient::update(const sp<IBinder>& display, 672 uint32_t reqWidth, uint32_t reqHeight) { 673 return ScreenshotClient::update(display, reqWidth, reqHeight, 0, -1UL); 674} 675 676void ScreenshotClient::release() { 677 if (mHaveBuffer) { 678 mCpuConsumer->unlockBuffer(mBuffer); 679 memset(&mBuffer, 0, sizeof(mBuffer)); 680 mHaveBuffer = false; 681 } 682 mCpuConsumer.clear(); 683} 684 685void const* ScreenshotClient::getPixels() const { 686 return mBuffer.data; 687} 688 689uint32_t ScreenshotClient::getWidth() const { 690 return mBuffer.width; 691} 692 693uint32_t ScreenshotClient::getHeight() const { 694 return mBuffer.height; 695} 696 697PixelFormat ScreenshotClient::getFormat() const { 698 return mBuffer.format; 699} 700 701uint32_t ScreenshotClient::getStride() const { 702 return mBuffer.stride; 703} 704 705size_t ScreenshotClient::getSize() const { 706 return mBuffer.stride * mBuffer.height * bytesPerPixel(mBuffer.format); 707} 708 709// ---------------------------------------------------------------------------- 710}; // namespace android 711