1501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu/*
2501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu * Copyright 2017 The Android Open Source Project
3501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu *
4501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu * Licensed under the Apache License, Version 2.0 (the "License");
5501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu * you may not use this file except in compliance with the License.
6501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu * You may obtain a copy of the License at
7501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu *
8501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu *      http://www.apache.org/licenses/LICENSE-2.0
9501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu *
10501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu * Unless required by applicable law or agreed to in writing, software
11501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu * distributed under the License is distributed on an "AS IS" BASIS,
12501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu * See the License for the specific language governing permissions and
14501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu * limitations under the License.
15501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu */
16501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
17501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu#ifndef ANDROID_SF_HWC2_ON_FB_ADAPTER_H
18501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu#define ANDROID_SF_HWC2_ON_FB_ADAPTER_H
19501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
20501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu#include <condition_variable>
21501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu#include <mutex>
22501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu#include <string>
23501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu#include <thread>
24501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu#include <unordered_set>
25501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
26501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu#include <hardware/hwcomposer2.h>
27501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
28501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wustruct framebuffer_device_t;
29501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
30501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wunamespace android {
31501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
32501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuclass HWC2OnFbAdapter : public hwc2_device_t {
33501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wupublic:
34501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    HWC2OnFbAdapter(framebuffer_device_t* fbDevice);
35501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
36501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    static HWC2OnFbAdapter& cast(hw_device_t* device);
37501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    static HWC2OnFbAdapter& cast(hwc2_device_t* device);
38501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
39501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    static hwc2_display_t getDisplayId();
40501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    static hwc2_config_t getConfigId();
41501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
42501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    void close();
43501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
44501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    struct Info {
45501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        std::string name;
46501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        uint32_t width;
47501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        uint32_t height;
48501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        int format;
49501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        int vsync_period_ns;
50501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        int xdpi_scaled;
51501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        int ydpi_scaled;
52501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    };
53501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    const Info& getInfo() const;
54501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
55501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    void updateDebugString();
56501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    const std::string& getDebugString() const;
57501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
58501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    enum class State {
59501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        MODIFIED,
60501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        VALIDATED_WITH_CHANGES,
61501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        VALIDATED,
62501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    };
63501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    void setState(State state);
64501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    State getState() const;
65501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
66501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    hwc2_layer_t addLayer();
67501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    bool removeLayer(hwc2_layer_t layer);
68501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    bool hasLayer(hwc2_layer_t layer) const;
69501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    bool markLayerDirty(hwc2_layer_t layer, bool dirty);
70501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    const std::unordered_set<hwc2_layer_t>& getDirtyLayers() const;
71501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    void clearDirtyLayers();
72501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
73501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    void setBuffer(buffer_handle_t buffer);
74501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    bool postBuffer();
75501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
76501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    void setVsyncCallback(HWC2_PFN_VSYNC callback, hwc2_callback_data_t data);
77501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    void enableVsync(bool enable);
78501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
79501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wuprivate:
80501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    framebuffer_device_t* mFbDevice{nullptr};
81501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    Info mFbInfo{};
82501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
83501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::string mDebugString;
84501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
85501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    State mState{State::MODIFIED};
86501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
87501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    uint64_t mNextLayerId{0};
88501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unordered_set<hwc2_layer_t> mLayers;
89501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    std::unordered_set<hwc2_layer_t> mDirtyLayers;
90501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
91501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    buffer_handle_t mBuffer{nullptr};
92501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
93501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    class VsyncThread {
94501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    public:
95501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        static int64_t now();
96501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        static bool sleepUntil(int64_t t);
97501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
98501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        void start(int64_t first, int64_t period);
99501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        void stop();
100501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        void setCallback(HWC2_PFN_VSYNC callback, hwc2_callback_data_t data);
101501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        void enableCallback(bool enable);
102501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
103501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    private:
104501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        void vsyncLoop();
105501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        bool waitUntilNextVsync();
106501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
107501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        std::thread mThread;
108501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        int64_t mNextVsync{0};
109501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        int64_t mPeriod{0};
110501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
111501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        std::mutex mMutex;
112501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        std::condition_variable mCondition;
113501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        bool mStarted{false};
114501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        HWC2_PFN_VSYNC mCallback{nullptr};
115501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        hwc2_callback_data_t mCallbackData{nullptr};
116501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu        bool mCallbackEnabled{false};
117501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    };
118501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu    VsyncThread mVsyncThread;
119501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu};
120501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
121501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu} // namespace android
122501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu
123501cc23259ddf6955f7148bfbda1f3a82d315483Chia-I Wu#endif // ANDROID_SF_HWC2_ON_FB_ADAPTER_H
124