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