107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani/* 207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Copyright (C) 2010 The Android Open Source Project 307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Copyright (C) 2012, The Linux Foundation. All rights reserved. 407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * 507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Not a Contribution, Apache license notifications and license are 607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * retained for attribution purposes only. 707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * 807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Licensed under the Apache License, Version 2.0 (the "License"); 907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * you may not use this file except in compliance with the License. 1007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * You may obtain a copy of the License at 1107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * 1207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * http://www.apache.org/licenses/LICENSE-2.0 1307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * 1407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * Unless required by applicable law or agreed to in writing, software 1507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * distributed under the License is distributed on an "AS IS" BASIS, 1607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * See the License for the specific language governing permissions and 1807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani * limitations under the License. 1907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani */ 2007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#ifndef HWC_FBUPDATE_H 2107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define HWC_FBUPDATE_H 2207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include "hwc_utils.h" 2307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#include "overlay.h" 2407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 2507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true )) 2607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false )) 2707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 2807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaninamespace overlay { 2907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani class Rotator; 3007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani} 3107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 3207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaninamespace qhwc { 3307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaninamespace ovutils = overlay::utils; 3407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 3507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani//Framebuffer update Interface 3607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniclass IFBUpdate { 3707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanipublic: 3807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani explicit IFBUpdate(hwc_context_t *ctx, const int& dpy); 3907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani virtual ~IFBUpdate() {}; 4007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani // Sets up members and prepares overlay if conditions are met 4107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani virtual bool prepare(hwc_context_t *ctx, hwc_display_contents_1 *list, 4207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani hwc_rect_t fbUpdatingRect, int fbZorder) = 0; 4307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani virtual bool prepareAndValidate(hwc_context_t *ctx, 4407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani hwc_display_contents_1 *list, int fbZorder); 4507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani // Draws layer 4607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani virtual bool draw(hwc_context_t *ctx, private_handle_t *hnd) = 0; 4707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani //Reset values 4807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani virtual void reset(); 4907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani //Factory method that returns a low-res or high-res version 5007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani static IFBUpdate *getObject(hwc_context_t *ctx, const int& dpy); 5107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 5207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniprotected: 5307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani const int mDpy; // display to update 5407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani bool mModeOn; // if prepare happened 5507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani overlay::Rotator *mRot; 5607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int mAlignedFBWidth; 5707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int mAlignedFBHeight; 5807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int mTileEnabled; 5907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani}; 6007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 6107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani//Non-Split panel handler. 6207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniclass FBUpdateNonSplit : public IFBUpdate { 6307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanipublic: 6407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani explicit FBUpdateNonSplit(hwc_context_t *ctx, const int& dpy); 6507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani virtual ~FBUpdateNonSplit() {}; 6607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani bool prepare(hwc_context_t *ctx, hwc_display_contents_1 *list, 6707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani hwc_rect_t fbUpdatingRect, int fbZorder); 6807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani bool draw(hwc_context_t *ctx, private_handle_t *hnd); 6907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani void reset(); 7007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniprivate: 7107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani bool configure(hwc_context_t *ctx, hwc_display_contents_1 *list, 7207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani hwc_rect_t fbUpdatingRect, int fbZorder); 7307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani bool preRotateExtDisplay(hwc_context_t *ctx, 7407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani hwc_layer_1_t *layer, 7507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ovutils::Whf &info, 7607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani hwc_rect_t& sourceCrop, 7707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ovutils::eMdpFlags& mdpFlags, 7807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani int& rotFlags); 7907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ovutils::eDest mDest; //pipe to draw on 8007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani}; 8107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 8207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani//Split panel handler. 8307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniclass FBUpdateSplit : public IFBUpdate { 8407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanipublic: 8507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani explicit FBUpdateSplit(hwc_context_t *ctx, const int& dpy); 8607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani virtual ~FBUpdateSplit() {}; 8707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani bool prepare(hwc_context_t *ctx, hwc_display_contents_1 *list, 8807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani hwc_rect_t fbUpdatingRect, int fbZorder); 8907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani bool draw(hwc_context_t *ctx, private_handle_t *hnd); 9007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani void reset(); 9107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 9207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniprotected: 9307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani virtual bool configure(hwc_context_t *ctx, hwc_display_contents_1 *list, 9407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani hwc_rect_t fbUpdatingRect, int fbZorder); 9507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ovutils::eDest mDestLeft; //left pipe to draw on 9607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani ovutils::eDest mDestRight; //right pipe to draw on 9707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani}; 9807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 9907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani//Source Split Handler 10007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniclass FBSrcSplit : public FBUpdateSplit { 10107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malanipublic: 10207bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani explicit FBSrcSplit(hwc_context_t *ctx, const int& dpy); 10307bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani virtual ~FBSrcSplit() {}; 10407bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malaniprivate: 10507bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani bool configure(hwc_context_t *ctx, hwc_display_contents_1 *list, 10607bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani hwc_rect_t fbUpdatingRect, int fbZorder); 10707bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani}; 10807bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 10907bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani}; //namespace qhwc 11007bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani 11107bbf1e89c031a5d41a7561433e832d396c311a5Prashant Malani#endif //HWC_FBUPDATE_H 112