Home | History | Annotate | Download | only in libvrflinger
      1 #ifndef ANDROID_DVR_SERVICES_DISPLAYD_HARDWARE_COMPOSER_H_
      2 #define ANDROID_DVR_SERVICES_DISPLAYD_HARDWARE_COMPOSER_H_
      3 
      4 #include <ui/GraphicBuffer.h>
      5 #include "DisplayHardware/ComposerHal.h"
      6 #include "hwc_types.h"
      7 
      8 #include <hardware/gralloc.h>
      9 #include <log/log.h>
     10 
     11 #include <array>
     12 #include <condition_variable>
     13 #include <memory>
     14 #include <mutex>
     15 #include <thread>
     16 #include <tuple>
     17 #include <vector>
     18 
     19 #include <dvr/pose_client.h>
     20 #include <pdx/file_handle.h>
     21 #include <pdx/rpc/variant.h>
     22 #include <private/dvr/buffer_hub_client.h>
     23 
     24 #include "acquired_buffer.h"
     25 #include "display_surface.h"
     26 
     27 // Hardware composer HAL doesn't define HWC_TRANSFORM_NONE as of this writing.
     28 #ifndef HWC_TRANSFORM_NONE
     29 #define HWC_TRANSFORM_NONE static_cast<hwc_transform_t>(0)
     30 #endif
     31 
     32 namespace android {
     33 namespace dvr {
     34 
     35 // Basic display metrics for physical displays. Dimensions and densities are
     36 // relative to the physical display orientation, which may be different from the
     37 // logical display orientation exposed to applications.
     38 struct HWCDisplayMetrics {
     39   int width;
     40   int height;
     41   struct {
     42     int x;
     43     int y;
     44   } dpi;
     45   int vsync_period_ns;
     46 };
     47 
     48 // Layer represents the connection between a hardware composer layer and the
     49 // source supplying buffers for the layer's contents.
     50 class Layer {
     51  public:
     52   Layer() {}
     53 
     54   // Sets up the global state used by all Layer instances. This must be called
     55   // before using any Layer methods.
     56   static void InitializeGlobals(Hwc2::Composer* hwc2_hidl,
     57                                 const HWCDisplayMetrics* metrics);
     58 
     59   // Releases any shared pointers and fence handles held by this instance.
     60   void Reset();
     61 
     62   // Sets up the layer to use a display surface as its content source. The Layer
     63   // automatically handles ACQUIRE/RELEASE phases for the surface's buffer train
     64   // every frame.
     65   //
     66   // |blending| receives HWC_BLENDING_* values.
     67   // |transform| receives HWC_TRANSFORM_* values.
     68   // |composition_type| receives either HWC_FRAMEBUFFER for most layers or
     69   // HWC_FRAMEBUFFER_TARGET (unless you know what you are doing).
     70   // |index| is the index of this surface in the DirectDisplaySurface array.
     71   void Setup(const std::shared_ptr<DirectDisplaySurface>& surface,
     72              HWC::BlendMode blending, HWC::Transform transform,
     73              HWC::Composition composition_type, size_t z_roder);
     74 
     75   // Sets up the layer to use a direct buffer as its content source. No special
     76   // handling of the buffer is performed; responsibility for updating or
     77   // changing the buffer each frame is on the caller.
     78   //
     79   // |blending| receives HWC_BLENDING_* values.
     80   // |transform| receives HWC_TRANSFORM_* values.
     81   // |composition_type| receives either HWC_FRAMEBUFFER for most layers or
     82   // HWC_FRAMEBUFFER_TARGET (unless you know what you are doing).
     83   void Setup(const std::shared_ptr<IonBuffer>& buffer, HWC::BlendMode blending,
     84              HWC::Transform transform, HWC::Composition composition_type,
     85              size_t z_order);
     86 
     87   // Layers that use a direct IonBuffer should call this each frame to update
     88   // which buffer will be used for the next PostLayers.
     89   void UpdateBuffer(const std::shared_ptr<IonBuffer>& buffer);
     90 
     91   // Sets up the hardware composer layer for the next frame. When the layer is
     92   // associated with a display surface, this method automatically ACQUIRES a new
     93   // buffer if one is available.
     94   void Prepare();
     95 
     96   // After calling prepare, if this frame is to be dropped instead of passing
     97   // along to the HWC, call Drop to close the contained fence(s).
     98   void Drop();
     99 
    100   // Performs fence bookkeeping after the frame has been posted to hardware
    101   // composer.
    102   void Finish(int release_fence_fd);
    103 
    104   // Sets the blending for the layer. |blending| receives HWC_BLENDING_* values.
    105   void SetBlending(HWC::BlendMode blending);
    106 
    107   // Sets the z-order of this layer
    108   void SetZOrder(size_t z_order);
    109 
    110   // Gets the current IonBuffer associated with this layer. Ownership of the
    111   // buffer DOES NOT pass to the caller and the pointer is not guaranteed to
    112   // remain valid across calls to Layer::Setup(), Layer::Prepare(), or
    113   // Layer::Reset(). YOU HAVE BEEN WARNED.
    114   IonBuffer* GetBuffer();
    115 
    116   HWC::Composition GetCompositionType() const { return composition_type_; }
    117   HWC::Layer GetLayerHandle() const { return hardware_composer_layer_; }
    118   bool IsLayerSetup() const { return !source_.empty(); }
    119 
    120   // Applies all of the settings to this layer using the hwc functions
    121   void UpdateLayerSettings();
    122 
    123   int GetSurfaceId() const {
    124     int surface_id = -1;
    125     pdx::rpc::IfAnyOf<SourceSurface>::Call(
    126         &source_, [&surface_id](const SourceSurface& surface_source) {
    127           surface_id = surface_source.surface->surface_id();
    128         });
    129     return surface_id;
    130   }
    131 
    132  private:
    133   void CommonLayerSetup();
    134 
    135   static Hwc2::Composer* hwc2_hidl_;
    136   static const HWCDisplayMetrics* display_metrics_;
    137 
    138   // The hardware composer layer and metrics to use during the prepare cycle.
    139   hwc2_layer_t hardware_composer_layer_ = 0;
    140 
    141   // Layer properties used to setup the hardware composer layer during the
    142   // Prepare phase.
    143   size_t z_order_ = 0;
    144   HWC::BlendMode blending_ = HWC::BlendMode::None;
    145   HWC::Transform transform_ = HWC::Transform::None;
    146   HWC::Composition composition_type_ = HWC::Composition::Invalid;
    147   HWC::Composition target_composition_type_ = HWC::Composition::Device;
    148 
    149   // State when the layer is connected to a surface. Provides the same interface
    150   // as SourceBuffer to simplify internal use by Layer.
    151   struct SourceSurface {
    152     std::shared_ptr<DirectDisplaySurface> surface;
    153     AcquiredBuffer acquired_buffer;
    154     pdx::LocalHandle release_fence;
    155 
    156     SourceSurface(const std::shared_ptr<DirectDisplaySurface>& surface)
    157         : surface(surface) {}
    158 
    159     // Attempts to acquire a new buffer from the surface and return a tuple with
    160     // width, height, buffer handle, and fence. If a new buffer is not available
    161     // the previous buffer is returned or an empty value if no buffer has ever
    162     // been posted. When a new buffer is acquired the previous buffer's release
    163     // fence is passed out automatically.
    164     std::tuple<int, int, sp<GraphicBuffer>, pdx::LocalHandle> Acquire() {
    165       if (surface->IsBufferAvailable()) {
    166         acquired_buffer.Release(std::move(release_fence));
    167         acquired_buffer = surface->AcquireCurrentBuffer();
    168         ATRACE_ASYNC_END("BufferPost", acquired_buffer.buffer()->id());
    169       }
    170       if (!acquired_buffer.IsEmpty()) {
    171         return std::make_tuple(acquired_buffer.buffer()->width(),
    172                                acquired_buffer.buffer()->height(),
    173                                acquired_buffer.buffer()->buffer()->buffer(),
    174                                acquired_buffer.ClaimAcquireFence());
    175       } else {
    176         return std::make_tuple(0, 0, nullptr, pdx::LocalHandle{});
    177       }
    178     }
    179 
    180     void Finish(pdx::LocalHandle fence) { release_fence = std::move(fence); }
    181 
    182     // Gets a pointer to the current acquired buffer or returns nullptr if there
    183     // isn't one.
    184     IonBuffer* GetBuffer() {
    185       if (acquired_buffer.IsAvailable())
    186         return acquired_buffer.buffer()->buffer();
    187       else
    188         return nullptr;
    189     }
    190 
    191     // Returns the surface id of the surface.
    192     int GetSurfaceId() { return surface->surface_id(); }
    193   };
    194 
    195   // State when the layer is connected to a buffer. Provides the same interface
    196   // as SourceSurface to simplify internal use by Layer.
    197   struct SourceBuffer {
    198     std::shared_ptr<IonBuffer> buffer;
    199 
    200     std::tuple<int, int, sp<GraphicBuffer>, pdx::LocalHandle> Acquire() {
    201       if (buffer)
    202         return std::make_tuple(buffer->width(), buffer->height(),
    203                                buffer->buffer(), pdx::LocalHandle{});
    204       else
    205         return std::make_tuple(0, 0, nullptr, pdx::LocalHandle{});
    206     }
    207 
    208     void Finish(pdx::LocalHandle /*fence*/) {}
    209 
    210     IonBuffer* GetBuffer() { return buffer.get(); }
    211 
    212     int GetSurfaceId() const { return -1; }
    213   };
    214 
    215   // The underlying hardware composer layer is supplied buffers either from a
    216   // surface buffer train or from a buffer directly.
    217   pdx::rpc::Variant<SourceSurface, SourceBuffer> source_;
    218 
    219   pdx::LocalHandle acquire_fence_;
    220   bool surface_rect_functions_applied_ = false;
    221 
    222   Layer(const Layer&) = delete;
    223   void operator=(const Layer&) = delete;
    224 };
    225 
    226 // HardwareComposer encapsulates the hardware composer HAL, exposing a
    227 // simplified API to post buffers to the display.
    228 //
    229 // HardwareComposer is accessed by both the vr flinger dispatcher thread and the
    230 // surface flinger main thread, in addition to internally running a separate
    231 // thread for compositing/EDS and posting layers to the HAL. When changing how
    232 // variables are used or adding new state think carefully about which threads
    233 // will access the state and whether it needs to be synchronized.
    234 class HardwareComposer {
    235  public:
    236   // Type for vsync callback.
    237   using VSyncCallback = std::function<void(int, int64_t, int64_t, uint32_t)>;
    238   using RequestDisplayCallback = std::function<void(bool)>;
    239 
    240   // Since there is no universal way to query the number of hardware layers,
    241   // just set it to 4 for now.
    242   static constexpr size_t kMaxHardwareLayers = 4;
    243 
    244   HardwareComposer();
    245   HardwareComposer(Hwc2::Composer* hidl,
    246                    RequestDisplayCallback request_display_callback);
    247   ~HardwareComposer();
    248 
    249   bool Initialize();
    250 
    251   bool IsInitialized() const { return initialized_; }
    252 
    253   // Start the post thread if there's work to do (i.e. visible layers). This
    254   // should only be called from surface flinger's main thread.
    255   void Enable();
    256   // Pause the post thread, blocking until the post thread has signaled that
    257   // it's paused. This should only be called from surface flinger's main thread.
    258   void Disable();
    259 
    260   // Get the HMD display metrics for the current display.
    261   display::Metrics GetHmdDisplayMetrics() const;
    262 
    263   HWC::Error GetDisplayAttribute(hwc2_display_t display, hwc2_config_t config,
    264                                  hwc2_attribute_t attributes,
    265                                  int32_t* out_value) const;
    266   HWC::Error GetDisplayMetrics(hwc2_display_t display, hwc2_config_t config,
    267                                HWCDisplayMetrics* out_metrics) const;
    268   std::string Dump();
    269 
    270   void SetVSyncCallback(VSyncCallback callback);
    271 
    272   // Metrics of the logical display, which is always landscape.
    273   int DisplayWidth() const { return display_metrics_.width; }
    274   int DisplayHeight() const { return display_metrics_.height; }
    275   HWCDisplayMetrics display_metrics() const { return display_metrics_; }
    276 
    277   // Metrics of the native display, which depends on the specific hardware
    278   // implementation of the display.
    279   HWCDisplayMetrics native_display_metrics() const {
    280     return native_display_metrics_;
    281   }
    282 
    283   // Sets the display surfaces to compose the hardware layer stack.
    284   void SetDisplaySurfaces(
    285       std::vector<std::shared_ptr<DirectDisplaySurface>> surfaces);
    286 
    287   void OnHardwareComposerRefresh();
    288 
    289  private:
    290   int32_t EnableVsync(bool enabled);
    291 
    292   class ComposerCallback : public Hwc2::IComposerCallback {
    293    public:
    294     ComposerCallback() {}
    295 
    296     hardware::Return<void> onHotplug(Hwc2::Display /*display*/,
    297                                      Connection /*connected*/) override {
    298       // TODO(skiazyk): depending on how the server is implemented, we might
    299       // have to set it up to synchronize with receiving this event, as it can
    300       // potentially be a critical event for setting up state within the
    301       // hwc2 module. That is, we (technically) should not call any other hwc
    302       // methods until this method has been called after registering the
    303       // callbacks.
    304       return hardware::Void();
    305     }
    306 
    307     hardware::Return<void> onRefresh(Hwc2::Display /*display*/) override {
    308       return hardware::Void();
    309     }
    310 
    311     hardware::Return<void> onVsync(Hwc2::Display /*display*/,
    312                                    int64_t /*timestamp*/) override {
    313       return hardware::Void();
    314     }
    315   };
    316 
    317   HWC::Error Validate(hwc2_display_t display);
    318   HWC::Error Present(hwc2_display_t display);
    319 
    320   void SetBacklightBrightness(int brightness);
    321 
    322   void PostLayers();
    323   void PostThread();
    324 
    325   // The post thread has two controlling states:
    326   // 1. Idle: no work to do (no visible surfaces).
    327   // 2. Suspended: explicitly halted (system is not in VR mode).
    328   // When either #1 or #2 is true then the post thread is quiescent, otherwise
    329   // it is active.
    330   using PostThreadStateType = uint32_t;
    331   struct PostThreadState {
    332     enum : PostThreadStateType {
    333       Active = 0,
    334       Idle = (1 << 0),
    335       Suspended = (1 << 1),
    336       Quit = (1 << 2),
    337     };
    338   };
    339 
    340   void UpdatePostThreadState(uint32_t state, bool suspend);
    341 
    342   // Blocks until either event_fd becomes readable, or we're interrupted by a
    343   // control thread. Any errors are returned as negative errno values. If we're
    344   // interrupted, kPostThreadInterrupted will be returned.
    345   int PostThreadPollInterruptible(const pdx::LocalHandle& event_fd,
    346                                   int requested_events);
    347 
    348   // BlockUntilVSync, WaitForVSync, and SleepUntil are all blocking calls made
    349   // on the post thread that can be interrupted by a control thread. If
    350   // interrupted, these calls return kPostThreadInterrupted.
    351   int ReadWaitPPState();
    352   int BlockUntilVSync();
    353   int ReadVSyncTimestamp(int64_t* timestamp);
    354   int WaitForVSync(int64_t* timestamp);
    355   int SleepUntil(int64_t wakeup_timestamp);
    356 
    357   bool IsFramePendingInDriver() { return ReadWaitPPState() == 1; }
    358 
    359   // Reconfigures the layer stack if the display surfaces changed since the last
    360   // frame. Called only from the post thread.
    361   bool UpdateLayerConfig();
    362 
    363   // Called on the post thread when the post thread is resumed.
    364   void OnPostThreadResumed();
    365   // Called on the post thread when the post thread is paused or quits.
    366   void OnPostThreadPaused();
    367 
    368   bool initialized_;
    369 
    370   // Hardware composer HAL device from SurfaceFlinger. VrFlinger does not own
    371   // this pointer.
    372   Hwc2::Composer* hwc2_hidl_;
    373   RequestDisplayCallback request_display_callback_;
    374   sp<ComposerCallback> callbacks_;
    375 
    376   // Display metrics of the physical display.
    377   HWCDisplayMetrics native_display_metrics_;
    378   // Display metrics of the logical display, adjusted so that orientation is
    379   // landscape.
    380   HWCDisplayMetrics display_metrics_;
    381   // Transform required to get from native to logical display orientation.
    382   HWC::Transform display_transform_ = HWC::Transform::None;
    383 
    384   // Pending surface list. Set by the display service when DirectSurfaces are
    385   // added, removed, or change visibility. Written by the message dispatch
    386   // thread and read by the post thread.
    387   std::vector<std::shared_ptr<DirectDisplaySurface>> pending_surfaces_;
    388 
    389   // The surfaces displayed by the post thread. Used exclusively by the post
    390   // thread.
    391   std::vector<std::shared_ptr<DirectDisplaySurface>> display_surfaces_;
    392 
    393   // Layer array for handling buffer flow into hardware composer layers.
    394   std::array<Layer, kMaxHardwareLayers> layers_;
    395   size_t active_layer_count_ = 0;
    396 
    397   // Handler to hook vsync events outside of this class.
    398   VSyncCallback vsync_callback_;
    399 
    400   // The layer posting thread. This thread wakes up a short time before vsync to
    401   // hand buffers to hardware composer.
    402   std::thread post_thread_;
    403 
    404   // Post thread state machine and synchronization primitives.
    405   PostThreadStateType post_thread_state_{PostThreadState::Idle};
    406   std::atomic<bool> post_thread_quiescent_{true};
    407   bool post_thread_resumed_{false};
    408   pdx::LocalHandle post_thread_event_fd_;
    409   std::mutex post_thread_mutex_;
    410   std::condition_variable post_thread_wait_;
    411   std::condition_variable post_thread_ready_;
    412 
    413   // Backlight LED brightness sysfs node.
    414   pdx::LocalHandle backlight_brightness_fd_;
    415 
    416   // Primary display vsync event sysfs node.
    417   pdx::LocalHandle primary_display_vsync_event_fd_;
    418 
    419   // Primary display wait_pingpong state sysfs node.
    420   pdx::LocalHandle primary_display_wait_pp_fd_;
    421 
    422   // VSync sleep timerfd.
    423   pdx::LocalHandle vsync_sleep_timer_fd_;
    424 
    425   // The timestamp of the last vsync.
    426   int64_t last_vsync_timestamp_ = 0;
    427 
    428   // Vsync count since display on.
    429   uint32_t vsync_count_ = 0;
    430 
    431   // Counter tracking the number of skipped frames.
    432   int frame_skip_count_ = 0;
    433 
    434   // Fd array for tracking retire fences that are returned by hwc. This allows
    435   // us to detect when the display driver begins queuing frames.
    436   std::vector<pdx::LocalHandle> retire_fence_fds_;
    437 
    438   // Pose client for frame count notifications. Pose client predicts poses
    439   // out to display frame boundaries, so we need to tell it about vsyncs.
    440   DvrPose* pose_client_ = nullptr;
    441 
    442   static constexpr int kPostThreadInterrupted = 1;
    443 
    444   static void HwcRefresh(hwc2_callback_data_t data, hwc2_display_t display);
    445   static void HwcVSync(hwc2_callback_data_t data, hwc2_display_t display,
    446                        int64_t timestamp);
    447   static void HwcHotplug(hwc2_callback_data_t callbackData,
    448                          hwc2_display_t display, hwc2_connection_t connected);
    449 
    450   HardwareComposer(const HardwareComposer&) = delete;
    451   void operator=(const HardwareComposer&) = delete;
    452 };
    453 
    454 }  // namespace dvr
    455 }  // namespace android
    456 
    457 #endif  // ANDROID_DVR_SERVICES_DISPLAYD_HARDWARE_COMPOSER_H_
    458