131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed/*
231da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed * Copyright (C) 2010 The Android Open Source Project
36c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R * Copyright (C) 2012-2013, The Linux Foundation. All rights reserved.
431da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed *
531da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed * Not a Contribution, Apache license notifications and license are retained
631da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed * for attribution purposes only.
731da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed *
831da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License");
931da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed * you may not use this file except in compliance with the License.
1031da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed * You may obtain a copy of the License at
1131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed *
1231da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed *      http://www.apache.org/licenses/LICENSE-2.0
1331da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed *
1431da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed * Unless required by applicable law or agreed to in writing, software
1531da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS,
1631da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1731da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed * See the License for the specific language governing permissions and
1831da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed * limitations under the License.
1931da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed */
2031da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed#ifndef HWC_COPYBIT_H
2131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed#define HWC_COPYBIT_H
2231da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed#include "hwc_utils.h"
2331da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed
246195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed#define NUM_RENDER_BUFFERS 2
2531da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed
2631da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmednamespace qhwc {
2772cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
2831da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmedclass CopyBit {
2931da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmedpublic:
306c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    CopyBit();
316c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    ~CopyBit();
326c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    // API to get copybit engine(non static)
336c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    struct copybit_device_t *getCopyBitDevice();
3431da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed    //Sets up members and prepares copybit if conditions are met
356c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    bool prepare(hwc_context_t *ctx, hwc_display_contents_1_t *list,
366c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R                                                                   int dpy);
3731da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed    //Draws layer if the layer is set for copybit in prepare
386c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list,
396c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R                                                        int dpy, int* fd);
406c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    // resets the values
416c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    void reset();
426195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed
436195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    private_handle_t * getCurrentRenderBuffer();
446195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed
456195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    void setReleaseFd(int fd);
466195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed
4731da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmedprivate:
486c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    // holds the copybit device
496c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    struct copybit_device_t *mEngine;
506c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    // Helper functions for copybit composition
516c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    int  drawLayerUsingCopybit(hwc_context_t *dev, hwc_layer_1_t *layer,
526c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R                                       private_handle_t *renderBuffer, int dpy);
536c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    bool canUseCopybitForYUV (hwc_context_t *ctx);
546c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    bool canUseCopybitForRGB (hwc_context_t *ctx,
556c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R                                     hwc_display_contents_1_t *list, int dpy);
566c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    bool validateParams (hwc_context_t *ctx,
576c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R                                const hwc_display_contents_1_t *list);
5831da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed    //Flags if this feature is on.
596c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    bool mIsModeOn;
606c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    // flag that indicates whether CopyBit composition is enabled for this cycle
616c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    bool mCopyBitDraw;
6231da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed
636c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    unsigned int getRGBRenderingArea
646c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R                            (const hwc_display_contents_1_t *list);
6531da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed
666c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    void getLayerResolution(const hwc_layer_1_t* layer,
6745a9960377b09b1f72fe0c7ed662f1e0110e2d68Naseer Ahmed                                   unsigned int &width, unsigned int& height);
686195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed
696195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    int allocRenderBuffers(int w, int h, int f);
706195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed
716195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    void freeRenderBuffers();
726195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed
736f51cecb2be306aef008773d61fea4ce7b896fc9Naseer Ahmed    int clear (private_handle_t* hnd, hwc_rect_t& rect);
746f51cecb2be306aef008773d61fea4ce7b896fc9Naseer Ahmed
756195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    private_handle_t* mRenderBuffer[NUM_RENDER_BUFFERS];
766195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed
776195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    // Index of the current intermediate render buffer
786195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    int mCurRenderBufferIndex;
796195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed
806195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    //These are the the release FDs of the T-2 and T-1 round
816195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    //We wait on the T-2 fence
826195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    int mRelFd[2];
83145e666f55a9df786bb0d8b1df5b72809a40a9e7Prabhanjan Kandula
84145e666f55a9df786bb0d8b1df5b72809a40a9e7Prabhanjan Kandula    //Dynamic composition threshold for deciding copybit usage.
85145e666f55a9df786bb0d8b1df5b72809a40a9e7Prabhanjan Kandula    double mDynThreshold;
8631da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed};
8731da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed
8831da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed}; //namespace qhwc
8931da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed
9031da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed#endif //HWC_COPYBIT_H
91