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