Add libvrflinger for use in SurfaceFlinger
A separate CL uses this code from SurfaceFlinger.
Bug: None
Test: Manually ran modified SurfaceFlinger
Change-Id: I34588df1365588c0a0265e1e2325e3dd5516206a
diff --git a/libs/vr/libvrflinger/surface_channel.cpp b/libs/vr/libvrflinger/surface_channel.cpp
new file mode 100644
index 0000000..8aa220b
--- /dev/null
+++ b/libs/vr/libvrflinger/surface_channel.cpp
@@ -0,0 +1,44 @@
+#include "surface_channel.h"
+
+using android::pdx::BorrowedChannelHandle;
+using android::pdx::Message;
+using android::pdx::rpc::DispatchRemoteMethod;
+
+namespace android {
+namespace dvr {
+
+int SurfaceChannel::HandleMessage(Message& message) {
+ switch (message.GetOp()) {
+ case DisplayRPC::GetMetadataBuffer::Opcode:
+ DispatchRemoteMethod<DisplayRPC::GetMetadataBuffer>(
+ *this, &SurfaceChannel::OnGetMetadataBuffer, message);
+ break;
+ }
+
+ return 0;
+}
+
+BorrowedChannelHandle SurfaceChannel::OnGetMetadataBuffer(Message& message) {
+ if (EnsureMetadataBuffer()) {
+ return metadata_buffer_->GetChannelHandle().Borrow();
+ } else {
+ REPLY_ERROR_RETURN(message, -ENOMEM, {});
+ }
+}
+
+bool SurfaceChannel::EnsureMetadataBuffer() {
+ if (!metadata_buffer_) {
+ metadata_buffer_ =
+ BufferProducer::CreateUncachedBlob(metadata_size());
+ if (!metadata_buffer_) {
+ ALOGE(
+ "DisplaySurface::EnsureMetadataBuffer: could not allocate metadata "
+ "buffer");
+ return false;
+ }
+ }
+ return true;
+}
+
+} // namespace dvr
+} // namespace android