Layer.h revision a67932fe6864ac346e7f78b86df11cf6c5344137
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
25a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <pixelflinger/pixelflinger.h>
263330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBuffer.h>
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h>
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
29076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <EGL/egl.h>
30076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <EGL/eglext.h>
31076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <GLES/gl.h>
32076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <GLES/glext.h>
33076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "LayerBase.h"
35a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include "SurfaceTextureLayer.h"
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Transform.h"
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
421f7bec634f19c123410a5155c8d282e177c01930Mathias Agopianclass FreezeLock;
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass Client;
441f7bec634f19c123410a5155c8d282e177c01930Mathias Agopianclass GLExtensions;
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass Layer : public LayerBaseClient
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
50d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopianpublic:
51b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian            Layer(SurfaceFlinger* flinger, DisplayID display,
52b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian                    const sp<Client>& client);
53d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian
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
62b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // Set this Layer's buffers size
63a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian    bool isFixedSize() const;
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
65b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // LayerBase interface
66a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian    virtual void setGeometry(hwc_layer_t* hwcl);
67a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian    virtual void setPerFrameData(hwc_layer_t* hwcl);
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void onDraw(const Region& clip) const;
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual uint32_t doTransaction(uint32_t transactionFlags);
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void lockPageFlip(bool& recomputeVisibleRegions);
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void unlockPageFlip(const Transform& planeTransform, Region& outDirtyRegion);
72a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    virtual bool isOpaque() const;
73401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian    virtual bool needsDithering() const     { return mNeedsDithering; }
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual bool isSecure() const           { return mSecure; }
757a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    virtual bool isProtected() const;
76d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian    virtual void onRemoved();
77b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
78cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    // only for debugging
79a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    inline const sp<FreezeLock>&  getFreezeLock() const { return mFreezeLock; }
801b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
811b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianprotected:
82ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian    virtual void destroy() const;
83a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    virtual void onFirstRef();
841b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    virtual void dump(String8& result, char* scratch, size_t size) const;
851b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
87a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    friend class SurfaceTextureLayer;
88a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    void onFrameQueued();
89a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    virtual sp<ISurface> createSurface();
903330b203039dea366d4981db1408a460134b2d2cMathias Agopian    uint32_t getEffectiveUsage(uint32_t usage) const;
91a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    void setFixedSize(bool fixedSize);
92a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    bool isCropped() const;
93a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    static bool getOpacityForFormat(uint32_t format);
94b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
95b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // -----------------------------------------------------------------------
96b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
97a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // constants
98a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    sp<SurfaceTextureLayer> mSurfaceTexture;
99a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    GLuint mTextureName;
100b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
101b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // thread-safe
102a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    volatile int32_t mQueuedFrames;
103a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
104a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    // main thread
105a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    sp<GraphicBuffer> mActiveBuffer;
106a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    GLfloat mTextureMatrix[16];
107a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    Rect mCurrentCrop;
108a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    uint32_t mCurrentTransform;
109a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    bool mCurrentOpacity;
110b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
111b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // constants
112b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    PixelFormat mFormat;
1131f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    const GLExtensions& mGLExtensions;
114a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    bool mOpaqueLayer;
115b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    bool mNeedsDithering;
116b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
117b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // page-flip thread (currently main thread)
11816f0453fee84c6aad59fe0d1c7d36f061d46cffcGlenn Kasten    bool mSecure;         // no screenshots
11916f0453fee84c6aad59fe0d1c7d36f061d46cffcGlenn Kasten    bool mProtectedByApp; // application requires protected path to external sink
120b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    Region mPostedDirtyRegion;
121b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
122b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // page-flip thread and transaction thread (currently main thread)
123b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<FreezeLock>  mFreezeLock;
124b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
125b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // binder thread, transaction thread
126b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    mutable Mutex mLock;
127b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    bool mFixedSize;
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_LAYER_H
135