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