10c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed/*
20c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * Copyright (C) 2010 The Android Open Source Project
356f610dd235b577725198e9341caae92379fdf23Saurabh Shah * Copyright (C) 2012, The Linux Foundation. All rights reserved.
40c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed *
50c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * Not a Contribution, Apache license notifications and license are
60c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * retained for attribution purposes only.
70c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed *
80c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License");
90c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * you may not use this file except in compliance with the License.
100c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * You may obtain a copy of the License at
110c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed *
120c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed *      http://www.apache.org/licenses/LICENSE-2.0
130c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed *
140c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * Unless required by applicable law or agreed to in writing, software
150c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS,
160c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
170c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * See the License for the specific language governing permissions and
180c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * limitations under the License.
190c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed */
20d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed#ifndef HWC_FBUPDATE_H
21d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed#define HWC_FBUPDATE_H
220c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#include "hwc_utils.h"
2372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed#include "overlay.h"
240c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
250c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define LIKELY( exp )       (__builtin_expect( (exp) != 0, true  ))
260c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed#define UNLIKELY( exp )     (__builtin_expect( (exp) != 0, false ))
270c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
280c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmednamespace qhwc {
29d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmednamespace ovutils = overlay::utils;
30d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed
316457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah//Framebuffer update Interface
326457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shahclass IFBUpdate {
336457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shahpublic:
346457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    explicit IFBUpdate(const int& dpy) : mDpy(dpy) {}
356457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    virtual ~IFBUpdate() {};
366457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    // Sets up members and prepares overlay if conditions are met
3785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    virtual bool prepare(hwc_context_t *ctx, hwc_display_contents_1 *list,
3885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                                                       int fbZorder) = 0;
396457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    // Draws layer
406195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    virtual bool draw(hwc_context_t *ctx, private_handle_t *hnd) = 0;
416457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    //Reset values
426457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    virtual void reset();
436457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    //Factory method that returns a low-res or high-res version
44828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah    static IFBUpdate *getObject(const int& width, const int& rightSplit,
45828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah            const int& dpy);
4685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah
476457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shahprotected:
486457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    const int mDpy; // display to update
496457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    bool mModeOn; // if prepare happened
506457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah};
516457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
526457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah//Low resolution (<= 2048) panel handler.
536457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shahclass FBUpdateLowRes : public IFBUpdate {
546457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shahpublic:
556457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    explicit FBUpdateLowRes(const int& dpy);
566457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    virtual ~FBUpdateLowRes() {};
5785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    bool prepare(hwc_context_t *ctx, hwc_display_contents_1 *list,
58828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah            int fbZorder);
596195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    bool draw(hwc_context_t *ctx, private_handle_t *hnd);
606457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    void reset();
616457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shahprivate:
6285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    bool configure(hwc_context_t *ctx, hwc_display_contents_1 *list,
63828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah            int fbZorder);
646457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    ovutils::eDest mDest; //pipe to draw on
656457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah};
666457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
676457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah//High resolution (> 2048) panel handler.
686457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shahclass FBUpdateHighRes : public IFBUpdate {
696457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shahpublic:
706457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    explicit FBUpdateHighRes(const int& dpy);
716457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    virtual ~FBUpdateHighRes() {};
7285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    bool prepare(hwc_context_t *ctx, hwc_display_contents_1 *list,
73828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah            int fbZorder);
746195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    bool draw(hwc_context_t *ctx, private_handle_t *hnd);
756457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    void reset();
766457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shahprivate:
7785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    bool configure(hwc_context_t *ctx, hwc_display_contents_1 *list,
78828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah            int fbZorder);
796457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    ovutils::eDest mDestLeft; //left pipe to draw on
806457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    ovutils::eDest mDestRight; //right pipe to draw on
810c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed};
820c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
830c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed}; //namespace qhwc
840c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
85d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed#endif //HWC_FBUPDATE_H
86