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