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