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