1 /*
2 // Copyright (c) 2014 Intel Corporation 
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 #ifndef HWC_LAYER_H
17 #define HWC_LAYER_H
18 
19 #include <hardware/hwcomposer.h>
20 #include <DisplayPlane.h>
21 #include <utils/Vector.h>
22 
23 //#define HWC_TRACE_FPS
24 
25 namespace android {
26 namespace intel {
27 
28 enum {
29     LAYER_STATIC_THRESHOLD = 10,
30 };
31 
32 class HwcLayer {
33 public:
34     enum {
35         // LAYER_FB layers are marked as HWC_FRAMEBUFFER.
36         // And a LAYER_FB can become HWC_OVERLAY layers during
37         // revisiting layer list.
38         LAYER_FB = 0,
39         // LAYER_FORCE_FB layers are marked as HWC_FRAMEBUFFER.
40         // And a LAYER_FORCE_FB can never become HWC_OVERLAY layers during
41         // revisiting layer list.
42         LAYER_FORCE_FB,
43         // LAYER_OVERLAY layers are marked as HWC_OVERLAY
44         LAYER_OVERLAY,
45         // LAYER_SKIPPED layers are marked as HWC_OVERLAY with no plane attached
46         LAYER_SKIPPED,
47         // LAYER_FRAMEBUFFER_TARGET layers are marked as HWC_FRAMEBUFFER_TARGET
48         LAYER_FRAMEBUFFER_TARGET,
49         // LAYER_SIDEBAND layers have alternate path bypassing HWC after setup
50         LAYER_SIDEBAND,
51         // LAYER_CURSOR_OVERLAY layers support hardware cursor planes
52         LAYER_CURSOR_OVERLAY,
53     };
54 
55     enum {
56         LAYER_PRIORITY_OVERLAY = 0x60000000UL,
57         LAYER_PRIORITY_PROTECTED = 0x70000000UL,
58         LAYER_PRIORITY_SIZE_OFFSET = 4,
59     };
60 public:
61     HwcLayer(int index, hwc_layer_1_t *layer);
62     virtual ~HwcLayer();
63 
64     // plane operations
65     bool attachPlane(DisplayPlane *plane, int device);
66     DisplayPlane* detachPlane();
67 
68     void setType(uint32_t type);
69     uint32_t getType() const;
70     int32_t getCompositionType() const;
71     void setCompositionType(int32_t type);
72 
73     int getIndex() const;
74     int getZOrder() const;
75     uint32_t getFormat() const;
76     uint32_t getBufferWidth() const;
77     uint32_t getBufferHeight() const;
78     const stride_t& getBufferStride() const;
79     uint32_t getUsage() const;
80     buffer_handle_t getHandle() const;
81     uint32_t getTransform() const;
82     bool isProtected() const;
83     hwc_layer_1_t* getLayer() const;
84     DisplayPlane* getPlane() const;
85 
86     void setPriority(uint32_t priority);
87     uint32_t getPriority() const;
88 
89     bool update(hwc_layer_1_t *layer);
90     void postFlip();
91     bool isUpdated();
92     uint32_t getStaticCount();
93 
94 public:
95     // temporary solution for plane assignment
96     bool mPlaneCandidate;
97 
98 private:
99     void setupAttributes();
100 
101 private:
102     const int mIndex;
103     int mZOrder;
104     int mDevice;
105     hwc_layer_1_t *mLayer;
106     DisplayPlane *mPlane;
107     uint32_t mFormat;
108     uint32_t mWidth;
109     uint32_t mHeight;
110     stride_t mStride;
111     uint32_t mUsage;
112     buffer_handle_t mHandle;
113     bool mIsProtected;
114     uint32_t mType;
115     uint32_t mPriority;
116     uint32_t mTransform;
117 
118     // for smart composition
119     hwc_frect_t mSourceCropf;
120     hwc_rect_t mDisplayFrame;
121     uint32_t mStaticCount;
122     bool mUpdated;
123 
124 #ifdef HWC_TRACE_FPS
125     // for frame per second trace
126     bool mTraceFps;
127     buffer_handle_t mLastHandle;
128     Vector<uint64_t>  mFrames;
129 #endif
130 };
131 
132 
133 } // namespace intel
134 } // namespace android
135 
136 
137 #endif /* HWC_LAYER_H */
138