Convert the pose buffer into a more generic named buffer
* It's likely that we'll have more than one pose buffer
* It's cleaner to separate the vsync info into a separate buffer
Bug: 37001881
Bug: 37240552
Test: Added and manually ran TestNamedBuffersSetup
Change-Id: I76621d3cfa8c21c9d5d1e6e648854067673be9ab
diff --git a/libs/vr/libvrflinger/display_manager_service.cpp b/libs/vr/libvrflinger/display_manager_service.cpp
index 49b6f09..99f93bf 100644
--- a/libs/vr/libvrflinger/display_manager_service.cpp
+++ b/libs/vr/libvrflinger/display_manager_service.cpp
@@ -2,7 +2,9 @@
#include <pdx/channel_handle.h>
#include <pdx/default_transport/service_endpoint.h>
+#include <private/android_filesystem_config.h>
#include <private/dvr/display_rpc.h>
+#include <private/dvr/trusted_uids.h>
#include <sys/poll.h>
#include <array>
@@ -82,9 +84,9 @@
*this, &DisplayManagerService::OnUpdateSurfaces, message);
return {};
- case DisplayManagerRPC::SetupPoseBuffer::Opcode:
- DispatchRemoteMethod<DisplayManagerRPC::SetupPoseBuffer>(
- *this, &DisplayManagerService::OnSetupPoseBuffer, message);
+ case DisplayManagerRPC::SetupNamedBuffer::Opcode:
+ DispatchRemoteMethod<DisplayManagerRPC::SetupNamedBuffer>(
+ *this, &DisplayManagerService::OnSetupNamedBuffer, message);
return {};
default:
@@ -188,9 +190,20 @@
return 0;
}
-pdx::BorrowedChannelHandle DisplayManagerService::OnSetupPoseBuffer(
- pdx::Message& /*message*/, size_t extended_region_size, int usage) {
- return display_service_->SetupPoseBuffer(extended_region_size, usage);
+pdx::Status<BorrowedNativeBufferHandle>
+DisplayManagerService::OnSetupNamedBuffer(pdx::Message& message,
+ const std::string& name, size_t size,
+ uint64_t producer_usage,
+ uint64_t consumer_usage) {
+ if (message.GetEffectiveUserId() != AID_ROOT &&
+ !IsTrustedUid(message.GetEffectiveUserId())) {
+ // Only trusted users can setup named buffers.
+ ALOGE("DisplayService::SetupNamedBuffer: Called by untrusted user: uid=%d.",
+ message.GetEffectiveUserId());
+ return {};
+ }
+ return display_service_->SetupNamedBuffer(name, size, producer_usage,
+ consumer_usage);
}
void DisplayManagerService::OnDisplaySurfaceChange() {
diff --git a/libs/vr/libvrflinger/display_manager_service.h b/libs/vr/libvrflinger/display_manager_service.h
index 80324fd..7b037de 100644
--- a/libs/vr/libvrflinger/display_manager_service.h
+++ b/libs/vr/libvrflinger/display_manager_service.h
@@ -54,9 +54,9 @@
int OnUpdateSurfaces(pdx::Message& message,
const std::map<int, DisplaySurfaceAttributes>& updates);
- pdx::BorrowedChannelHandle OnSetupPoseBuffer(pdx::Message& message,
- size_t extended_region_size,
- int usage);
+ pdx::Status<BorrowedNativeBufferHandle> OnSetupNamedBuffer(
+ pdx::Message& message, const std::string& name, size_t size,
+ uint64_t producer_usage, uint64_t consumer_usage);
// Called by the display service to indicate changes to display surfaces that
// the display manager should evaluate.
diff --git a/libs/vr/libvrflinger/display_service.cpp b/libs/vr/libvrflinger/display_service.cpp
index bb8613c..8cf9d64 100644
--- a/libs/vr/libvrflinger/display_service.cpp
+++ b/libs/vr/libvrflinger/display_service.cpp
@@ -1,5 +1,6 @@
#include "display_service.h"
+#include <unistd.h>
#include <vector>
#include <pdx/default_transport/service_endpoint.h>
@@ -18,20 +19,10 @@
using android::pdx::rpc::DispatchRemoteMethod;
using android::pdx::rpc::WrapBuffer;
-namespace {
-
-constexpr char kPersistentPoseBufferName[] = "DvrPersistentPoseBuffer";
-const int kPersistentPoseBufferUserId = 0;
-const int kPersistentPoseBufferGroupId = 0;
-const size_t kTimingDataSizeOffset = 128;
-
-} // anonymous namespace
-
namespace android {
namespace dvr {
-DisplayService::DisplayService()
- : DisplayService(nullptr) {}
+DisplayService::DisplayService() : DisplayService(nullptr) {}
DisplayService::DisplayService(Hwc2::Composer* hidl)
: BASE("DisplayService", Endpoint::Create(DisplayRPC::kClientPath)),
@@ -89,9 +80,9 @@
*this, &DisplayService::OnSetViewerParams, message);
return {};
- case DisplayRPC::GetPoseBuffer::Opcode:
- DispatchRemoteMethod<DisplayRPC::GetPoseBuffer>(
- *this, &DisplayService::OnGetPoseBuffer, message);
+ case DisplayRPC::GetNamedBuffer::Opcode:
+ DispatchRemoteMethod<DisplayRPC::GetNamedBuffer>(
+ *this, &DisplayService::OnGetNamedBuffer, message);
return {};
case DisplayRPC::IsVrAppRunning::Opcode:
@@ -254,13 +245,14 @@
compositor->UpdateHeadMountMetrics(head_mount_metrics);
}
-pdx::LocalChannelHandle DisplayService::OnGetPoseBuffer(pdx::Message& message) {
- if (pose_buffer_) {
- return pose_buffer_->CreateConsumer().take();
+pdx::Status<BorrowedNativeBufferHandle> DisplayService::OnGetNamedBuffer(
+ pdx::Message& /* message */, const std::string& name) {
+ auto named_buffer = named_buffers_.find(name);
+ if (named_buffer != named_buffers_.end()) {
+ return {BorrowedNativeBufferHandle(*named_buffer->second, 0)};
}
- pdx::rpc::RemoteMethodError(message, EAGAIN);
- return {};
+ return pdx::ErrorStatus(EINVAL);
}
// Calls the message handler for the DisplaySurface associated with this
@@ -334,16 +326,22 @@
hardware_composer_.SetDisplaySurfaces(std::move(visible_surfaces));
}
-pdx::BorrowedChannelHandle DisplayService::SetupPoseBuffer(
- size_t extended_region_size, int usage) {
- if (!pose_buffer_) {
- pose_buffer_ = BufferProducer::Create(
- kPersistentPoseBufferName, kPersistentPoseBufferUserId,
- kPersistentPoseBufferGroupId, usage,
- extended_region_size + kTimingDataSizeOffset);
+pdx::Status<BorrowedNativeBufferHandle> DisplayService::SetupNamedBuffer(
+ const std::string& name, size_t size, int producer_usage,
+ int consumer_usage) {
+ auto named_buffer = named_buffers_.find(name);
+ if (named_buffer == named_buffers_.end()) {
+ // TODO(hendrikw): Update BufferProducer to take producer_usage and
+ // consumer_usage flags.
+ auto ion_buffer = std::make_unique<IonBuffer>(
+ static_cast<int>(size), 1, HAL_PIXEL_FORMAT_BLOB,
+ producer_usage | consumer_usage);
+ named_buffer =
+ named_buffers_.insert(std::make_pair(name, std::move(ion_buffer)))
+ .first;
}
- return pose_buffer_->GetChannelHandle().Borrow();
+ return {BorrowedNativeBufferHandle(*named_buffer->second, 0)};
}
void DisplayService::OnHardwareComposerRefresh() {
@@ -362,10 +360,11 @@
int DisplayService::IsVrAppRunning(pdx::Message& message) {
bool visible = false;
- ForEachDisplaySurface([&visible](const std::shared_ptr<DisplaySurface>& surface) {
- if (surface->client_z_order() == 0 && surface->IsVisible())
- visible = true;
- });
+ ForEachDisplaySurface(
+ [&visible](const std::shared_ptr<DisplaySurface>& surface) {
+ if (surface->client_z_order() == 0 && surface->IsVisible())
+ visible = true;
+ });
REPLY_SUCCESS_RETURN(message, visible, 0);
}
diff --git a/libs/vr/libvrflinger/display_service.h b/libs/vr/libvrflinger/display_service.h
index da80a84..db89064 100644
--- a/libs/vr/libvrflinger/display_service.h
+++ b/libs/vr/libvrflinger/display_service.h
@@ -3,6 +3,7 @@
#include <pdx/service.h>
#include <private/dvr/buffer_hub_client.h>
+#include <private/dvr/bufferhub_rpc.h>
#include <private/dvr/display_rpc.h>
#include <private/dvr/late_latch.h>
@@ -38,8 +39,9 @@
// any change to client/manager attributes that affect visibility or z order.
void UpdateActiveDisplaySurfaces();
- pdx::BorrowedChannelHandle SetupPoseBuffer(size_t extended_region_size,
- int usage);
+ pdx::Status<BorrowedNativeBufferHandle> SetupNamedBuffer(
+ const std::string& name, size_t size, int producer_usage,
+ int consumer_usage);
template <class A>
void ForEachDisplaySurface(A action) const {
@@ -85,7 +87,8 @@
void OnSetViewerParams(pdx::Message& message,
const ViewerParams& view_params);
- pdx::LocalChannelHandle OnGetPoseBuffer(pdx::Message& message);
+ pdx::Status<BorrowedNativeBufferHandle> OnGetNamedBuffer(
+ pdx::Message& message, const std::string& name);
// Temporary query for current VR status. Will be removed later.
int IsVrAppRunning(pdx::Message& message);
@@ -102,7 +105,7 @@
HardwareComposer hardware_composer_;
DisplayConfigurationUpdateNotifier update_notifier_;
- std::unique_ptr<BufferProducer> pose_buffer_;
+ std::unordered_map<std::string, std::unique_ptr<IonBuffer>> named_buffers_;
};
} // namespace dvr