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