1bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed/*
2bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed * Copyright (C) 2010 The Android Open Source Project
3404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R * Copyright (C) 2012-2014, The Linux Foundation. All rights reserved.
4bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed *
5bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed * Not a Contribution, Apache license notifications and license are retained
6bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed * for attribution purposes only.
7bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed *
8bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License");
9bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed * you may not use this file except in compliance with the License.
10bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed * You may obtain a copy of the License at
11bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed *
12bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed *      http://www.apache.org/licenses/LICENSE-2.0
13bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed *
14bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed * Unless required by applicable law or agreed to in writing, software
15bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS,
16bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed * See the License for the specific language governing permissions and
18bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed * limitations under the License.
19bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed */
20bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed#ifndef HWC_COPYBIT_H
21bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed#define HWC_COPYBIT_H
22bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed#include "hwc_utils.h"
23bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed
24866120c90c620c405591947ab905c17e62cfd0a2Xiaoming Zhou#define NUM_RENDER_BUFFERS 3
25503386673b68e63ee15b576703e9b0a140cc5401Terence Hampson//These scaling factors are specific for MDP3. Normally scaling factor
26503386673b68e63ee15b576703e9b0a140cc5401Terence Hampson//is only 4, but copybit will create temp buffer to let it run through
27503386673b68e63ee15b576703e9b0a140cc5401Terence Hampson//twice
28503386673b68e63ee15b576703e9b0a140cc5401Terence Hampson#define MAX_SCALE_FACTOR 16
29503386673b68e63ee15b576703e9b0a140cc5401Terence Hampson#define MIN_SCALE_FACTOR 0.0625
30bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed
31bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmednamespace qhwc {
321589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
33bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmedclass CopyBit {
34bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmedpublic:
35c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah    CopyBit(hwc_context_t *ctx, const int& dpy);
364019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R    ~CopyBit();
374019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R    // API to get copybit engine(non static)
384019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R    struct copybit_device_t *getCopyBitDevice();
39bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed    //Sets up members and prepares copybit if conditions are met
404019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R    bool prepare(hwc_context_t *ctx, hwc_display_contents_1_t *list,
414019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R                                                                   int dpy);
42bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed    //Draws layer if the layer is set for copybit in prepare
434019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R    bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list,
444019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R                                                        int dpy, int* fd);
454019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R    // resets the values
464019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R    void reset();
4704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed
4804a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    private_handle_t * getCurrentRenderBuffer();
4904a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed
5004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    void setReleaseFd(int fd);
5104a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed
52bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmedprivate:
534019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R    // holds the copybit device
544019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R    struct copybit_device_t *mEngine;
554019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R    // Helper functions for copybit composition
564019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R    int  drawLayerUsingCopybit(hwc_context_t *dev, hwc_layer_1_t *layer,
57404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R                          private_handle_t *renderBuffer, bool isFG);
58905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan    int fillColorUsingCopybit(hwc_layer_1_t *layer,
59905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan                          private_handle_t *renderBuffer);
604019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R    bool canUseCopybitForYUV (hwc_context_t *ctx);
614019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R    bool canUseCopybitForRGB (hwc_context_t *ctx,
624019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R                                     hwc_display_contents_1_t *list, int dpy);
634019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R    bool validateParams (hwc_context_t *ctx,
644019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R                                const hwc_display_contents_1_t *list);
65bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed    //Flags if this feature is on.
664019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R    bool mIsModeOn;
674019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R    // flag that indicates whether CopyBit composition is enabled for this cycle
684019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R    bool mCopyBitDraw;
69bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed
704019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R    unsigned int getRGBRenderingArea
714019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R                            (const hwc_display_contents_1_t *list);
72bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed
734019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R    void getLayerResolution(const hwc_layer_1_t* layer,
74e2cb361a1ac1df575a6316b691f49b6bad177a2eNaseer Ahmed                                   unsigned int &width, unsigned int& height);
7504a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed
7604a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    int allocRenderBuffers(int w, int h, int f);
7704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed
7804a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    void freeRenderBuffers();
7904a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed
80347ca48efbcf8055f1ae733d9c0126bb5a9db8c6Naseer Ahmed    int clear (private_handle_t* hnd, hwc_rect_t& rect);
81347ca48efbcf8055f1ae733d9c0126bb5a9db8c6Naseer Ahmed
8204a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    private_handle_t* mRenderBuffer[NUM_RENDER_BUFFERS];
8304a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed
8404a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    // Index of the current intermediate render buffer
8504a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    int mCurRenderBufferIndex;
8604a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed
87b67303f4ba6edc01c9e255f841a36b13043105f3Prabhanjan Kandula    // Release FDs of the intermediate render buffer
88b67303f4ba6edc01c9e255f841a36b13043105f3Prabhanjan Kandula    int mRelFd[NUM_RENDER_BUFFERS];
8980d8a5cb55d1036b37c88924db1ea1298a3e4287Prabhanjan Kandula
9080d8a5cb55d1036b37c88924db1ea1298a3e4287Prabhanjan Kandula    //Dynamic composition threshold for deciding copybit usage.
9180d8a5cb55d1036b37c88924db1ea1298a3e4287Prabhanjan Kandula    double mDynThreshold;
92c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah    int mAlignedFBWidth;
93c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah    int mAlignedFBHeight;
94bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed};
95bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed
96bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed}; //namespace qhwc
97bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed
98bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed#endif //HWC_COPYBIT_H
99