1#ifndef ANDROID_DVR_DISPLAY_CLIENT_H_
2#define ANDROID_DVR_DISPLAY_CLIENT_H_
3
4#include <hardware/hwcomposer.h>
5#include <pdx/client.h>
6#include <pdx/file_handle.h>
7#include <private/dvr/buffer_hub_client.h>
8#include <private/dvr/buffer_hub_queue_client.h>
9#include <private/dvr/display_protocol.h>
10
11namespace android {
12namespace dvr {
13namespace display {
14
15class Surface : public pdx::ClientBase<Surface> {
16 public:
17  // Utility named constructor. This can be removed once ClientBase::Create is
18  // refactored to return Status<T> types.
19  static pdx::Status<std::unique_ptr<Surface>> CreateSurface(
20      const SurfaceAttributes& attributes) {
21    int error;
22    pdx::Status<std::unique_ptr<Surface>> status;
23    if (auto surface = Create(attributes, &error))
24      status.SetValue(std::move(surface));
25    else
26      status.SetError(error);
27    return status;
28  }
29
30  int surface_id() const { return surface_id_; }
31  int z_order() const { return z_order_; }
32  bool visible() const { return visible_; }
33
34  pdx::Status<void> SetVisible(bool visible);
35  pdx::Status<void> SetZOrder(int z_order);
36  pdx::Status<void> SetAttributes(const SurfaceAttributes& attributes);
37
38  // Creates an empty queue.
39  pdx::Status<std::unique_ptr<ProducerQueue>> CreateQueue();
40
41  // Creates a queue and populates it with |capacity| buffers of the specified
42  // parameters.
43  pdx::Status<std::unique_ptr<ProducerQueue>> CreateQueue(uint32_t width,
44                                                          uint32_t height,
45                                                          uint32_t layer_count,
46                                                          uint32_t format,
47                                                          uint64_t usage,
48                                                          size_t capacity);
49
50 private:
51  friend BASE;
52
53  int surface_id_ = -1;
54  int z_order_ = 0;
55  bool visible_ = false;
56
57  // TODO(eieio,avakulenko): Remove error param once pdx::ClientBase::Create()
58  // returns Status<T>.
59  explicit Surface(const SurfaceAttributes& attributes, int* error = nullptr);
60  explicit Surface(pdx::LocalChannelHandle channel_handle,
61                   int* error = nullptr);
62
63  Surface(const Surface&) = delete;
64  void operator=(const Surface&) = delete;
65};
66
67class DisplayClient : public pdx::ClientBase<DisplayClient> {
68 public:
69  pdx::Status<Metrics> GetDisplayMetrics();
70  pdx::Status<std::unique_ptr<IonBuffer>> GetNamedBuffer(
71      const std::string& name);
72  pdx::Status<std::unique_ptr<Surface>> CreateSurface(
73      const SurfaceAttributes& attributes);
74
75  // Temporary query for current VR status. Will be removed later.
76  pdx::Status<bool> IsVrAppRunning();
77
78 private:
79  friend BASE;
80
81  explicit DisplayClient(int* error = nullptr);
82
83  DisplayClient(const DisplayClient&) = delete;
84  void operator=(const DisplayClient&) = delete;
85};
86
87}  // namespace display
88}  // namespace dvr
89}  // namespace android
90
91#endif  // ANDROID_DVR_DISPLAY_CLIENT_H_
92