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

Commit 5ce4bb2c authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "VR: Move VR HWC DVR API to libdvr" into oc-dev

parents 93e3900a 37cdc8d0
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ LOCAL_SRC_FILES := \
    dvr_api.cpp \
    dvr_buffer.cpp \
    dvr_buffer_queue.cpp \
    dvr_hardware_composer_client.cpp \
    dvr_surface.cpp \
    vsync_client_api.cpp \

@@ -42,12 +43,15 @@ LOCAL_STATIC_LIBRARIES := \
    libdisplay \
    libvrsensor \
    libvirtualtouchpadclient \
    libvr_hwc-impl \
    libvr_hwc-binder \

LOCAL_SHARED_LIBRARIES := \
    android.hardware.graphics.bufferqueue@1.0 \
    android.hidl.token@1.0-utils \
    libandroid_runtime \
    libbase \
    libnativewindow \

include $(BUILD_STATIC_LIBRARY)

+21 −0
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@

// Headers not yet moved into libdvr.
// TODO(jwcai) Move these once their callers are moved into Google3.
#include <dvr/dvr_hardware_composer_client.h>
#include <dvr/pose_client.h>
#include <dvr/virtual_touchpad_client.h>

@@ -100,6 +101,26 @@ DVR_EXPORT int dvrGetApi(void* api, size_t struct_size, int version) {
    dvr_api->virtual_touchpad_touch = dvrVirtualTouchpadTouch;
    dvr_api->virtual_touchpad_button_state = dvrVirtualTouchpadButtonState;

    // dvr_hardware_composer_client.h
    dvr_api->hwc_client_create = dvrHwcClientCreate;
    dvr_api->hwc_client_destroy = dvrHwcClientDestroy;
    dvr_api->hwc_frame_destroy = dvrHwcFrameDestroy;
    dvr_api->hwc_frame_get_display_id = dvrHwcFrameGetDisplayId;
    dvr_api->hwc_frame_get_display_width = dvrHwcFrameGetDisplayWidth;
    dvr_api->hwc_frame_get_display_height = dvrHwcFrameGetDisplayHeight;
    dvr_api->hwc_frame_get_layer_count = dvrHwcFrameGetLayerCount;
    dvr_api->hwc_frame_get_layer_id = dvrHwcFrameGetLayerId;
    dvr_api->hwc_frame_get_layer_buffer = dvrHwcFrameGetLayerBuffer;
    dvr_api->hwc_frame_get_layer_fence = dvrHwcFrameGetLayerFence;
    dvr_api->hwc_frame_get_layer_display_frame =
        dvrHwcFrameGetLayerDisplayFrame;
    dvr_api->hwc_frame_get_layer_crop = dvrHwcFrameGetLayerCrop;
    dvr_api->hwc_frame_get_layer_blend_mode = dvrHwcFrameGetLayerBlendMode;
    dvr_api->hwc_frame_get_layer_alpha = dvrHwcFrameGetLayerAlpha;
    dvr_api->hwc_frame_get_layer_type = dvrHwcFrameGetLayerType;
    dvr_api->hwc_frame_get_layer_application_id =
        dvrHwcFrameGetLayerApplicationId;

    return 0;
  }
  return -EINVAL;
+27 −7
Original line number Diff line number Diff line
#include "private/android/dvr_hardware_composer_client.h"
#include "include/dvr/dvr_hardware_composer_client.h"

#include <android/dvr/IVrComposer.h>
#include <android/dvr/BnVrComposerCallback.h>
#include <android/hardware_buffer.h>
#include <binder/IServiceManager.h>
#include <private/android/AHardwareBufferHelpers.h>

@@ -15,7 +16,8 @@ namespace {

class HwcCallback : public android::dvr::BnVrComposerCallback {
 public:
  explicit HwcCallback(DvrHwcOnFrameCallback callback);
  explicit HwcCallback(DvrHwcOnFrameCallback callback,
                       void* client_state);
  ~HwcCallback() override;

  std::unique_ptr<DvrHwcFrame> DequeueFrame();
@@ -27,13 +29,14 @@ class HwcCallback : public android::dvr::BnVrComposerCallback {
      android::dvr::ParcelableUniqueFd* fence) override;

  DvrHwcOnFrameCallback callback_;
  void* client_state_;

  HwcCallback(const HwcCallback&) = delete;
  void operator=(const HwcCallback&) = delete;
};

HwcCallback::HwcCallback(DvrHwcOnFrameCallback callback)
    : callback_(callback) {}
HwcCallback::HwcCallback(DvrHwcOnFrameCallback callback, void* client_state)
    : callback_(callback), client_state_(client_state) {}

HwcCallback::~HwcCallback() {}

@@ -43,7 +46,8 @@ android::binder::Status HwcCallback::onNewFrame(
  std::unique_ptr<DvrHwcFrame> dvr_frame(new DvrHwcFrame());
  dvr_frame->frame = frame.frame();

  fence->set_fence(android::base::unique_fd(callback_(dvr_frame.release())));
  fence->set_fence(android::base::unique_fd(callback_(client_state_,
                                                      dvr_frame.release())));
  return android::binder::Status::ok();
}

@@ -54,7 +58,7 @@ struct DvrHwcClient {
  android::sp<HwcCallback> callback;
};

DvrHwcClient* dvrHwcCreateClient(DvrHwcOnFrameCallback callback) {
DvrHwcClient* dvrHwcClientCreate(DvrHwcOnFrameCallback callback, void* data) {
  std::unique_ptr<DvrHwcClient> client(new DvrHwcClient());

  android::sp<android::IServiceManager> sm(android::defaultServiceManager());
@@ -63,7 +67,7 @@ DvrHwcClient* dvrHwcCreateClient(DvrHwcOnFrameCallback callback) {
  if (!client->composer.get())
    return nullptr;

  client->callback = new HwcCallback(callback);
  client->callback = new HwcCallback(callback, data);
  android::binder::Status status = client->composer->registerObserver(
      client->callback);
  if (!status.isOk())
@@ -72,6 +76,10 @@ DvrHwcClient* dvrHwcCreateClient(DvrHwcOnFrameCallback callback) {
  return client.release();
}

void dvrHwcClientDestroy(DvrHwcClient* client) {
  delete client;
}

void dvrHwcFrameDestroy(DvrHwcFrame* frame) {
  delete frame;
}
@@ -80,6 +88,18 @@ Display dvrHwcFrameGetDisplayId(DvrHwcFrame* frame) {
  return frame->frame.display_id;
}

int32_t dvrHwcFrameGetDisplayWidth(DvrHwcFrame* frame) {
  return frame->frame.display_width;
}

int32_t dvrHwcFrameGetDisplayHeight(DvrHwcFrame* frame) {
  return frame->frame.display_height;
}

bool dvrHwcFrameGetDisplayRemoved(DvrHwcFrame* frame) {
  return frame->frame.removed;
}

size_t dvrHwcFrameGetLayerCount(DvrHwcFrame* frame) {
  return frame->frame.layers.size();
}
+51 −0
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@
#include <stddef.h>
#include <stdint.h>

#include <dvr/dvr_hardware_composer_defs.h>
#include <jni.h>

#ifdef __cplusplus
@@ -144,6 +145,37 @@ typedef int (*DvrVirtualTouchpadTouchPtr)(DvrVirtualTouchpad* client,
typedef int (*DvrVirtualTouchpadButtonStatePtr)(DvrVirtualTouchpad* client,
                                                int touchpad, int buttons);

// dvr_hardware_composer_client.h
typedef struct DvrHwcClient DvrHwcClient;
typedef struct DvrHwcFrame DvrHwcFrame;
typedef int(*DvrHwcOnFrameCallback)(void* client_state, DvrHwcFrame* frame);
typedef DvrHwcClient* (*DvrHwcClientCreatePtr)(DvrHwcOnFrameCallback callback,
                                               void* client_state);
typedef void (*DvrHwcClientDestroyPtr)(DvrHwcClient* client);
typedef void (*DvrHwcFrameDestroyPtr)(DvrHwcFrame* frame);
typedef Display (*DvrHwcFrameGetDisplayIdPtr)(DvrHwcFrame* frame);
typedef int32_t (*DvrHwcFrameGetDisplayWidthPtr)(DvrHwcFrame* frame);
typedef int32_t (*DvrHwcFrameGetDisplayHeightPtr)(DvrHwcFrame* frame);
typedef bool (*DvrHwcFrameGetDisplayRemovedPtr)(DvrHwcFrame* frame);
typedef size_t (*DvrHwcFrameGetLayerCountPtr)(DvrHwcFrame* frame);
typedef Layer (*DvrHwcFrameGetLayerIdPtr)(DvrHwcFrame* frame, size_t layer_index);
typedef AHardwareBuffer* (*DvrHwcFrameGetLayerBufferPtr)(DvrHwcFrame* frame,
                                                         size_t layer_index);
typedef int (*DvrHwcFrameGetLayerFencePtr)(DvrHwcFrame* frame,
                                           size_t layer_index);
typedef Recti (*DvrHwcFrameGetLayerDisplayFramePtr)(DvrHwcFrame* frame,
                                                    size_t layer_index);
typedef Rectf (*DvrHwcFrameGetLayerCropPtr)(DvrHwcFrame* frame,
                                            size_t layer_index);
typedef BlendMode (*DvrHwcFrameGetLayerBlendModePtr)(DvrHwcFrame* frame,
                                                     size_t layer_index);
typedef float (*DvrHwcFrameGetLayerAlphaPtr)(DvrHwcFrame* frame,
                                             size_t layer_index);
typedef uint32_t (*DvrHwcFrameGetLayerTypePtr)(DvrHwcFrame* frame,
                                               size_t layer_index);
typedef uint32_t (*DvrHwcFrameGetLayerApplicationIdPtr)(DvrHwcFrame* frame,
                                                        size_t layer_index);

struct DvrApi_v1 {
  // Display manager client
  DvrDisplayManagerClientCreatePtr display_manager_client_create;
@@ -220,6 +252,25 @@ struct DvrApi_v1 {
  DvrVirtualTouchpadDetachPtr virtual_touchpad_detach;
  DvrVirtualTouchpadTouchPtr virtual_touchpad_touch;
  DvrVirtualTouchpadButtonStatePtr virtual_touchpad_button_state;

  // VR HWComposer client
  DvrHwcClientCreatePtr hwc_client_create;
  DvrHwcClientDestroyPtr hwc_client_destroy;
  DvrHwcFrameDestroyPtr hwc_frame_destroy;
  DvrHwcFrameGetDisplayIdPtr hwc_frame_get_display_id;
  DvrHwcFrameGetDisplayWidthPtr hwc_frame_get_display_width;
  DvrHwcFrameGetDisplayHeightPtr hwc_frame_get_display_height;
  DvrHwcFrameGetDisplayRemovedPtr hwc_frame_get_display_removed;
  DvrHwcFrameGetLayerCountPtr hwc_frame_get_layer_count;
  DvrHwcFrameGetLayerIdPtr hwc_frame_get_layer_id;
  DvrHwcFrameGetLayerBufferPtr hwc_frame_get_layer_buffer;
  DvrHwcFrameGetLayerFencePtr hwc_frame_get_layer_fence;
  DvrHwcFrameGetLayerDisplayFramePtr hwc_frame_get_layer_display_frame;
  DvrHwcFrameGetLayerCropPtr hwc_frame_get_layer_crop;
  DvrHwcFrameGetLayerBlendModePtr hwc_frame_get_layer_blend_mode;
  DvrHwcFrameGetLayerAlphaPtr hwc_frame_get_layer_alpha;
  DvrHwcFrameGetLayerTypePtr hwc_frame_get_layer_type;
  DvrHwcFrameGetLayerApplicationIdPtr hwc_frame_get_layer_application_id;
};

int dvrGetApi(void* api, size_t struct_size, int version);
+23 −7
Original line number Diff line number Diff line
#ifndef VR_HARDWARE_COMPOSER_PRIVATE_ANDROID_DVR_HARDWARE_COMPOSER_CLIENT_H
#define VR_HARDWARE_COMPOSER_PRIVATE_ANDROID_DVR_HARDWARE_COMPOSER_CLIENT_H
#ifndef ANDROID_DVR_HARDWARE_COMPOSER_CLIENT_H
#define ANDROID_DVR_HARDWARE_COMPOSER_CLIENT_H

#include <android/dvr_hardware_composer_defs.h>
#include <android/hardware_buffer.h>
#include <dvr/dvr_hardware_composer_defs.h>
#include <stdbool.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef struct AHardwareBuffer AHardwareBuffer;
typedef struct DvrHwcClient DvrHwcClient;
typedef struct DvrHwcFrame DvrHwcFrame;

// Called when a new frame has arrived.
//
// @param client_state Pointer to client state passed in |dvrHwcCreateClient()|.
// @param frame New frame. Owned by the client.
// @return fence FD for the release of the last frame.
typedef int(*DvrHwcOnFrameCallback)(DvrHwcFrame* frame);
typedef int(*DvrHwcOnFrameCallback)(void* client_state, DvrHwcFrame* frame);

DvrHwcClient* dvrHwcCreateClient(DvrHwcOnFrameCallback callback);
// @param callback Called when a new frame is available.
// @param client_state Pointer to client state passed back in the callback.
DvrHwcClient* dvrHwcClientCreate(DvrHwcOnFrameCallback callback,
                                 void* client_state);

void dvrHwcClientDestroy(DvrHwcClient* client);

// Called to free the frame information.
void dvrHwcFrameDestroy(DvrHwcFrame* frame);

Display dvrHwcFrameGetDisplayId(DvrHwcFrame* frame);

int32_t dvrHwcFrameGetDisplayWidth(DvrHwcFrame* frame);

int32_t dvrHwcFrameGetDisplayHeight(DvrHwcFrame* frame);

// @return True if the display has been removed. In this case the current frame
// does not contain any valid layers to display. It is a signal to clean up any
// display related state.
bool dvrHwcFrameGetDisplayRemoved(DvrHwcFrame* frame);

// @return Number of layers in the frame.
size_t dvrHwcFrameGetLayerCount(DvrHwcFrame* frame);

@@ -59,4 +75,4 @@ uint32_t dvrHwcFrameGetLayerApplicationId(DvrHwcFrame* frame,
}  // extern "C"
#endif

#endif  // VR_HARDWARE_COMPOSER_PRIVATE_ANDROID_DVR_HARDWARE_COMPOSER_CLIENT_H
#endif  // ANDROID_DVR_HARDWARE_COMPOSER_CLIENT_H
Loading