1ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/*
2ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Copyright (C) 2012-2013, The Linux Foundation. All rights reserved.
3ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *
4ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Not a Contribution, Apache license notifications and license are retained
5ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * for attribution purposes only.
6ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *
7ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Licensed under the Apache License, Version 2.0 (the "License");
8ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * you may not use this file except in compliance with the License.
9ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * You may obtain a copy of the License at
10ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *
11ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *      http://www.apache.org/licenses/LICENSE-2.0
12ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *
13ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Unless required by applicable law or agreed to in writing, software
14ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * distributed under the License is distributed on an "AS IS" BASIS,
15ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * See the License for the specific language governing permissions and
17ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * limitations under the License.
18ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson */
19ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
20ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#ifndef HWC_MDP_COMP
21ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define HWC_MDP_COMP
22ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
23ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <hwc_utils.h>
24ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <idle_invalidator.h>
25ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <cutils/properties.h>
26ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <overlay.h>
27ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
28a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#define DEFAULT_IDLE_TIME 70
29ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define MAX_PIPES_PER_MIXER 4
30ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
31ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonnamespace overlay {
32ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonclass Rotator;
33ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
34ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
35ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonnamespace qhwc {
36ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonnamespace ovutils = overlay::utils;
37ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
38ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonclass MDPComp {
39ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonpublic:
40ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    explicit MDPComp(int);
41ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    virtual ~MDPComp(){};
42ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /*sets up mdp comp for the current frame */
43ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list);
44ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* draw */
45ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    virtual bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list) = 0;
4644d388cf974016f159e1fb6bbb0173c1ca87b9c9Raj Kamal    //Reset values
4744d388cf974016f159e1fb6bbb0173c1ca87b9c9Raj Kamal    void reset();
48ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* dumpsys */
49463feeb515f0cc7454eac70ae8bb96df4b852a38Jeykumar Sankaran    void dump(android::String8& buf, hwc_context_t *ctx);
50a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    bool isGLESOnlyComp() { return (mCurrentFrame.mdpCount == 0); }
5180cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan    int drawOverlap(hwc_context_t *ctx, hwc_display_contents_1_t* list);
52a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    static MDPComp* getObject(hwc_context_t *ctx, const int& dpy);
53ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* Handler to invoke frame redraw on Idle Timer expiry */
54ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    static void timeout_handler(void *udata);
55ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* Initialize MDP comp*/
56ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    static bool init(hwc_context_t *ctx);
57ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    static void resetIdleFallBack() { sIdleFallBack = false; }
581b0c2f1b1c7201502f75c12131e3bc54f92d60eaRamkumar Radhakrishnan    static bool isIdleFallback() { return sIdleFallBack; }
59000cb84f08ff7034094a16e9514a67c9bc470c0cNaseer Ahmed    static void dynamicDebug(bool enable){ sDebugLogs = enable; }
60ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
61ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonprotected:
62ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    enum { MAX_SEC_LAYERS = 1 }; //TODO add property support
63ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
64ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    enum ePipeType {
65ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        MDPCOMP_OV_RGB = ovutils::OV_MDP_PIPE_RGB,
66ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        MDPCOMP_OV_VG = ovutils::OV_MDP_PIPE_VG,
67ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        MDPCOMP_OV_DMA = ovutils::OV_MDP_PIPE_DMA,
68ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        MDPCOMP_OV_ANY,
69ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    };
70ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
71484b141e59f02304121b7da45a04ef722a97c294Jeykumar Sankaran    //Simulation flags
72484b141e59f02304121b7da45a04ef722a97c294Jeykumar Sankaran    enum {
73484b141e59f02304121b7da45a04ef722a97c294Jeykumar Sankaran        MDPCOMP_AVOID_FULL_MDP = 0x001,
74484b141e59f02304121b7da45a04ef722a97c294Jeykumar Sankaran        MDPCOMP_AVOID_CACHE_MDP = 0x002,
75484b141e59f02304121b7da45a04ef722a97c294Jeykumar Sankaran        MDPCOMP_AVOID_LOAD_MDP = 0x004,
76484b141e59f02304121b7da45a04ef722a97c294Jeykumar Sankaran        MDPCOMP_AVOID_VIDEO_ONLY = 0x008,
77484b141e59f02304121b7da45a04ef722a97c294Jeykumar Sankaran    };
78484b141e59f02304121b7da45a04ef722a97c294Jeykumar Sankaran
79ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* mdp pipe data */
80ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    struct MdpPipeInfo {
81ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        int zOrder;
82ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        virtual ~MdpPipeInfo(){};
83ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    };
84ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
85a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    struct MdpYUVPipeInfo : public MdpPipeInfo{
86a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        ovutils::eDest lIndex;
87a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        ovutils::eDest rIndex;
88a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        virtual ~MdpYUVPipeInfo(){};
89a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    };
90a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
91ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* per layer data */
92ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    struct PipeLayerPair {
93ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        MdpPipeInfo *pipeInfo;
94ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        overlay::Rotator* rot;
95ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        int listIndex;
96ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    };
97ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
98ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* per frame data */
99ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    struct FrameInfo {
100ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        /* maps layer list to mdp list */
101ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        int layerCount;
102ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        int layerToMDP[MAX_NUM_APP_LAYERS];
103ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
104ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        /* maps mdp list to layer list */
105ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        int mdpCount;
106ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        struct PipeLayerPair mdpToLayer[MAX_PIPES_PER_MIXER];
107ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
108ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        /* layer composing on FB? */
109ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        int fbCount;
110ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        bool isFBComposed[MAX_NUM_APP_LAYERS];
111a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        /* layers lying outside ROI. Will
112a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson         * be dropped off from the composition */
113a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        int dropCount;
114a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        bool drop[MAX_NUM_APP_LAYERS];
115ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
116ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        bool needsRedraw;
117ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        int fbZ;
118ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
119ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        /* c'tor */
120ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        FrameInfo();
121ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        /* clear old frame data */
122ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        void reset(const int& numLayers);
123ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        void map();
124ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    };
125ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
126ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* cached data */
127ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    struct LayerCache {
128ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        int layerCount;
129ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        buffer_handle_t hnd[MAX_NUM_APP_LAYERS];
130a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        bool isFBComposed[MAX_NUM_APP_LAYERS];
131a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        bool drop[MAX_NUM_APP_LAYERS];
132ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
133ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        /* c'tor */
134ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        LayerCache();
135ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        /* clear caching info*/
136ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        void reset();
137ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        void cacheAll(hwc_display_contents_1_t* list);
138ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        void updateCounts(const FrameInfo&);
139a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        bool isSameFrame(const FrameInfo& curFrame,
140a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                         hwc_display_contents_1_t* list);
141ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    };
142ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
143ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* allocates pipe from pipe book */
144ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    virtual bool allocLayerPipes(hwc_context_t *ctx,
145ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                                 hwc_display_contents_1_t* list) = 0;
146ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* configures MPD pipes */
147ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
148ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                          PipeLayerPair& pipeLayerPair) = 0;
149a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    /* Increments mdpCount if 4k2k yuv layer split is enabled.
150a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson     * updates framebuffer z order if fb lies above source-split layer */
151a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    virtual void adjustForSourceSplit(hwc_context_t *ctx,
152ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            hwc_display_contents_1_t* list) = 0;
153a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    /* configures 4kx2k yuv layer*/
154a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    virtual int configure4k2kYuv(hwc_context_t *ctx, hwc_layer_1_t *layer,
155a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            PipeLayerPair& PipeLayerPair) = 0;
1566f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran    /* generates ROI based on the modified area of the frame */
1576f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran    virtual void generateROI(hwc_context_t *ctx,
1586f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran            hwc_display_contents_1_t* list) = 0;
1596f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran    /* validates the ROI generated for fallback conditions */
1606f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran    virtual bool validateAndApplyROI(hwc_context_t *ctx,
1616f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran            hwc_display_contents_1_t* list) = 0;
1626f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran    /* Trims fbRect calculated against ROI generated */
1636f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran    virtual void trimAgainstROI(hwc_context_t *ctx, hwc_rect_t& fbRect) = 0;
1646f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran
16553b0b5fcf40f174642b0a58cba91b5479d31fe91Jeykumar Sankaran    /* set/reset flags for MDPComp */
16653b0b5fcf40f174642b0a58cba91b5479d31fe91Jeykumar Sankaran    void setMDPCompLayerFlags(hwc_context_t *ctx,
16753b0b5fcf40f174642b0a58cba91b5479d31fe91Jeykumar Sankaran                              hwc_display_contents_1_t* list);
168a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    void setRedraw(hwc_context_t *ctx,
169a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            hwc_display_contents_1_t* list);
170ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* checks for conditions where mdpcomp is not possible */
171ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    bool isFrameDoable(hwc_context_t *ctx);
172ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* checks for conditions where RGB layers cannot be bypassed */
173a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    bool tryFullFrame(hwc_context_t *ctx, hwc_display_contents_1_t* list);
174ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* checks if full MDP comp can be done */
175ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    bool fullMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list);
17680cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan    /* Full MDP Composition with Peripheral Tiny Overlap Removal */
17780cd536400045e5625ed89af9b297800d69d7b89Sushil Chauhan    bool fullMDPCompWithPTOR(hwc_context_t *ctx,hwc_display_contents_1_t* list);
178ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* check if we can use layer cache to do at least partial MDP comp */
179ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    bool partialMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list);
180ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* Partial MDP comp that uses caching to save power as primary goal */
181ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    bool cacheBasedComp(hwc_context_t *ctx, hwc_display_contents_1_t* list);
182a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    /* Partial MDP comp that balances the load between MDP and GPU such that
183a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson     * MDP is loaded to the max of its capacity. The lower z order layers are
184a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson     * fed to MDP, whereas the upper ones to GPU, because the upper ones have
185a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson     * lower number of pixels and can reduce GPU processing time */
186ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    bool loadBasedComp(hwc_context_t *ctx, hwc_display_contents_1_t* list);
187ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* Checks if its worth doing load based partial comp */
188a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    bool isLoadBasedCompDoable(hwc_context_t *ctx);
189ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* checks for conditions where only video can be bypassed */
190a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    bool tryVideoOnly(hwc_context_t *ctx, hwc_display_contents_1_t* list);
191a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    bool videoOnlyComp(hwc_context_t *ctx, hwc_display_contents_1_t* list,
192a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            bool secureOnly);
193ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* checks for conditions where YUV layers cannot be bypassed */
194ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    bool isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer);
195a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    /* checks if MDP/MDSS can process current list w.r.to HW limitations
196a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson     * All peculiar HW limitations should go here */
197a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    bool hwLimitationsCheck(hwc_context_t* ctx, hwc_display_contents_1_t* list);
198ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* Is debug enabled */
199ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    static bool isDebug() { return sDebugLogs ? true : false; };
200ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* Is feature enabled */
201ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    static bool isEnabled() { return sEnabled; };
202ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* checks for mdp comp dimension limitation */
203ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    bool isValidDimension(hwc_context_t *ctx, hwc_layer_1_t *layer);
204ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* tracks non updating layers*/
205ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void updateLayerCache(hwc_context_t* ctx, hwc_display_contents_1_t* list);
206ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* optimize layers for mdp comp*/
207a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    bool markLayersForCaching(hwc_context_t* ctx,
208a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            hwc_display_contents_1_t* list);
209a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    int getBatch(hwc_display_contents_1_t* list,
210a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            int& maxBatchStart, int& maxBatchEnd,
211a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            int& maxBatchCount);
212a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    bool canPushBatchToTop(const hwc_display_contents_1_t* list,
213a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            int fromIndex, int toIndex);
214a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    bool intersectingUpdatingLayers(const hwc_display_contents_1_t* list,
215a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            int fromIndex, int toIndex, int targetLayerIndex);
216a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
217a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        /* updates cache map with YUV info */
218a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    void updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list,
219a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            bool secureOnly);
220a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    /* Validates if the GPU/MDP layer split chosen by a strategy is supported
221a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson     * by MDP.
222a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson     * Sets up MDP comp data structures to reflect covnversion from layers to
223a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson     * overlay pipes.
224a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson     * Configures overlay.
225a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson     * Configures if GPU should redraw.
226a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson     */
227a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    bool postHeuristicsHandling(hwc_context_t *ctx,
228a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            hwc_display_contents_1_t* list);
229a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    void reset(hwc_context_t *ctx);
230ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    bool isSupportedForMDPComp(hwc_context_t *ctx, hwc_layer_1_t* layer);
2314a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan    bool resourceCheck(hwc_context_t* ctx, hwc_display_contents_1_t* list);
2326f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran    hwc_rect_t getUpdatingFBRect(hwc_context_t *ctx,
2336f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran            hwc_display_contents_1_t* list);
2346f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran    /* checks for conditions to enable partial udpate */
2356f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran    bool canPartialUpdate(hwc_context_t *ctx, hwc_display_contents_1_t* list);
236ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
237ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int mDpy;
238ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    static bool sEnabled;
239ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    static bool sEnableMixedMode;
240484b141e59f02304121b7da45a04ef722a97c294Jeykumar Sankaran    static int sSimulationFlags;
241ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    static bool sDebugLogs;
242ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    static bool sIdleFallBack;
243a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    /* Handles the timeout event from kernel, if the value is set to true */
244a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    static bool sHandleTimeout;
245ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    static int sMaxPipesPerMixer;
246ef898e19da9a67d99c50376af694877e2c87b5e6Manoj Kumar AVM    static bool sSrcSplitEnabled;
247ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    static IdleInvalidator *idleInvalidator;
248ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    struct FrameInfo mCurrentFrame;
249ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    struct LayerCache mCachedFrame;
250a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    //Enable 4kx2k yuv layer split
251a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    static bool sEnable4k2kYUVSplit;
25244d388cf974016f159e1fb6bbb0173c1ca87b9c9Raj Kamal    bool mModeOn; // if prepare happened
253a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    bool allocSplitVGPipesfor4k2k(hwc_context_t *ctx, int index);
254ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
255ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
256a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonclass MDPCompNonSplit : public MDPComp {
257ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonpublic:
258a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    explicit MDPCompNonSplit(int dpy):MDPComp(dpy){};
259a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    virtual ~MDPCompNonSplit(){};
260ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    virtual bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list);
261ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
262ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonprivate:
263a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    struct MdpPipeInfoNonSplit : public MdpPipeInfo {
264ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        ovutils::eDest index;
265a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        virtual ~MdpPipeInfoNonSplit() {};
266ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    };
267ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
268ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* configure's overlay pipes for the frame */
269ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
270ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                          PipeLayerPair& pipeLayerPair);
271ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
272ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* allocates pipes to selected candidates */
273ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    virtual bool allocLayerPipes(hwc_context_t *ctx,
274ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                                 hwc_display_contents_1_t* list);
275ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
276a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    /* Increments mdpCount if 4k2k yuv layer split is enabled.
277a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson     * updates framebuffer z order if fb lies above source-split layer */
278a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    virtual void adjustForSourceSplit(hwc_context_t *ctx,
279ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            hwc_display_contents_1_t* list);
280a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
281a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    /* configures 4kx2k yuv layer to 2 VG pipes*/
282a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    virtual int configure4k2kYuv(hwc_context_t *ctx, hwc_layer_1_t *layer,
283a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            PipeLayerPair& PipeLayerPair);
2846f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran    /* generates ROI based on the modified area of the frame */
2856f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran    virtual void generateROI(hwc_context_t *ctx,
2866f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran            hwc_display_contents_1_t* list);
2876f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran    /* validates the ROI generated for fallback conditions */
2886f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran    virtual bool validateAndApplyROI(hwc_context_t *ctx,
2896f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran            hwc_display_contents_1_t* list);
2906f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran    /* Trims fbRect calculated against ROI generated */
2916f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran    virtual void trimAgainstROI(hwc_context_t *ctx, hwc_rect_t& fbRect);
292ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
293ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
294a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonclass MDPCompSplit : public MDPComp {
295ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonpublic:
296a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    explicit MDPCompSplit(int dpy):MDPComp(dpy){};
297a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    virtual ~MDPCompSplit(){};
298ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    virtual bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list);
299a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
300a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonprotected:
301a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    struct MdpPipeInfoSplit : public MdpPipeInfo {
302ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        ovutils::eDest lIndex;
303ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        ovutils::eDest rIndex;
304a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        virtual ~MdpPipeInfoSplit() {};
305ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    };
306ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
307a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    virtual bool acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer,
308a83d776f160d90db1cb5df28a793f4f06a93f020Saurabh Shah                         MdpPipeInfoSplit& pipe_info);
309ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
310ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* configure's overlay pipes for the frame */
311ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
312ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                          PipeLayerPair& pipeLayerPair);
313ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
314ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* allocates pipes to selected candidates */
315ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    virtual bool allocLayerPipes(hwc_context_t *ctx,
316ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                                 hwc_display_contents_1_t* list);
317a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonprivate:
318a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    /* Increments mdpCount if 4k2k yuv layer split is enabled.
319a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson     * updates framebuffer z order if fb lies above source-split layer */
320a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    virtual void adjustForSourceSplit(hwc_context_t *ctx,
321a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            hwc_display_contents_1_t* list);
322a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
323a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    /* configures 4kx2k yuv layer*/
324a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    virtual int configure4k2kYuv(hwc_context_t *ctx, hwc_layer_1_t *layer,
325a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            PipeLayerPair& PipeLayerPair);
3266f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran    /* generates ROI based on the modified area of the frame */
3276f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran    virtual void generateROI(hwc_context_t *ctx,
3286f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran            hwc_display_contents_1_t* list);
3296f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran    /* validates the ROI generated for fallback conditions */
3306f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran    virtual bool validateAndApplyROI(hwc_context_t *ctx,
3316f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran            hwc_display_contents_1_t* list);
3326f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran    /* Trims fbRect calculated against ROI generated */
3336f7634666209698e4835b9f326278a7068834383Jeykumar Sankaran    virtual void trimAgainstROI(hwc_context_t *ctx, hwc_rect_t& fbRect);
334a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson};
335a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
336a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonclass MDPCompSrcSplit : public MDPCompSplit {
337a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonpublic:
338a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    explicit MDPCompSrcSplit(int dpy) : MDPCompSplit(dpy){};
339a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    virtual ~MDPCompSrcSplit(){};
340a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonprivate:
341a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    virtual bool acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer,
342a83d776f160d90db1cb5df28a793f4f06a93f020Saurabh Shah            MdpPipeInfoSplit& pipe_info);
343a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
344a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
345a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            PipeLayerPair& pipeLayerPair);
346ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson};
347ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
348ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}; //namespace
349ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#endif
350