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 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef ANDROID_LAYER_H 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define ANDROID_LAYER_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 23a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <gui/SurfaceTexture.h> 24a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 2590ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <utils/Timers.h> 2690ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian 273330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBuffer.h> 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h> 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3090ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposerClient.h> 3190ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian 32076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <EGL/egl.h> 33076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <EGL/eglext.h> 34076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <GLES/gl.h> 35076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <GLES/glext.h> 36076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "LayerBase.h" 38a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include "SurfaceTextureLayer.h" 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Transform.h" 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass Client; 461f7bec634f19c123410a5155c8d282e177c01930Mathias Agopianclass GLExtensions; 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 5047d0812977b7acc4fed6a823203770a57f7a6b78Mathias Agopianclass Layer : public LayerBaseClient 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 52d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopianpublic: 533ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian Layer(SurfaceFlinger* flinger, const sp<Client>& client); 54b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian virtual ~Layer(); 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 56b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian virtual const char* getTypeId() const { return "Layer"; } 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 58b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian // the this layer's size and format 59cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian status_t setBuffers(uint32_t w, uint32_t h, 60cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian PixelFormat format, uint32_t flags=0); 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 62a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian bool isFixedSize() const; 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 64b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian // LayerBase interface 654297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian virtual void setGeometry(const sp<const DisplayDevice>& hw, 664fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian HWComposer::HWCLayerInterface& layer); 674297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian virtual void setPerFrameData(const sp<const DisplayDevice>& hw, 68d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian HWComposer::HWCLayerInterface& layer); 694297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian virtual void setAcquireFence(const sp<const DisplayDevice>& hw, 70d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian HWComposer::HWCLayerInterface& layer); 714297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian virtual void onLayerDisplayed(const sp<const DisplayDevice>& hw, 72d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian HWComposer::HWCLayerInterface* layer); 73d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian virtual bool onPreComposition(); 74d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian virtual void onPostComposition(); 754fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian 764297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian virtual void onDraw(const sp<const DisplayDevice>& hw, const Region& clip) const; 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual uint32_t doTransaction(uint32_t transactionFlags); 784fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian virtual Region latchBuffer(bool& recomputeVisibleRegions); 79a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian virtual bool isOpaque() const; 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual bool isSecure() const { return mSecure; } 817a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis virtual bool isProtected() const; 82d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian virtual void onRemoved(); 83fb4d5d5726c172adbe62341d99a2148685a98379Mathias Agopian virtual sp<Layer> getLayer() const { return const_cast<Layer*>(this); } 84a249f2d11249ff37c48119020b797ad437ddef2cJamie Gennis virtual void setName(const String8& name); 85da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian virtual bool isVisible() const; 86b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian 87582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis // LayerBaseClient interface 88582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis virtual wp<IBinder> getSurfaceTextureBinder() const; 89582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis 90cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian // only for debugging 91fb4d5d5726c172adbe62341d99a2148685a98379Mathias Agopian inline const sp<GraphicBuffer>& getActiveBuffer() const { return mActiveBuffer; } 921b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 936905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden // Updates the transform hint in our SurfaceTexture to match 946905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden // the current orientation of the default display device. 956905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden virtual void updateTransformHint() const; 966905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden 971b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianprotected: 98a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian virtual void onFirstRef(); 991b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian virtual void dump(String8& result, char* scratch, size_t size) const; 10082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian virtual void dumpStats(String8& result, char* buffer, size_t SIZE) const; 10125e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian virtual void clearStats(); 1021b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 104a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian friend class SurfaceTextureLayer; 105a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian void onFrameQueued(); 106a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian virtual sp<ISurface> createSurface(); 1073330b203039dea366d4981db1408a460134b2d2cMathias Agopian uint32_t getEffectiveUsage(uint32_t usage) const; 108a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian bool isCropped() const; 109f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis Rect computeBufferCrop() const; 110a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian static bool getOpacityForFormat(uint32_t format); 111b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian 112b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian // ----------------------------------------------------------------------- 113b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian 114a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian // constants 115b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lam sp<SurfaceTexture> mSurfaceTexture; 116a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian GLuint mTextureName; 117b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian 118b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian // thread-safe 119a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian volatile int32_t mQueuedFrames; 120a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 121a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian // main thread 122a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian sp<GraphicBuffer> mActiveBuffer; 123a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian Rect mCurrentCrop; 124a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian uint32_t mCurrentTransform; 125933389f75814bb62e8153528f9cff2cb329b77dfMathias Agopian uint32_t mCurrentScalingMode; 126a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian bool mCurrentOpacity; 1274d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian bool mRefreshPending; 128e8696a40e09b24b634214684d18526187b316a2fJamie Gennis bool mFrameLatencyNeeded; 129e8696a40e09b24b634214684d18526187b316a2fJamie Gennis int mFrameLatencyOffset; 13099ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 13182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian struct Statistics { 13282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian Statistics() : timestamp(0), set(0), vsync(0) { } 13382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian nsecs_t timestamp; // buffer timestamp 13482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian nsecs_t set; // buffer displayed timestamp 13582d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian nsecs_t vsync; // vsync immediately before set 13682d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian }; 13799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 13882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian // protected by mLock 13982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian Statistics mFrameStats[128]; 140b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian 141b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian // constants 142b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian PixelFormat mFormat; 1431f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian const GLExtensions& mGLExtensions; 144a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian bool mOpaqueLayer; 145b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian 146b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian // page-flip thread (currently main thread) 14716f0453fee84c6aad59fe0d1c7d36f061d46cffcGlenn Kasten bool mSecure; // no screenshots 14816f0453fee84c6aad59fe0d1c7d36f061d46cffcGlenn Kasten bool mProtectedByApp; // application requires protected path to external sink 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_LAYER_H 156