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