Surface.h revision 90ac799241f077a7b7e6c1875fd933864c8dd2a7
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1790ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#ifndef ANDROID_GUI_SURFACE_H 1890ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#define ANDROID_GUI_SURFACE_H 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h> 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 23aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis#include <utils/KeyedVector.h> 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/RefBase.h> 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/threads.h> 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h> 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/Region.h> 29076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 308f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian#include <gui/SurfaceTextureClient.h> 3190ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurface.h> 3290ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposerClient.h> 339cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian 34e4e8cf1f19002be418aad1b89fa6bb8aeabf9f65Mathias Agopian#define ANDROID_VIEW_SURFACE_JNI_ID "mNativeSurface" 35e4e8cf1f19002be418aad1b89fa6bb8aeabf9f65Mathias Agopian 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 401e7fa9e945d98eab76ff92f37c25040429a6c0a0tedboclass ISurfaceTexture; 410926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianclass Surface; 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass SurfaceComposerClient; 43076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 44076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// --------------------------------------------------------------------------- 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 4662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianclass SurfaceControl : public RefBase 4762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian{ 4862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianpublic: 4962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian static bool isValid(const sp<SurfaceControl>& surface) { 5001b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian return (surface != 0) && surface->isValid(); 5162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian } 5201b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian bool isValid() { 5301b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian return mToken>=0 && mClient!=0; 5401b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian } 5501b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian static bool isSameSurface( 5601b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian const sp<SurfaceControl>& lhs, const sp<SurfaceControl>& rhs); 5762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian 5862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian uint32_t getIdentity() const { return mIdentity; } 5962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian 6062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian // release surface data from java 6162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian void clear(); 6262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian 6362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian status_t setLayer(int32_t layer); 6462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian status_t setPosition(int32_t x, int32_t y); 6562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian status_t setSize(uint32_t w, uint32_t h); 6662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian status_t hide(); 6762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian status_t show(int32_t layer = -1); 6862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian status_t freeze(); 6962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian status_t unfreeze(); 7062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian status_t setFlags(uint32_t flags, uint32_t mask); 7162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian status_t setTransparentRegionHint(const Region& transparent); 7262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian status_t setAlpha(float alpha=1.0f); 7362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian status_t setMatrix(float dsdx, float dtdx, float dsdy, float dtdy); 7462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian status_t setFreezeTint(uint32_t tint); 7562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian 7601b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian static status_t writeSurfaceToParcel( 7701b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian const sp<SurfaceControl>& control, Parcel* parcel); 7801b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian 7901b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian sp<Surface> getSurface() const; 8001b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian 8162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianprivate: 8201b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian // can't be copied 8301b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian SurfaceControl& operator = (SurfaceControl& rhs); 8401b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian SurfaceControl(const SurfaceControl& rhs); 8501b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian 8662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian friend class SurfaceComposerClient; 8762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian friend class Surface; 8801b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian 8901b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian SurfaceControl( 9001b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian const sp<SurfaceComposerClient>& client, 9162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian const sp<ISurface>& surface, 92c10d9d90b2088a3304076e0dc4bf05cdbb5d45abMathias Agopian const ISurfaceComposerClient::surface_data_t& data); 9362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian 9462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian ~SurfaceControl(); 9501b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian 96963abad79ae64dae9bf4c32bfb110d9e6314c857Mathias Agopian status_t validate() const; 9762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian void destroy(); 9862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian 9962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian sp<SurfaceComposerClient> mClient; 10062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian sp<ISurface> mSurface; 10162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian SurfaceID mToken; 10262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian uint32_t mIdentity; 10362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian mutable Mutex mLock; 10401b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian 10501b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian mutable sp<Surface> mSurfaceData; 10662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian}; 10762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian 10862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian// --------------------------------------------------------------------------- 10962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian 1108f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopianclass Surface : public SurfaceTextureClient 111076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project struct SurfaceInfo { 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t w; 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t h; 116076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian uint32_t s; 117076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian uint32_t usage; 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project PixelFormat format; 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project void* bits; 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t reserved[2]; 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 123bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg explicit Surface(const sp<ISurfaceTexture>& st); 124bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg 125c10d9d90b2088a3304076e0dc4bf05cdbb5d45abMathias Agopian static status_t writeToParcel(const sp<Surface>& control, Parcel* parcel); 126bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg 127aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis static sp<Surface> readFromParcel(const Parcel& data); 12840b7f6e0433b89c27b2fe5a1c0c47f67b42eceb2Mathias Agopian static bool isValid(const sp<Surface>& surface) { 12901b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian return (surface != 0) && surface->isValid(); 13040b7f6e0433b89c27b2fe5a1c0c47f67b42eceb2Mathias Agopian } 131ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian 132ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian bool isValid(); 133ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian uint32_t getIdentity() const { return mIdentity; } 1341e7fa9e945d98eab76ff92f37c25040429a6c0a0tedbo sp<ISurfaceTexture> getSurfaceTexture(); 13540b7f6e0433b89c27b2fe5a1c0c47f67b42eceb2Mathias Agopian 136ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian // the lock/unlock APIs must be used from the same thread 1378f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian status_t lock(SurfaceInfo* info, Region* dirty = NULL); 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project status_t unlockAndPost(); 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 14047d8730a2463f38a695ab95b533b0d9728f266a3Mathias Agopian sp<IBinder> asBinder() const; 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 142b296533607232357597b255679db29470ab5925dMathias Agopianprivate: 143ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian // this is just to be able to write some unit tests 144ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian friend class Test; 145b296533607232357597b255679db29470ab5925dMathias Agopian friend class SurfaceControl; 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 147b296533607232357597b255679db29470ab5925dMathias Agopian // can't be copied 148b296533607232357597b255679db29470ab5925dMathias Agopian Surface& operator = (Surface& rhs); 149b296533607232357597b255679db29470ab5925dMathias Agopian Surface(const Surface& rhs); 150076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 151bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg explicit Surface(const sp<SurfaceControl>& control); 152a0c30e924193da57723fd53b710ce6be24fb26f5Mathias Agopian Surface(const Parcel& data, const sp<IBinder>& ref); 153b296533607232357597b255679db29470ab5925dMathias Agopian ~Surface(); 154b296533607232357597b255679db29470ab5925dMathias Agopian 155b296533607232357597b255679db29470ab5925dMathias Agopian /* 156b296533607232357597b255679db29470ab5925dMathias Agopian * private stuff... 157b296533607232357597b255679db29470ab5925dMathias Agopian */ 158bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg void init(const sp<ISurfaceTexture>& surfaceTexture); 159b296533607232357597b255679db29470ab5925dMathias Agopian 160455d18d4c26a823bff62ca14771986cca52d3462Mathias Agopian static void cleanCachedSurfacesLocked(); 161aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis 1628f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian virtual int query(int what, int* value) const; 1638f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian 164ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian // constants 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sp<ISurface> mSurface; 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t mIdentity; 167ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian 168aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis // A cache of Surface objects that have been deserialized into this process. 169aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis static Mutex sCachedSurfacesLock; 170aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis static DefaultKeyedVector<wp<IBinder>, wp<Surface> > sCachedSurfaces; 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17590ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#endif // ANDROID_GUI_SURFACE_H 176