12251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include "include/dvr/dvr_display_manager.h"
22251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
32251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <dvr/dvr_buffer.h>
42251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <pdx/rpc/variant.h>
52251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <private/dvr/buffer_hub_client.h>
62251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <private/dvr/buffer_hub_queue_client.h>
7bcb03d005a4ccca20a0723f087e90e8b503b4848Hendrik Wagenaar#include <private/dvr/display_client.h>
82251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <private/dvr/display_manager_client.h>
92251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
102251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include "dvr_internal.h"
11656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai#include "dvr_buffer_queue_internal.h"
122251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
132251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing android::dvr::BufferConsumer;
142251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing android::dvr::display::DisplayManagerClient;
152251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing android::dvr::display::SurfaceAttributes;
162251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing android::dvr::display::SurfaceAttribute;
172251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing android::dvr::display::SurfaceState;
182251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing android::pdx::rpc::EmptyVariant;
192251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
202251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakanamespace {
212251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
222251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Extracts type and value from the attribute Variant and writes them into the
232251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// respective fields of DvrSurfaceAttribute.
242251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakastruct AttributeVisitor {
252251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  DvrSurfaceAttribute* attribute;
262251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
272251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  void operator()(int32_t value) {
282251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    attribute->value.int32_value = value;
292251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    attribute->value.type = DVR_SURFACE_ATTRIBUTE_TYPE_INT32;
302251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  }
312251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  void operator()(int64_t value) {
322251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    attribute->value.int64_value = value;
332251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    attribute->value.type = DVR_SURFACE_ATTRIBUTE_TYPE_INT64;
342251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  }
352251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  void operator()(bool value) {
362251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    attribute->value.bool_value = value;
372251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    attribute->value.type = DVR_SURFACE_ATTRIBUTE_TYPE_BOOL;
382251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  }
392251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  void operator()(float value) {
402251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    attribute->value.float_value = value;
412251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    attribute->value.type = DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT;
422251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  }
432251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  void operator()(const std::array<float, 2>& value) {
442251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    std::copy(value.cbegin(), value.cend(), attribute->value.float2_value);
452251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    attribute->value.type = DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT2;
462251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  }
472251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  void operator()(const std::array<float, 3>& value) {
482251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    std::copy(value.cbegin(), value.cend(), attribute->value.float3_value);
492251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    attribute->value.type = DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT3;
502251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  }
512251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  void operator()(const std::array<float, 4>& value) {
522251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    std::copy(value.cbegin(), value.cend(), attribute->value.float4_value);
532251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    attribute->value.type = DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT4;
542251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  }
552251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  void operator()(const std::array<float, 8>& value) {
562251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    std::copy(value.cbegin(), value.cend(), attribute->value.float8_value);
572251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    attribute->value.type = DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT8;
582251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  }
592251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  void operator()(const std::array<float, 16>& value) {
602251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    std::copy(value.cbegin(), value.cend(), attribute->value.float16_value);
612251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    attribute->value.type = DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT16;
622251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  }
632251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  void operator()(EmptyVariant) {
642251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    attribute->value.type = DVR_SURFACE_ATTRIBUTE_TYPE_NONE;
652251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  }
662251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka};
672251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
682251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakasize_t ConvertSurfaceAttributes(const SurfaceAttributes& surface_attributes,
692251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                                DvrSurfaceAttribute* attributes,
702251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                                size_t max_count) {
712251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  size_t count = 0;
722251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  for (const auto& attribute : surface_attributes) {
732251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    if (count >= max_count)
742251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka      break;
752251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
762251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    // Copy the key and extract the Variant value using a visitor.
772251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    attributes[count].key = attribute.first;
782251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    attribute.second.Visit(AttributeVisitor{&attributes[count]});
792251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    count++;
802251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  }
812251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
822251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  return count;
832251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}
842251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
852251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}  // anonymous namespace
862251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
872251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaextern "C" {
882251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
892251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakastruct DvrDisplayManager {
902251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  std::unique_ptr<DisplayManagerClient> client;
912251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka};
922251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
932251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakastruct DvrSurfaceState {
942251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  std::vector<SurfaceState> state;
952251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka};
962251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
972251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaint dvrDisplayManagerCreate(DvrDisplayManager** client_out) {
982251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!client_out)
992251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
1002251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1012251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  auto client = DisplayManagerClient::Create();
1022251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!client) {
1032251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    ALOGE("dvrDisplayManagerCreate: Failed to create display manager client!");
1042251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EIO;
1052251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  }
1062251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1072251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  *client_out = new DvrDisplayManager{std::move(client)};
1082251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  return 0;
1092251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}
1102251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1112251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrDisplayManagerDestroy(DvrDisplayManager* client) { delete client; }
1122251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1132251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaint dvrDisplayManagerGetEventFd(DvrDisplayManager* client) {
1142251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!client)
1152251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
1162251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1172251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  return client->client->event_fd();
1182251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}
1192251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1202251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaint dvrDisplayManagerTranslateEpollEventMask(DvrDisplayManager* client,
1212251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                                             int in_events, int* out_events) {
1222251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!client || !out_events)
1232251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
1242251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1252251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  auto status = client->client->GetEventMask(in_events);
1262251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!status)
1272251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -status.error();
1282251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1292251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  *out_events = status.get();
1302251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  return 0;
1312251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}
1322251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1332251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaint dvrDisplayManagerGetSurfaceState(DvrDisplayManager* client,
1342251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                                     DvrSurfaceState* state) {
1352251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!client || !state)
1362251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
1372251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1382251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  auto status = client->client->GetSurfaceState();
1392251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!status)
1402251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -status.error();
1412251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1422251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  state->state = status.take();
1432251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  return 0;
1442251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}
1452251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1462251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaint dvrDisplayManagerGetReadBufferQueue(DvrDisplayManager* client,
1472251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                                        int surface_id, int queue_id,
1482251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                                        DvrReadBufferQueue** queue_out) {
1492251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!client || !queue_out)
1502251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
1512251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1522251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  auto status = client->client->GetSurfaceQueue(surface_id, queue_id);
1532251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!status) {
1542251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    ALOGE("dvrDisplayManagerGetReadBufferQueue: Failed to get queue: %s",
1552251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka          status.GetErrorMessage().c_str());
1562251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -status.error();
1572251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  }
1582251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
159656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  *queue_out = new DvrReadBufferQueue(status.take());
1602251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  return 0;
1612251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}
1622251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1632251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaint dvrSurfaceStateCreate(DvrSurfaceState** surface_state_out) {
1642251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!surface_state_out)
1652251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
1662251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1672251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  *surface_state_out = new DvrSurfaceState{};
1682251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  return 0;
1692251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}
1702251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1712251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrSurfaceStateDestroy(DvrSurfaceState* surface_state) {
1722251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  delete surface_state;
1732251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}
1742251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1752251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaint dvrSurfaceStateGetSurfaceCount(DvrSurfaceState* surface_state,
1762251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                                   size_t* count_out) {
1772251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!surface_state)
1782251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
1792251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1802251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  *count_out = surface_state->state.size();
1812251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  return 0;
1822251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}
1832251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1842251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaint dvrSurfaceStateGetUpdateFlags(DvrSurfaceState* surface_state,
1852251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                                  size_t surface_index,
1862251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                                  DvrSurfaceUpdateFlags* flags_out) {
1872251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!surface_state || surface_index >= surface_state->state.size())
1882251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
1892251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1902251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  *flags_out = surface_state->state[surface_index].update_flags;
1912251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  return 0;
1922251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}
1932251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1942251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaint dvrSurfaceStateGetSurfaceId(DvrSurfaceState* surface_state,
1952251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                                size_t surface_index, int* surface_id_out) {
1962251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!surface_state || surface_index >= surface_state->state.size())
1972251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
1982251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1992251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  *surface_id_out = surface_state->state[surface_index].surface_id;
2002251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  return 0;
2012251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}
2022251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2032251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaint dvrSurfaceStateGetProcessId(DvrSurfaceState* surface_state,
2042251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                                size_t surface_index, int* process_id_out) {
2052251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!surface_state || surface_index >= surface_state->state.size())
2062251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
2072251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2082251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  *process_id_out = surface_state->state[surface_index].process_id;
2092251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  return 0;
2102251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}
2112251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2122251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaint dvrSurfaceStateGetQueueCount(DvrSurfaceState* surface_state,
2132251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                                 size_t surface_index, size_t* count_out) {
2142251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!surface_state || surface_index >= surface_state->state.size())
2152251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
2162251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2172251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  *count_out = surface_state->state[surface_index].queue_ids.size();
2182251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  return 0;
2192251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}
2202251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2212251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakassize_t dvrSurfaceStateGetQueueIds(DvrSurfaceState* surface_state,
2222251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                                   size_t surface_index, int* queue_ids,
2232251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                                   size_t max_count) {
2242251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!surface_state || surface_index >= surface_state->state.size())
2252251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
2262251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2272251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  size_t i;
2282251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  const auto& state = surface_state->state[surface_index];
2292251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  for (i = 0; i < std::min(max_count, state.queue_ids.size()); i++) {
2302251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    queue_ids[i] = state.queue_ids[i];
2312251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  }
2322251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2332251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  return i;
2342251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}
2352251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2362251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaint dvrSurfaceStateGetZOrder(DvrSurfaceState* surface_state,
2372251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                             size_t surface_index, int* z_order_out) {
2382251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!surface_state || surface_index >= surface_state->state.size() ||
2392251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka      !z_order_out) {
2402251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
2412251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  }
2422251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2432251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  *z_order_out = surface_state->state[surface_index].GetZOrder();
2442251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  return 0;
2452251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}
2462251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2472251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaint dvrSurfaceStateGetVisible(DvrSurfaceState* surface_state,
2482251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                              size_t surface_index, bool* visible_out) {
2492251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!surface_state || surface_index >= surface_state->state.size() ||
2502251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka      !visible_out) {
2512251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
2522251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  }
2532251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2542251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  *visible_out = surface_state->state[surface_index].GetVisible();
2552251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  return 0;
2562251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}
2572251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2582251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaint dvrSurfaceStateGetAttributeCount(DvrSurfaceState* surface_state,
2592251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                                     size_t surface_index, size_t* count_out) {
2602251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!surface_state || surface_index >= surface_state->state.size() ||
2612251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka      !count_out) {
2622251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
2632251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  }
2642251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2652251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  *count_out = surface_state->state[surface_index].surface_attributes.size();
2662251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  return 0;
2672251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}
2682251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2692251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakassize_t dvrSurfaceStateGetAttributes(DvrSurfaceState* surface_state,
2702251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                                     size_t surface_index,
2712251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                                     DvrSurfaceAttribute* attributes,
2722251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                                     size_t max_count) {
2732251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!surface_state || surface_index >= surface_state->state.size() ||
2742251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka      !attributes) {
2752251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
2762251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  }
2772251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2782251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  return ConvertSurfaceAttributes(
2792251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka      surface_state->state[surface_index].surface_attributes, attributes,
2802251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka      max_count);
2812251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}
2822251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
2832251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}  // extern "C"
284