Loading libs/vr/libdvr/dvr_api.cpp +2 −0 Original line number Original line Diff line number Diff line Loading @@ -77,6 +77,8 @@ DVR_EXPORT int dvrGetApi(void* api, size_t struct_size, int version) { // dvr_surface.h // dvr_surface.h dvr_api->get_pose_buffer_ = dvrGetPoseBuffer; dvr_api->get_pose_buffer_ = dvrGetPoseBuffer; dvr_api->surface_create_ = dvrSurfaceCreate; dvr_api->surface_get_write_buffer_queue_ = dvrSurfaceGetWriteBufferQueue; // vsync_client_api.h // vsync_client_api.h dvr_api->vsync_client_create_ = dvr_vsync_client_create; dvr_api->vsync_client_create_ = dvr_vsync_client_create; Loading libs/vr/libdvr/dvr_surface.cpp +52 −0 Original line number Original line Diff line number Diff line Loading @@ -4,8 +4,60 @@ using namespace android; using namespace android; struct DvrSurface { std::unique_ptr<dvr::DisplaySurfaceClient> display_surface_; }; extern "C" { extern "C" { int dvrSurfaceCreate(int width, int height, int format, uint64_t usage0, uint64_t usage1, int flags, DvrSurface** out_surface) { if (out_surface == nullptr) { ALOGE("dvrSurfaceCreate: invalid inputs: out_surface=%p.", out_surface); return -EINVAL; } int error; auto client = dvr::DisplayClient::Create(&error); if (!client) { ALOGE("Failed to create display client!"); return error; } // TODO(hendrikw): When we move to gralloc1, pass both usage0 and usage1 down. std::unique_ptr<dvr::DisplaySurfaceClient> surface = client->CreateDisplaySurface( width, height, static_cast<int>(usage0 | usage1), format, flags); DvrSurface* dvr_surface = new DvrSurface; dvr_surface->display_surface_ = std::move(surface); *out_surface = dvr_surface; return 0; } int dvrSurfaceGetWriteBufferQueue(DvrSurface* surface, DvrWriteBufferQueue** out_writer) { if (surface == nullptr || out_writer == nullptr) { ALOGE( "dvrSurfaceGetWriteBufferQueue: Invalid inputs: surface=%p, " "out_writer=%p.", surface, out_writer); return -EINVAL; } DvrWriteBufferQueue* buffer_writer = new DvrWriteBufferQueue; buffer_writer->producer_queue_ = surface->display_surface_->GetProducerQueue(); if (buffer_writer->producer_queue_ == nullptr) { ALOGE( "dvrSurfaceGetWriteBufferQueue: Failed to get producer queue from " "display surface."); return -ENOMEM; } *out_writer = buffer_writer; return 0; } int dvrGetPoseBuffer(DvrReadBuffer** pose_buffer) { int dvrGetPoseBuffer(DvrReadBuffer** pose_buffer) { auto client = android::dvr::DisplayClient::Create(); auto client = android::dvr::DisplayClient::Create(); if (!client) { if (!client) { Loading libs/vr/libdvr/include/dvr/dvr_api.h +9 −0 Original line number Original line Diff line number Diff line Loading @@ -33,6 +33,8 @@ typedef struct AHardwareBuffer AHardwareBuffer; typedef struct DvrWriteBufferQueue DvrWriteBufferQueue; typedef struct DvrWriteBufferQueue DvrWriteBufferQueue; typedef struct DvrReadBufferQueue DvrReadBufferQueue; typedef struct DvrReadBufferQueue DvrReadBufferQueue; typedef struct DvrSurface DvrSurface; // display_manager_client.h // display_manager_client.h typedef int (*DvrDisplayManagerClientGetSurfaceListPtr)( typedef int (*DvrDisplayManagerClientGetSurfaceListPtr)( DvrDisplayManagerClient* client, DvrDisplayManagerClient* client, Loading Loading @@ -107,6 +109,11 @@ typedef int (*DvrReadBufferQueueDequeuePtr)(DvrReadBufferQueue* read_queue, // dvr_surface.h // dvr_surface.h typedef int (*DvrGetPoseBufferPtr)(DvrReadBuffer** pose_buffer); typedef int (*DvrGetPoseBufferPtr)(DvrReadBuffer** pose_buffer); typedef int (*DvrSurfaceCreatePtr)(int width, int height, int format, uint64_t usage0, uint64_t usage1, int flags, DvrSurface** out_surface); typedef int (*DvrSurfaceGetWriteBufferQueuePtr)( DvrSurface* surface, DvrWriteBufferQueue** out_writer); // vsync_client_api.h // vsync_client_api.h typedef dvr_vsync_client* (*DvrVSyncClientCreatePtr)(); typedef dvr_vsync_client* (*DvrVSyncClientCreatePtr)(); Loading Loading @@ -196,6 +203,8 @@ struct DvrApi_v1 { // Display surface // Display surface DvrGetPoseBufferPtr get_pose_buffer_; DvrGetPoseBufferPtr get_pose_buffer_; DvrSurfaceCreatePtr surface_create_; DvrSurfaceGetWriteBufferQueuePtr surface_get_write_buffer_queue_; // Pose client // Pose client DvrPoseClientCreatePtr pose_client_create_; DvrPoseClientCreatePtr pose_client_create_; Loading libs/vr/libdvr/include/dvr/dvr_surface.h +11 −0 Original line number Original line Diff line number Diff line Loading @@ -2,14 +2,25 @@ #define ANDROID_DVR_SURFACE_H_ #define ANDROID_DVR_SURFACE_H_ #include <dvr/dvr_buffer.h> #include <dvr/dvr_buffer.h> #include <dvr/dvr_buffer_queue.h> #ifdef __cplusplus #ifdef __cplusplus extern "C" { extern "C" { #endif #endif typedef struct DvrSurface DvrSurface; typedef struct DvrSurfaceParameter DvrSurfaceParameter; // Get a pointer to the global pose buffer. // Get a pointer to the global pose buffer. int dvrGetPoseBuffer(DvrReadBuffer** pose_buffer); int dvrGetPoseBuffer(DvrReadBuffer** pose_buffer); int dvrSurfaceCreate(int width, int height, int format, uint64_t usage0, uint64_t usage1, int flags, DvrSurface** out_surface); // TODO(eieio, jwcai) Change this once we have multiple buffer queue support. int dvrSurfaceGetWriteBufferQueue(DvrSurface* surface, DvrWriteBufferQueue** out_writer); #ifdef __cplusplus #ifdef __cplusplus } // extern "C" } // extern "C" #endif #endif Loading Loading
libs/vr/libdvr/dvr_api.cpp +2 −0 Original line number Original line Diff line number Diff line Loading @@ -77,6 +77,8 @@ DVR_EXPORT int dvrGetApi(void* api, size_t struct_size, int version) { // dvr_surface.h // dvr_surface.h dvr_api->get_pose_buffer_ = dvrGetPoseBuffer; dvr_api->get_pose_buffer_ = dvrGetPoseBuffer; dvr_api->surface_create_ = dvrSurfaceCreate; dvr_api->surface_get_write_buffer_queue_ = dvrSurfaceGetWriteBufferQueue; // vsync_client_api.h // vsync_client_api.h dvr_api->vsync_client_create_ = dvr_vsync_client_create; dvr_api->vsync_client_create_ = dvr_vsync_client_create; Loading
libs/vr/libdvr/dvr_surface.cpp +52 −0 Original line number Original line Diff line number Diff line Loading @@ -4,8 +4,60 @@ using namespace android; using namespace android; struct DvrSurface { std::unique_ptr<dvr::DisplaySurfaceClient> display_surface_; }; extern "C" { extern "C" { int dvrSurfaceCreate(int width, int height, int format, uint64_t usage0, uint64_t usage1, int flags, DvrSurface** out_surface) { if (out_surface == nullptr) { ALOGE("dvrSurfaceCreate: invalid inputs: out_surface=%p.", out_surface); return -EINVAL; } int error; auto client = dvr::DisplayClient::Create(&error); if (!client) { ALOGE("Failed to create display client!"); return error; } // TODO(hendrikw): When we move to gralloc1, pass both usage0 and usage1 down. std::unique_ptr<dvr::DisplaySurfaceClient> surface = client->CreateDisplaySurface( width, height, static_cast<int>(usage0 | usage1), format, flags); DvrSurface* dvr_surface = new DvrSurface; dvr_surface->display_surface_ = std::move(surface); *out_surface = dvr_surface; return 0; } int dvrSurfaceGetWriteBufferQueue(DvrSurface* surface, DvrWriteBufferQueue** out_writer) { if (surface == nullptr || out_writer == nullptr) { ALOGE( "dvrSurfaceGetWriteBufferQueue: Invalid inputs: surface=%p, " "out_writer=%p.", surface, out_writer); return -EINVAL; } DvrWriteBufferQueue* buffer_writer = new DvrWriteBufferQueue; buffer_writer->producer_queue_ = surface->display_surface_->GetProducerQueue(); if (buffer_writer->producer_queue_ == nullptr) { ALOGE( "dvrSurfaceGetWriteBufferQueue: Failed to get producer queue from " "display surface."); return -ENOMEM; } *out_writer = buffer_writer; return 0; } int dvrGetPoseBuffer(DvrReadBuffer** pose_buffer) { int dvrGetPoseBuffer(DvrReadBuffer** pose_buffer) { auto client = android::dvr::DisplayClient::Create(); auto client = android::dvr::DisplayClient::Create(); if (!client) { if (!client) { Loading
libs/vr/libdvr/include/dvr/dvr_api.h +9 −0 Original line number Original line Diff line number Diff line Loading @@ -33,6 +33,8 @@ typedef struct AHardwareBuffer AHardwareBuffer; typedef struct DvrWriteBufferQueue DvrWriteBufferQueue; typedef struct DvrWriteBufferQueue DvrWriteBufferQueue; typedef struct DvrReadBufferQueue DvrReadBufferQueue; typedef struct DvrReadBufferQueue DvrReadBufferQueue; typedef struct DvrSurface DvrSurface; // display_manager_client.h // display_manager_client.h typedef int (*DvrDisplayManagerClientGetSurfaceListPtr)( typedef int (*DvrDisplayManagerClientGetSurfaceListPtr)( DvrDisplayManagerClient* client, DvrDisplayManagerClient* client, Loading Loading @@ -107,6 +109,11 @@ typedef int (*DvrReadBufferQueueDequeuePtr)(DvrReadBufferQueue* read_queue, // dvr_surface.h // dvr_surface.h typedef int (*DvrGetPoseBufferPtr)(DvrReadBuffer** pose_buffer); typedef int (*DvrGetPoseBufferPtr)(DvrReadBuffer** pose_buffer); typedef int (*DvrSurfaceCreatePtr)(int width, int height, int format, uint64_t usage0, uint64_t usage1, int flags, DvrSurface** out_surface); typedef int (*DvrSurfaceGetWriteBufferQueuePtr)( DvrSurface* surface, DvrWriteBufferQueue** out_writer); // vsync_client_api.h // vsync_client_api.h typedef dvr_vsync_client* (*DvrVSyncClientCreatePtr)(); typedef dvr_vsync_client* (*DvrVSyncClientCreatePtr)(); Loading Loading @@ -196,6 +203,8 @@ struct DvrApi_v1 { // Display surface // Display surface DvrGetPoseBufferPtr get_pose_buffer_; DvrGetPoseBufferPtr get_pose_buffer_; DvrSurfaceCreatePtr surface_create_; DvrSurfaceGetWriteBufferQueuePtr surface_get_write_buffer_queue_; // Pose client // Pose client DvrPoseClientCreatePtr pose_client_create_; DvrPoseClientCreatePtr pose_client_create_; Loading
libs/vr/libdvr/include/dvr/dvr_surface.h +11 −0 Original line number Original line Diff line number Diff line Loading @@ -2,14 +2,25 @@ #define ANDROID_DVR_SURFACE_H_ #define ANDROID_DVR_SURFACE_H_ #include <dvr/dvr_buffer.h> #include <dvr/dvr_buffer.h> #include <dvr/dvr_buffer_queue.h> #ifdef __cplusplus #ifdef __cplusplus extern "C" { extern "C" { #endif #endif typedef struct DvrSurface DvrSurface; typedef struct DvrSurfaceParameter DvrSurfaceParameter; // Get a pointer to the global pose buffer. // Get a pointer to the global pose buffer. int dvrGetPoseBuffer(DvrReadBuffer** pose_buffer); int dvrGetPoseBuffer(DvrReadBuffer** pose_buffer); int dvrSurfaceCreate(int width, int height, int format, uint64_t usage0, uint64_t usage1, int flags, DvrSurface** out_surface); // TODO(eieio, jwcai) Change this once we have multiple buffer queue support. int dvrSurfaceGetWriteBufferQueue(DvrSurface* surface, DvrWriteBufferQueue** out_writer); #ifdef __cplusplus #ifdef __cplusplus } // extern "C" } // extern "C" #endif #endif Loading