1a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko#ifndef ANDROID_DVR_VR_FLINGER_H_ 2a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko#define ANDROID_DVR_VR_FLINGER_H_ 3a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko 4a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko#include <thread> 5a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko#include <memory> 6a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko 76e8f706c21a01d6a1225e86972ff432bba5f0106Steven Thomas#define HWC2_INCLUDE_STRINGIFICATION 86e8f706c21a01d6a1225e86972ff432bba5f0106Steven Thomas#define HWC2_USE_CPP11 96e8f706c21a01d6a1225e86972ff432bba5f0106Steven Thomas#include <hardware/hwcomposer2.h> 106e8f706c21a01d6a1225e86972ff432bba5f0106Steven Thomas#undef HWC2_INCLUDE_STRINGIFICATION 116e8f706c21a01d6a1225e86972ff432bba5f0106Steven Thomas#undef HWC2_USE_CPP11 126e8f706c21a01d6a1225e86972ff432bba5f0106Steven Thomas 135a244ed36c8e45fd95b89ff916caf083fb182ec1Alex Vakulenko#include <pdx/service_dispatcher.h> 14050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas#include <vr/vr_manager/vr_manager.h> 15050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas 16a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkonamespace android { 17a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko 18a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkonamespace Hwc2 { 19a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkoclass Composer; 20a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko} // namespace Hwc2 21a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko 22a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkonamespace dvr { 23a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko 24a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkoclass DisplayService; 25a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko 26a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkoclass VrFlinger { 27a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko public: 28050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas using RequestDisplayCallback = std::function<void(bool)>; 29050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas static std::unique_ptr<VrFlinger> Create( 306e8f706c21a01d6a1225e86972ff432bba5f0106Steven Thomas Hwc2::Composer* hidl, 316e8f706c21a01d6a1225e86972ff432bba5f0106Steven Thomas hwc2_display_t primary_display_id, 326e8f706c21a01d6a1225e86972ff432bba5f0106Steven Thomas RequestDisplayCallback request_display_callback); 33050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas ~VrFlinger(); 34f43d13e4e35ae7d3cdafc4b97c819669d42cef78Steven Thomas 35050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas // These functions are all called on surface flinger's main thread. 36050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas void OnBootFinished(); 37050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas void GrantDisplayOwnership(); 38050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas void SeizeDisplayOwnership(); 39050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas 40171155a55d7a3b7571ea1292f1aad926b6f82509Karthik Ravi Shankar // dump all vr flinger state. 41171155a55d7a3b7571ea1292f1aad926b6f82509Karthik Ravi Shankar std::string Dump(); 42171155a55d7a3b7571ea1292f1aad926b6f82509Karthik Ravi Shankar 43a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko private: 44050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas VrFlinger(); 45050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas bool Init(Hwc2::Composer* hidl, 466e8f706c21a01d6a1225e86972ff432bba5f0106Steven Thomas hwc2_display_t primary_display_id, 47050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas RequestDisplayCallback request_display_callback); 48050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas 49050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas // Needs to be a separate class for binder's ref counting 50050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas class PersistentVrStateCallback : public BnPersistentVrStateCallbacks { 51050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas public: 52050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas PersistentVrStateCallback(RequestDisplayCallback request_display_callback) 53050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas : request_display_callback_(request_display_callback) {} 54050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas void onPersistentVrStateChanged(bool enabled) override; 55050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas private: 56050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas RequestDisplayCallback request_display_callback_; 57050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas }; 58050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas 59050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas std::thread dispatcher_thread_; 60050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas std::unique_ptr<android::pdx::ServiceDispatcher> dispatcher_; 61a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko std::shared_ptr<android::dvr::DisplayService> display_service_; 62050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas sp<PersistentVrStateCallback> persistent_vr_state_callback_; 63050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas RequestDisplayCallback request_display_callback_; 64a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko}; 65a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko 66a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko} // namespace dvr 67a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko} // namespace android 68a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko 69a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko#endif // ANDROID_DVR_VR_FLINGER_H_ 70