SurfaceComposerClient.h revision dd3cb84cfbe8068790c6233b5829fae9c4a0ee93
127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi/* 227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Copyright (C) 2007 The Android Open Source Project 327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * 427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Licensed under the Apache License, Version 2.0 (the "License"); 527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * you may not use this file except in compliance with the License. 627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * You may obtain a copy of the License at 727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * 827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * http://www.apache.org/licenses/LICENSE-2.0 927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * 1027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Unless required by applicable law or agreed to in writing, software 1127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * distributed under the License is distributed on an "AS IS" BASIS, 1227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * See the License for the specific language governing permissions and 1427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * limitations under the License. 1527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi */ 1627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 172272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi#ifndef ANDROID_GUI_SURFACE_COMPOSER_CLIENT_H 1827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#define ANDROID_GUI_SURFACE_COMPOSER_CLIENT_H 1927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <stdint.h> 2127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <sys/types.h> 2227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <binder/IBinder.h> 24927634a98167e24241b89d80a1ea4511c0bb9cd1Adam Lesinski 2527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <utils/RefBase.h> 2627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <utils/Singleton.h> 27927634a98167e24241b89d80a1ea4511c0bb9cd1Adam Lesinski#include <utils/SortedVector.h> 2827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <utils/threads.h> 2927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <ui/PixelFormat.h> 3127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <gui/Surface.h> 338d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang 348d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wangnamespace android { 358d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang 3627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi// --------------------------------------------------------------------------- 3727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 388f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wangclass DisplayInfo; 398f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wangclass Composer; 40927634a98167e24241b89d80a1ea4511c0bb9cd1Adam Lesinskiclass IMemoryHeap; 41927634a98167e24241b89d80a1ea4511c0bb9cd1Adam Lesinskiclass ISurfaceComposerClient; 42927634a98167e24241b89d80a1ea4511c0bb9cd1Adam Lesinskiclass ISurfaceTexture; 43927634a98167e24241b89d80a1ea4511c0bb9cd1Adam Lesinskiclass Region; 44927634a98167e24241b89d80a1ea4511c0bb9cd1Adam Lesinski 45927634a98167e24241b89d80a1ea4511c0bb9cd1Adam Lesinski// --------------------------------------------------------------------------- 4627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiclass SurfaceComposerClient : public RefBase 4827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi{ 492272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi friend class Composer; 5027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshipublic: 5127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi SurfaceComposerClient(); 5227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi virtual ~SurfaceComposerClient(); 538d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang 548d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang // Always make sure we could initialize 55927634a98167e24241b89d80a1ea4511c0bb9cd1Adam Lesinski status_t initCheck() const; 56927634a98167e24241b89d80a1ea4511c0bb9cd1Adam Lesinski 57927634a98167e24241b89d80a1ea4511c0bb9cd1Adam Lesinski // Return the connection of this client 58927634a98167e24241b89d80a1ea4511c0bb9cd1Adam Lesinski sp<IBinder> connection() const; 59927634a98167e24241b89d80a1ea4511c0bb9cd1Adam Lesinski 60927634a98167e24241b89d80a1ea4511c0bb9cd1Adam Lesinski // Forcibly remove connection before all references have gone away. 6127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi void dispose(); 6227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 6327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi // callback when the composer is dies 6427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t linkToComposerDeath(const sp<IBinder::DeathRecipient>& recipient, 6527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi void* cookie = NULL, uint32_t flags = 0); 6627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 6727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi // Get information about a display 685ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block static status_t getDisplayInfo(const sp<IBinder>& display, DisplayInfo* info); 6927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 7027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi /* triggers screen off and waits for it to complete */ 7127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi static void blankDisplay(const sp<IBinder>& display); 7227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 7327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi /* triggers screen on and waits for it to complete */ 748d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang static void unblankDisplay(const sp<IBinder>& display); 758d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang 768d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang // ------------------------------------------------------------------------ 778d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang // surface creation / destruction 788d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang 7927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //! Create a surface 808d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang sp<SurfaceControl> createSurface( 8127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8& name,// name of the surface 8227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi uint32_t w, // width in pixel 83e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi uint32_t h, // height in pixel 84e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi PixelFormat format, // pixel-format desired 8527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi uint32_t flags = 0 // usage flags 8627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ); 87e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 88e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi //! Create a display 8927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi static sp<IBinder> createDisplay(const String8& displayName, bool secure); 9027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 9127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //! Get the token for the existing default displays. 92b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang //! Possible values for id are eDisplayIdMain and eDisplayIdHdmi. 93b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang static sp<IBinder> getBuiltInDisplay(int32_t id); 9427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 9527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi // ------------------------------------------------------------------------ 96c618b5af98dec06d49374a61a5a94016f9fec2d3Takeshi Aimi // Composer parameters 97c618b5af98dec06d49374a61a5a94016f9fec2d3Takeshi Aimi // All composer parameters must be changed within a transaction 9827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi // several surfaces can be updated in one transaction, all changes are 9927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi // committed at once when the transaction is closed. 10027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi // closeGlobalTransaction() requires an IPC with the server. 10127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //! Open a composer transaction on all active SurfaceComposerClients. 10327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi static void openGlobalTransaction(); 104b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang 105b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang //! Close a composer transaction on all active SurfaceComposerClients. 10627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi static void closeGlobalTransaction(bool synchronous = false); 10727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //! Flag the currently open transaction as an animation transaction. 10927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi static void setAnimationTransaction(); 1103473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 1113473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi status_t hide(SurfaceID id); 1123473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi status_t show(SurfaceID id); 1133473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi status_t setFlags(SurfaceID id, uint32_t flags, uint32_t mask); 1143473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi status_t setTransparentRegionHint(SurfaceID id, const Region& transparent); 1153473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi status_t setLayer(SurfaceID id, int32_t layer); 1163473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi status_t setAlpha(SurfaceID id, float alpha=1.0f); 1173473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi status_t setMatrix(SurfaceID id, float dsdx, float dtdx, float dsdy, float dtdy); 118b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang status_t setPosition(SurfaceID id, float x, float y); 119b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang status_t setSize(SurfaceID id, uint32_t w, uint32_t h); 12027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t setCrop(SurfaceID id, const Rect& crop); 12127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t setLayerStack(SurfaceID id, uint32_t layerStack); 12227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t destroySurface(SurfaceID sid); 12327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 12427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi static void setDisplaySurface(const sp<IBinder>& token, 12527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const sp<ISurfaceTexture>& surface); 12627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi static void setDisplayLayerStack(const sp<IBinder>& token, 127b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang uint32_t layerStack); 128b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang 12927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi /* setDisplayProjection() defines the projection of layer stacks 13027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * to a given display. 13127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * 13227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * - orientation defines the display's orientation. 13327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * - layerStackRect defines which area of the window manager coordinate 13427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * space will be used. 13527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * - displayRect defines where on the display will layerStackRect be 136b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang * mapped to. displayRect is specified post-orientation, that is 137b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang * it uses the orientation seen by the end-user. 13827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi */ 13927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi static void setDisplayProjection(const sp<IBinder>& token, 14027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi uint32_t orientation, 14127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const Rect& layerStackRect, 14227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const Rect& displayRect); 14327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiprivate: 1452272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi virtual void onFirstRef(); 14627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Composer& getComposer(); 1478d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang 148b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang mutable Mutex mLock; 14927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t mStatus; 15027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi sp<ISurfaceComposerClient> mClient; 151b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang Composer& mComposer; 152bf5b3b29e31b293313788d7464cfb258ac0da803James Dong}; 15327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 15427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi// --------------------------------------------------------------------------- 155bf5b3b29e31b293313788d7464cfb258ac0da803James Dong 15627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiclass ScreenshotClient 15727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi{ 15827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi sp<IMemoryHeap> mHeap; 15927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi uint32_t mWidth; 16027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi uint32_t mHeight; 16127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi PixelFormat mFormat; 16227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshipublic: 16327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ScreenshotClient(); 164b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang 165b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang // frees the previous screenshot and capture a new one 16627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t update(const sp<IBinder>& display); 16727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t update(const sp<IBinder>& display, 16827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi uint32_t reqWidth, uint32_t reqHeight); 16927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t update(const sp<IBinder>& display, 17027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi uint32_t reqWidth, uint32_t reqHeight, 17127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi uint32_t minLayerZ, uint32_t maxLayerZ); 17227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 17327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi // release memory occupied by the screenshot 174b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang void release(); 175b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang 17627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi // pixels are valid until this object is freed or 17727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi // release() or update() is called 17827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi void const* getPixels() const; 17927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1802272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi uint32_t getWidth() const; 181b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang uint32_t getHeight() const; 182b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang PixelFormat getFormat() const; 1832272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi uint32_t getStride() const; 184b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang // size of allocated memory in bytes 185b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang size_t getSize() const; 186b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang}; 18727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1882272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi// --------------------------------------------------------------------------- 18927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}; // namespace android 19027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1912272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi#endif // ANDROID_GUI_SURFACE_COMPOSER_CLIENT_H 192b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang