Layer.h revision 4b0eba949cc026ffb2c75313042d8a7bcb3fcf86
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
2390ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <utils/Timers.h>
2490ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian
253330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBuffer.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h>
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2890ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposerClient.h>
2990ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian
30076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <EGL/egl.h>
31076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <EGL/eglext.h>
32076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <GLES/gl.h>
33076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <GLES/glext.h>
34076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
35bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden#include "SurfaceFlingerConsumer.h"
3682dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis#include "FrameTracker.h"
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
50882e3a39ed770b335a203e233b57127fde1c839eAndy McFadden/*
51882e3a39ed770b335a203e233b57127fde1c839eAndy McFadden * The Layer class is essentially a LayerBase combined with a BufferQueue.
52882e3a39ed770b335a203e233b57127fde1c839eAndy McFadden * A new BufferQueue and a new SurfaceFlingerConsumer are created when the
53882e3a39ed770b335a203e233b57127fde1c839eAndy McFadden * Layer is first referenced.
54882e3a39ed770b335a203e233b57127fde1c839eAndy McFadden *
55882e3a39ed770b335a203e233b57127fde1c839eAndy McFadden * This also implements onFrameAvailable(), which notifies SurfaceFlinger
56882e3a39ed770b335a203e233b57127fde1c839eAndy McFadden * that new data has arrived.
57882e3a39ed770b335a203e233b57127fde1c839eAndy McFadden */
58a4a3149a36bc69a06e4824aeae909ab910661070Igor Murashkinclass Layer : public LayerBaseClient,
59bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden              public SurfaceFlingerConsumer::FrameAvailableListener
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
61d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopianpublic:
62882e3a39ed770b335a203e233b57127fde1c839eAndy McFadden    Layer(SurfaceFlinger* flinger, const sp<Client>& client);
63b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    virtual ~Layer();
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
65b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    virtual const char* getTypeId() const { return "Layer"; }
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
67b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // the this layer's size and format
68cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    status_t setBuffers(uint32_t w, uint32_t h,
69cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian            PixelFormat format, uint32_t flags=0);
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
71a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian    bool isFixedSize() const;
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
73b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // LayerBase interface
744297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian    virtual void setGeometry(const sp<const DisplayDevice>& hw,
754fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian            HWComposer::HWCLayerInterface& layer);
764297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian    virtual void setPerFrameData(const sp<const DisplayDevice>& hw,
77d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian            HWComposer::HWCLayerInterface& layer);
784297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian    virtual void setAcquireFence(const sp<const DisplayDevice>& hw,
79d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian            HWComposer::HWCLayerInterface& layer);
804297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian    virtual void onLayerDisplayed(const sp<const DisplayDevice>& hw,
81d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian            HWComposer::HWCLayerInterface* layer);
82d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    virtual bool onPreComposition();
83d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian    virtual void onPostComposition();
844fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian
854297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian    virtual void onDraw(const sp<const DisplayDevice>& hw, const Region& clip) const;
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual uint32_t doTransaction(uint32_t transactionFlags);
874fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian    virtual Region latchBuffer(bool& recomputeVisibleRegions);
88a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    virtual bool isOpaque() const;
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual bool isSecure() const           { return mSecure; }
907a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    virtual bool isProtected() const;
91d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian    virtual void onRemoved();
92fb4d5d5726c172adbe62341d99a2148685a98379Mathias Agopian    virtual sp<Layer> getLayer() const { return const_cast<Layer*>(this); }
93a249f2d11249ff37c48119020b797ad437ddef2cJamie Gennis    virtual void setName(const String8& name);
94da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian    virtual bool isVisible() const;
95b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
96582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis    // LayerBaseClient interface
97582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis    virtual wp<IBinder> getSurfaceTextureBinder() const;
98582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis
99cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    // only for debugging
100fb4d5d5726c172adbe62341d99a2148685a98379Mathias Agopian    inline const sp<GraphicBuffer>& getActiveBuffer() const { return mActiveBuffer; }
1011b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
102bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    // Updates the transform hint in our SurfaceFlingerConsumer to match
1038430095879d2fa6878e68f8f12da4e704815ac09Mathias Agopian    // the current orientation of the display device.
1048430095879d2fa6878e68f8f12da4e704815ac09Mathias Agopian    virtual void updateTransformHint(const sp<const DisplayDevice>& hw) const;
1056905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden
1061b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianprotected:
107a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    virtual void onFirstRef();
1081b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    virtual void dump(String8& result, char* scratch, size_t size) const;
10982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    virtual void dumpStats(String8& result, char* buffer, size_t SIZE) const;
11025e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian    virtual void clearStats();
1111b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
113882e3a39ed770b335a203e233b57127fde1c839eAndy McFadden    // Creates an instance of ISurface for this Layer.
114a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    virtual sp<ISurface> createSurface();
115882e3a39ed770b335a203e233b57127fde1c839eAndy McFadden
1163330b203039dea366d4981db1408a460134b2d2cMathias Agopian    uint32_t getEffectiveUsage(uint32_t usage) const;
117a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    bool isCropped() const;
118f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    Rect computeBufferCrop() const;
119a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    static bool getOpacityForFormat(uint32_t format);
120b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
121bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    // Interface implementation for SurfaceFlingerConsumer::FrameAvailableListener
122a4a3149a36bc69a06e4824aeae909ab910661070Igor Murashkin    virtual void onFrameAvailable();
123a4a3149a36bc69a06e4824aeae909ab910661070Igor Murashkin
124b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // -----------------------------------------------------------------------
125b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
126a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // constants
127bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden    sp<SurfaceFlingerConsumer> mSurfaceFlingerConsumer;
128a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    GLuint mTextureName;
129b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
130b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // thread-safe
131a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    volatile int32_t mQueuedFrames;
1324b0eba949cc026ffb2c75313042d8a7bcb3fcf86Jamie Gennis    FrameTracker mFrameTracker;
133a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
134a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // main thread
135a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    sp<GraphicBuffer> mActiveBuffer;
136a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    Rect mCurrentCrop;
137a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    uint32_t mCurrentTransform;
138933389f75814bb62e8153528f9cff2cb329b77dfMathias Agopian    uint32_t mCurrentScalingMode;
139a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    bool mCurrentOpacity;
1404d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian    bool mRefreshPending;
141e8696a40e09b24b634214684d18526187b316a2fJamie Gennis    bool mFrameLatencyNeeded;
142b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
143b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // constants
144b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    PixelFormat mFormat;
1451f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    const GLExtensions& mGLExtensions;
146a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    bool mOpaqueLayer;
147b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
148b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // page-flip thread (currently main thread)
14916f0453fee84c6aad59fe0d1c7d36f061d46cffcGlenn Kasten    bool mSecure;         // no screenshots
15016f0453fee84c6aad59fe0d1c7d36f061d46cffcGlenn Kasten    bool mProtectedByApp; // application requires protected path to external sink
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_LAYER_H
158