1054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*
2054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Copyright (C) 2010 The Android Open Source Project
3054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Copyright (C) 2012, The Linux Foundation. All rights reserved.
4054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *
5054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Not a Contribution, Apache license notifications and license are
6054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * retained for attribution purposes only.
7054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *
8054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Licensed under the Apache License, Version 2.0 (the "License");
9054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * you may not use this file except in compliance with the License.
10054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * You may obtain a copy of the License at
11054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *
12054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *      http://www.apache.org/licenses/LICENSE-2.0
13054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *
14054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Unless required by applicable law or agreed to in writing, software
15054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * distributed under the License is distributed on an "AS IS" BASIS,
16054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * See the License for the specific language governing permissions and
18054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * limitations under the License.
19054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin */
20054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#ifndef HWC_FBUPDATE_H
21054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define HWC_FBUPDATE_H
22054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "hwc_utils.h"
23054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include "overlay.h"
24054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
25054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define LIKELY( exp )       (__builtin_expect( (exp) != 0, true  ))
26054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define UNLIKELY( exp )     (__builtin_expect( (exp) != 0, false ))
27054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
28054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinnamespace overlay {
29054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    class Rotator;
30054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
31054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
32054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinnamespace qhwc {
33054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinnamespace ovutils = overlay::utils;
34054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
35054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin//Framebuffer update Interface
36054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinclass IFBUpdate {
37054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinpublic:
38054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    explicit IFBUpdate(hwc_context_t *ctx, const int& dpy);
39054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual ~IFBUpdate() {};
40054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // Sets up members and prepares overlay if conditions are met
41054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual bool prepare(hwc_context_t *ctx, hwc_display_contents_1 *list,
42054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            hwc_rect_t fbUpdatingRect, int fbZorder) = 0;
43054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual bool prepareAndValidate(hwc_context_t *ctx,
44054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            hwc_display_contents_1 *list, int fbZorder);
45054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    // Draws layer
46054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual bool draw(hwc_context_t *ctx, private_handle_t *hnd) = 0;
47054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    //Reset values
48054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual void reset();
49054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    //Factory method that returns a low-res or high-res version
50054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    static IFBUpdate *getObject(hwc_context_t *ctx, const int& dpy);
51054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
52054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinprotected:
53054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    const int mDpy; // display to update
54054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool mModeOn; // if prepare happened
55054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    overlay::Rotator *mRot;
56054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int mAlignedFBWidth;
57054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int mAlignedFBHeight;
58054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int mTileEnabled;
59054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin};
60054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
61054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin//Non-Split panel handler.
62054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinclass FBUpdateNonSplit : public IFBUpdate {
63054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinpublic:
64054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    explicit FBUpdateNonSplit(hwc_context_t *ctx, const int& dpy);
65054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual ~FBUpdateNonSplit() {};
66054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool prepare(hwc_context_t *ctx, hwc_display_contents_1 *list,
67054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            hwc_rect_t fbUpdatingRect, int fbZorder);
68054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool draw(hwc_context_t *ctx, private_handle_t *hnd);
69054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void reset();
70054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinprivate:
71054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool configure(hwc_context_t *ctx, hwc_display_contents_1 *list,
72054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            hwc_rect_t fbUpdatingRect, int fbZorder);
73054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool preRotateExtDisplay(hwc_context_t *ctx,
74054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                                 hwc_layer_1_t *layer,
75054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                                 ovutils::Whf &info,
76054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                                 hwc_rect_t& sourceCrop,
77054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                                 ovutils::eMdpFlags& mdpFlags,
78054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                                 int& rotFlags);
79054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ovutils::eDest mDest; //pipe to draw on
80054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin};
81054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
82054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin//Split panel handler.
83054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinclass FBUpdateSplit : public IFBUpdate {
84054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinpublic:
85054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    explicit FBUpdateSplit(hwc_context_t *ctx, const int& dpy);
86054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual ~FBUpdateSplit() {};
87054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool prepare(hwc_context_t *ctx, hwc_display_contents_1 *list,
88054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            hwc_rect_t fbUpdatingRect, int fbZorder);
89054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool draw(hwc_context_t *ctx, private_handle_t *hnd);
90054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void reset();
91054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
92054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinprotected:
93054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual bool configure(hwc_context_t *ctx, hwc_display_contents_1 *list,
94054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            hwc_rect_t fbUpdatingRect, int fbZorder);
95054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ovutils::eDest mDestLeft; //left pipe to draw on
96054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ovutils::eDest mDestRight; //right pipe to draw on
97054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin};
98054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
99054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin//Source Split Handler
100054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinclass FBSrcSplit : public FBUpdateSplit {
101054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinpublic:
102054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    explicit FBSrcSplit(hwc_context_t *ctx, const int& dpy);
103054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    virtual ~FBSrcSplit() {};
104054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinprivate:
105054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    bool configure(hwc_context_t *ctx, hwc_display_contents_1 *list,
106054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin            hwc_rect_t fbUpdatingRect, int fbZorder);
107054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin};
108054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
109054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}; //namespace qhwc
110054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
111054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif //HWC_FBUPDATE_H
112