1 #include "include/dvr/dvr_display_manager.h"
2 
3 #include <dvr/dvr_buffer.h>
4 #include <pdx/rpc/variant.h>
5 #include <private/dvr/buffer_hub_client.h>
6 #include <private/dvr/buffer_hub_queue_client.h>
7 #include <private/dvr/display_client.h>
8 #include <private/dvr/display_manager_client.h>
9 
10 #include "dvr_internal.h"
11 #include "dvr_buffer_queue_internal.h"
12 
13 using android::dvr::BufferConsumer;
14 using android::dvr::display::DisplayManagerClient;
15 using android::dvr::display::SurfaceAttributes;
16 using android::dvr::display::SurfaceAttribute;
17 using android::dvr::display::SurfaceState;
18 using android::pdx::rpc::EmptyVariant;
19 
20 namespace {
21 
22 // Extracts type and value from the attribute Variant and writes them into the
23 // respective fields of DvrSurfaceAttribute.
24 struct AttributeVisitor {
25   DvrSurfaceAttribute* attribute;
26 
operator ()__anon5c1839f30111::AttributeVisitor27   void operator()(int32_t value) {
28     attribute->value.int32_value = value;
29     attribute->value.type = DVR_SURFACE_ATTRIBUTE_TYPE_INT32;
30   }
operator ()__anon5c1839f30111::AttributeVisitor31   void operator()(int64_t value) {
32     attribute->value.int64_value = value;
33     attribute->value.type = DVR_SURFACE_ATTRIBUTE_TYPE_INT64;
34   }
operator ()__anon5c1839f30111::AttributeVisitor35   void operator()(bool value) {
36     attribute->value.bool_value = value;
37     attribute->value.type = DVR_SURFACE_ATTRIBUTE_TYPE_BOOL;
38   }
operator ()__anon5c1839f30111::AttributeVisitor39   void operator()(float value) {
40     attribute->value.float_value = value;
41     attribute->value.type = DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT;
42   }
operator ()__anon5c1839f30111::AttributeVisitor43   void operator()(const std::array<float, 2>& value) {
44     std::copy(value.cbegin(), value.cend(), attribute->value.float2_value);
45     attribute->value.type = DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT2;
46   }
operator ()__anon5c1839f30111::AttributeVisitor47   void operator()(const std::array<float, 3>& value) {
48     std::copy(value.cbegin(), value.cend(), attribute->value.float3_value);
49     attribute->value.type = DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT3;
50   }
operator ()__anon5c1839f30111::AttributeVisitor51   void operator()(const std::array<float, 4>& value) {
52     std::copy(value.cbegin(), value.cend(), attribute->value.float4_value);
53     attribute->value.type = DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT4;
54   }
operator ()__anon5c1839f30111::AttributeVisitor55   void operator()(const std::array<float, 8>& value) {
56     std::copy(value.cbegin(), value.cend(), attribute->value.float8_value);
57     attribute->value.type = DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT8;
58   }
operator ()__anon5c1839f30111::AttributeVisitor59   void operator()(const std::array<float, 16>& value) {
60     std::copy(value.cbegin(), value.cend(), attribute->value.float16_value);
61     attribute->value.type = DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT16;
62   }
operator ()__anon5c1839f30111::AttributeVisitor63   void operator()(EmptyVariant) {
64     attribute->value.type = DVR_SURFACE_ATTRIBUTE_TYPE_NONE;
65   }
66 };
67 
ConvertSurfaceAttributes(const SurfaceAttributes & surface_attributes,DvrSurfaceAttribute * attributes,size_t max_count)68 size_t ConvertSurfaceAttributes(const SurfaceAttributes& surface_attributes,
69                                 DvrSurfaceAttribute* attributes,
70                                 size_t max_count) {
71   size_t count = 0;
72   for (const auto& attribute : surface_attributes) {
73     if (count >= max_count)
74       break;
75 
76     // Copy the key and extract the Variant value using a visitor.
77     attributes[count].key = attribute.first;
78     attribute.second.Visit(AttributeVisitor{&attributes[count]});
79     count++;
80   }
81 
82   return count;
83 }
84 
85 }  // anonymous namespace
86 
87 extern "C" {
88 
89 struct DvrDisplayManager {
90   std::unique_ptr<DisplayManagerClient> client;
91 };
92 
93 struct DvrSurfaceState {
94   std::vector<SurfaceState> state;
95 };
96 
dvrDisplayManagerCreate(DvrDisplayManager ** client_out)97 int dvrDisplayManagerCreate(DvrDisplayManager** client_out) {
98   if (!client_out)
99     return -EINVAL;
100 
101   auto client = DisplayManagerClient::Create();
102   if (!client) {
103     ALOGE("dvrDisplayManagerCreate: Failed to create display manager client!");
104     return -EIO;
105   }
106 
107   *client_out = new DvrDisplayManager{std::move(client)};
108   return 0;
109 }
110 
dvrDisplayManagerDestroy(DvrDisplayManager * client)111 void dvrDisplayManagerDestroy(DvrDisplayManager* client) { delete client; }
112 
dvrDisplayManagerGetEventFd(DvrDisplayManager * client)113 int dvrDisplayManagerGetEventFd(DvrDisplayManager* client) {
114   if (!client)
115     return -EINVAL;
116 
117   return client->client->event_fd();
118 }
119 
dvrDisplayManagerTranslateEpollEventMask(DvrDisplayManager * client,int in_events,int * out_events)120 int dvrDisplayManagerTranslateEpollEventMask(DvrDisplayManager* client,
121                                              int in_events, int* out_events) {
122   if (!client || !out_events)
123     return -EINVAL;
124 
125   auto status = client->client->GetEventMask(in_events);
126   if (!status)
127     return -status.error();
128 
129   *out_events = status.get();
130   return 0;
131 }
132 
dvrDisplayManagerGetSurfaceState(DvrDisplayManager * client,DvrSurfaceState * state)133 int dvrDisplayManagerGetSurfaceState(DvrDisplayManager* client,
134                                      DvrSurfaceState* state) {
135   if (!client || !state)
136     return -EINVAL;
137 
138   auto status = client->client->GetSurfaceState();
139   if (!status)
140     return -status.error();
141 
142   state->state = status.take();
143   return 0;
144 }
145 
dvrDisplayManagerGetReadBufferQueue(DvrDisplayManager * client,int surface_id,int queue_id,DvrReadBufferQueue ** queue_out)146 int dvrDisplayManagerGetReadBufferQueue(DvrDisplayManager* client,
147                                         int surface_id, int queue_id,
148                                         DvrReadBufferQueue** queue_out) {
149   if (!client || !queue_out)
150     return -EINVAL;
151 
152   auto status = client->client->GetSurfaceQueue(surface_id, queue_id);
153   if (!status) {
154     ALOGE("dvrDisplayManagerGetReadBufferQueue: Failed to get queue: %s",
155           status.GetErrorMessage().c_str());
156     return -status.error();
157   }
158 
159   *queue_out = new DvrReadBufferQueue(status.take());
160   return 0;
161 }
162 
dvrSurfaceStateCreate(DvrSurfaceState ** surface_state_out)163 int dvrSurfaceStateCreate(DvrSurfaceState** surface_state_out) {
164   if (!surface_state_out)
165     return -EINVAL;
166 
167   *surface_state_out = new DvrSurfaceState{};
168   return 0;
169 }
170 
dvrSurfaceStateDestroy(DvrSurfaceState * surface_state)171 void dvrSurfaceStateDestroy(DvrSurfaceState* surface_state) {
172   delete surface_state;
173 }
174 
dvrSurfaceStateGetSurfaceCount(DvrSurfaceState * surface_state,size_t * count_out)175 int dvrSurfaceStateGetSurfaceCount(DvrSurfaceState* surface_state,
176                                    size_t* count_out) {
177   if (!surface_state)
178     return -EINVAL;
179 
180   *count_out = surface_state->state.size();
181   return 0;
182 }
183 
dvrSurfaceStateGetUpdateFlags(DvrSurfaceState * surface_state,size_t surface_index,DvrSurfaceUpdateFlags * flags_out)184 int dvrSurfaceStateGetUpdateFlags(DvrSurfaceState* surface_state,
185                                   size_t surface_index,
186                                   DvrSurfaceUpdateFlags* flags_out) {
187   if (!surface_state || surface_index >= surface_state->state.size())
188     return -EINVAL;
189 
190   *flags_out = surface_state->state[surface_index].update_flags;
191   return 0;
192 }
193 
dvrSurfaceStateGetSurfaceId(DvrSurfaceState * surface_state,size_t surface_index,int * surface_id_out)194 int dvrSurfaceStateGetSurfaceId(DvrSurfaceState* surface_state,
195                                 size_t surface_index, int* surface_id_out) {
196   if (!surface_state || surface_index >= surface_state->state.size())
197     return -EINVAL;
198 
199   *surface_id_out = surface_state->state[surface_index].surface_id;
200   return 0;
201 }
202 
dvrSurfaceStateGetProcessId(DvrSurfaceState * surface_state,size_t surface_index,int * process_id_out)203 int dvrSurfaceStateGetProcessId(DvrSurfaceState* surface_state,
204                                 size_t surface_index, int* process_id_out) {
205   if (!surface_state || surface_index >= surface_state->state.size())
206     return -EINVAL;
207 
208   *process_id_out = surface_state->state[surface_index].process_id;
209   return 0;
210 }
211 
dvrSurfaceStateGetQueueCount(DvrSurfaceState * surface_state,size_t surface_index,size_t * count_out)212 int dvrSurfaceStateGetQueueCount(DvrSurfaceState* surface_state,
213                                  size_t surface_index, size_t* count_out) {
214   if (!surface_state || surface_index >= surface_state->state.size())
215     return -EINVAL;
216 
217   *count_out = surface_state->state[surface_index].queue_ids.size();
218   return 0;
219 }
220 
dvrSurfaceStateGetQueueIds(DvrSurfaceState * surface_state,size_t surface_index,int * queue_ids,size_t max_count)221 ssize_t dvrSurfaceStateGetQueueIds(DvrSurfaceState* surface_state,
222                                    size_t surface_index, int* queue_ids,
223                                    size_t max_count) {
224   if (!surface_state || surface_index >= surface_state->state.size())
225     return -EINVAL;
226 
227   size_t i;
228   const auto& state = surface_state->state[surface_index];
229   for (i = 0; i < std::min(max_count, state.queue_ids.size()); i++) {
230     queue_ids[i] = state.queue_ids[i];
231   }
232 
233   return i;
234 }
235 
dvrSurfaceStateGetZOrder(DvrSurfaceState * surface_state,size_t surface_index,int * z_order_out)236 int dvrSurfaceStateGetZOrder(DvrSurfaceState* surface_state,
237                              size_t surface_index, int* z_order_out) {
238   if (!surface_state || surface_index >= surface_state->state.size() ||
239       !z_order_out) {
240     return -EINVAL;
241   }
242 
243   *z_order_out = surface_state->state[surface_index].GetZOrder();
244   return 0;
245 }
246 
dvrSurfaceStateGetVisible(DvrSurfaceState * surface_state,size_t surface_index,bool * visible_out)247 int dvrSurfaceStateGetVisible(DvrSurfaceState* surface_state,
248                               size_t surface_index, bool* visible_out) {
249   if (!surface_state || surface_index >= surface_state->state.size() ||
250       !visible_out) {
251     return -EINVAL;
252   }
253 
254   *visible_out = surface_state->state[surface_index].GetVisible();
255   return 0;
256 }
257 
dvrSurfaceStateGetAttributeCount(DvrSurfaceState * surface_state,size_t surface_index,size_t * count_out)258 int dvrSurfaceStateGetAttributeCount(DvrSurfaceState* surface_state,
259                                      size_t surface_index, size_t* count_out) {
260   if (!surface_state || surface_index >= surface_state->state.size() ||
261       !count_out) {
262     return -EINVAL;
263   }
264 
265   *count_out = surface_state->state[surface_index].surface_attributes.size();
266   return 0;
267 }
268 
dvrSurfaceStateGetAttributes(DvrSurfaceState * surface_state,size_t surface_index,DvrSurfaceAttribute * attributes,size_t max_count)269 ssize_t dvrSurfaceStateGetAttributes(DvrSurfaceState* surface_state,
270                                      size_t surface_index,
271                                      DvrSurfaceAttribute* attributes,
272                                      size_t max_count) {
273   if (!surface_state || surface_index >= surface_state->state.size() ||
274       !attributes) {
275     return -EINVAL;
276   }
277 
278   return ConvertSurfaceAttributes(
279       surface_state->state[surface_index].surface_attributes, attributes,
280       max_count);
281 }
282 
283 }  // extern "C"
284