Home | History | Annotate | Download | only in libvrflinger
      1 #ifndef ANDROID_DVR_SERVICES_DISPLAYD_DISPLAY_SERVICE_H_
      2 #define ANDROID_DVR_SERVICES_DISPLAYD_DISPLAY_SERVICE_H_
      3 
      4 #include <dvr/dvr_api.h>
      5 #include <pdx/service.h>
      6 #include <pdx/status.h>
      7 #include <private/dvr/bufferhub_rpc.h>
      8 #include <private/dvr/display_protocol.h>
      9 
     10 #include <functional>
     11 #include <iterator>
     12 #include <memory>
     13 #include <string>
     14 #include <vector>
     15 
     16 #include "acquired_buffer.h"
     17 #include "display_surface.h"
     18 #include "epoll_event_dispatcher.h"
     19 #include "hardware_composer.h"
     20 
     21 namespace android {
     22 namespace dvr {
     23 
     24 // DisplayService implements the display service component of VrFlinger.
     25 class DisplayService : public pdx::ServiceBase<DisplayService> {
     26  public:
     27   bool IsInitialized() const override;
     28   std::string DumpState(size_t max_length) override;
     29 
     30   void OnChannelClose(pdx::Message& message,
     31                       const std::shared_ptr<pdx::Channel>& channel) override;
     32   pdx::Status<void> HandleMessage(pdx::Message& message) override;
     33 
     34   std::shared_ptr<DisplaySurface> GetDisplaySurface(int surface_id) const;
     35   std::vector<std::shared_ptr<DisplaySurface>> GetDisplaySurfaces() const;
     36   std::vector<std::shared_ptr<DirectDisplaySurface>> GetVisibleDisplaySurfaces()
     37       const;
     38 
     39   // Updates the list of actively displayed surfaces. This must be called after
     40   // any change to client/manager attributes that affect visibility or z order.
     41   void UpdateActiveDisplaySurfaces();
     42 
     43   pdx::Status<BorrowedNativeBufferHandle> SetupGlobalBuffer(
     44       DvrGlobalBufferKey key, size_t size, uint64_t usage);
     45 
     46   pdx::Status<void> DeleteGlobalBuffer(DvrGlobalBufferKey key);
     47 
     48   template <class A>
     49   void ForEachDisplaySurface(SurfaceType surface_type, A action) const {
     50     ForEachChannel([surface_type,
     51                     action](const ChannelIterator::value_type& pair) mutable {
     52       auto surface = std::static_pointer_cast<DisplaySurface>(pair.second);
     53       if (surface->surface_type() == surface_type)
     54         action(surface);
     55     });
     56   }
     57 
     58   using DisplayConfigurationUpdateNotifier = std::function<void(void)>;
     59   void SetDisplayConfigurationUpdateNotifier(
     60       DisplayConfigurationUpdateNotifier notifier);
     61 
     62   void GrantDisplayOwnership() { hardware_composer_.Enable(); }
     63   void SeizeDisplayOwnership() { hardware_composer_.Disable(); }
     64   void OnBootFinished() { hardware_composer_.OnBootFinished(); }
     65 
     66  private:
     67   friend BASE;
     68   friend DisplaySurface;
     69 
     70   friend class VrDisplayStateService;
     71 
     72   using RequestDisplayCallback = std::function<void(bool)>;
     73 
     74   DisplayService(android::Hwc2::Composer* hidl,
     75                  hwc2_display_t primary_display_id,
     76                  RequestDisplayCallback request_display_callback);
     77 
     78   pdx::Status<BorrowedNativeBufferHandle> OnGetGlobalBuffer(
     79       pdx::Message& message, DvrGlobalBufferKey key);
     80   pdx::Status<display::Metrics> OnGetMetrics(pdx::Message& message);
     81   pdx::Status<std::string> OnGetConfigurationData(
     82       pdx::Message& message, display::ConfigFileType config_type);
     83   pdx::Status<display::SurfaceInfo> OnCreateSurface(
     84       pdx::Message& message, const display::SurfaceAttributes& attributes);
     85   pdx::Status<BorrowedNativeBufferHandle> OnSetupGlobalBuffer(
     86       pdx::Message& message, DvrGlobalBufferKey key, size_t size,
     87       uint64_t usage);
     88   pdx::Status<void> OnDeleteGlobalBuffer(pdx::Message& message,
     89                                          DvrGlobalBufferKey key);
     90 
     91   // Temporary query for current VR status. Will be removed later.
     92   pdx::Status<bool> IsVrAppRunning(pdx::Message& message);
     93 
     94   pdx::Status<void> AddEventHandler(int fd, int events,
     95                                     EpollEventDispatcher::Handler handler) {
     96     return dispatcher_.AddEventHandler(fd, events, handler);
     97   }
     98   pdx::Status<void> RemoveEventHandler(int fd) {
     99     return dispatcher_.RemoveEventHandler(fd);
    100   }
    101 
    102   void SurfaceUpdated(SurfaceType surface_type,
    103                       display::SurfaceUpdateFlags update_flags);
    104 
    105   // Called by DisplaySurface to signal that a surface property has changed and
    106   // the display manager should be notified.
    107   void NotifyDisplayConfigurationUpdate();
    108 
    109   pdx::Status<void> HandleSurfaceMessage(pdx::Message& message);
    110 
    111   HardwareComposer hardware_composer_;
    112   EpollEventDispatcher dispatcher_;
    113   DisplayConfigurationUpdateNotifier update_notifier_;
    114 
    115   std::unordered_map<DvrGlobalBufferKey, std::unique_ptr<IonBuffer>>
    116       global_buffers_;
    117 
    118   DisplayService(const DisplayService&) = delete;
    119   void operator=(const DisplayService&) = delete;
    120 };
    121 
    122 }  // namespace dvr
    123 }  // namespace android
    124 
    125 #endif  // ANDROID_DVR_SERVICES_DISPLAYD_DISPLAY_SERVICE_H_
    126