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