Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 010fe955 authored by Hendrik Wagenaar's avatar Hendrik Wagenaar
Browse files

Add ability to pass device metrics to GVR

* Passes config file data for the device to VrCore

Bug: 36215727
Test: DvrDisplayManagerTest::ConfigurationData - on marlin, SELinux on,
      with and without setenforce.
Change-Id: Iee05b90a21937ed9b60658c70da87a8c99dfcbb2
parent fcae2e36
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -58,6 +58,20 @@ pdx::Status<std::unique_ptr<IonBuffer>> DisplayManagerClient::SetupNamedBuffer(
  return {std::move(ion_buffer)};
}

pdx::Status<std::string> DisplayManagerClient::GetConfigurationData(
    ConfigFileType config_type) {
  auto status =
      InvokeRemoteMethod<DisplayManagerProtocol::GetConfigurationData>(
          config_type);
  if (!status && status.error() != ENOENT) {
    ALOGE(
        "DisplayManagerClient::GetConfigurationData: Unable to get "
        "configuration data. Error: %s",
        status.GetErrorMessage().c_str());
  }
  return status;
}

pdx::Status<std::unique_ptr<ConsumerQueue>>
DisplayManagerClient::GetSurfaceQueue(int surface_id, int queue_id) {
  auto status = InvokeRemoteMethod<DisplayManagerProtocol::GetSurfaceQueue>(
+1 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ class DisplayManagerClient : public pdx::ClientBase<DisplayManagerClient> {
  pdx::Status<std::unique_ptr<ConsumerQueue>> GetSurfaceQueue(int surface_id,
                                                              int queue_id);

  pdx::Status<std::string> GetConfigurationData(ConfigFileType config_type);
  using Client::event_fd;

  pdx::Status<int> GetEventMask(int events) {
+10 −0
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@

#include <dvr/dvr_display_types.h>

#include <pdx/rpc/buffer_wrapper.h>
#include <pdx/rpc/remote_method.h>
#include <pdx/rpc/serializable.h>
#include <pdx/rpc/variant.h>
@@ -217,6 +218,12 @@ struct DisplayProtocol {
                    void(const SurfaceAttributes& attributes));
};

enum class ConfigFileType : uint32_t {
  kLensMetrics,
  kDeviceMetrics,
  kDeviceConfiguration
};

struct DisplayManagerProtocol {
  // Service path.
  static constexpr char kClientPath[] = "system/vr/display/manager";
@@ -226,6 +233,7 @@ struct DisplayManagerProtocol {
    kOpGetSurfaceState = 0,
    kOpGetSurfaceQueue,
    kOpSetupNamedBuffer,
    kOpGetConfigurationData,
  };

  // Aliases.
@@ -240,6 +248,8 @@ struct DisplayManagerProtocol {
  PDX_REMOTE_METHOD(SetupNamedBuffer, kOpSetupNamedBuffer,
                    LocalNativeBufferHandle(const std::string& name,
                                            size_t size, uint64_t usage));
  PDX_REMOTE_METHOD(GetConfigurationData, kOpGetConfigurationData,
                    std::string(ConfigFileType config_type));
};

struct VSyncSchedInfo {
+25 −0
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@

using android::AHardwareBuffer_convertToGrallocUsageBits;
using android::dvr::BufferConsumer;
using android::dvr::display::ConfigFileType;
using android::dvr::display::DisplayManagerClient;
using android::dvr::display::SurfaceAttributes;
using android::dvr::display::SurfaceAttribute;
@@ -131,6 +132,30 @@ int dvrDisplayManagerSetupNamedBuffer(DvrDisplayManager* client,
  return 0;
}

int dvrConfigurationDataGet(DvrDisplayManager* client, int config_type,
                            uint8_t** data, size_t* data_size) {
  if (!client || !data || !data_size) {
    return -EINVAL;
  }

  ConfigFileType config_file_type = static_cast<ConfigFileType>(config_type);
  auto config_data_status =
      client->client->GetConfigurationData(config_file_type);

  if (!config_data_status) {
    return -config_data_status.error();
  }

  *data_size = config_data_status.get().size();
  *data = new uint8_t[*data_size];
  std::copy_n(config_data_status.get().begin(), *data_size, *data);
  return 0;
}

void dvrConfigurationDataDestroy(DvrDisplayManager*, uint8_t* data) {
  delete[] data;
}

int dvrDisplayManagerGetEventFd(DvrDisplayManager* client) {
  if (!client)
    return -EINVAL;
+5 −0
Original line number Diff line number Diff line
@@ -54,6 +54,11 @@ typedef int (*DvrDisplayManagerGetSurfaceStatePtr)(
typedef int (*DvrDisplayManagerGetReadBufferQueuePtr)(
    DvrDisplayManager* client, int surface_id, int queue_id,
    DvrReadBufferQueue** queue_out);
typedef int (*DvrConfigurationDataGetPtr)(DvrDisplayManager* client,
                                          int config_type, uint8_t** data,
                                          size_t* data_size);
typedef void (*DvrConfigurationDataDestroyPtr)(DvrDisplayManager* client,
                                               uint8_t* data);
typedef int (*DvrSurfaceStateCreatePtr)(DvrSurfaceState** surface_state);
typedef void (*DvrSurfaceStateDestroyPtr)(DvrSurfaceState* surface_state);
typedef int (*DvrSurfaceStateGetSurfaceCountPtr)(DvrSurfaceState* surface_state,
Loading