Layer.h revision a402c4c9913cfbc6c3da21719c57a93a11f091f0
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef ANDROID_LAYER_H
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define ANDROID_LAYER_H
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h>
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h>
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <gui/SurfaceTexture.h>
24ebf9a0d8a888042c16ec0cb6dd8419f18038663fMike Lockwood
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <pixelflinger/pixelflinger.h>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/GraphicBuffer.h>
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/PixelFormat.h>
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <EGL/egl.h>
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <EGL/eglext.h>
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <GLES/gl.h>
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <GLES/glext.h>
33ebf9a0d8a888042c16ec0cb6dd8419f18038663fMike Lockwood
348335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian#include "LayerBase.h"
358335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian#include "SurfaceTextureLayer.h"
368335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian#include "Transform.h"
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian// ---------------------------------------------------------------------------
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass Client;
43627e7b50be41e4fdee758a1bfad3a55de56b4e27Mathias Agopianclass GLExtensions;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------
46bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass Layer : public LayerBaseClient
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Layer(SurfaceFlinger* flinger, DisplayID display,
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    const sp<Client>& client);
52bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual ~Layer();
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual const char* getTypeId() const { return "Layer"; }
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // the this layer's size and format
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t setBuffers(uint32_t w, uint32_t h,
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            PixelFormat format, uint32_t flags=0);
60a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian
61a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian    bool isFixedSize() const;
62a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian
63a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian    // LayerBase interface
64a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian    virtual void setGeometry(hwc_layer_t* hwcl);
65a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian    virtual void setPerFrameData(hwc_layer_t* hwcl);
66a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian    virtual void onDraw(const Region& clip) const;
67a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian    virtual uint32_t doTransaction(uint32_t transactionFlags);
68a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian    virtual void lockPageFlip(bool& recomputeVisibleRegions);
69a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian    virtual void unlockPageFlip(const Transform& planeTransform, Region& outDirtyRegion);
70a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian    virtual bool isOpaque() const;
71a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian    virtual bool needsDithering() const     { return mNeedsDithering; }
72a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian    virtual bool isSecure() const           { return mSecure; }
73a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian    virtual bool isProtected() const;
74d3782b26b2026e60a8e0d4b967a156369f2a46f8Kevin Hester    virtual void onRemoved();
75083b84cf8880bb7f0d2c2dc1b45c7d610656dbd1Jesse Hall    virtual sp<Layer> getLayer() const { return const_cast<Layer*>(this); }
76ebf9a0d8a888042c16ec0cb6dd8419f18038663fMike Lockwood    virtual void setName(const String8& name);
77a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian
78a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian    // LayerBaseClient interface
79a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian    virtual wp<IBinder> getSurfaceTextureBinder() const;
80a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian
81a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian    // only for debugging
82a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian    inline const sp<GraphicBuffer>& getActiveBuffer() const { return mActiveBuffer; }
83a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopian
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprotected:
850c1eeb3c8ab53954218d3b8f4be08ff21be3e985Mykola Kondratenko    virtual void onFirstRef();
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void dump(String8& result, char* scratch, size_t size) const;
87ebf9a0d8a888042c16ec0cb6dd8419f18038663fMike Lockwood
88a8826d67097b12cf9d6b14a7e32c0862f17b189aMathias Agopianprivate:
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    friend class SurfaceTextureLayer;
90d3782b26b2026e60a8e0d4b967a156369f2a46f8Kevin Hester    void onFrameQueued();
91d3782b26b2026e60a8e0d4b967a156369f2a46f8Kevin Hester    virtual sp<ISurface> createSurface();
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t getEffectiveUsage(uint32_t usage) const;
93ebf9a0d8a888042c16ec0cb6dd8419f18038663fMike Lockwood    uint32_t getTransformHint() const;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool isCropped() const;
95b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian    static bool getOpacityForFormat(uint32_t format);
96b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian
97b2cf954cb47a73065aa4b7fed753877615614f41Mathias Agopian    // -----------------------------------------------------------------------
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // constants
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<SurfaceTextureLayer> mSurfaceTexture;
10117f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    GLuint mTextureName;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
103afd31e08299008fdc5c2813f21b2573f29dc53dfNarayan Kamath    // thread-safe
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    volatile int32_t mQueuedFrames;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // main thread
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<GraphicBuffer> mActiveBuffer;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLfloat mTextureMatrix[16];
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Rect mCurrentCrop;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t mCurrentTransform;
111    uint32_t mCurrentScalingMode;
112    bool mCurrentOpacity;
113
114    // constants
115    PixelFormat mFormat;
116    const GLExtensions& mGLExtensions;
117    bool mOpaqueLayer;
118    bool mNeedsDithering;
119
120    // page-flip thread (currently main thread)
121    bool mSecure;         // no screenshots
122    bool mProtectedByApp; // application requires protected path to external sink
123    Region mPostedDirtyRegion;
124
125    // binder thread, transaction thread
126    mutable Mutex mLock;
127};
128
129// ---------------------------------------------------------------------------
130
131}; // namespace android
132
133#endif // ANDROID_LAYER_H
134