Layer.h revision 076b1cc3a9b90aa5b381a1ed268ca0b548444c9b
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
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <private/ui/SharedState.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <private/ui/LayerState.h>
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/pixelflinger.h>
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
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
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "LayerBitmap.h"
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "LayerBase.h"
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Transform.h"
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass Client;
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass LayerBitmap;
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass MemoryDealer;
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass FreezeLock;
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
50076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianconst int NUM_BUFFERS = 2;
51076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass Layer : public LayerBaseClient
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static const uint32_t typeInfo;
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static const char* const typeID;
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual char const* getTypeID() const { return typeID; }
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual uint32_t getTypeInfo() const { return typeInfo; }
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                 Layer(SurfaceFlinger* flinger, DisplayID display,
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                         Client* c, int32_t i);
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        virtual ~Layer();
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    inline PixelFormat pixelFormat() const {
66076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return frontBuffer().getPixelFormat();
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t setBuffers(    Client* client,
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            uint32_t w, uint32_t h,
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            PixelFormat format, uint32_t flags=0);
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void onDraw(const Region& clip) const;
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void initStates(uint32_t w, uint32_t h, uint32_t flags);
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void setSizeChanged(uint32_t w, uint32_t h);
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual uint32_t doTransaction(uint32_t transactionFlags);
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual Point getPhysicalSize() const;
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void lockPageFlip(bool& recomputeVisibleRegions);
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void unlockPageFlip(const Transform& planeTransform, Region& outDirtyRegion);
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void finishPageFlip();
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual bool needsBlending() const      { return mNeedsBlending; }
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual bool isSecure() const           { return mSecure; }
83076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    virtual sp<Surface> createSurface() const;
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const LayerBitmap& getBuffer(int i) const { return mBuffers[i]; }
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project          LayerBitmap& getBuffer(int i)       { return mBuffers[i]; }
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // only for debugging
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const sp<FreezeLock>&  getFreezeLock() const { return mFreezeLock; }
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    inline const LayerBitmap&
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            frontBuffer() const { return getBuffer(mFrontBufferIndex); }
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    inline LayerBitmap&
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            frontBuffer()       { return getBuffer(mFrontBufferIndex); }
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    inline const LayerBitmap&
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            backBuffer() const  { return getBuffer(1-mFrontBufferIndex); }
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    inline LayerBitmap&
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            backBuffer()        { return getBuffer(1-mFrontBufferIndex); }
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void reloadTexture(const Region& dirty);
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t resize(int32_t index, uint32_t w, uint32_t h, const char* what);
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Region post(uint32_t* oldState, bool& recomputeVisibleRegions);
105076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    sp<SurfaceBuffer> peekBuffer();
106076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
107076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
108076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    class SurfaceLayer : public LayerBaseClient::Surface
109076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    {
110076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    public:
111076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                SurfaceLayer(SurfaceID id, const sp<Layer>& owner);
112076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
113076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    private:
114076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        virtual sp<SurfaceBuffer> getBuffer();
115076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
116076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        sp<Layer> getOwner() const {
117076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            return static_cast<Layer*>(Surface::getOwner().get());
118076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        }
119076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    };
120076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    friend class SurfaceLayer;
121076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
122076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    struct Texture {
123076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        Texture() : name(-1U), width(0), height(0), image(EGL_NO_IMAGE_KHR),
124076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            dirty(true) { }
125076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        GLuint      name;
126076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        GLuint      width;
127076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        GLuint      height;
128076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        EGLImageKHR image;
129076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        bool        dirty;
130076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    };
131076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    sp<Surface>             mSurface;
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bool            mSecure;
135076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            LayerBitmap     mBuffers[NUM_BUFFERS];
136076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            Texture         mTextures[NUM_BUFFERS];
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t         mFrontBufferIndex;
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bool            mNeedsBlending;
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bool            mResizeTransactionDone;
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            Region          mPostedDirtyRegion;
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            sp<FreezeLock>  mFreezeLock;
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_LAYER_H
149