Layer.h revision 16f0453fee84c6aad59fe0d1c7d36f061d46cffc
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
233330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBuffer.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/pixelflinger.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
27076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <EGL/egl.h>
28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <EGL/eglext.h>
29076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <GLES/gl.h>
30076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <GLES/glext.h>
31076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "LayerBase.h"
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Transform.h"
34d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian#include "TextureManager.h"
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
401f7bec634f19c123410a5155c8d282e177c01930Mathias Agopianclass FreezeLock;
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass Client;
421f7bec634f19c123410a5155c8d282e177c01930Mathias Agopianclass GLExtensions;
43b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopianclass UserClient;
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass Layer : public LayerBaseClient
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
49d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopianpublic:
50b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian            Layer(SurfaceFlinger* flinger, DisplayID display,
51b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian                    const sp<Client>& client);
52d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian
53b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    virtual ~Layer();
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
55b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    virtual const char* getTypeId() const { return "Layer"; }
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
57b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // the this layer's size and format
58cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    status_t setBuffers(uint32_t w, uint32_t h,
59cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian            PixelFormat format, uint32_t flags=0);
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
61b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // associate a UserClient to this Layer
62b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    status_t setToken(const sp<UserClient>& uc, SharedClient* sc, int32_t idx);
63b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    int32_t getToken() const;
64579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian    sp<UserClient> getClient() const;
65b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
66b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // Set this Layer's buffers size
67a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian    void setBufferSize(uint32_t w, uint32_t h);
68a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian    bool isFixedSize() const;
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
70b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // LayerBase interface
71a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian    virtual void setGeometry(hwc_layer_t* hwcl);
72a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian    virtual void setPerFrameData(hwc_layer_t* hwcl);
7374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    virtual void drawForSreenShot() const;
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void onDraw(const Region& clip) const;
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual uint32_t doTransaction(uint32_t transactionFlags);
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void lockPageFlip(bool& recomputeVisibleRegions);
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void unlockPageFlip(const Transform& planeTransform, Region& outDirtyRegion);
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual bool needsBlending() const      { return mNeedsBlending; }
79401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian    virtual bool needsDithering() const     { return mNeedsDithering; }
80a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian    virtual bool needsFiltering() const;
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual bool isSecure() const           { return mSecure; }
8216f0453fee84c6aad59fe0d1c7d36f061d46cffcGlenn Kasten    virtual bool isProtectedByApp() const   { return mProtectedByApp; }
8316f0453fee84c6aad59fe0d1c7d36f061d46cffcGlenn Kasten    virtual bool isProtectedByDRM() const   { return mProtectedByDRM; }
84076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    virtual sp<Surface> createSurface() const;
859a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    virtual status_t ditch();
86d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian    virtual void onRemoved();
87b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
88cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    // only for debugging
89b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    inline sp<GraphicBuffer> getBuffer(int i) const {
90b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        return mBufferManager.getBuffer(i); }
91cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    // only for debugging
92b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    inline const sp<FreezeLock>&  getFreezeLock() const {
93b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        return mFreezeLock; }
941b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
951b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianprotected:
961b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    virtual void dump(String8& result, char* scratch, size_t size) const;
971b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void reloadTexture(const Region& dirty);
1003330b203039dea366d4981db1408a460134b2d2cMathias Agopian    uint32_t getEffectiveUsage(uint32_t usage) const;
101a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian    sp<GraphicBuffer> requestBuffer(int bufferIdx,
102a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian            uint32_t w, uint32_t h, uint32_t format, uint32_t usage);
103b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian    status_t setBufferCount(int bufferCount);
1040aa758d64ac530833ce9a311b164c9175a7a054cMathias Agopian
105b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // -----------------------------------------------------------------------
106b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
107cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    class SurfaceLayer : public LayerBaseClient::Surface {
108076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    public:
10996f0819f81293076e652792794a961543e6750d7Mathias Agopian        SurfaceLayer(const sp<SurfaceFlinger>& flinger, const sp<Layer>& owner);
110cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        ~SurfaceLayer();
111076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    private:
112a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian        virtual sp<GraphicBuffer> requestBuffer(int bufferIdx,
113a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian                uint32_t w, uint32_t h, uint32_t format, uint32_t usage);
114b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian        virtual status_t setBufferCount(int bufferCount);
115076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        sp<Layer> getOwner() const {
116076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            return static_cast<Layer*>(Surface::getOwner().get());
117076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        }
118076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    };
119076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    friend class SurfaceLayer;
120b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
121b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // -----------------------------------------------------------------------
122b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
123b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    class ClientRef {
124b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        ClientRef(const ClientRef& rhs);
125b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        ClientRef& operator = (const ClientRef& rhs);
126b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        mutable Mutex mLock;
127b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        // binder thread, page-flip thread
128579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian        sp<SharedBufferServer> mControlBlock;
129b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        wp<UserClient> mUserClient;
130b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        int32_t mToken;
131b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    public:
132b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        ClientRef();
133b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        ~ClientRef();
134b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        int32_t getToken() const;
135579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian        sp<UserClient> getClient() const;
136b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        status_t setToken(const sp<UserClient>& uc,
137579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian                const sp<SharedBufferServer>& sharedClient, int32_t token);
138b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        sp<UserClient> getUserClientUnsafe() const;
139b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        class Access {
140b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian            Access(const Access& rhs);
141b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian            Access& operator = (const Access& rhs);
142b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian            sp<UserClient> mUserClientStrongRef;
143579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian            sp<SharedBufferServer> mControlBlock;
144b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        public:
145b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian            Access(const ClientRef& ref);
146579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian            ~Access();
147579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian            inline SharedBufferServer* get() const { return mControlBlock.get(); }
148b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        };
149b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        friend class Access;
150b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    };
151b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
152b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // -----------------------------------------------------------------------
153b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
154b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    class BufferManager {
155b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        static const size_t NUM_BUFFERS = 2;
156b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        struct BufferData {
157b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian            sp<GraphicBuffer>   buffer;
158b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian            Image               texture;
159b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        };
160b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        // this lock protect mBufferData[].buffer but since there
161b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        // is very little contention, we have only one like for
162b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        // the whole array, we also use it to protect mNumBuffers.
163b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        mutable Mutex mLock;
164b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        BufferData          mBufferData[SharedBufferStack::NUM_BUFFER_MAX];
165b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        size_t              mNumBuffers;
166b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        Texture             mFailoverTexture;
167b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        TextureManager&     mTextureManager;
168420a283c4dc2a669c93bd5c0a2180b14f3625501Mathias Agopian        ssize_t             mActiveBufferIndex;
169420a283c4dc2a669c93bd5c0a2180b14f3625501Mathias Agopian        sp<GraphicBuffer>   mActiveBuffer;
170b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        bool                mFailover;
171b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        static status_t destroyTexture(Image* tex, EGLDisplay dpy);
172b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
173b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    public:
174b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        static size_t getDefaultBufferCount() { return NUM_BUFFERS; }
175b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        BufferManager(TextureManager& tm);
176b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        ~BufferManager();
177b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
178b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        // detach/attach buffer from/to given index
179b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        sp<GraphicBuffer> detachBuffer(size_t index);
180b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        status_t attachBuffer(size_t index, const sp<GraphicBuffer>& buffer);
181b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        // resize the number of active buffers
18254cc83e8a48c57307cdd40fe4b7e296020490095Jamie Gennis        status_t resize(size_t size, const sp<SurfaceFlinger>& flinger,
18354cc83e8a48c57307cdd40fe4b7e296020490095Jamie Gennis                EGLDisplay dpy);
184b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
185b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        // ----------------------------------------------
186b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        // must be called from GL thread
187b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
188b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        // set/get active buffer index
189b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        status_t setActiveBufferIndex(size_t index);
190b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        size_t getActiveBufferIndex() const;
191b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        // return the active buffer
192b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        sp<GraphicBuffer> getActiveBuffer() const;
193da9584dc295cc5e6d0b49a97c1e45159249d650bMathias Agopian        // return wether we have an active buffer
194da9584dc295cc5e6d0b49a97c1e45159249d650bMathias Agopian        bool hasActiveBuffer() const;
195b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        // return the active texture (or fail-over)
196b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        Texture getActiveTexture() const;
197b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        // frees resources associated with all buffers
198b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        status_t destroy(EGLDisplay dpy);
199b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        // load bitmap data into the active buffer
200b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        status_t loadTexture(const Region& dirty, const GGLSurface& t);
201b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        // make active buffer an EGLImage if needed
202b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        status_t initEglImage(EGLDisplay dpy,
203b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian                const sp<GraphicBuffer>& buffer);
204b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
205b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        // ----------------------------------------------
206b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        // only for debugging
207b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        sp<GraphicBuffer> getBuffer(size_t index) const;
208b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    };
209b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
210b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // -----------------------------------------------------------------------
211b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
212b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // thread-safe
213b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    ClientRef mUserClientRef;
214b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
215b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // constants
216b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<Surface> mSurface;
217b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    PixelFormat mFormat;
2181f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian    const GLExtensions& mGLExtensions;
219b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    bool mNeedsBlending;
220b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    bool mNeedsDithering;
221b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
222b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // page-flip thread (currently main thread)
22316f0453fee84c6aad59fe0d1c7d36f061d46cffcGlenn Kasten    bool mSecure;         // no screenshots
22416f0453fee84c6aad59fe0d1c7d36f061d46cffcGlenn Kasten    bool mProtectedByApp; // application requires protected path to external sink
22516f0453fee84c6aad59fe0d1c7d36f061d46cffcGlenn Kasten    bool mProtectedByDRM; // DRM agent requires protected path to external sink
226b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    Region mPostedDirtyRegion;
227b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
228b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // page-flip thread and transaction thread (currently main thread)
229b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<FreezeLock>  mFreezeLock;
230b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
231b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // see threading usage in declaration
232b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    TextureManager mTextureManager;
233b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    BufferManager mBufferManager;
234b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
235b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    // binder thread, transaction thread
236b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    mutable Mutex mLock;
237b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    uint32_t mWidth;
238b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    uint32_t mHeight;
239b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    uint32_t mReqWidth;
240b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    uint32_t mReqHeight;
241b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    uint32_t mReqFormat;
242733189d408e13b54fd70971b265244367efd0f51Mathias Agopian    bool mNeedsScaling;
243b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    bool mFixedSize;
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_LAYER_H
251