1b166940edca6e312463461438e2aa66e9852c26aBenoit Goby/*
2b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Copyright (C) 2010 The Android Open Source Project
3b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Copyright (C) 2012-2013, The Linux Foundation. All rights reserved.
4b166940edca6e312463461438e2aa66e9852c26aBenoit Goby *
5b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Not a Contribution, Apache license notifications and license are retained
6b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * for attribution purposes only.
7b166940edca6e312463461438e2aa66e9852c26aBenoit Goby *
8b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Licensed under the Apache License, Version 2.0 (the "License");
9b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * you may not use this file except in compliance with the License.
10b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * You may obtain a copy of the License at
11b166940edca6e312463461438e2aa66e9852c26aBenoit Goby *
12b166940edca6e312463461438e2aa66e9852c26aBenoit Goby *      http://www.apache.org/licenses/LICENSE-2.0
13b166940edca6e312463461438e2aa66e9852c26aBenoit Goby *
14b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Unless required by applicable law or agreed to in writing, software
15b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * distributed under the License is distributed on an "AS IS" BASIS,
16b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * See the License for the specific language governing permissions and
18b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * limitations under the License.
19b166940edca6e312463461438e2aa66e9852c26aBenoit Goby */
20b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#ifndef HWC_COPYBIT_H
21b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#define HWC_COPYBIT_H
22b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include "hwc_utils.h"
23b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
24b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#define NUM_RENDER_BUFFERS 2
25b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
26b166940edca6e312463461438e2aa66e9852c26aBenoit Gobynamespace qhwc {
27b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
28b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyclass CopyBit {
29b166940edca6e312463461438e2aa66e9852c26aBenoit Gobypublic:
30b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    CopyBit();
31b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ~CopyBit();
32b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    // API to get copybit engine(non static)
33b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    struct copybit_device_t *getCopyBitDevice();
34b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    //Sets up members and prepares copybit if conditions are met
35b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    bool prepare(hwc_context_t *ctx, hwc_display_contents_1_t *list,
36b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                                                                   int dpy);
37b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    //Draws layer if the layer is set for copybit in prepare
38b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    bool draw(hwc_context_t *ctx, hwc_display_contents_1_t *list,
39b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                                                        int dpy, int* fd);
40b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    // resets the values
41b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    void reset();
42b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
43b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    private_handle_t * getCurrentRenderBuffer();
44b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
45b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    void setReleaseFd(int fd);
46b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
47b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyprivate:
48b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    // holds the copybit device
49b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    struct copybit_device_t *mEngine;
50b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    // Helper functions for copybit composition
51b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    int  drawLayerUsingCopybit(hwc_context_t *dev, hwc_layer_1_t *layer,
52b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                                       private_handle_t *renderBuffer, int dpy);
53b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    bool canUseCopybitForYUV (hwc_context_t *ctx);
54b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    bool canUseCopybitForRGB (hwc_context_t *ctx,
55b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                                     hwc_display_contents_1_t *list, int dpy);
56b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    bool validateParams (hwc_context_t *ctx,
57b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                                const hwc_display_contents_1_t *list);
58b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    //Flags if this feature is on.
59b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    bool mIsModeOn;
60b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    // flag that indicates whether CopyBit composition is enabled for this cycle
61b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    bool mCopyBitDraw;
62b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
63b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    unsigned int getRGBRenderingArea
64b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                            (const hwc_display_contents_1_t *list);
65b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
66b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    void getLayerResolution(const hwc_layer_1_t* layer,
67b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                                   unsigned int &width, unsigned int& height);
68b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
69b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    int allocRenderBuffers(int w, int h, int f);
70b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
71b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    void freeRenderBuffers();
72b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
73b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    int clear (private_handle_t* hnd, hwc_rect_t& rect);
74b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
75b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    private_handle_t* mRenderBuffer[NUM_RENDER_BUFFERS];
76b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
77b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    // Index of the current intermediate render buffer
78b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    int mCurRenderBufferIndex;
79b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
80b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    //These are the the release FDs of the T-2 and T-1 round
81b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    //We wait on the T-2 fence
82b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    int mRelFd[2];
83b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
84b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    //Dynamic composition threshold for deciding copybit usage.
85b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    double mDynThreshold;
86b166940edca6e312463461438e2aa66e9852c26aBenoit Goby};
87b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
88b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}; //namespace qhwc
89b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
90b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#endif //HWC_COPYBIT_H
91