Layer.h revision 2a9fc493dfdba67108e4335bb1fe931bc1e2a025
144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin/* 244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * Copyright (C) 2007 The Android Open Source Project 344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * 444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * Licensed under the Apache License, Version 2.0 (the "License"); 544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * you may not use this file except in compliance with the License. 644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * You may obtain a copy of the License at 744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * 844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * http://www.apache.org/licenses/LICENSE-2.0 944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * 1044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * Unless required by applicable law or agreed to in writing, software 1144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * distributed under the License is distributed on an "AS IS" BASIS, 1244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * See the License for the specific language governing permissions and 1444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * limitations under the License. 1544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin */ 1644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 1744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#ifndef ANDROID_LAYER_H 1844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#define ANDROID_LAYER_H 1944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 2044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#include <stdint.h> 21e5729fac81c8a984e984fefc90afc64135817d4fColin Cross#include <sys/types.h> 22e5729fac81c8a984e984fefc90afc64135817d4fColin Cross 2344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#include <utils/Timers.h> 2444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 2544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#include <ui/GraphicBuffer.h> 2644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#include <ui/PixelFormat.h> 2744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 2844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#include <gui/ISurfaceComposerClient.h> 2944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 307b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <EGL/egl.h> 317b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <EGL/eglext.h> 327b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <GLES/gl.h> 33e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include <GLES/glext.h> 3498e24724fb77445d4d015a5fec4ecbd5b49abc9bIgor Murashkin 3544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#include "SurfaceFlingerConsumer.h" 3644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#include "FrameTracker.h" 3744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#include "LayerBase.h" 3844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#include "SurfaceTextureLayer.h" 3944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#include "Transform.h" 4044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 4144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinnamespace android { 4244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 4344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin// --------------------------------------------------------------------------- 4444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 4544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinclass Client; 4644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinclass GLExtensions; 4744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 4844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin// --------------------------------------------------------------------------- 4944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 5044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin/* 5144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * The Layer class is essentially a LayerBase combined with a BufferQueue. 5244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * A new BufferQueue and a new SurfaceFlingerConsumer are created when the 5344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * Layer is first referenced. 5444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * 5544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * This also implements onFrameAvailable(), which notifies SurfaceFlinger 5644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * that new data has arrived. 5744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin */ 5844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinclass Layer : public LayerBaseClient, 5944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin public SurfaceFlingerConsumer::FrameAvailableListener 6098e24724fb77445d4d015a5fec4ecbd5b49abc9bIgor Murashkin{ 6198e24724fb77445d4d015a5fec4ecbd5b49abc9bIgor Murashkinpublic: 6298e24724fb77445d4d015a5fec4ecbd5b49abc9bIgor Murashkin Layer(SurfaceFlinger* flinger, const sp<Client>& client); 6344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin virtual ~Layer(); 6444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 6544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin virtual const char* getTypeId() const { return "Layer"; } 6644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 6744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin // the this layer's size and format 6844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin status_t setBuffers(uint32_t w, uint32_t h, 6944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin PixelFormat format, uint32_t flags=0); 7044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 7144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin bool isFixedSize() const; 7244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 7344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin // LayerBase interface 7444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin virtual void setGeometry(const sp<const DisplayDevice>& hw, 7544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin HWComposer::HWCLayerInterface& layer); 7644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin virtual void setPerFrameData(const sp<const DisplayDevice>& hw, 7744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin HWComposer::HWCLayerInterface& layer); 7844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin virtual void setAcquireFence(const sp<const DisplayDevice>& hw, 7944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin HWComposer::HWCLayerInterface& layer); 8044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin virtual void onLayerDisplayed(const sp<const DisplayDevice>& hw, 8144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin HWComposer::HWCLayerInterface* layer); 8244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin virtual bool onPreComposition(); 8344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin virtual void onPostComposition(); 84e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin 85e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin virtual void onDraw(const sp<const DisplayDevice>& hw, const Region& clip) const; 86e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin virtual uint32_t doTransaction(uint32_t transactionFlags); 87e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin virtual Region latchBuffer(bool& recomputeVisibleRegions); 88e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin virtual bool isOpaque() const; 89e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin virtual bool isSecure() const { return mSecure; } 90e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin virtual bool isProtected() const; 91e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin virtual void onRemoved(); 92e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin virtual sp<Layer> getLayer() const { return const_cast<Layer*>(this); } 93e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin virtual void setName(const String8& name); 94e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin virtual bool isVisible() const; 95e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin 9644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin // LayerBaseClient interface 9744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin virtual wp<IBinder> getSurfaceTextureBinder() const; 9844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 9944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin // only for debugging 10066281c3a5d7eea486ddc6ad30088ba92956fd4fdZhijun He inline const sp<GraphicBuffer>& getActiveBuffer() const { return mActiveBuffer; } 10144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 10244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin // Updates the transform hint in our SurfaceFlingerConsumer to match 10344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin // the current orientation of the display device. 10444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin virtual void updateTransformHint(const sp<const DisplayDevice>& hw) const; 10544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 10644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinprotected: 10744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin virtual void onFirstRef(); 10844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin virtual void dump(String8& result, char* scratch, size_t size) const; 10944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin virtual void dumpStats(String8& result, char* buffer, size_t SIZE) const; 11044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin virtual void clearStats(); 11144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 11244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin sp<SurfaceFlingerConsumer> getConsumer() const { 11344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin return mSurfaceFlingerConsumer; 114e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin } 115e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin 11644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinprivate: 11744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin // Creates an instance of ISurface for this Layer. 11844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin virtual sp<ISurface> createSurface(); 11944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 12044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin uint32_t getEffectiveUsage(uint32_t usage) const; 12144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin bool isCropped() const; 12244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Rect computeBufferCrop() const; 12344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin static bool getOpacityForFormat(uint32_t format); 12444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 12544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin // Interface implementation for SurfaceFlingerConsumer::FrameAvailableListener 12644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin virtual void onFrameAvailable(); 12744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 12844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin // ----------------------------------------------------------------------- 12944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 13044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin // constants 13144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin sp<SurfaceFlingerConsumer> mSurfaceFlingerConsumer; 13244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin GLuint mTextureName; 13344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 13444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin // thread-safe 13544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin volatile int32_t mQueuedFrames; 13644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin FrameTracker mFrameTracker; 13744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 13844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin // main thread 13944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin sp<GraphicBuffer> mActiveBuffer; 14044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin Rect mCurrentCrop; 14144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin uint32_t mCurrentTransform; 14244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin uint32_t mCurrentScalingMode; 14344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin bool mCurrentOpacity; 14444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin bool mRefreshPending; 14544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin bool mFrameLatencyNeeded; 14644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 14744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin // constants 14844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin PixelFormat mFormat; 14944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin const GLExtensions& mGLExtensions; 15044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin bool mOpaqueLayer; 15144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 15244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin // page-flip thread (currently main thread) 15344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin bool mSecure; // no screenshots 15444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin bool mProtectedByApp; // application requires protected path to external sink 15544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin}; 15644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 15744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin// --------------------------------------------------------------------------- 15844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 15944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin}; // namespace android 16044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 16144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#endif // ANDROID_LAYER_H 16244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin