1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  * Copyright (C) 2012, The Linux Foundation. All rights reserved.
4  *
5  * Not a Contribution, Apache license notifications and license are
6  * retained for attribution purposes only.
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  */
20 #ifndef HWC_FBUPDATE_H
21 #define HWC_FBUPDATE_H
22 #include "hwc_utils.h"
23 #include "overlay.h"
24 
25 #define LIKELY( exp )       (__builtin_expect( (exp) != 0, true  ))
26 #define UNLIKELY( exp )     (__builtin_expect( (exp) != 0, false ))
27 
28 namespace qhwc {
29 namespace ovutils = overlay::utils;
30 
31 //Framebuffer update Interface
32 class IFBUpdate {
33 public:
IFBUpdate(const int & dpy)34     explicit IFBUpdate(const int& dpy) : mDpy(dpy) {}
~IFBUpdate()35     virtual ~IFBUpdate() {};
36     // Sets up members and prepares overlay if conditions are met
37     virtual bool prepare(hwc_context_t *ctx, hwc_display_contents_1 *list,
38                                                        int fbZorder) = 0;
39     // Draws layer
40     virtual bool draw(hwc_context_t *ctx, private_handle_t *hnd) = 0;
41     //Reset values
42     virtual void reset();
43     //Factory method that returns a low-res or high-res version
44     static IFBUpdate *getObject(const int& width, const int& rightSplit,
45             const int& dpy);
46 
47 protected:
48     const int mDpy; // display to update
49     bool mModeOn; // if prepare happened
50 };
51 
52 //Low resolution (<= 2048) panel handler.
53 class FBUpdateLowRes : public IFBUpdate {
54 public:
55     explicit FBUpdateLowRes(const int& dpy);
~FBUpdateLowRes()56     virtual ~FBUpdateLowRes() {};
57     bool prepare(hwc_context_t *ctx, hwc_display_contents_1 *list,
58             int fbZorder);
59     bool draw(hwc_context_t *ctx, private_handle_t *hnd);
60     void reset();
61 private:
62     bool configure(hwc_context_t *ctx, hwc_display_contents_1 *list,
63             int fbZorder);
64     ovutils::eDest mDest; //pipe to draw on
65 };
66 
67 //High resolution (> 2048) panel handler.
68 class FBUpdateHighRes : public IFBUpdate {
69 public:
70     explicit FBUpdateHighRes(const int& dpy);
~FBUpdateHighRes()71     virtual ~FBUpdateHighRes() {};
72     bool prepare(hwc_context_t *ctx, hwc_display_contents_1 *list,
73             int fbZorder);
74     bool draw(hwc_context_t *ctx, private_handle_t *hnd);
75     void reset();
76 private:
77     bool configure(hwc_context_t *ctx, hwc_display_contents_1 *list,
78             int fbZorder);
79     ovutils::eDest mDestLeft; //left pipe to draw on
80     ovutils::eDest mDestRight; //right pipe to draw on
81 };
82 
83 }; //namespace qhwc
84 
85 #endif //HWC_FBUPDATE_H
86