• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ANDROID_LAYER_H
18 #define ANDROID_LAYER_H
19 
20 #include <stdint.h>
21 #include <sys/types.h>
22 
23 #include <ui/GraphicBuffer.h>
24 #include <ui/PixelFormat.h>
25 #include <pixelflinger/pixelflinger.h>
26 
27 #include <EGL/egl.h>
28 #include <EGL/eglext.h>
29 #include <GLES/gl.h>
30 #include <GLES/glext.h>
31 
32 #include "LayerBase.h"
33 #include "Transform.h"
34 
35 namespace android {
36 
37 // ---------------------------------------------------------------------------
38 
39 class Client;
40 class FreezeLock;
41 
42 // ---------------------------------------------------------------------------
43 
44 const size_t NUM_BUFFERS = 2;
45 
46 class Layer : public LayerBaseClient
47 {
48 public:
49     static const uint32_t typeInfo;
50     static const char* const typeID;
getTypeID()51     virtual char const* getTypeID() const { return typeID; }
getTypeInfo()52     virtual uint32_t getTypeInfo() const { return typeInfo; }
53 
54                  Layer(SurfaceFlinger* flinger, DisplayID display,
55                          const sp<Client>& client, int32_t i);
56 
57         virtual ~Layer();
58 
59     status_t setBuffers(uint32_t w, uint32_t h,
60             PixelFormat format, uint32_t flags=0);
61 
62     void setDrawingSize(uint32_t w, uint32_t h);
63 
64     virtual void onDraw(const Region& clip) const;
65     virtual uint32_t doTransaction(uint32_t transactionFlags);
66     virtual void lockPageFlip(bool& recomputeVisibleRegions);
67     virtual void unlockPageFlip(const Transform& planeTransform, Region& outDirtyRegion);
68     virtual void finishPageFlip();
needsBlending()69     virtual bool needsBlending() const      { return mNeedsBlending; }
needsDithering()70     virtual bool needsDithering() const     { return mNeedsDithering; }
isSecure()71     virtual bool isSecure() const           { return mSecure; }
72     virtual sp<Surface> createSurface() const;
73     virtual status_t ditch();
74 
75     // only for debugging
getBuffer(int i)76     inline sp<GraphicBuffer> getBuffer(int i) { return mBuffers[i]; }
77     // only for debugging
getFreezeLock()78     inline const sp<FreezeLock>&  getFreezeLock() const { return mFreezeLock; }
79     // only for debugging
pixelFormat()80     inline PixelFormat pixelFormat() const { return mFormat; }
81 
82 private:
getFrontBufferLocked()83     inline sp<GraphicBuffer> getFrontBufferLocked() {
84         return mBuffers[mFrontBufferIndex];
85     }
86 
87     void reloadTexture(const Region& dirty);
88 
89     uint32_t getEffectiveUsage(uint32_t usage) const;
90 
91     sp<GraphicBuffer> requestBuffer(int index, int usage);
92     void destroy();
93 
94     class SurfaceLayer : public LayerBaseClient::Surface {
95     public:
96         SurfaceLayer(const sp<SurfaceFlinger>& flinger,
97                 SurfaceID id, const sp<Layer>& owner);
98         ~SurfaceLayer();
99     private:
100         virtual sp<GraphicBuffer> requestBuffer(int index, int usage);
getOwner()101         sp<Layer> getOwner() const {
102             return static_cast<Layer*>(Surface::getOwner().get());
103         }
104     };
105     friend class SurfaceLayer;
106 
107     sp<Surface>             mSurface;
108 
109             bool            mSecure;
110             bool            mNoEGLImageForSwBuffers;
111             int32_t         mFrontBufferIndex;
112             bool            mNeedsBlending;
113             bool            mNeedsDithering;
114             Region          mPostedDirtyRegion;
115             sp<FreezeLock>  mFreezeLock;
116             PixelFormat     mFormat;
117 
118             // protected by mLock
119             sp<GraphicBuffer> mBuffers[NUM_BUFFERS];
120             Texture         mTextures[NUM_BUFFERS];
121             sp<GraphicBuffer> mHybridBuffer;
122             uint32_t        mWidth;
123             uint32_t        mHeight;
124 
125    mutable Mutex mLock;
126 };
127 
128 // ---------------------------------------------------------------------------
129 
130 }; // namespace android
131 
132 #endif // ANDROID_LAYER_H
133