107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani/*
207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Copyright (C) 2012-2015, The Linux Foundation. All rights reserved.
307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *
407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Not a Contribution, Apache license notifications and license are retained
507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * for attribution purposes only.
607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *
707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Licensed under the Apache License, Version 2.0 (the "License");
807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * you may not use this file except in compliance with the License.
907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * You may obtain a copy of the License at
1007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *
1107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *      http://www.apache.org/licenses/LICENSE-2.0
1207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani *
1307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Unless required by applicable law or agreed to in writing, software
1407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * distributed under the License is distributed on an "AS IS" BASIS,
1507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * See the License for the specific language governing permissions and
1707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * limitations under the License.
1807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani */
1907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
2007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#ifndef HWC_MDP_COMP
2107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define HWC_MDP_COMP
2207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
2307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <hwc_utils.h>
2407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <idle_invalidator.h>
2507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <cutils/properties.h>
2607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include <overlay.h>
2707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
2807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define MAX_PIPES_PER_MIXER 4
2907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
3007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaninamespace overlay {
3107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniclass Rotator;
3207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani};
3307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
3407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaninamespace qhwc {
3507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaninamespace ovutils = overlay::utils;
3607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
3707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniclass MDPComp {
3807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanipublic:
3907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    explicit MDPComp(int);
4007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual ~MDPComp(){};
4107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /*sets up mdp comp for the current frame */
4207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    int prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list);
4307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* draw */
4407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list) = 0;
4507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    //Reset values
4607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    void reset();
4707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* dumpsys */
4807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    void dump(android::String8& buf, hwc_context_t *ctx);
4907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool isGLESOnlyComp() { return (mCurrentFrame.mdpCount == 0); }
5007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool isMDPComp() { return mModeOn; }
5107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    int drawOverlap(hwc_context_t *ctx, hwc_display_contents_1_t* list);
5207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    static MDPComp* getObject(hwc_context_t *ctx, const int& dpy);
5307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* Handler to invoke frame redraw on Idle Timer expiry */
5407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    static void timeout_handler(void *udata);
5507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* Initialize MDP comp*/
5607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    static bool init(hwc_context_t *ctx);
5707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    static void resetIdleFallBack() { sIdleFallBack = false; }
5807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    static bool isIdleFallback() { return sIdleFallBack; }
5907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    static void dynamicDebug(bool enable){ sDebugLogs = enable; }
6007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    static void setIdleTimeout(const uint32_t& timeout);
6107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    static int setPartialUpdatePref(hwc_context_t *ctx, bool enable);
6207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    void setDynRefreshRate(hwc_context_t *ctx, hwc_display_contents_1_t* list);
6307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    static int getPartialUpdatePref(hwc_context_t *ctx);
6407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    static void enablePartialUpdate(bool enable)
6507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                          { sIsPartialUpdateActive = enable; };
6607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
6707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniprotected:
6807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    enum { MAX_SEC_LAYERS = 1 }; //TODO add property support
6907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
7007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    enum ePipeType {
7107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        MDPCOMP_OV_RGB = ovutils::OV_MDP_PIPE_RGB,
7207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        MDPCOMP_OV_VG = ovutils::OV_MDP_PIPE_VG,
7307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        MDPCOMP_OV_DMA = ovutils::OV_MDP_PIPE_DMA,
7407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        MDPCOMP_OV_ANY,
7507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    };
7607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
7707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    //Simulation flags
7807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    enum {
7907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        MDPCOMP_AVOID_FULL_MDP = 0x001,
8007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        MDPCOMP_AVOID_CACHE_MDP = 0x002,
8107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        MDPCOMP_AVOID_LOAD_MDP = 0x004,
8207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        MDPCOMP_AVOID_VIDEO_ONLY = 0x008,
8307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        MDPCOMP_AVOID_MDP_ONLY_LAYERS = 0x010,
8407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    };
8507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
8607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* mdp pipe data */
8707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    struct MdpPipeInfo {
8807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        int zOrder;
8907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        virtual ~MdpPipeInfo(){};
9007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    };
9107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
9207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    struct MdpYUVPipeInfo : public MdpPipeInfo{
9307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        ovutils::eDest lIndex;
9407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        ovutils::eDest rIndex;
9507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        virtual ~MdpYUVPipeInfo(){};
9607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    };
9707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
9807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* per layer data */
9907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    struct PipeLayerPair {
10007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        MdpPipeInfo *pipeInfo;
10107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        overlay::Rotator* rot;
10207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        int listIndex;
10307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    };
10407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
10507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* per frame data */
10607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    struct FrameInfo {
10707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        /* maps layer list to mdp list */
10807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        int layerCount;
10907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        int layerToMDP[MAX_NUM_APP_LAYERS];
11007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
11107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        /* maps mdp list to layer list */
11207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        int mdpCount;
11307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        struct PipeLayerPair mdpToLayer[MAX_PIPES_PER_MIXER];
11407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
11507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        /* layer composing on FB? */
11607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        int fbCount;
11707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        bool isFBComposed[MAX_NUM_APP_LAYERS];
11807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        /* layers lying outside ROI. Will
11907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani         * be dropped off from the composition */
12007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        int dropCount;
12107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        bool drop[MAX_NUM_APP_LAYERS];
12207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
12307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        bool needsRedraw;
12407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        int fbZ;
12507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
12607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        /* c'tor */
12707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        FrameInfo();
12807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        /* clear old frame data */
12907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        void reset(const int& numLayers);
13007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        void map();
13107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    };
13207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
13307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* cached data */
13407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    struct LayerCache {
13507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        int layerCount;
13607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        bool isFBComposed[MAX_NUM_APP_LAYERS];
13707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        bool drop[MAX_NUM_APP_LAYERS];
13807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
13907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        /* c'tor */
14007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        LayerCache();
14107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        /* clear caching info*/
14207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        void reset();
14307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        void updateCounts(const FrameInfo&);
14407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        bool isSameFrame(const FrameInfo& curFrame,
14507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                         hwc_display_contents_1_t* list);
14607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        bool isSameFrame(hwc_context_t *ctx, int dpy,
14707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                        hwc_display_contents_1_t* list);
14807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    };
14907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
15007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* allocates pipe from pipe book */
15107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual bool allocLayerPipes(hwc_context_t *ctx,
15207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                 hwc_display_contents_1_t* list) = 0;
15307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* configures MPD pipes */
15407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
15507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                          PipeLayerPair& pipeLayerPair) = 0;
15607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* Increments mdpCount if 4k2k yuv layer split is enabled.
15707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani     * updates framebuffer z order if fb lies above source-split layer */
15807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual void adjustForSourceSplit(hwc_context_t *ctx,
15907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            hwc_display_contents_1_t* list) = 0;
16007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* configures 4kx2k yuv layer*/
16107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual int configure4k2kYuv(hwc_context_t *ctx, hwc_layer_1_t *layer,
16207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            PipeLayerPair& PipeLayerPair) = 0;
16307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* generates ROI based on the modified area of the frame */
16407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual void generateROI(hwc_context_t *ctx,
16507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            hwc_display_contents_1_t* list) = 0;
16607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* validates the ROI generated for fallback conditions */
16707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual bool validateAndApplyROI(hwc_context_t *ctx,
16807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            hwc_display_contents_1_t* list) = 0;
16907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* Trims fbRect calculated against ROI generated */
17007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual void trimAgainstROI(hwc_context_t *ctx, hwc_rect_t& fbRect) = 0;
17107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
17207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* set/reset flags for MDPComp */
17307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    void setMDPCompLayerFlags(hwc_context_t *ctx,
17407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                              hwc_display_contents_1_t* list);
17507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    void setRedraw(hwc_context_t *ctx,
17607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            hwc_display_contents_1_t* list);
17707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* checks for conditions where mdpcomp is not possible */
17807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool isFrameDoable(hwc_context_t *ctx);
17907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* checks for conditions where RGB layers cannot be bypassed */
18007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool tryFullFrame(hwc_context_t *ctx, hwc_display_contents_1_t* list);
18107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* checks if full MDP comp can be done */
18207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool fullMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list);
18307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* Full MDP Composition with Peripheral Tiny Overlap Removal */
18407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool fullMDPCompWithPTOR(hwc_context_t *ctx,hwc_display_contents_1_t* list);
18507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* check if we can use layer cache to do at least partial MDP comp */
18607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool partialMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list);
18707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* Partial MDP comp that uses caching to save power as primary goal */
18807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool cacheBasedComp(hwc_context_t *ctx, hwc_display_contents_1_t* list);
18907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* Partial MDP comp that balances the load between MDP and GPU such that
19007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani     * MDP is loaded to the max of its capacity. The lower z order layers are
19107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani     * fed to MDP, whereas the upper ones to GPU, because the upper ones have
19207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani     * lower number of pixels and can reduce GPU processing time */
19307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool loadBasedComp(hwc_context_t *ctx, hwc_display_contents_1_t* list);
19407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* Checks if its worth doing load based partial comp */
19507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool isLoadBasedCompDoable(hwc_context_t *ctx);
19607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* checks for conditions where only video can be bypassed */
19707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool tryVideoOnly(hwc_context_t *ctx, hwc_display_contents_1_t* list);
19807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool videoOnlyComp(hwc_context_t *ctx, hwc_display_contents_1_t* list,
19907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            bool secureOnly);
20007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* checks for conditions where only secure RGB and video can be bypassed */
20107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool tryMDPOnlyLayers(hwc_context_t *ctx, hwc_display_contents_1_t* list);
20207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool mdpOnlyLayersComp(hwc_context_t *ctx, hwc_display_contents_1_t* list,
20307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            bool secureOnly);
20407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* checks for conditions where YUV layers cannot be bypassed */
20507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer);
20607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* checks for conditions where Secure RGB layers cannot be bypassed */
20707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool isSecureRGBDoable(hwc_context_t* ctx, hwc_layer_1_t* layer);
20807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* checks if MDP/MDSS can process current list w.r.to HW limitations
20907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani     * All peculiar HW limitations should go here */
21007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool hwLimitationsCheck(hwc_context_t* ctx, hwc_display_contents_1_t* list);
21107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* Is debug enabled */
21207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    static bool isDebug() { return sDebugLogs ? true : false; };
21307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* Is feature enabled */
21407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    static bool isEnabled() { return sEnabled; };
21507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* checks for mdp comp dimension limitation */
21607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool isValidDimension(hwc_context_t *ctx, hwc_layer_1_t *layer);
21707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* tracks non updating layers*/
21807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    void updateLayerCache(hwc_context_t* ctx, hwc_display_contents_1_t* list,
21907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                          FrameInfo& frame);
22007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* optimize layers for mdp comp*/
22107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool markLayersForCaching(hwc_context_t* ctx,
22207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            hwc_display_contents_1_t* list);
22307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    int getBatch(hwc_display_contents_1_t* list,
22407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            int& maxBatchStart, int& maxBatchEnd,
22507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            int& maxBatchCount);
22607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool canPushBatchToTop(const hwc_display_contents_1_t* list,
22707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            int fromIndex, int toIndex);
22807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool intersectingUpdatingLayers(const hwc_display_contents_1_t* list,
22907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            int fromIndex, int toIndex, int targetLayerIndex);
23007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
23107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* drop other non-AIV layers from external display list.*/
23207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    void dropNonAIVLayers(hwc_context_t* ctx, hwc_display_contents_1_t* list);
23307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
23407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        /* updates cache map with YUV info */
23507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    void updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list,
23607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            bool secureOnly, FrameInfo& frame);
23707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* updates cache map with secure RGB info */
23807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    void updateSecureRGB(hwc_context_t* ctx,
23907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            hwc_display_contents_1_t* list);
24007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* Validates if the GPU/MDP layer split chosen by a strategy is supported
24107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani     * by MDP.
24207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani     * Sets up MDP comp data structures to reflect covnversion from layers to
24307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani     * overlay pipes.
24407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani     * Configures overlay.
24507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani     * Configures if GPU should redraw.
24607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani     */
24707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool postHeuristicsHandling(hwc_context_t *ctx,
24807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            hwc_display_contents_1_t* list);
24907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    void reset(hwc_context_t *ctx);
25007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool isSupportedForMDPComp(hwc_context_t *ctx, hwc_layer_1_t* layer);
25107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool resourceCheck(hwc_context_t* ctx, hwc_display_contents_1_t* list);
25207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    hwc_rect_t getUpdatingFBRect(hwc_context_t *ctx,
25307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            hwc_display_contents_1_t* list);
25407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* checks for conditions to enable partial udpate */
25507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool canPartialUpdate(hwc_context_t *ctx, hwc_display_contents_1_t* list);
25607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
25707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    int mDpy;
25807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    static bool sEnabled;
25907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    static bool sEnableMixedMode;
26007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    static int sSimulationFlags;
26107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    static bool sDebugLogs;
26207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    static bool sIdleFallBack;
26307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    static int sMaxPipesPerMixer;
26407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    static bool sSrcSplitEnabled;
26507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    static IdleInvalidator *sIdleInvalidator;
26607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    struct FrameInfo mCurrentFrame;
26707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    struct LayerCache mCachedFrame;
26807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    static bool sIsPartialUpdateActive;
26907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    //Enable 4kx2k yuv layer split
27007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    static bool sEnableYUVsplit;
27107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool mModeOn; // if prepare happened
27207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool allocSplitVGPipesfor4k2k(hwc_context_t *ctx, int index);
27307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    bool mPrevModeOn; //if previous prepare happened
27407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    //Enable Partial Update for MDP3 targets
27507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    static bool enablePartialUpdateForMDP3;
27607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani};
27707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
27807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniclass MDPCompNonSplit : public MDPComp {
27907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanipublic:
28007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    explicit MDPCompNonSplit(int dpy):MDPComp(dpy){};
28107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual ~MDPCompNonSplit(){};
28207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list);
28307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
28407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniprivate:
28507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    struct MdpPipeInfoNonSplit : public MdpPipeInfo {
28607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        ovutils::eDest index;
28707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        virtual ~MdpPipeInfoNonSplit() {};
28807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    };
28907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
29007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* configure's overlay pipes for the frame */
29107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
29207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                          PipeLayerPair& pipeLayerPair);
29307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
29407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* allocates pipes to selected candidates */
29507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual bool allocLayerPipes(hwc_context_t *ctx,
29607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                 hwc_display_contents_1_t* list);
29707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
29807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* Increments mdpCount if 4k2k yuv layer split is enabled.
29907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani     * updates framebuffer z order if fb lies above source-split layer */
30007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual void adjustForSourceSplit(hwc_context_t *ctx,
30107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            hwc_display_contents_1_t* list);
30207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
30307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* configures 4kx2k yuv layer to 2 VG pipes*/
30407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual int configure4k2kYuv(hwc_context_t *ctx, hwc_layer_1_t *layer,
30507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            PipeLayerPair& PipeLayerPair);
30607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* generates ROI based on the modified area of the frame */
30707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual void generateROI(hwc_context_t *ctx,
30807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            hwc_display_contents_1_t* list);
30907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* validates the ROI generated for fallback conditions */
31007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual bool validateAndApplyROI(hwc_context_t *ctx,
31107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            hwc_display_contents_1_t* list);
31207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* Trims fbRect calculated against ROI generated */
31307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual void trimAgainstROI(hwc_context_t *ctx, hwc_rect_t& fbRect);
31407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani};
31507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
31607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniclass MDPCompSplit : public MDPComp {
31707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanipublic:
31807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    explicit MDPCompSplit(int dpy):MDPComp(dpy){};
31907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual ~MDPCompSplit(){};
32007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list);
32107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
32207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniprotected:
32307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    struct MdpPipeInfoSplit : public MdpPipeInfo {
32407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        ovutils::eDest lIndex;
32507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        ovutils::eDest rIndex;
32607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani        virtual ~MdpPipeInfoSplit() {};
32707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    };
32807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
32907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual bool acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer,
33007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                         MdpPipeInfoSplit& pipe_info);
33107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
33207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* configure's overlay pipes for the frame */
33307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
33407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                          PipeLayerPair& pipeLayerPair);
33507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
33607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* allocates pipes to selected candidates */
33707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual bool allocLayerPipes(hwc_context_t *ctx,
33807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani                                 hwc_display_contents_1_t* list);
33907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniprivate:
34007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* Increments mdpCount if 4k2k yuv layer split is enabled.
34107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani     * updates framebuffer z order if fb lies above source-split layer */
34207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual void adjustForSourceSplit(hwc_context_t *ctx,
34307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            hwc_display_contents_1_t* list);
34407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
34507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* configures 4kx2k yuv layer*/
34607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual int configure4k2kYuv(hwc_context_t *ctx, hwc_layer_1_t *layer,
34707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            PipeLayerPair& PipeLayerPair);
34807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* generates ROI based on the modified area of the frame */
34907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual void generateROI(hwc_context_t *ctx,
35007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            hwc_display_contents_1_t* list);
35107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* validates the ROI generated for fallback conditions */
35207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual bool validateAndApplyROI(hwc_context_t *ctx,
35307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            hwc_display_contents_1_t* list);
35407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    /* Trims fbRect calculated against ROI generated */
35507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual void trimAgainstROI(hwc_context_t *ctx, hwc_rect_t& fbRect);
35607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani};
35707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
35807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniclass MDPCompSrcSplit : public MDPCompSplit {
35907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanipublic:
36007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    explicit MDPCompSrcSplit(int dpy) : MDPCompSplit(dpy){};
36107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual ~MDPCompSrcSplit(){};
36207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniprivate:
36307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual bool acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer,
36407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            MdpPipeInfoSplit& pipe_info);
36507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
36607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani    virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
36707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani            PipeLayerPair& pipeLayerPair);
36807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani};
36907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani
37007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani}; //namespace
37107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#endif
372