• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:
Layer()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 
GetCompositionType()116   HWC::Composition GetCompositionType() const { return composition_type_; }
GetLayerHandle()117   HWC::Layer GetLayerHandle() const { return hardware_composer_layer_; }
IsLayerSetup()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 
GetSurfaceId()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 
SourceSurfaceSourceSurface156     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.
AcquireSourceSurface164     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 
FinishSourceSurface180     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.
GetBufferSourceSurface184     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.
GetSurfaceIdSourceSurface192     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 
AcquireSourceBuffer200     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 
FinishSourceBuffer208     void Finish(pdx::LocalHandle /*fence*/) {}
209 
GetBufferSourceBuffer210     IonBuffer* GetBuffer() { return buffer.get(); }
211 
GetSurfaceIdSourceBuffer212     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 
IsInitialized()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.
DisplayWidth()273   int DisplayWidth() const { return display_metrics_.width; }
DisplayHeight()274   int DisplayHeight() const { return display_metrics_.height; }
display_metrics()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.
native_display_metrics()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:
ComposerCallback()294     ComposerCallback() {}
295 
onHotplug(Hwc2::Display,Connection)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 
onRefresh(Hwc2::Display)307     hardware::Return<void> onRefresh(Hwc2::Display /*display*/) override {
308       return hardware::Void();
309     }
310 
onVsync(Hwc2::Display,int64_t)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 
IsFramePendingInDriver()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