From 007b00e775b92025d539eac69b93b7eb91164db1 Mon Sep 17 00:00:00 2001 From: Daniel Nicoara Date: Mon, 8 May 2017 16:44:42 -0400 Subject: [PATCH] Remove vr_wm service (try 2) VR Window Manager has moved to VrCore. Removing deprecated code. Bug: 36051907 Test: Compiled and verified VR still works. Change-Id: Iea0c7646df8a068c058099cf19ef7d76bbf89192 --- services/vr/vr_window_manager/Android.bp | 101 ---- .../aidl/android/service/vr/IVrWindowManager.aidl | 30 -- services/vr/vr_window_manager/application.cpp | 330 ------------- services/vr/vr_window_manager/application.h | 111 ----- .../vr_window_manager/controller_data_provider.h | 19 - services/vr/vr_window_manager/controller_mesh.cpp | 75 --- services/vr/vr_window_manager/controller_mesh.h | 13 - services/vr/vr_window_manager/display_view.cpp | 458 ------------------ services/vr/vr_window_manager/display_view.h | 119 ----- services/vr/vr_window_manager/elbow_model.cpp | 134 ------ services/vr/vr_window_manager/elbow_model.h | 45 -- services/vr/vr_window_manager/hwc_callback.cpp | 96 ---- services/vr/vr_window_manager/hwc_callback.h | 132 ----- services/vr/vr_window_manager/proguard.flags | 22 - services/vr/vr_window_manager/reticle.cpp | 100 ---- services/vr/vr_window_manager/reticle.h | 35 -- services/vr/vr_window_manager/shell_view.cpp | 535 --------------------- services/vr/vr_window_manager/shell_view.h | 103 ---- .../shell_view_binder_interface.h | 22 - .../vr/vr_window_manager/surface_flinger_view.cpp | 77 --- .../vr/vr_window_manager/surface_flinger_view.h | 46 -- services/vr/vr_window_manager/texture.cpp | 41 -- services/vr/vr_window_manager/texture.h | 37 -- .../vr/vr_window_manager/vr_window_manager.cpp | 47 -- .../vr_window_manager/vr_window_manager_binder.cpp | 167 ------- .../vr_window_manager/vr_window_manager_binder.h | 79 --- .../vr_window_manager_binder_test.cpp | 29 -- services/vr/vr_window_manager/vr_wm.rc | 5 - services/vr/vr_window_manager/vr_wm_ctl.cpp | 52 -- 29 files changed, 3060 deletions(-) delete mode 100644 services/vr/vr_window_manager/Android.bp delete mode 100644 services/vr/vr_window_manager/aidl/android/service/vr/IVrWindowManager.aidl delete mode 100644 services/vr/vr_window_manager/application.cpp delete mode 100644 services/vr/vr_window_manager/application.h delete mode 100644 services/vr/vr_window_manager/controller_data_provider.h delete mode 100644 services/vr/vr_window_manager/controller_mesh.cpp delete mode 100644 services/vr/vr_window_manager/controller_mesh.h delete mode 100644 services/vr/vr_window_manager/display_view.cpp delete mode 100644 services/vr/vr_window_manager/display_view.h delete mode 100644 services/vr/vr_window_manager/elbow_model.cpp delete mode 100644 services/vr/vr_window_manager/elbow_model.h delete mode 100644 services/vr/vr_window_manager/hwc_callback.cpp delete mode 100644 services/vr/vr_window_manager/hwc_callback.h delete mode 100644 services/vr/vr_window_manager/proguard.flags delete mode 100644 services/vr/vr_window_manager/reticle.cpp delete mode 100644 services/vr/vr_window_manager/reticle.h delete mode 100644 services/vr/vr_window_manager/shell_view.cpp delete mode 100644 services/vr/vr_window_manager/shell_view.h delete mode 100644 services/vr/vr_window_manager/shell_view_binder_interface.h delete mode 100644 services/vr/vr_window_manager/surface_flinger_view.cpp delete mode 100644 services/vr/vr_window_manager/surface_flinger_view.h delete mode 100644 services/vr/vr_window_manager/texture.cpp delete mode 100644 services/vr/vr_window_manager/texture.h delete mode 100644 services/vr/vr_window_manager/vr_window_manager.cpp delete mode 100644 services/vr/vr_window_manager/vr_window_manager_binder.cpp delete mode 100644 services/vr/vr_window_manager/vr_window_manager_binder.h delete mode 100644 services/vr/vr_window_manager/vr_window_manager_binder_test.cpp delete mode 100644 services/vr/vr_window_manager/vr_wm.rc delete mode 100644 services/vr/vr_window_manager/vr_wm_ctl.cpp diff --git a/services/vr/vr_window_manager/Android.bp b/services/vr/vr_window_manager/Android.bp deleted file mode 100644 index bba3ac9ec5..0000000000 --- a/services/vr/vr_window_manager/Android.bp +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (C) 2016 The Android Open Source Project -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -native_src = [ - "application.cpp", - "controller_mesh.cpp", - "elbow_model.cpp", - "hwc_callback.cpp", - "reticle.cpp", - "shell_view.cpp", - "surface_flinger_view.cpp", - "texture.cpp", - "vr_window_manager.cpp", - "vr_window_manager_binder.cpp", - "aidl/android/service/vr/IVrWindowManager.aidl", - "display_view.cpp", -] - -static_libs = [ - "libdisplay", - "libbufferhub", - "libbufferhubqueue", - "libdvrgraphics", - "libdvrcommon", - "libhwcomposer-client", - "libvrsensor", - "libperformance", - "libpdx_default_transport", - "libcutils", - "libvr_hwc-binder", - "libvr_manager", - "libvirtualtouchpadclient", -] - -shared_libs = [ - "android.frameworks.vr.composer@1.0", - "android.hardware.graphics.composer@2.1", - "libbase", - "libbinder", - "libinput", - "libhardware", - "libhwbinder", - "libsync", - "libutils", - "libgui", - "libEGL", - "libGLESv2", - "libvulkan", - "libsync", - "libui", - "libhidlbase", - "libhidltransport", - "liblog", - "libvr_hwc-hal", -] - -cc_binary { - srcs: native_src, - static_libs: static_libs, - shared_libs: shared_libs, - cflags: ["-DGL_GLEXT_PROTOTYPES", "-DEGL_EGLEXT_PROTOTYPES", "-DLOG_TAG=\"VrWindowManager\""], - host_ldlibs: ["-llog"], - name: "vr_wm", - tags: ["optional"], - init_rc: ["vr_wm.rc"], -} - -cmd_src = [ - "vr_wm_ctl.cpp", - "aidl/android/service/vr/IVrWindowManager.aidl", -] - -staticLibs = ["libcutils"] - -sharedLibs = [ - "libbase", - "libbinder", - "libutils", -] - -cc_binary { - srcs: cmd_src, - static_libs: staticLibs, - shared_libs: sharedLibs, - cppflags: ["-std=c++11"], - cflags: ["-DLOG_TAG=\"vrwmctl\""], - host_ldlibs: ["-llog"], - name: "vr_wm_ctl", - tags: ["optional"], -} diff --git a/services/vr/vr_window_manager/aidl/android/service/vr/IVrWindowManager.aidl b/services/vr/vr_window_manager/aidl/android/service/vr/IVrWindowManager.aidl deleted file mode 100644 index b16049f059..0000000000 --- a/services/vr/vr_window_manager/aidl/android/service/vr/IVrWindowManager.aidl +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (c) 2017, The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.service.vr; - -/** @hide */ -interface IVrWindowManager { - const String SERVICE_NAME = "vr_window_manager"; - void connectController(in FileDescriptor fd) = 0; - void disconnectController() = 1; - void enterVrMode() = 2; - void exitVrMode() = 3; - void setDebugMode(int mode) = 4; - void set2DMode(int mode) = 5; - void setRotation(int angle) = 6; -} - diff --git a/services/vr/vr_window_manager/application.cpp b/services/vr/vr_window_manager/application.cpp deleted file mode 100644 index 8b4460a780..0000000000 --- a/services/vr/vr_window_manager/application.cpp +++ /dev/null @@ -1,330 +0,0 @@ -#include "application.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -namespace android { -namespace dvr { - -Application::Application() { - vr_mode_listener_ = new VrModeListener(this); -} - -Application::~Application() { - sp vrManagerService = interface_cast( - defaultServiceManager()->getService(String16("vrmanager"))); - if (vrManagerService.get()) { - vrManagerService->unregisterPersistentVrStateListener(vr_mode_listener_); - } -} - -int Application::Initialize() { - dvrSetCpuPartition(0, "/application/performance"); - - bool is_right_handed = true; // TODO: retrieve setting from system - elbow_model_.Enable(ElbowModel::kDefaultNeckPosition, is_right_handed); - last_frame_time_ = std::chrono::system_clock::now(); - - sp vrManagerService = interface_cast( - defaultServiceManager()->getService(String16("vrmanager"))); - if (vrManagerService.get()) { - vrManagerService->registerPersistentVrStateListener(vr_mode_listener_); - } - return 0; -} - -int Application::AllocateResources() { - int surface_width = 0, surface_height = 0; - DvrLensInfo lens_info = {}; - GLuint texture_id = 0; - GLenum texture_target = 0; - std::vector surface_params = { - DVR_SURFACE_PARAMETER_OUT(SURFACE_WIDTH, &surface_width), - DVR_SURFACE_PARAMETER_OUT(SURFACE_HEIGHT, &surface_height), - DVR_SURFACE_PARAMETER_OUT(INTER_LENS_METERS, &lens_info.inter_lens_meters), - DVR_SURFACE_PARAMETER_OUT(LEFT_FOV_LRBT, &lens_info.left_fov), - DVR_SURFACE_PARAMETER_OUT(RIGHT_FOV_LRBT, &lens_info.right_fov), - DVR_SURFACE_PARAMETER_OUT(SURFACE_TEXTURE_TARGET_TYPE, &texture_target), - DVR_SURFACE_PARAMETER_OUT(SURFACE_TEXTURE_TARGET_ID, &texture_id), - DVR_SURFACE_PARAMETER_IN(VISIBLE, 0), - DVR_SURFACE_PARAMETER_IN(Z_ORDER, 1), - DVR_SURFACE_PARAMETER_IN(GEOMETRY, DVR_SURFACE_GEOMETRY_SINGLE), - DVR_SURFACE_PARAMETER_IN(ENABLE_LATE_LATCH, 0), - DVR_SURFACE_PARAMETER_IN(DISABLE_DISTORTION, 0), - DVR_SURFACE_PARAMETER_LIST_END, - }; - - int ret = dvrGraphicsContextCreate(surface_params.data(), &graphics_context_); - if (ret) - return ret; - - GLuint fbo = 0; - GLuint depth_stencil_buffer = 0; - GLuint samples = 1; - glGenFramebuffers(1, &fbo); - glBindFramebuffer(GL_FRAMEBUFFER, fbo); - glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - texture_target, texture_id, 0, samples); - - glGenRenderbuffers(1, &depth_stencil_buffer); - glBindRenderbuffer(GL_RENDERBUFFER, depth_stencil_buffer); - glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, - GL_DEPTH_COMPONENT24, surface_width, - surface_height); - - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, - GL_RENDERBUFFER, depth_stencil_buffer); - - ALOGI("Surface size=%dx%d", surface_width, surface_height); - pose_client_ = dvrPoseCreate(); - if (!pose_client_) - return 1; - - vec2i eye_size(surface_width / 2, surface_height); - - eye_viewport_[0] = Range2i::FromSize(vec2i(0, 0), eye_size); - eye_viewport_[1] = Range2i::FromSize(vec2i(surface_width / 2, 0), eye_size); - - eye_from_head_[0] = Eigen::Translation3f( - vec3(lens_info.inter_lens_meters * 0.5f, 0.0f, 0.0f)); - eye_from_head_[1] = Eigen::Translation3f( - vec3(-lens_info.inter_lens_meters * 0.5f, 0.0f, 0.0f)); - - fov_[0] = FieldOfView(lens_info.left_fov[0], lens_info.left_fov[1], - lens_info.left_fov[2], lens_info.left_fov[3]); - fov_[1] = FieldOfView(lens_info.right_fov[0], lens_info.right_fov[1], - lens_info.right_fov[2], lens_info.right_fov[3]); - - return 0; -} - -void Application::DeallocateResources() { - if (graphics_context_) - dvrGraphicsContextDestroy(graphics_context_); - graphics_context_ = nullptr; - - if (pose_client_) - dvrPoseDestroy(pose_client_); - - initialized_ = false; -} - -void Application::ProcessTasks(const std::vector& tasks) { - for (auto task : tasks) { - switch (task) { - case MainThreadTask::EnableDebugMode: - if (!debug_mode_) { - debug_mode_ = true; - SetVisibility(debug_mode_); - } - break; - case MainThreadTask::DisableDebugMode: - if (debug_mode_) { - debug_mode_ = false; - SetVisibility(debug_mode_); - } - break; - case MainThreadTask::EnteringVrMode: - if (!initialized_) { - LOG_ALWAYS_FATAL_IF(AllocateResources(), - "Failed to allocate resources"); - } - break; - case MainThreadTask::ExitingVrMode: - if (initialized_) - DeallocateResources(); - break; - case MainThreadTask::Show: - if (!is_visible_) - SetVisibility(true); - break; - } - } -} - -void Application::DrawFrame() { - // Thread should block if we are invisible or not fully initialized. - std::unique_lock lock(mutex_); - wake_up_init_and_render_.wait(lock, [this]() { - return (is_visible_ && initialized_) || !main_thread_tasks_.empty(); - }); - - // Process main thread tasks if there are any. - std::vector tasks; - tasks.swap(main_thread_tasks_); - lock.unlock(); - - if (!tasks.empty()) - ProcessTasks(tasks); - - if (!initialized_) - return; - - // TODO(steventhomas): If we're not visible, block until we are. For now we - // throttle by calling dvrGraphicsWaitNextFrame. - DvrFrameSchedule schedule; - int status = dvrGraphicsWaitNextFrame(graphics_context_, 0, &schedule); - if (status < 0) { - ALOGE("Context lost, deallocating graphics resources"); - SetVisibility(false); - DeallocateResources(); - } - - OnDrawFrame(); - - if (is_visible_) { - ProcessControllerInput(); - - DvrPoseAsync pose; - dvrPoseGet(pose_client_, schedule.vsync_count, &pose); - last_pose_ = Posef( - quat(pose.orientation[3], pose.orientation[0], pose.orientation[1], - pose.orientation[2]), - vec3(pose.translation[0], pose.translation[1], pose.translation[2])); - - std::chrono::time_point now = - std::chrono::system_clock::now(); - double delta = - std::chrono::duration(now - last_frame_time_).count(); - last_frame_time_ = now; - - if (delta > 1.0f) - delta = 0.05f; - - fade_value_ += delta / 0.25f; - if (fade_value_ > 1.0f) - fade_value_ = 1.0f; - - controller_position_ = - elbow_model_.Update(delta, last_pose_.GetRotation(), - controller_orientation_, should_recenter_); - - dvrBeginRenderFrameEds(graphics_context_, pose.orientation, - pose.translation); - - glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - mat4 head_matrix = last_pose_.GetObjectFromReferenceMatrix(); - glViewport(eye_viewport_[kLeftEye].GetMinPoint()[0], - eye_viewport_[kLeftEye].GetMinPoint()[1], - eye_viewport_[kLeftEye].GetSize()[0], - eye_viewport_[kLeftEye].GetSize()[1]); - DrawEye(kLeftEye, fov_[kLeftEye].GetProjectionMatrix(0.1f, 500.0f), - eye_from_head_[kLeftEye], head_matrix); - - glViewport(eye_viewport_[kRightEye].GetMinPoint()[0], - eye_viewport_[kRightEye].GetMinPoint()[1], - eye_viewport_[kRightEye].GetSize()[0], - eye_viewport_[kRightEye].GetSize()[1]); - DrawEye(kRightEye, fov_[kRightEye].GetProjectionMatrix(0.1f, 500.0f), - eye_from_head_[kRightEye], head_matrix); - - OnEndFrame(); - - dvrPresent(graphics_context_); - should_recenter_ = false; - } -} - -void Application::ProcessControllerInput() { - if (controller_data_provider_) { - shmem_controller_active_ = false; - const void* data = controller_data_provider_->LockControllerData(); - // TODO(kpschoedel): define wire format. - if (data) { - struct wire_format { - uint32_t version; - uint32_t timestamph; - uint32_t timestampl; - uint32_t quat_count; - float q[4]; - uint32_t buttonsh; - uint32_t buttonsl; - } __attribute__((__aligned__(32))); - const wire_format* wire_data = static_cast(data); - static uint64_t last_timestamp = 0; - if (wire_data->version == 1) { - shmem_controller_active_ = true; - uint64_t timestamp = - (((uint64_t)wire_data->timestamph) << 32) | wire_data->timestampl; - if (timestamp == last_timestamp) { - static uint64_t last_logged_timestamp = 0; - if (last_logged_timestamp != last_timestamp) { - last_logged_timestamp = last_timestamp; - ALOGI("Controller shmem stale T=0x%" PRIX64, last_timestamp); - } - } else { - last_timestamp = timestamp; - controller_orientation_ = quat(wire_data->q[3], wire_data->q[0], - wire_data->q[1], wire_data->q[2]); - shmem_controller_buttons_ = - (((uint64_t)wire_data->buttonsh) << 32) | wire_data->buttonsl; - } - } else if (wire_data->version == 0xFEEDFACE) { - static bool logged_init = false; - if (!logged_init) { - logged_init = true; - ALOGI("Controller shmem waiting for data"); - } - } - } - controller_data_provider_->UnlockControllerData(); - if (shmem_controller_active_) { - ALOGV("Controller shmem orientation: %f %f %f %f", - controller_orientation_.x(), controller_orientation_.y(), - controller_orientation_.z(), controller_orientation_.w()); - if (shmem_controller_buttons_) { - ALOGV("Controller shmem buttons: %017" PRIX64, - shmem_controller_buttons_); - } - } - } -} - -void Application::SetVisibility(bool visible) { - if (visible && !initialized_) { - if (AllocateResources()) - ALOGE("Failed to allocate resources"); - } - - bool changed = is_visible_ != visible; - if (changed) { - is_visible_ = visible; - dvrGraphicsSurfaceSetVisible(graphics_context_, is_visible_); - OnVisibilityChanged(is_visible_); - } -} - -void Application::OnVisibilityChanged(bool visible) { - if (visible) { - fade_value_ = 0; - // We have been sleeping so to ensure correct deltas, reset the time. - last_frame_time_ = std::chrono::system_clock::now(); - } -} - -void Application::QueueTask(MainThreadTask task) { - std::unique_lock lock(mutex_); - main_thread_tasks_.push_back(task); - wake_up_init_and_render_.notify_one(); -} - -void Application::VrModeListener::onPersistentVrStateChanged(bool enabled) { - if (!enabled) - app_->QueueTask(MainThreadTask::ExitingVrMode); -} - -} // namespace dvr -} // namespace android diff --git a/services/vr/vr_window_manager/application.h b/services/vr/vr_window_manager/application.h deleted file mode 100644 index ed99157914..0000000000 --- a/services/vr/vr_window_manager/application.h +++ /dev/null @@ -1,111 +0,0 @@ -#ifndef VR_WINDOW_MANAGER_APPLICATION_H_ -#define VR_WINDOW_MANAGER_APPLICATION_H_ - -#include -#include -#include -#include - -#include -#include -#include - -#include "controller_data_provider.h" -#include "elbow_model.h" - -struct DvrGraphicsContext; -struct DvrPose; - -namespace android { -namespace dvr { - -class Application { - public: - Application(); - virtual ~Application(); - - virtual int Initialize(); - - virtual int AllocateResources(); - virtual void DeallocateResources(); - - void DrawFrame(); - - void SetControllerDataProvider(ControllerDataProvider* provider) { - controller_data_provider_ = provider; - } - - protected: - enum class MainThreadTask { - EnteringVrMode, - ExitingVrMode, - EnableDebugMode, - DisableDebugMode, - Show, - }; - - class VrModeListener : public BnPersistentVrStateCallbacks { - public: - VrModeListener(Application *app) : app_(app) {} - void onPersistentVrStateChanged(bool enabled) override; - - private: - Application *app_; - }; - - sp vr_mode_listener_; - virtual void OnDrawFrame() = 0; - virtual void DrawEye(EyeType eye, const mat4& perspective, - const mat4& eye_matrix, const mat4& head_matrix) = 0; - virtual void OnEndFrame() = 0; - - void SetVisibility(bool visible); - virtual void OnVisibilityChanged(bool visible); - - void ProcessControllerInput(); - - void ProcessTasks(const std::vector& tasks); - - void QueueTask(MainThreadTask task); - - DvrGraphicsContext* graphics_context_ = nullptr; - DvrPose* pose_client_ = nullptr; - - Range2i eye_viewport_[2]; - mat4 eye_from_head_[2]; - FieldOfView fov_[2]; - Posef last_pose_; - - quat controller_orientation_; - bool shmem_controller_active_ = false; - uint64_t shmem_controller_buttons_; - - // Used to center the scene when the shell becomes visible. - bool should_recenter_ = true; - - bool is_visible_ = false; - std::chrono::time_point visibility_button_press_; - bool debug_mode_ = false; - - std::chrono::time_point last_frame_time_; - vec3 controller_position_; - ElbowModel elbow_model_; - - float fade_value_ = 0; - - std::mutex mutex_; - std::condition_variable wake_up_init_and_render_; - bool initialized_ = false; - std::vector main_thread_tasks_; - - // Controller data provider from shared memory buffer. - ControllerDataProvider* controller_data_provider_ = nullptr; - - Application(const Application&) = delete; - void operator=(const Application&) = delete; -}; - -} // namespace dvr -} // namespace android - -#endif // VR_WINDOW_MANAGER_APPLICATION_H_ diff --git a/services/vr/vr_window_manager/controller_data_provider.h b/services/vr/vr_window_manager/controller_data_provider.h deleted file mode 100644 index bc1450c668..0000000000 --- a/services/vr/vr_window_manager/controller_data_provider.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef VR_WINDOW_MANAGER_CONTROLLER_DATA_PROVIDER_H_ -#define VR_WINDOW_MANAGER_CONTROLLER_DATA_PROVIDER_H_ - -namespace android { -namespace dvr { - -class ControllerDataProvider { - public: - virtual ~ControllerDataProvider() {} - // Returns data pointer or nullptr. If pointer is valid, call to - // UnlockControllerData is required. - virtual const void* LockControllerData() = 0; - virtual void UnlockControllerData() = 0; -}; - -} // namespace dvr -} // namespace android - -#endif // VR_WINDOW_MANAGER_CONTROLLER_DATA_PROVIDER_H_ \ No newline at end of file diff --git a/services/vr/vr_window_manager/controller_mesh.cpp b/services/vr/vr_window_manager/controller_mesh.cpp deleted file mode 100644 index c6095b15de..0000000000 --- a/services/vr/vr_window_manager/controller_mesh.cpp +++ /dev/null @@ -1,75 +0,0 @@ -#include "controller_mesh.h" - -namespace android { -namespace dvr { - -const int kNumControllerMeshVertices = 60; - -// Vertices in position.xyz, normal.xyz, uv.xy oder. -// Generated from an .obj mesh. -const float kControllerMeshVertices[] = { - 0.002023, 0.001469, -0.5, 0.809016, 0.587787, 0, 0, 0, - 0.000773, 0.002378, -0.5, 0.309004, 0.951061, 0, 0.1, 0, - 0.000773, 0.002378, 0, 0.309004, 0.951061, 0, 0.1, 1, - 0.002023, 0.001469, -0.5, 0.809016, 0.587787, 0, 0, 0, - 0.000773, 0.002378, 0, 0.309004, 0.951061, 0, 0.1, 1, - 0.002023, 0.001469, 0, 0.809016, 0.587787, 0, 0, 1, - 0.000773, 0.002378, -0.5, 0.309004, 0.951061, 0, 0.1, 0, - -0.000773, 0.002378, -0.5, -0.309004, 0.951061, 0, 0.2, 0, - -0.000773, 0.002378, 0, -0.309004, 0.951061, 0, 0.2, 1, - 0.000773, 0.002378, -0.5, 0.309004, 0.951061, 0, 0.1, 0, - -0.000773, 0.002378, 0, -0.309004, 0.951061, 0, 0.2, 1, - 0.000773, 0.002378, 0, 0.309004, 0.951061, 0, 0.1, 1, - -0.000773, 0.002378, -0.5, -0.309004, 0.951061, 0, 0.2, 0, - -0.002023, 0.001469, -0.5, -0.809016, 0.587787, 0, 0.3, 0, - -0.002023, 0.001469, 0, -0.809016, 0.587787, 0, 0.3, 1, - -0.000773, 0.002378, -0.5, -0.309004, 0.951061, 0, 0.2, 0, - -0.002023, 0.001469, 0, -0.809016, 0.587787, 0, 0.3, 1, - -0.000773, 0.002378, 0, -0.309004, 0.951061, 0, 0.2, 1, - -0.002023, 0.001469, -0.5, -0.809016, 0.587787, 0, 0.3, 0, - -0.0025, 0, -0.5, -1, -0, 0, 0.4, 0, - -0.0025, 0, 0, -1, -0, 0, 0.4, 1, - -0.002023, 0.001469, -0.5, -0.809016, 0.587787, 0, 0.3, 0, - -0.0025, 0, 0, -1, -0, 0, 0.4, 1, - -0.002023, 0.001469, 0, -0.809016, 0.587787, 0, 0.3, 1, - -0.0025, 0, -0.5, -1, -0, 0, 0.4, 0, - -0.002023, -0.001469, -0.5, -0.809016, -0.587787, 0, 0.5, 0, - -0.002023, -0.001469, 0, -0.809016, -0.587787, 0, 0.5, 1, - -0.0025, 0, -0.5, -1, -0, 0, 0.4, 0, - -0.002023, -0.001469, 0, -0.809016, -0.587787, 0, 0.5, 1, - -0.0025, 0, 0, -1, -0, 0, 0.4, 1, - -0.002023, -0.001469, -0.5, -0.809016, -0.587787, 0, 0.5, 0, - -0.000773, -0.002378, -0.5, -0.309004, -0.951061, 0, 0.6, 0, - -0.000773, -0.002378, 0, -0.309004, -0.951061, 0, 0.6, 1, - -0.002023, -0.001469, -0.5, -0.809016, -0.587787, 0, 0.5, 0, - -0.000773, -0.002378, 0, -0.309004, -0.951061, 0, 0.6, 1, - -0.002023, -0.001469, 0, -0.809016, -0.587787, 0, 0.5, 1, - -0.000773, -0.002378, -0.5, -0.309004, -0.951061, 0, 0.6, 0, - 0.000773, -0.002378, -0.5, 0.309004, -0.951061, 0, 0.7, 0, - 0.000773, -0.002378, 0, 0.309004, -0.951061, 0, 0.7, 1, - -0.000773, -0.002378, -0.5, -0.309004, -0.951061, 0, 0.6, 0, - 0.000773, -0.002378, 0, 0.309004, -0.951061, 0, 0.7, 1, - -0.000773, -0.002378, 0, -0.309004, -0.951061, 0, 0.6, 1, - 0.000773, -0.002378, -0.5, 0.309004, -0.951061, 0, 0.7, 0, - 0.002023, -0.001469, -0.5, 0.809016, -0.587787, 0, 0.8, 0, - 0.002023, -0.001469, 0, 0.809016, -0.587787, 0, 0.8, 1, - 0.000773, -0.002378, -0.5, 0.309004, -0.951061, 0, 0.7, 0, - 0.002023, -0.001469, 0, 0.809016, -0.587787, 0, 0.8, 1, - 0.000773, -0.002378, 0, 0.309004, -0.951061, 0, 0.7, 1, - 0.002023, -0.001469, -0.5, 0.809016, -0.587787, 0, 0.8, 0, - 0.0025, 0, -0.5, 1, 0, 0, 0.9, 0, - 0.0025, 0, 0, 1, 0, 0, 0.9, 1, - 0.002023, -0.001469, -0.5, 0.809016, -0.587787, 0, 0.8, 0, - 0.0025, 0, 0, 1, 0, 0, 0.9, 1, - 0.002023, -0.001469, 0, 0.809016, -0.587787, 0, 0.8, 1, - 0.0025, 0, -0.5, 1, 0, 0, 0.9, 0, - 0.002023, 0.001469, -0.5, 0.809016, 0.587787, 0, 1, 0, - 0.002023, 0.001469, 0, 0.809016, 0.587787, 0, 1, 1, - 0.0025, 0, -0.5, 1, 0, 0, 0.9, 0, - 0.002023, 0.001469, 0, 0.809016, 0.587787, 0, 1, 1, - 0.0025, 0, 0, 1, 0, 0, 0.9, 1, - -}; - -} // namespace dvr -} // namespace android diff --git a/services/vr/vr_window_manager/controller_mesh.h b/services/vr/vr_window_manager/controller_mesh.h deleted file mode 100644 index 88872c7ee3..0000000000 --- a/services/vr/vr_window_manager/controller_mesh.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef VR_WINDOW_MANAGER_CONTROLLER_MESH_H_ -#define VR_WINDOW_MANAGER_CONTROLLER_MESH_H_ - -namespace android { -namespace dvr { - -extern const int kNumControllerMeshVertices; -extern const float kControllerMeshVertices[]; - -} // namespace dvr -} // namespace android - -#endif // VR_WINDOW_MANAGER_CONTROLLER_MESH_H_ diff --git a/services/vr/vr_window_manager/display_view.cpp b/services/vr/vr_window_manager/display_view.cpp deleted file mode 100644 index 88768a0a7a..0000000000 --- a/services/vr/vr_window_manager/display_view.cpp +++ /dev/null @@ -1,458 +0,0 @@ -#include "display_view.h" - -#include "texture.h" - -namespace android { -namespace dvr { - -namespace { - -constexpr float kLayerScaleFactor = 3.0f; -constexpr unsigned int kMaximumPendingFrames = 8; -constexpr uint32_t kSystemId = 1000; - -// clang-format off -const GLfloat kVertices[] = { - -1, -1, 0, - 1, -1, 0, - -1, 1, 0, - 1, 1, 0, -}; - -const GLfloat kTextureVertices[] = { - 0, 1, - 1, 1, - 0, 0, - 1, 0, -}; -// clang-format on - -// Returns true if the given point is inside the given rect. -bool IsInside(const vec2& pt, const vec2& tl, const vec2& br) { - return pt.x() >= tl.x() && pt.x() <= br.x() && pt.y() >= tl.y() && - pt.y() <= br.y(); -} - -mat4 GetScalingMatrix(float width, float height) { - float xscale = 1, yscale = 1; - float ar = width / height; - if (ar > 1) - yscale = 1.0 / ar; - else - xscale = ar; - - xscale *= kLayerScaleFactor; - yscale *= kLayerScaleFactor; - - return mat4(Eigen::Scaling(xscale, yscale, 1.0)); -} - -// Helper function that applies the crop transform to the texture layer and -// positions (and scales) the texture layer in the appropriate location in the -// display space. -mat4 GetLayerTransform(const TextureLayer& texture_layer, float display_width, - float display_height) { - // Map from vertex coordinates to [0, 1] coordinates: - // 1) Flip y since in vertex coordinates (-1, -1) is at the bottom left and - // in texture coordinates (0, 0) is at the top left. - // 2) Translate by (1, 1) to map vertex coordinates to [0, 2] on x and y. - // 3) Scale by 1 / 2 to map coordinates to [0, 1] on x and y. - mat4 unit_space(Eigen::AlignedScaling3f(0.5f, 0.5f, 1.0f) * - Eigen::Translation3f(1.0f, 1.0f, 0.0f) * - Eigen::AlignedScaling3f(1.0f, -1.0f, 1.0f)); - - mat4 texture_space(Eigen::AlignedScaling3f( - texture_layer.texture->width(), texture_layer.texture->height(), 1.0f)); - - // 1) Translate the layer to crop the left and top edge. - // 2) Scale the layer such that the cropped right and bottom edges map outside - // the exture region. - float crop_width = texture_layer.crop.right - texture_layer.crop.left; - float crop_height = texture_layer.crop.bottom - texture_layer.crop.top; - mat4 texture_crop(Eigen::AlignedScaling3f( - texture_layer.texture->width() / crop_width, - texture_layer.texture->height() / crop_height, 1.0f) * - Eigen::Translation3f(-texture_layer.crop.left, - -texture_layer.crop.top, 0.0f)); - - mat4 display_space( - Eigen::AlignedScaling3f(display_width, display_height, 1.0f)); - - // 1) Scale the texture to fit the display frame. - // 2) Translate the texture in the display frame location. - float display_frame_width = - texture_layer.display_frame.right - texture_layer.display_frame.left; - float display_frame_height = - texture_layer.display_frame.bottom - texture_layer.display_frame.top; - mat4 display_frame( - Eigen::Translation3f(texture_layer.display_frame.left, - texture_layer.display_frame.top, 0.0f) * - Eigen::AlignedScaling3f(display_frame_width / display_width, - display_frame_height / display_height, 1.0f)); - - mat4 layer_transform = unit_space.inverse() * display_space.inverse() * - display_frame * display_space * - texture_space.inverse() * texture_crop * - texture_space * unit_space; - return layer_transform; -} - -// Determine if ths frame should be shown or hidden. -ViewMode CalculateVisibilityFromLayerConfig(const HwcCallback::Frame& frame, - uint32_t* appid) { - auto& layers = frame.layers(); - - size_t index; - // Skip all layers that we don't know about. - for (index = 0; index < layers.size(); index++) { - if (layers[index].type != 0xFFFFFFFF && layers[index].type != 0) - break; - } - - if (index == layers.size()) - return ViewMode::Hidden; - - if (layers[index].type != 1) { - // We don't have a VR app layer? Abort. - return ViewMode::Hidden; - } - - if (layers[index].appid != *appid) { - *appid = layers[index].appid; - return ViewMode::App; - } - - // This is the VR app, ignore it. - index++; - - // Now, find a dim layer if it exists. - // If it does, ignore any layers behind it for visibility determination. - for (size_t i = index; i < layers.size(); i++) { - if (layers[i].appid == HwcCallback::HwcLayer::kSurfaceFlingerLayer) { - index = i + 1; - } - } - - // If any non-skipped layers exist now then we show, otherwise hide. - for (size_t i = index; i < layers.size(); i++) { - if (!layers[i].should_skip_layer()) - return ViewMode::VR; - } - - return ViewMode::Hidden; -} - -} // namespace - -DisplayView::DisplayView(uint32_t id, int touchpad_id) - : id_(id), touchpad_id_(touchpad_id) { - translate_ = Eigen::Translation3f(0, 0, -5.0f); - ime_translate_ = mat4(Eigen::Translation3f(0.0f, -0.5f, 0.25f)); - ime_top_left_ = vec2(0, 0); - ime_size_ = vec2(0, 0); - rotation_ = mat4::Identity(); -} - -DisplayView::~DisplayView() {} - -void DisplayView::Recenter(const mat4& initial) { - initial_head_matrix_ = - initial * Eigen::AngleAxisf(M_PI * 0.5f, vec3::UnitZ()); -} - -void DisplayView::SetPrograms(ShaderProgram* program, - ShaderProgram* overlay_program) { - program_ = program; - overlay_program_ = overlay_program; -} - -void DisplayView::DrawEye(EyeType /* eye */, const mat4& perspective, - const mat4& eye_matrix, const mat4& head_matrix, - float fade_value) { - scale_ = GetScalingMatrix(size_.x(), size_.y()); - - DrawOverlays(perspective, eye_matrix, head_matrix, fade_value); -} - -void DisplayView::AdvanceFrame() { - if (!pending_frames_.empty()) { - // Check if we should advance the frame. - auto& frame = pending_frames_.front(); - if (frame.visibility == ViewMode::Hidden || - frame.frame->Finish() == HwcCallback::FrameStatus::kFinished) { - current_frame_ = std::move(frame); - pending_frames_.pop_front(); - } - } -} - -void DisplayView::OnDrawFrame(SurfaceFlingerView* surface_flinger_view, - bool debug_mode) { - textures_.clear(); - has_ime_ = false; - - if (!visible()) - return; - - surface_flinger_view->GetTextures(*current_frame_.frame.get(), &textures_, - &ime_texture_, debug_mode, - current_frame_.visibility == ViewMode::VR); - has_ime_ = ime_texture_.texture != nullptr; -} - -base::unique_fd DisplayView::OnFrame(std::unique_ptr frame, - bool debug_mode, bool is_vr_active, - bool* showing) { - size_ = vec2(frame->display_width(), frame->display_height()); - uint32_t app = current_vr_app_; - ViewMode visibility = CalculateVisibilityFromLayerConfig(*frame.get(), &app); - - if (visibility == ViewMode::Hidden && debug_mode) - visibility = ViewMode::VR; - - if (frame->layers().empty()) { - current_vr_app_ = 0; - } else if (visibility == ViewMode::App) { - // This is either a VR app switch or a 2D app launching. - // If we can have VR apps, update if it's 0. - if (!always_2d_ && is_vr_active && !use_2dmode_ && app != kSystemId) { - visibility = ViewMode::Hidden; - current_vr_app_ = app; - } - } else if ((use_2dmode_ || !is_vr_active) && app != 0 && - visibility == ViewMode::Hidden) { - // This is the case for the VR app launching a 2D intent of itself on some - // display. - visibility = ViewMode::App; - } else if (!current_vr_app_) { - // The VR app is running. - current_vr_app_ = app; - } - - pending_frames_.emplace_back(std::move(frame), visibility); - - if (pending_frames_.size() > kMaximumPendingFrames) { - pending_frames_.pop_front(); - } - - if (visibility == ViewMode::Hidden && - current_frame_.visibility == ViewMode::Hidden) { - // Consume all frames while hidden. - while (!pending_frames_.empty()) - AdvanceFrame(); - } - - // If we are showing ourselves the main thread is not processing anything, - // so give it a kick. - if (visibility != ViewMode::Hidden && - current_frame_.visibility == ViewMode::Hidden) { - *showing = true; - } - - return base::unique_fd(dup(release_fence_.get())); -} - -bool DisplayView::IsHit(const vec3& view_location, const vec3& view_direction, - vec3* hit_location, vec2* hit_location_in_window_coord, - bool test_ime) { - mat4 m = GetStandardTransform(); - if (test_ime) - m = m * ime_translate_; - mat4 inverse = (m * scale_).inverse(); - vec4 transformed_loc = - inverse * vec4(view_location[0], view_location[1], view_location[2], 1); - vec4 transformed_dir = inverse * vec4(view_direction[0], view_direction[1], - view_direction[2], 0); - - if (transformed_dir.z() >= 0 || transformed_loc.z() <= 0) - return false; - - float distance = -transformed_loc.z() / transformed_dir.z(); - vec4 transformed_hit_loc = transformed_loc + transformed_dir * distance; - if (transformed_hit_loc.x() < -1 || transformed_hit_loc.x() > 1) - return false; - if (transformed_hit_loc.y() < -1 || transformed_hit_loc.y() > 1) - return false; - - hit_location_in_window_coord->x() = - (1 + transformed_hit_loc.x()) / 2 * size_.x(); - hit_location_in_window_coord->y() = - (1 - transformed_hit_loc.y()) / 2 * size_.y(); - - *hit_location = view_location + view_direction * distance; - return true; -} - -void DisplayView::DrawOverlays(const mat4& perspective, const mat4& eye_matrix, - const mat4& head_matrix, float fade_value) { - if (textures_.empty()) - return; - - program_->Use(); - mat4 mvp = perspective * eye_matrix * head_matrix; - GLint view_projection_location = - glGetUniformLocation(program_->GetProgram(), "uViewProjection"); - glUniformMatrix4fv(view_projection_location, 1, 0, mvp.data()); - - GLint alpha_location = glGetUniformLocation(program_->GetProgram(), "uAlpha"); - - GLint tex_location = glGetUniformLocation(program_->GetProgram(), "tex"); - glUniform1i(tex_location, 0); - glActiveTexture(GL_TEXTURE0); - - for (const auto& texture_layer : textures_) { - switch (texture_layer.blending) { - case HWC2_BLEND_MODE_PREMULTIPLIED: - glEnable(GL_BLEND); - glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); - break; - case HWC2_BLEND_MODE_COVERAGE: - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - break; - default: - break; - } - - glUniform1f(alpha_location, fade_value * texture_layer.alpha); - - glBindTexture(GL_TEXTURE_2D, texture_layer.texture->id()); - - mat4 layer_transform = - GetLayerTransform(texture_layer, size_.x(), size_.y()); - - mat4 transform = GetStandardTransform() * scale_ * layer_transform; - DrawWithTransform(transform, *program_); - - glDisable(GL_BLEND); - } - - if (has_ime_) { - ime_top_left_ = vec2(static_cast(ime_texture_.display_frame.left), - static_cast(ime_texture_.display_frame.top)); - ime_size_ = vec2(static_cast(ime_texture_.display_frame.right - - ime_texture_.display_frame.left), - static_cast(ime_texture_.display_frame.bottom - - ime_texture_.display_frame.top)); - - DrawDimOverlay(mvp, textures_[0], ime_top_left_, ime_top_left_ + ime_size_); - - DrawIme(); - } -} - -void DisplayView::UpdateReleaseFence() { - EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); - EGLSyncKHR sync = - eglCreateSyncKHR(display, EGL_SYNC_NATIVE_FENCE_ANDROID, nullptr); - if (sync != EGL_NO_SYNC_KHR) { - // Need to flush in order to get the fence FD. - glFlush(); - base::unique_fd fence(eglDupNativeFenceFDANDROID(display, sync)); - eglDestroySyncKHR(display, sync); - release_fence_ = std::move(fence); - } else { - ALOGE("Failed to create sync fence"); - release_fence_ = base::unique_fd(); - } -} - -mat4 DisplayView::GetStandardTransform() { - mat4 m = initial_head_matrix_ * rotation_ * translate_; - if (current_frame_.visibility == ViewMode::App) - m *= Eigen::AngleAxisf(M_PI * -0.5f, vec3::UnitZ()); - return m; -} - -void DisplayView::DrawIme() { - program_->Use(); - glBindTexture(GL_TEXTURE_2D, ime_texture_.texture->id()); - - mat4 layer_transform = GetLayerTransform(ime_texture_, size_.x(), size_.y()); - - mat4 transform = - GetStandardTransform() * ime_translate_ * scale_ * layer_transform; - - DrawWithTransform(transform, *program_); -} - -void DisplayView::DrawDimOverlay(const mat4& mvp, const TextureLayer& layer, - const vec2& top_left, - const vec2& bottom_right) { - overlay_program_->Use(); - glUniformMatrix4fv( - glGetUniformLocation(overlay_program_->GetProgram(), "uViewProjection"), - 1, 0, mvp.data()); - glUniform4f(glGetUniformLocation(overlay_program_->GetProgram(), "uCoords"), - top_left.x() / size_.x(), top_left.y() / size_.y(), - bottom_right.x() / size_.x(), bottom_right.y() / size_.y()); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - mat4 layer_transform = GetLayerTransform(layer, size_.x(), size_.y()); - - mat4 transform = GetStandardTransform() * scale_ * layer_transform; - DrawWithTransform(transform, *overlay_program_); - glDisable(GL_BLEND); -} - -void DisplayView::DrawWithTransform(const mat4& transform, - const ShaderProgram& program) { - GLint transform_location = - glGetUniformLocation(program.GetProgram(), "uTransform"); - glUniformMatrix4fv(transform_location, 1, 0, transform.data()); - - glEnableVertexAttribArray(0); - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, kVertices); - glEnableVertexAttribArray(1); - glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, kTextureVertices); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); -} - -bool DisplayView::UpdateHitInfo(const vec3& view_location, - const vec3& view_direction, - vec3* hit_location) { - bool is_hit = false; - if (has_ime_) { - // This will set allow_input_ and hit_location_in_window_coord_. - is_hit = IsImeHit(view_location, view_direction, hit_location); - } else { - is_hit = IsHit(view_location, view_direction, hit_location, - &hit_location_in_window_coord_, false); - allow_input_ = is_hit; - } - return is_hit; -} - -bool DisplayView::IsImeHit(const vec3& view_location, - const vec3& view_direction, vec3* hit_location) { - // First, check if the IME window is hit. - bool is_hit = IsHit(view_location, view_direction, hit_location, - &hit_location_in_window_coord_, true); - if (is_hit) { - // If it is, check if the window coordinate is in the IME region; - // if so then we are done. - if (IsInside(hit_location_in_window_coord_, ime_top_left_, - ime_top_left_ + ime_size_)) { - allow_input_ = true; - return true; - } - } - - allow_input_ = false; - // Check if we have hit the main window. - is_hit = IsHit(view_location, view_direction, hit_location, - &hit_location_in_window_coord_, false); - if (is_hit) { - // Only allow input if we are not hitting the region hidden by the IME. - // Allowing input here would cause clicks on the main window to actually - // be clicks on the IME. - if (!IsInside(hit_location_in_window_coord_, ime_top_left_, - ime_top_left_ + ime_size_)) { - allow_input_ = true; - } - } - return is_hit; -} - -} // namespace dvr -} // namespace android diff --git a/services/vr/vr_window_manager/display_view.h b/services/vr/vr_window_manager/display_view.h deleted file mode 100644 index ad624c6e8c..0000000000 --- a/services/vr/vr_window_manager/display_view.h +++ /dev/null @@ -1,119 +0,0 @@ -#ifndef VR_WINDOW_MANAGER_DISPLAY_VIEW_H_ -#define VR_WINDOW_MANAGER_DISPLAY_VIEW_H_ - -#include -#include - -#include "hwc_callback.h" -#include "surface_flinger_view.h" - -namespace android { -namespace dvr { - -enum class ViewMode { - Hidden, - VR, - App, -}; - -class DisplayView { - public: - DisplayView(uint32_t id, int touchpad_id); - ~DisplayView(); - - // Calls to these 3 functions must be synchronized. - base::unique_fd OnFrame(std::unique_ptr frame, - bool debug_mode, bool is_vr_active, bool* showing); - void AdvanceFrame(); - void UpdateReleaseFence(); - - void OnDrawFrame(SurfaceFlingerView* surface_flinger_view, bool debug_mode); - void DrawEye(EyeType eye, const mat4& perspective, const mat4& eye_matrix, - const mat4& head_matrix, float fade_value); - - void Recenter(const mat4& initial); - - bool UpdateHitInfo(const vec3& view_location, const vec3& view_direction, - vec3* hit_location); - - void SetPrograms(ShaderProgram* program, ShaderProgram* overlay_program); - - bool visible() const { return current_frame_.visibility != ViewMode::Hidden; } - bool allow_input() const { return allow_input_; } - const vec2& hit_location() const { return hit_location_in_window_coord_; } - uint32_t id() const { return id_; } - int touchpad_id() const { return touchpad_id_; } - vec2 size() const { return size_; } - - void set_2dmode(bool mode) { use_2dmode_ = mode; } - void set_always_2d(bool mode) { always_2d_ = mode; } - - void set_rotation(const mat4& rotation) { rotation_ = rotation; } - - private: - bool IsHit(const vec3& view_location, const vec3& view_direction, - vec3* hit_location, vec2* hit_location_in_window_coord, - bool test_ime); - bool IsImeHit(const vec3& view_location, const vec3& view_direction, - vec3* hit_location); - void DrawOverlays(const mat4& perspective, const mat4& eye_matrix, - const mat4& head_matrix, float fade_value); - void DrawIme(); - void DrawDimOverlay(const mat4& mvp, const TextureLayer& layer, - const vec2& top_left, const vec2& bottom_right); - void DrawWithTransform(const mat4& transform, const ShaderProgram& program); - - // This is the rotated, translated but unscaled transform to apply everywhere. - mat4 GetStandardTransform(); - - uint32_t id_; - int touchpad_id_; - - uint32_t current_vr_app_; - - ShaderProgram* program_; - ShaderProgram* overlay_program_; - - mat4 initial_head_matrix_; - mat4 scale_; - mat4 translate_; - mat4 ime_translate_; - mat4 rotation_; - vec2 size_; - - std::vector textures_; - TextureLayer ime_texture_; - - bool allow_input_ = false; - vec2 hit_location_in_window_coord_; - vec2 ime_top_left_; - vec2 ime_size_; - bool has_ime_ = false; - bool use_2dmode_ = false; - bool always_2d_ = false; - - struct PendingFrame { - PendingFrame() = default; - PendingFrame(std::unique_ptr&& frame, - ViewMode visibility) - : frame(std::move(frame)), visibility(visibility) {} - PendingFrame(PendingFrame&& r) - : frame(std::move(r.frame)), visibility(r.visibility) {} - - void operator=(PendingFrame&& r) { - frame.reset(r.frame.release()); - visibility = r.visibility; - } - - std::unique_ptr frame; - ViewMode visibility = ViewMode::Hidden; - }; - std::deque pending_frames_; - PendingFrame current_frame_; - base::unique_fd release_fence_; -}; - -} // namespace dvr -} // namespace android - -#endif // VR_WINDOW_MANAGER_DISPLAY_VIEW_H_ diff --git a/services/vr/vr_window_manager/elbow_model.cpp b/services/vr/vr_window_manager/elbow_model.cpp deleted file mode 100644 index 9543f17697..0000000000 --- a/services/vr/vr_window_manager/elbow_model.cpp +++ /dev/null @@ -1,134 +0,0 @@ -#include "elbow_model.h" - -#include - -namespace android { -namespace dvr { -namespace { - -const vec3 kControllerForearm(0.0f, 0.0f, -0.25f); -const vec3 kControllerPosition(0.0f, 0.0f, -0.05f); -const vec3 kLeftElbowPosition(-0.195f, -0.5f, 0.075f); -const vec3 kLeftArmExtension(0.13f, 0.14f, -0.08f); -const vec3 kRightElbowPosition(0.195f, -0.5f, 0.075f); -const vec3 kRightArmExtension(-0.13f, 0.14f, -0.08f); -constexpr float kElbowBendRatio = 0.4f; -constexpr float kCosMaxExtensionAngle = - 0.87f; // Cos of 30 degrees (90-30 = 60) -constexpr float kCosMinExtensionAngle = 0.12f; // Cos of 83 degrees (90-83 = 7) -constexpr float kYAxisExtensionFraction = 0.4f; -constexpr float kMinRotationSpeed = 0.61f; // 35 degrees in radians -constexpr float kMinAngleDelta = 0.175f; // 10 degrees in radians - -float clamp(float v, float min, float max) { - if (v < min) - return min; - if (v > max) - return max; - return v; -} - -float NormalizeAngle(float angle) { - if (angle > M_PI) - angle = 2.0f * M_PI - angle; - return angle; -} - -} // namespace - -const vec3 ElbowModel::kDefaultNeckPosition = vec3(0, -0.075f, -0.080f); - -ElbowModel::ElbowModel() {} -ElbowModel::~ElbowModel() {} - -void ElbowModel::Enable(const vec3& neck_position, bool right_handed) { - enabled_ = true; - neck_position_ = neck_position; - - if (right_handed) { - elbow_position_ = kRightElbowPosition; - arm_extension_ = kRightArmExtension; - } else { - elbow_position_ = kLeftElbowPosition; - arm_extension_ = kLeftArmExtension; - } - - ResetRoot(); -} - -void ElbowModel::Disable() { enabled_ = false; } - -vec3 ElbowModel::Update(float delta_t, const quat& hmd_orientation, - const quat& controller_orientation, bool recenter) { - if (!enabled_) - return vec3::Zero(); - - float heading_rad = GetHeading(hmd_orientation); - - quat y_rotation; - y_rotation = Eigen::AngleAxis(heading_rad, vec3::UnitY()); - - // If the controller's angular velocity is above a certain amount, we can - // assume torso rotation and move the elbow joint relative to the - // camera orientation. - float angle_delta = last_controller_.angularDistance(controller_orientation); - float rot_speed = angle_delta / delta_t; - - if (recenter) { - root_rot_ = y_rotation; - } else if (rot_speed > kMinRotationSpeed) { - root_rot_.slerp(angle_delta / kMinAngleDelta, y_rotation); - } - - // Calculate angle (or really, cos thereof) between controller forward vector - // and Y axis to determine extension amount. - vec3 controller_forward_rotated = controller_orientation * -vec3::UnitZ(); - float dot_y = controller_forward_rotated.y(); - float amt_extension = clamp(dot_y - kCosMinExtensionAngle, 0, 1); - - // Remove the root rotation from the orientation reading--we'll add it back in - // later. - quat controller_rot = root_rot_.inverse() * controller_orientation; - controller_forward_rotated = controller_rot * -vec3::UnitZ(); - quat rot_xy; - rot_xy.setFromTwoVectors(-vec3::UnitZ(), controller_forward_rotated); - - // Fixing polar singularity - float total_angle = NormalizeAngle(atan2f(rot_xy.norm(), rot_xy.w()) * 2.0f); - float lerp_amount = (1.0f - powf(total_angle / M_PI, 6.0f)) * - (1.0f - (kElbowBendRatio + - (1.0f - kElbowBendRatio) * - (amt_extension + kYAxisExtensionFraction))); - - // Calculate the relative rotations of the elbow and wrist joints. - quat wrist_rot = quat::Identity(); - wrist_rot.slerp(lerp_amount, rot_xy); - quat elbow_rot = wrist_rot.inverse() * rot_xy; - - last_controller_ = controller_orientation; - - vec3 position = - root_rot_ * - ((controller_root_offset_ + arm_extension_ * amt_extension) + - elbow_rot * (kControllerForearm + wrist_rot * kControllerPosition)); - - return position; -} - -float ElbowModel::GetHeading(const quat& orientation) { - vec3 gaze = orientation * -vec3::UnitZ(); - - if (gaze.y() > 0.99) - gaze = orientation * -vec3::UnitY(); - else if (gaze.y() < -0.99) - gaze = orientation * vec3::UnitY(); - - return atan2f(-gaze.x(), -gaze.z()); -} - -void ElbowModel::ResetRoot() { - controller_root_offset_ = elbow_position_ + neck_position_; -} - -} // namespace dvr -} // namespace android diff --git a/services/vr/vr_window_manager/elbow_model.h b/services/vr/vr_window_manager/elbow_model.h deleted file mode 100644 index a6d5ca93cb..0000000000 --- a/services/vr/vr_window_manager/elbow_model.h +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef VR_WINDOW_MANAGER_ELBOW_MODEL_H_ -#define VR_WINDOW_MANAGER_ELBOW_MODEL_H_ - -#include - -namespace android { -namespace dvr { - -class ElbowModel { - public: - ElbowModel(); - ~ElbowModel(); - - void Enable(const vec3& neck_position, bool right_handed); - void Disable(); - - vec3 Update(float delta_t, const quat& hmd_orientation, - const quat& controller_orientation, bool recenter); - - static const vec3 kDefaultNeckPosition; - - private: - ElbowModel(const ElbowModel&) = delete; - void operator=(const ElbowModel&) = delete; - - void ResetRoot(); - - float GetHeading(const quat& orientation); - - bool enabled_ = false; - - quat last_controller_ = quat::Identity(); - - quat root_rot_ = quat::Identity(); - - vec3 controller_root_offset_ = vec3::Zero(); - vec3 elbow_position_ = vec3::Zero(); - vec3 arm_extension_ = vec3::Zero(); - vec3 neck_position_ = vec3::Zero(); -}; - -} // namespace dvr -} // namespace android - -#endif // VR_WINDOW_MANAGER_ELBOW_MODEL_H_ diff --git a/services/vr/vr_window_manager/hwc_callback.cpp b/services/vr/vr_window_manager/hwc_callback.cpp deleted file mode 100644 index 28e97ff01b..0000000000 --- a/services/vr/vr_window_manager/hwc_callback.cpp +++ /dev/null @@ -1,96 +0,0 @@ -#include "hwc_callback.h" - -#include -#include -#include -#include -#include - -namespace android { -namespace dvr { - -namespace { - -HwcCallback::FrameStatus GetFrameStatus(const HwcCallback::Frame& frame) { - for (const auto& layer : frame.layers()) { - // If there is no fence it means the buffer is already finished. - if (layer.fence->isValid()) { - status_t result = layer.fence->wait(0); - if (result != OK) { - if (result != -ETIME) { - ALOGE("fence wait on buffer fence failed. status=%d (%s).", - result, strerror(-result)); - return HwcCallback::FrameStatus::kError; - } - return HwcCallback::FrameStatus::kUnfinished; - } - } - } - - return HwcCallback::FrameStatus::kFinished; -} - -} // namespace - -void HwcCallback::HwcLayer::PrintLayer() { - ALOGI("appid=%d, type=%d, alpha=%.2f, cursor=%dx%d, color=%02X%02X%02X%02X, " - "crop=%.1f,%.1f,%.1f,%.1f, display=%d,%d,%d,%d, dataspace=%d, " - "transform=%d", appid, type, alpha, cursor_x, cursor_y, color.r, color.g, - color.b, color.a, crop.left, crop.top, crop.right, crop.bottom, - display_frame.left, display_frame.right, display_frame.top, - display_frame.bottom, dataspace, transform); -} - -HwcCallback::HwcCallback(Client* client) : client_(client) { -} - -HwcCallback::~HwcCallback() { -} - -binder::Status HwcCallback::onNewFrame( - const ParcelableComposerFrame& parcelable_frame, - ParcelableUniqueFd* fence) { - ComposerView::Frame frame = parcelable_frame.frame(); - std::vector hwc_frame(frame.layers.size()); - for (size_t i = 0; i < frame.layers.size(); ++i) { - const ComposerView::ComposerLayer& layer = frame.layers[i]; - hwc_frame[i] = HwcLayer{ - .fence = layer.fence, - .buffer = layer.buffer, - .crop = layer.crop, - .display_frame = layer.display_frame, - .blending = static_cast(layer.blend_mode), - .appid = layer.app_id, - .type = static_cast(layer.type), - .alpha = layer.alpha, - .cursor_x = layer.cursor_x, - .cursor_y = layer.cursor_y, - .color = layer.color, - .dataspace = layer.dataspace, - .transform = layer.transform, - }; - } - - fence->set_fence(client_->OnFrame(std::make_unique( - std::move(hwc_frame), frame.display_id, frame.removed, - frame.display_width, frame.display_height))); - return binder::Status::ok(); -} - -HwcCallback::Frame::Frame(std::vector&& layers, uint32_t display_id, - bool removed, int32_t display_width, - int32_t display_height) - : display_id_(display_id), - removed_(removed), - display_width_(display_width), - display_height_(display_height), - layers_(std::move(layers)) {} - -HwcCallback::FrameStatus HwcCallback::Frame::Finish() { - if (status_ == FrameStatus::kUnfinished) - status_ = GetFrameStatus(*this); - return status_; -} - -} // namespace dvr -} // namespace android diff --git a/services/vr/vr_window_manager/hwc_callback.h b/services/vr/vr_window_manager/hwc_callback.h deleted file mode 100644 index 259c4ac799..0000000000 --- a/services/vr/vr_window_manager/hwc_callback.h +++ /dev/null @@ -1,132 +0,0 @@ -#ifndef VR_WINDOW_MANAGER_HWC_CALLBACK_H_ -#define VR_WINDOW_MANAGER_HWC_CALLBACK_H_ - -#include -#include -#include - -#include -#include -#include -#include - -namespace android { - -class Fence; -class GraphicBuffer; - -namespace dvr { - -using Recti = ComposerView::ComposerLayer::Recti; -using Rectf = ComposerView::ComposerLayer::Rectf; - -class HwcCallback : public BnVrComposerCallback { - public: - struct HwcLayer { - enum LayerType : uint32_t { - // These are from frameworks/base/core/java/android/view/WindowManager.java - kSurfaceFlingerLayer = 0, - kUndefinedWindow = ~0U, - kFirstApplicationWindow = 1, - kLastApplicationWindow = 99, - kFirstSubWindow = 1000, - kLastSubWindow = 1999, - kFirstSystemWindow = 2000, - kStatusBar = kFirstSystemWindow, - kInputMethod = kFirstSystemWindow + 11, - kNavigationBar = kFirstSystemWindow + 19, - kLastSystemWindow = 2999, - }; - - bool should_skip_layer() const { - switch (type) { - // Always skip the following layer types - case kNavigationBar: - case kStatusBar: - case kSurfaceFlingerLayer: - case kUndefinedWindow: - return true; - default: - return false; - } - } - - // This is a layer that provides some other functionality, eg dim layer. - // We use this to determine the point at which layers are "on top". - bool is_extra_layer() const { - switch(type) { - case kSurfaceFlingerLayer: - case kUndefinedWindow: - return true; - default: - return false; - } - } - - void PrintLayer(); - - sp fence; - sp buffer; - Rectf crop; - Recti display_frame; - int32_t blending; - uint32_t appid; - LayerType type; - float alpha; - int32_t cursor_x; - int32_t cursor_y; - IComposerClient::Color color; - int32_t dataspace; - int32_t transform; - }; - - enum class FrameStatus { - kUnfinished, - kFinished, - kError - }; - - class Frame { - public: - Frame(std::vector&& layers, uint32_t display_id, bool removed, - int32_t display_width, int32_t display_height); - - FrameStatus Finish(); - const std::vector& layers() const { return layers_; } - uint32_t display_id() const { return display_id_; } - bool removed() const { return removed_; } - int32_t display_width() const { return display_width_; } - int32_t display_height() const { return display_height_; } - - private: - uint32_t display_id_; - bool removed_; - int32_t display_width_; - int32_t display_height_; - std::vector layers_; - FrameStatus status_ = FrameStatus::kUnfinished; - }; - - class Client { - public: - virtual ~Client() {} - virtual base::unique_fd OnFrame(std::unique_ptr) = 0; - }; - - explicit HwcCallback(Client* client); - ~HwcCallback() override; - - private: - binder::Status onNewFrame(const ParcelableComposerFrame& frame, - ParcelableUniqueFd* fence) override; - - Client *client_; - - HwcCallback(const HwcCallback&) = delete; - void operator=(const HwcCallback&) = delete; -}; - -} // namespace dvr -} // namespace android - -#endif // VR_WINDOW_MANAGER_HWC_CALLBACK_H_ diff --git a/services/vr/vr_window_manager/proguard.flags b/services/vr/vr_window_manager/proguard.flags deleted file mode 100644 index 7683d6e58d..0000000000 --- a/services/vr/vr_window_manager/proguard.flags +++ /dev/null @@ -1,22 +0,0 @@ -# Don't obfuscate any NDK/SDK code. This makes the debugging of stack traces in -# in release builds easier. --keepnames class com.google.vr.ndk.** { *; } --keepnames class com.google.vr.sdk.** { *; } - -# These are part of the SDK <-> VrCore interfaces for GVR. --keepnames class com.google.vr.vrcore.library.api.** { *; } - -# These are part of the Java <-> native interfaces for GVR. --keep class com.google.vr.** { native ; } - --keep class com.google.vr.cardboard.annotations.UsedByNative --keep @com.google.vr.cardboard.annotations.UsedByNative class * --keepclassmembers class * { - @com.google.vr.cardboard.annotations.UsedByNative *; -} - --keep class com.google.vr.cardboard.UsedByNative --keep @com.google.vr.cardboard.UsedByNative class * --keepclassmembers class * { - @com.google.vr.cardboard.UsedByNative *; -} diff --git a/services/vr/vr_window_manager/reticle.cpp b/services/vr/vr_window_manager/reticle.cpp deleted file mode 100644 index cbd0caf29c..0000000000 --- a/services/vr/vr_window_manager/reticle.cpp +++ /dev/null @@ -1,100 +0,0 @@ -#include "reticle.h" - -#include -#include - -namespace android { -namespace dvr { - -namespace { - -const std::string kVertexShader = SHADER0([]() { - layout(location = 0) in vec4 aPosition; - layout(location = 1) in vec4 aTexCoord; - uniform mat4 uViewProjection; - uniform mat4 uTransform; - - out vec2 vTexCoord; - void main() { - gl_Position = uViewProjection * uTransform * aPosition; - vTexCoord = aTexCoord.xy; - } -}); - -const std::string kFragmentShader = SHADER0([]() { - precision mediump float; - - in vec2 vTexCoord; - uniform vec3 uColor; - - out vec4 fragColor; - void main() { - float alpha = smoothstep(1.0, 0.0, length(vTexCoord)); - fragColor = vec4(uColor, alpha); - } -}); - -} // namespace - -Reticle::Reticle() {} - -Reticle::~Reticle() {} - -bool Reticle::Initialize() { - program_.Link(kVertexShader, kFragmentShader); - if (!program_) - return false; - - return true; -} - -void Reticle::ShowAt(const mat4& hit_transform, const vec3& color) { - transform_ = hit_transform; - shown_ = true; - - GLint view_projection_location = - glGetUniformLocation(program_.GetProgram(), "uColor"); - glProgramUniform3f(program_.GetProgram(), view_projection_location, color.x(), - color.y(), color.z()); -} - -void Reticle::Draw(const mat4& perspective, const mat4& eye_matrix, - const mat4& head_matrix) { - if (!shown_) - return; - - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - program_.Use(); - - const float kRadius = 0.015; - GLfloat vertices[] = { - -kRadius, -kRadius, 0, kRadius, -kRadius, 0, - -kRadius, kRadius, 0, kRadius, kRadius, 0, - }; - GLfloat texture_vertices[] = { - -1, 1, 1, 1, -1, -1, 1, -1, - }; - - mat4 mvp = perspective * eye_matrix * head_matrix; - GLint view_projection_location = - glGetUniformLocation(program_.GetProgram(), "uViewProjection"); - glUniformMatrix4fv(view_projection_location, 1, 0, mvp.data()); - - GLint transform_location = - glGetUniformLocation(program_.GetProgram(), "uTransform"); - glUniformMatrix4fv(transform_location, 1, 0, transform_.data()); - - glEnableVertexAttribArray(0); - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vertices); - glEnableVertexAttribArray(1); - glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, texture_vertices); - - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - - glDisable(GL_BLEND); -} - -} // namespace dvr -} // namespace android diff --git a/services/vr/vr_window_manager/reticle.h b/services/vr/vr_window_manager/reticle.h deleted file mode 100644 index d8522aacba..0000000000 --- a/services/vr/vr_window_manager/reticle.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef VR_WINDOW_MANAGER_SHELL_RETICLE_H_ -#define VR_WINDOW_MANAGER_SHELL_RETICLE_H_ - -#include -#include - -namespace android { -namespace dvr { - -class Reticle { - public: - Reticle(); - ~Reticle(); - - bool Initialize(); - - void ShowAt(const mat4& hit_transform, const vec3& color); - void Hide() { shown_ = false; } - - void Draw(const mat4& perspective, const mat4& eye_matrix, - const mat4& head_matrix); - - private: - bool shown_ = false; - ShaderProgram program_; - mat4 transform_; - - Reticle(const Reticle&) = delete; - void operator=(const Reticle&) = delete; -}; - -} // namespace dvr -} // namespace android - -#endif // VR_WINDOW_MANAGER_SHELL_RETICLE_H_ diff --git a/services/vr/vr_window_manager/shell_view.cpp b/services/vr/vr_window_manager/shell_view.cpp deleted file mode 100644 index abd0651361..0000000000 --- a/services/vr/vr_window_manager/shell_view.cpp +++ /dev/null @@ -1,535 +0,0 @@ -#include "shell_view.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "controller_mesh.h" -#include "texture.h" - -namespace android { -namespace dvr { - -namespace { - -constexpr uint32_t kPrimaryDisplayId = 1; - -const std::string kVertexShader = SHADER0([]() { - layout(location = 0) in vec4 aPosition; - layout(location = 1) in vec4 aTexCoord; - uniform mat4 uViewProjection; - uniform mat4 uTransform; - - out vec2 vTexCoord; - void main() { - gl_Position = uViewProjection * uTransform * aPosition; - vTexCoord = aTexCoord.xy; - } -}); - -const std::string kFragmentShader = SHADER0([]() { - precision mediump float; - - in vec2 vTexCoord; - uniform sampler2D tex; - uniform float uAlpha; - - out vec4 fragColor; - void main() { - fragColor = texture(tex, vTexCoord); - fragColor.a *= uAlpha; - } -}); - -// This shader provides a dim layer in a given rect. This is intended -// to indicate the non-interactive region. -// Texture coordinates between [uCoords.xy, uCoords.zw] are dim, otherwise -// transparent. -const std::string kOverlayFragmentShader = SHADER0([]() { - precision highp float; - - in vec2 vTexCoord; - uniform sampler2D tex; - uniform vec4 uCoords; - - out vec4 fragColor; - void main() { - vec4 color = vec4(0, 0, 0, 0); - if (all(greaterThan(vTexCoord, uCoords.xy)) && - all(lessThan(vTexCoord, uCoords.zw))) { - color = vec4(0, 0, 0, 0.5); - } - fragColor = color; - } -}); - -const std::string kControllerFragmentShader = SHADER0([]() { - precision mediump float; - - in vec2 vTexCoord; - - out vec4 fragColor; - void main() { fragColor = vec4(0.8, 0.2, 0.2, 1.0); } -}); - -mat4 GetHorizontallyAlignedMatrixFromPose(const Posef& pose) { - vec3 position = pose.GetPosition(); - quat view_quaternion = pose.GetRotation(); - - vec3 z = vec3(view_quaternion * vec3(0.0f, 0.0f, 1.0f)); - vec3 y(0.0f, 1.0f, 0.0f); - vec3 x = y.cross(z); - x.normalize(); - y = z.cross(x); - - mat4 m; - // clang-format off - m(0, 0) = x[0]; m(0, 1) = y[0]; m(0, 2) = z[0]; m(0, 3) = position[0]; - m(1, 0) = x[1]; m(1, 1) = y[1]; m(1, 2) = z[1]; m(1, 3) = position[1]; - m(2, 0) = x[2]; m(2, 1) = y[2]; m(2, 2) = z[2]; m(2, 3) = position[2]; - m(3, 0) = 0.0f; m(3, 1) = 0.0f; m(3, 2) = 0.0f; m(3, 3) = 1.0f; - // clang-format on - - return m; -} - -int GetTouchIdForDisplay(uint32_t display) { - return display == kPrimaryDisplayId ? DVR_VIRTUAL_TOUCHPAD_PRIMARY - : DVR_VIRTUAL_TOUCHPAD_VIRTUAL; -} - -} // namespace - -ShellView::ShellView() {} - -ShellView::~ShellView() {} - -int ShellView::Initialize() { - int ret = Application::Initialize(); - if (ret) - return ret; - - virtual_touchpad_.reset(dvrVirtualTouchpadCreate()); - const status_t touchpad_status = - dvrVirtualTouchpadAttach(virtual_touchpad_.get()); - if (touchpad_status != OK) { - ALOGE("Failed to connect to virtual touchpad"); - return touchpad_status; - } - - surface_flinger_view_.reset(new SurfaceFlingerView); - if (!surface_flinger_view_->Initialize(this)) - return 1; - - return 0; -} - -int ShellView::AllocateResources() { - int ret = Application::AllocateResources(); - if (ret) - return ret; - - program_.reset(new ShaderProgram); - program_->Link(kVertexShader, kFragmentShader); - overlay_program_.reset(new ShaderProgram); - overlay_program_->Link(kVertexShader, kOverlayFragmentShader); - controller_program_.reset(new ShaderProgram); - controller_program_->Link(kVertexShader, kControllerFragmentShader); - if (!program_ || !overlay_program_ || !controller_program_) - return 1; - - reticle_.reset(new Reticle()); - if (!reticle_->Initialize()) - return 1; - - controller_mesh_.reset(new Mesh()); - controller_mesh_->SetVertices(kNumControllerMeshVertices, - kControllerMeshVertices); - - for (auto& display : displays_) - display->SetPrograms(program_.get(), overlay_program_.get()); - - initialized_ = true; - - return 0; -} - -void ShellView::DeallocateResources() { - { - std::unique_lock l(display_frame_mutex_); - removed_displays_.clear(); - new_displays_.clear(); - displays_.clear(); - } - - display_client_.reset(); - reticle_.reset(); - controller_mesh_.reset(); - program_.reset(new ShaderProgram); - overlay_program_.reset(new ShaderProgram); - controller_program_.reset(new ShaderProgram); - Application::DeallocateResources(); -} - -void ShellView::EnableDebug(bool debug) { - QueueTask(debug ? MainThreadTask::EnableDebugMode - : MainThreadTask::DisableDebugMode); -} - -void ShellView::VrMode(bool mode) { - QueueTask(mode ? MainThreadTask::EnteringVrMode - : MainThreadTask::ExitingVrMode); -} - -void ShellView::dumpInternal(String8& result) { - result.append("[shell]\n"); - result.appendFormat("initialized = %s\n", initialized_ ? "true" : "false"); - result.appendFormat("is_visible = %s\n", is_visible_ ? "true" : "false"); - result.appendFormat("debug_mode = %s\n\n", debug_mode_ ? "true" : "false"); - - result.append("[displays]\n"); - result.appendFormat("count = %zu\n", displays_.size()); - for (size_t i = 0; i < displays_.size(); ++i) { - result.appendFormat(" display_id = %" PRId32 "\n", displays_[i]->id()); - result.appendFormat(" size=%fx%f\n", displays_[i]->size().x(), - displays_[i]->size().y()); - } - - result.append("\n"); -} - -void ShellView::Set2DMode(bool mode) { - if (!displays_.empty()) - displays_[0]->set_2dmode(mode); -} - -void ShellView::SetRotation(int angle) { - mat4 m(Eigen::AngleAxisf(M_PI * -0.5f * angle, vec3::UnitZ())); - for (auto& d : displays_) - d->set_rotation(m); -} - -void ShellView::OnDrawFrame() { - bool visible = false; - - { - std::unique_lock l(display_frame_mutex_); - - // Move any new displays into the list. - if (!new_displays_.empty()) { - for (auto& display : new_displays_) { - display->Recenter(GetHorizontallyAlignedMatrixFromPose(last_pose_)); - display->SetPrograms(program_.get(), overlay_program_.get()); - displays_.emplace_back(display.release()); - } - new_displays_.clear(); - } - - // Remove any old displays from the list now. - if (!removed_displays_.empty()) { - for (auto& display : removed_displays_) { - displays_.erase(std::find_if( - displays_.begin(), displays_.end(), - [display](auto& ptr) { return display == ptr.get(); })); - } - removed_displays_.clear(); - } - - for (auto& display : displays_) { - display->AdvanceFrame(); - visible = visible || display->visible(); - } - } - - if (!debug_mode_ && visible != is_visible_) { - SetVisibility(visible); - } - - for (auto& display : displays_) { - display->OnDrawFrame(surface_flinger_view_.get(), debug_mode_); - } -} - -void ShellView::OnEndFrame() { - std::unique_lock l(display_frame_mutex_); - for (auto& display : displays_) { - display->UpdateReleaseFence(); - } -} - -DisplayView* ShellView::FindOrCreateDisplay(uint32_t id) { - for (auto& display : displays_) { - if (display->id() == id) { - return display.get(); - } - } - - // It might be pending addition. - for (auto& display : new_displays_) { - if (display->id() == id) { - return display.get(); - } - } - - auto display = new DisplayView(id, GetTouchIdForDisplay(id)); - // Virtual displays only ever have 2D apps so force it. - if (id != kPrimaryDisplayId) - display->set_always_2d(true); - new_displays_.emplace_back(display); - return display; -} - -base::unique_fd ShellView::OnFrame(std::unique_ptr frame) { - std::unique_lock l(display_frame_mutex_); - DisplayView* display = FindOrCreateDisplay(frame->display_id()); - - if (frame->removed()) { - removed_displays_.push_back(display); - return base::unique_fd(); - } - - bool showing = false; - - // This is a temporary fix for now. These APIs will be changed when everything - // is moved into vrcore. - // Do this on demand in case vr_flinger crashed and we are reconnecting. - if (!display_client_.get()) { - int error = 0; - display_client_ = display::DisplayClient::Create(&error); - - if (error) { - ALOGE("Could not connect to display service : %s(%d)", strerror(error), - error); - return base::unique_fd(); - } - } - - // TODO(achaulk): change when moved into vrcore. - auto status = display_client_->IsVrAppRunning(); - if (!status) { - ALOGE("Failed to check VR running status: %s", - status.GetErrorMessage().c_str()); - return base::unique_fd(); - } - const bool vr_running = status.get(); - - base::unique_fd fd( - display->OnFrame(std::move(frame), debug_mode_, vr_running, &showing)); - - if (showing) - QueueTask(MainThreadTask::Show); - - return fd; -} - -void ShellView::DrawEye(EyeType eye, const mat4& perspective, - const mat4& eye_matrix, const mat4& head_matrix) { - if (should_recenter_ && !displays_.empty()) { - // Position the quad horizontally aligned in the direction the user - // is facing, effectively taking out head roll. - displays_[0]->Recenter(GetHorizontallyAlignedMatrixFromPose(last_pose_)); - } - - for (auto& display : displays_) { - if (display->visible()) { - display->DrawEye(eye, perspective, eye_matrix, head_matrix, fade_value_); - } - } - - // TODO(alexst): Replicate controller rendering from VR Home. - // Current approach in the function below is a quick visualization. - DrawController(perspective, eye_matrix, head_matrix); - - DrawReticle(perspective, eye_matrix, head_matrix); -} - -void ShellView::OnVisibilityChanged(bool visible) { - should_recenter_ = visible; - Application::OnVisibilityChanged(visible); -} - -bool ShellView::OnClick(bool down) { - if (down) { - if (!is_touching_ && active_display_ && active_display_->allow_input()) { - is_touching_ = true; - } - } else { - is_touching_ = false; - } - Touch(); - return true; -} - -void ShellView::DrawReticle(const mat4& perspective, const mat4& eye_matrix, - const mat4& head_matrix) { - reticle_->Hide(); - - vec3 pointer_location = last_pose_.GetPosition(); - quat view_quaternion = last_pose_.GetRotation(); - - if (shmem_controller_active_) { - view_quaternion = controller_orientation_; - vec4 controller_location = controller_translate_ * vec4(0, 0, 0, 1); - pointer_location = vec3(controller_location.x(), controller_location.y(), - controller_location.z()); - - if (shmem_controller_active_) { - uint64_t buttons = shmem_controller_buttons_; - shmem_controller_buttons_ = 0; - while (buttons) { - switch (buttons & 0xF) { - case 0x1: - OnClick(false); - break; - case 0x3: - OnTouchpadButton(false, AMOTION_EVENT_BUTTON_BACK); - break; - case 0x4: - should_recenter_ = true; - break; - case 0x9: - OnClick(true); - break; - case 0xB: - OnTouchpadButton(true, AMOTION_EVENT_BUTTON_BACK); - break; - default: - break; - } - buttons >>= 4; - } - } - } - - vec3 hit_location; - active_display_ = - FindActiveDisplay(pointer_location, view_quaternion, &hit_location); - - if (active_display_) { - reticle_->ShowAt( - Eigen::Translation3f(hit_location) * view_quaternion.matrix(), - active_display_->allow_input() ? vec3(1, 0, 0) : vec3(0, 0, 0)); - Touch(); - } - - reticle_->Draw(perspective, eye_matrix, head_matrix); -} - -DisplayView* ShellView::FindActiveDisplay(const vec3& position, - const quat& quaternion, - vec3* hit_location) { - vec3 direction = vec3(quaternion * vec3(0, 0, -1)); - vec3 temp_hit; - - DisplayView* best_display = nullptr; - vec3 best_hit; - - auto is_better = [&best_hit, &position](DisplayView*, const vec3& hit) { - return (hit - position).squaredNorm() < (best_hit - position).squaredNorm(); - }; - - for (auto& display : displays_) { - if (display->UpdateHitInfo(position, direction, &temp_hit)) { - if (!best_display || is_better(display.get(), temp_hit)) { - best_display = display.get(); - best_hit = temp_hit; - } - } - } - - if (best_display) - *hit_location = best_hit; - return best_display; -} - -void ShellView::DrawController(const mat4& perspective, const mat4& eye_matrix, - const mat4& head_matrix) { - if (!shmem_controller_active_) - return; - - controller_program_->Use(); - mat4 mvp = perspective * eye_matrix * head_matrix; - - GLint view_projection_location = glGetUniformLocation( - controller_program_->GetProgram(), "uViewProjection"); - glUniformMatrix4fv(view_projection_location, 1, 0, mvp.data()); - - quat view_quaternion = controller_orientation_; - view_quaternion.toRotationMatrix(); - - vec3 world_pos = last_pose_.GetPosition() + controller_position_; - - controller_translate_ = - Eigen::Translation3f(world_pos.x(), world_pos.y(), world_pos.z()); - - mat4 transform = controller_translate_ * view_quaternion * - mat4(Eigen::Scaling(1, 1, 3.0)); - GLint transform_location = - glGetUniformLocation(controller_program_->GetProgram(), "uTransform"); - glUniformMatrix4fv(transform_location, 1, 0, transform.data()); - - controller_mesh_->Draw(); -} - -void ShellView::Touch() { - if (!virtual_touchpad_) { - ALOGE("missing virtual touchpad"); - return; - } - - if (!active_display_) - return; - - const vec2& hit_location = active_display_->hit_location(); - const vec2 size = active_display_->size(); - - float x = hit_location.x() / size.x(); - float y = hit_location.y() / size.y(); - - // Device is portrait, but in landscape when in VR. - // Rotate touch input appropriately. - const android::status_t status = dvrVirtualTouchpadTouch( - virtual_touchpad_.get(), active_display_->touchpad_id(), x, y, - is_touching_ ? 1.0f : 0.0f); - if (status != OK) { - ALOGE("touch failed: %d", status); - } -} - -bool ShellView::OnTouchpadButton(bool down, int button) { - int buttons = touchpad_buttons_; - if (down) { - if (active_display_ && active_display_->allow_input()) { - buttons |= button; - } - } else { - buttons &= ~button; - } - if (buttons == touchpad_buttons_) { - return true; - } - touchpad_buttons_ = buttons; - if (!virtual_touchpad_) { - ALOGE("missing virtual touchpad"); - return false; - } - - if (!active_display_) - return true; - - const android::status_t status = dvrVirtualTouchpadButtonState( - virtual_touchpad_.get(), active_display_->touchpad_id(), - touchpad_buttons_); - if (status != OK) { - ALOGE("touchpad button failed: %d %d", touchpad_buttons_, status); - } - return true; -} - -} // namespace dvr -} // namespace android diff --git a/services/vr/vr_window_manager/shell_view.h b/services/vr/vr_window_manager/shell_view.h deleted file mode 100644 index 9b51600106..0000000000 --- a/services/vr/vr_window_manager/shell_view.h +++ /dev/null @@ -1,103 +0,0 @@ -#ifndef VR_WINDOW_MANAGER_SHELL_VIEW_H_ -#define VR_WINDOW_MANAGER_SHELL_VIEW_H_ - -#include -#include -#include -#include - -#include - -#include "application.h" -#include "display_view.h" -#include "reticle.h" -#include "shell_view_binder_interface.h" -#include "surface_flinger_view.h" - -namespace android { -namespace dvr { - -class ShellView : public Application, - public android::dvr::ShellViewBinderInterface, - public HwcCallback::Client { - public: - ShellView(); - virtual ~ShellView(); - - int Initialize() override; - - int AllocateResources() override; - void DeallocateResources() override; - - // ShellViewBinderInterface: - void EnableDebug(bool debug) override; - void VrMode(bool mode) override; - void dumpInternal(String8& result) override; - void Set2DMode(bool mode) override; - void SetRotation(int angle) override; - - - protected: - void DrawEye(EyeType eye, const mat4& perspective, const mat4& eye_matrix, - const mat4& head_matrix) override; - void OnDrawFrame() override; - void OnEndFrame() override; - void OnVisibilityChanged(bool visible) override; - - void DrawReticle(const mat4& perspective, const mat4& eye_matrix, - const mat4& head_matrix); - void DrawController(const mat4& perspective, const mat4& eye_matrix, - const mat4& head_matrix); - - void Touch(); - bool OnTouchpadButton(bool down, int button); - - bool OnClick(bool down); - - DisplayView* FindActiveDisplay(const vec3& position, const quat& quaternion, - vec3* hit_location); - - // HwcCallback::Client: - base::unique_fd OnFrame(std::unique_ptr frame) override; - DisplayView* FindOrCreateDisplay(uint32_t id); - - std::unique_ptr program_; - std::unique_ptr overlay_program_; - std::unique_ptr controller_program_; - - std::unique_ptr surface_flinger_view_; - std::unique_ptr reticle_; - - std::unique_ptr display_client_; - - struct DvrVirtualTouchpadDeleter { - void operator()(DvrVirtualTouchpad* p) { - dvrVirtualTouchpadDetach(p); - dvrVirtualTouchpadDestroy(p); - } - }; - std::unique_ptr - virtual_touchpad_; - - std::unique_ptr> controller_mesh_; - - bool is_touching_ = false; - int touchpad_buttons_ = 0; - - std::mutex display_frame_mutex_; - - std::vector> displays_; - std::vector> new_displays_; - std::vector removed_displays_; - DisplayView* active_display_ = nullptr; - - mat4 controller_translate_; - - ShellView(const ShellView&) = delete; - void operator=(const ShellView&) = delete; -}; - -} // namespace dvr -} // namespace android - -#endif // VR_WINDOW_MANAGER_SHELL_VIEW_H_ diff --git a/services/vr/vr_window_manager/shell_view_binder_interface.h b/services/vr/vr_window_manager/shell_view_binder_interface.h deleted file mode 100644 index c66e4a1def..0000000000 --- a/services/vr/vr_window_manager/shell_view_binder_interface.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef VR_WINDOW_MANAGER_SHELL_VIEWBINDER_INTERFACE_H_ -#define VR_WINDOW_MANAGER_SHELL_VIEWBINDER_INTERFACE_H_ - -namespace android { -namespace dvr { - -class ShellViewBinderInterface { - public: - ShellViewBinderInterface() {}; - virtual ~ShellViewBinderInterface() {}; - - virtual void EnableDebug(bool debug) = 0; - virtual void VrMode(bool mode) = 0; - virtual void dumpInternal(String8& result) = 0; - virtual void Set2DMode(bool mode) = 0; - virtual void SetRotation(int angle) = 0; -}; - -} // namespace dvr -} // namespace android - -#endif // VR_WINDOW_MANAGER_SHELL_VIEWBINDER_INTERFACE_H_ diff --git a/services/vr/vr_window_manager/surface_flinger_view.cpp b/services/vr/vr_window_manager/surface_flinger_view.cpp deleted file mode 100644 index b41de03dcf..0000000000 --- a/services/vr/vr_window_manager/surface_flinger_view.cpp +++ /dev/null @@ -1,77 +0,0 @@ -#include "surface_flinger_view.h" - -#include -#include -#include - -#include "hwc_callback.h" -#include "texture.h" - -namespace android { -namespace dvr { - -SurfaceFlingerView::SurfaceFlingerView() {} - -SurfaceFlingerView::~SurfaceFlingerView() {} - -bool SurfaceFlingerView::Initialize(HwcCallback::Client *client) { - sp sm(defaultServiceManager()); - vr_composer_ = interface_cast( - sm->getService(IVrComposer::SERVICE_NAME())); - - String8 service_name(IVrComposer::SERVICE_NAME().string()); - if (!vr_composer_.get()) { - ALOGE("Faild to connect to %s", service_name.c_str()); - return false; - } - - composer_callback_ = new HwcCallback(client); - binder::Status status = vr_composer_->registerObserver(composer_callback_); - if (!status.isOk()) { - ALOGE("Failed to register observer with %s", service_name.c_str()); - return false; - } - - return true; -} - -bool SurfaceFlingerView::GetTextures(const HwcCallback::Frame& frame, - std::vector* texture_layers, - TextureLayer* ime_layer, - bool debug, bool skip_first_layer) const { - auto& layers = frame.layers(); - texture_layers->clear(); - - size_t start = 0; - // Skip the second layer if it is from the VR app. - if (!debug && skip_first_layer) { - start = 2; - } - - for (size_t i = start; i < layers.size(); ++i) { - if (!debug && layers[i].should_skip_layer()) - continue; - - std::unique_ptr texture(new Texture()); - if (!texture->Initialize(layers[i].buffer->getNativeBuffer())) { - ALOGE("Failed to create texture"); - texture_layers->clear(); - return false; - } - - TextureLayer texture_layer = { - std::move(texture), layers[i].crop, layers[i].display_frame, - layers[i].blending, layers[i].alpha, - }; - if (debug && layers[i].type == HwcCallback::HwcLayer::kInputMethod) { - *ime_layer = std::move(texture_layer); - } else { - texture_layers->emplace_back(std::move(texture_layer)); - } - } - - return true; -} - -} // namespace dvr -} // namespace android diff --git a/services/vr/vr_window_manager/surface_flinger_view.h b/services/vr/vr_window_manager/surface_flinger_view.h deleted file mode 100644 index 1bea38d9d2..0000000000 --- a/services/vr/vr_window_manager/surface_flinger_view.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef APPLICATIONS_EXPERIMENTS_SURFACE_FLINGER_DEMO_SURFACE_FLINGER_VIEW_H_ -#define APPLICATIONS_EXPERIMENTS_SURFACE_FLINGER_DEMO_SURFACE_FLINGER_VIEW_H_ - -#include - -#include "hwc_callback.h" - -namespace android { -namespace dvr { - -class IDisplay; -class IVrComposer; -class Texture; - -struct TextureLayer { - std::unique_ptr texture; - Rectf crop; - Recti display_frame; - int32_t blending; - float alpha; -}; - -class SurfaceFlingerView { - public: - SurfaceFlingerView(); - ~SurfaceFlingerView(); - - bool Initialize(HwcCallback::Client *client); - - bool GetTextures(const HwcCallback::Frame& layers, - std::vector* texture_layers, - TextureLayer* ime_layer, bool debug, - bool skip_first_layer) const; - - private: - sp vr_composer_; - sp composer_callback_; - - SurfaceFlingerView(const SurfaceFlingerView&) = delete; - void operator=(const SurfaceFlingerView&) = delete; -}; - -} // namespace dvr -} // namespace android - -#endif // APPLICATIONS_EXPERIMENTS_SURFACE_FLINGER_DEMO_SURFACE_FLINGER_VIEW_H_ diff --git a/services/vr/vr_window_manager/texture.cpp b/services/vr/vr_window_manager/texture.cpp deleted file mode 100644 index 2229efad38..0000000000 --- a/services/vr/vr_window_manager/texture.cpp +++ /dev/null @@ -1,41 +0,0 @@ -#include "texture.h" - -#include -#include -#include - -namespace android { -namespace dvr { - -Texture::Texture() {} - -Texture::~Texture() { - EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); - if (id_) - glDeleteTextures(1, &id_); - if (image_) - eglDestroyImageKHR(display, image_); -} - -bool Texture::Initialize(ANativeWindowBuffer* buffer) { - width_ = buffer->width; - height_ = buffer->height; - - EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); - image_ = eglCreateImageKHR(display, EGL_NO_CONTEXT, - EGL_NATIVE_BUFFER_ANDROID, buffer, nullptr); - if (!image_) { - ALOGE("Failed to create eglImage"); - return false; - } - - glGenTextures(1, &id_); - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, id_); - glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image_); - - return true; -} - -} // namespace android -} // namespace dvr diff --git a/services/vr/vr_window_manager/texture.h b/services/vr/vr_window_manager/texture.h deleted file mode 100644 index 9840f1955e..0000000000 --- a/services/vr/vr_window_manager/texture.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef VR_WINDOW_MANAGER_TEXTURE_H_ -#define VR_WINDOW_MANAGER_TEXTURE_H_ - -#include -#include -#include - -struct ANativeWindowBuffer; - -namespace android { -namespace dvr { - -class Texture { - public: - explicit Texture(); - ~Texture(); - - bool Initialize(ANativeWindowBuffer* buffer); - - GLuint id() const { return id_; } - int width() const { return width_; } - int height() const { return height_; } - - private: - EGLImageKHR image_ = nullptr; - GLuint id_ = 0; - int width_ = 0; - int height_ = 0; - - Texture(const Texture&) = delete; - void operator=(const Texture&) = delete; -}; - -} // namespace dvr -} // namespace android - -#endif // VR_WINDOW_MANAGER_TEXTURE_H_ diff --git a/services/vr/vr_window_manager/vr_window_manager.cpp b/services/vr/vr_window_manager/vr_window_manager.cpp deleted file mode 100644 index dd2cba7798..0000000000 --- a/services/vr/vr_window_manager/vr_window_manager.cpp +++ /dev/null @@ -1,47 +0,0 @@ -#include -#include -#include -#include -#include - -#include "shell_view.h" -#include "vr_window_manager_binder.h" - -using namespace android; -using namespace android::dvr; - -int main(int /* argc */, char** /* argv */) { - android::ProcessState::self()->startThreadPool(); - - // ShellView needs to be created after vr_hwcomposer. - android::dvr::ShellView app; - const int app_status = app.Initialize(); - LOG_ALWAYS_FATAL_IF(app_status != 0, "failed to initialize: %d", app_status); - - // Create vr_wm_binder. - android::sp vr_wm_binder = - new android::service::vr::VrWindowManagerBinder(app); - const int status = vr_wm_binder->Initialize(); - LOG_ALWAYS_FATAL_IF(status != 0, "initialization failed: %d", status); - - android::sp sm(android::defaultServiceManager()); - const android::status_t vr_wm_binder_status = sm->addService( - android::service::vr::VrWindowManagerBinder::SERVICE_NAME(), - vr_wm_binder, false /*allowIsolated*/); - LOG_ALWAYS_FATAL_IF(vr_wm_binder_status != android::OK, - "vr_wm_binder service not added: %d", - static_cast(vr_wm_binder_status)); - - app.SetControllerDataProvider(vr_wm_binder.get()); - - android::hardware::ProcessState::self()->startThreadPool(); - - while (true) { - app.DrawFrame(); - } - - android::hardware::IPCThreadState::self()->joinThreadPool(); - android::IPCThreadState::self()->joinThreadPool(); - - return 0; -} diff --git a/services/vr/vr_window_manager/vr_window_manager_binder.cpp b/services/vr/vr_window_manager/vr_window_manager_binder.cpp deleted file mode 100644 index fdcb8b24c2..0000000000 --- a/services/vr/vr_window_manager/vr_window_manager_binder.cpp +++ /dev/null @@ -1,167 +0,0 @@ -#include "vr_window_manager_binder.h" - -#include -#include - -#include -#include -#include -#include -#include -#include - -namespace android { -namespace service { -namespace vr { - -namespace { -const String16 kDumpPermission("android.permission.DUMP"); -const String16 kSendMeControllerInputPermission( - "android.permission.RESTRICTED_VR_ACCESS"); -} // anonymous namespace - -constexpr size_t AshmemControllerDataProvider::kRegionLength; - -status_t AshmemControllerDataProvider::Connect(const int in_fd) { - if (in_fd < 0) { - return BAD_VALUE; - } - if (fd_.get() >= 0) { - // The VrCore is dead. Long live the VrCore. - Disconnect(); - } - void* const shared_region = - ::mmap(nullptr, kRegionLength, PROT_READ, MAP_SHARED, in_fd, 0); - if (shared_region == MAP_FAILED) { - shared_region_ = nullptr; - return NO_MEMORY; - } - - errno = 0; - const int fd = ::fcntl(in_fd, F_DUPFD_CLOEXEC, 0); - if (fd < 0) { - ::munmap(shared_region, kRegionLength); - return -errno; - } - fd_.reset(fd); - ALOGI("controller connected %d -> %d @ %p", in_fd, fd, shared_region); - - std::lock_guard guard(mutex_); - shared_region_ = shared_region; - return OK; -} - -status_t AshmemControllerDataProvider::Disconnect() { - if (shared_region_ == nullptr || fd_.get() < 0) { - return INVALID_OPERATION; - } - std::lock_guard guard(mutex_); - ::munmap(shared_region_, kRegionLength); - shared_region_ = nullptr; - fd_.reset(); - ALOGI("controller disconnected"); - return OK; -} - -const void* AshmemControllerDataProvider::LockControllerData() { - mutex_.lock(); - if (!shared_region_) { - mutex_.unlock(); - return nullptr; - } - return shared_region_; -} - -void AshmemControllerDataProvider::UnlockControllerData() { mutex_.unlock(); } - -void AshmemControllerDataProvider::dumpInternal(String8& result) { - result.appendFormat("[controller]\nfd = %d\n", fd_.get()); - if (shared_region_) { - int32_t* p = reinterpret_cast(shared_region_); - result.appendFormat("header = "); - for (int i = 0; i < 8; ++i) { - result.appendFormat("%c 0x%08" PRIX32, i ? ',' : '[', p[i]); - } - result.appendFormat(" ]\n\n"); - } -} - -int VrWindowManagerBinder::Initialize() { return 0; } - -binder::Status VrWindowManagerBinder::connectController( - const ::android::base::unique_fd& in_fd) { - // TODO(kpschoedel): check permission -#if 0 - int32_t pid, uid; - if (!PermissionCache::checkCallingPermission(kSendMeControllerInputPermission, - &pid, &uid)) { - ALOGE("permission denied to pid=%" PRId32 " uid=%" PRId32, pid, uid); - return binder::Status::fromStatusT(PERMISSION_DENIED); - } -#endif - return binder::Status::fromStatusT(Connect(in_fd.get())); -} - -binder::Status VrWindowManagerBinder::disconnectController() { - // TODO(kpschoedel): check permission -#if 0 - int32_t pid, uid; - if (!PermissionCache::checkCallingPermission(kSendMeControllerInputPermission, - &pid, &uid)) { - ALOGE("permission denied to pid=%" PRId32 " uid=%" PRId32, pid, uid); - return binder::Status::fromStatusT(PERMISSION_DENIED); - } -#endif - return binder::Status::fromStatusT(Disconnect()); -} - -binder::Status VrWindowManagerBinder::enterVrMode() { - // TODO(kpschoedel): check permission - app_.VrMode(true); - return binder::Status::ok(); -} - -binder::Status VrWindowManagerBinder::exitVrMode() { - // TODO(kpschoedel): check permission - app_.VrMode(false); - return binder::Status::ok(); -} - -binder::Status VrWindowManagerBinder::setDebugMode(int32_t mode) { - // TODO(kpschoedel): check permission - app_.EnableDebug(static_cast(mode)); - return binder::Status::ok(); -} - -binder::Status VrWindowManagerBinder::set2DMode(int32_t mode) { - app_.Set2DMode(static_cast(mode)); - return binder::Status::ok(); -} - -binder::Status VrWindowManagerBinder::setRotation(int32_t angle) { - app_.SetRotation(angle); - return binder::Status::ok(); -} - -status_t VrWindowManagerBinder::dump( - int fd, const Vector& args [[gnu::unused]]) { - String8 result; - const android::IPCThreadState* ipc = android::IPCThreadState::self(); - const pid_t pid = ipc->getCallingPid(); - const uid_t uid = ipc->getCallingUid(); - if ((uid != AID_SHELL) && - !PermissionCache::checkPermission(kDumpPermission, pid, uid)) { - result.appendFormat("Permission denial: can't dump " LOG_TAG - " from pid=%d, uid=%d\n", - pid, uid); - } else { - app_.dumpInternal(result); - AshmemControllerDataProvider::dumpInternal(result); - } - write(fd, result.string(), result.size()); - return OK; -} - -} // namespace vr -} // namespace service -} // namespace android diff --git a/services/vr/vr_window_manager/vr_window_manager_binder.h b/services/vr/vr_window_manager/vr_window_manager_binder.h deleted file mode 100644 index 9d0f0b263f..0000000000 --- a/services/vr/vr_window_manager/vr_window_manager_binder.h +++ /dev/null @@ -1,79 +0,0 @@ -#ifndef VR_WINDOW_MANAGER_VR_WINDOW_MANAGER_BINDER_H_ -#define VR_WINDOW_MANAGER_VR_WINDOW_MANAGER_BINDER_H_ - -#include - -#include - -#include "controller_data_provider.h" -#include "shell_view_binder_interface.h" - -namespace android { -namespace service { -namespace vr { - -class AshmemControllerDataProvider : public dvr::ControllerDataProvider { - public: - AshmemControllerDataProvider() {} - virtual ~AshmemControllerDataProvider() {} - - status_t Connect(int fd); - status_t Disconnect(); - - // ControllerDataProvider: - const void* LockControllerData() override; - void UnlockControllerData() override; - - protected: - void dumpInternal(String8& result); - - private: - static constexpr size_t kRegionLength = 8192; // TODO(kpschoedel) - ::android::base::unique_fd fd_; - - // Mutex for guarding shared_region_. - std::mutex mutex_; - void* shared_region_ = nullptr; - - AshmemControllerDataProvider(const AshmemControllerDataProvider&) = delete; - void operator=(const AshmemControllerDataProvider&) = delete; -}; - -class VrWindowManagerBinder : public BnVrWindowManager, - public AshmemControllerDataProvider { - public: - VrWindowManagerBinder(android::dvr::ShellViewBinderInterface& app) - : app_(app) {} - virtual ~VrWindowManagerBinder() {} - - // Must be called before clients can connect. - // Returns 0 if initialization is successful. - int Initialize(); - static char const* getServiceName() { return "vr_window_manager"; } - - protected: - // Implements IVrWindowManagerBinder. - ::android::binder::Status connectController( - const ::android::base::unique_fd& fd) override; - ::android::binder::Status disconnectController() override; - ::android::binder::Status enterVrMode() override; - ::android::binder::Status exitVrMode() override; - ::android::binder::Status setDebugMode(int32_t mode) override; - ::android::binder::Status set2DMode(int32_t mode) override; - ::android::binder::Status setRotation(int32_t angle) override; - - // Implements BBinder::dump(). - status_t dump(int fd, const Vector& args) override; - - private: - android::dvr::ShellViewBinderInterface& app_; - - VrWindowManagerBinder(const VrWindowManagerBinder&) = delete; - void operator=(const VrWindowManagerBinder&) = delete; -}; - -} // namespace vr -} // namespace service -} // namespace android - -#endif // VR_WINDOW_MANAGER_VR_WINDOW_MANAGER_BINDER_H_ diff --git a/services/vr/vr_window_manager/vr_window_manager_binder_test.cpp b/services/vr/vr_window_manager/vr_window_manager_binder_test.cpp deleted file mode 100644 index f43e803d9e..0000000000 --- a/services/vr/vr_window_manager/vr_window_manager_binder_test.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include -#include -#include -#include - -#include "vr_window_manager_binder.h" - -int main() { - ALOGI("Starting"); - android::service::vr::VrWindowManagerBinder service; - const int status = service.Initialize(); - LOG_ALWAYS_FATAL_IF(status != 0, "initialization failed: %d", status); - - signal(SIGPIPE, SIG_IGN); - android::sp ps(android::ProcessState::self()); - ps->setThreadPoolMaxThreadCount(4); - ps->startThreadPool(); - ps->giveThreadPoolName(); - - android::sp sm(android::defaultServiceManager()); - const android::status_t service_status = sm->addService( - android::service::vr::VrWindowManagerBinder::SERVICE_NAME(), &service, - false /*allowIsolated*/); - LOG_ALWAYS_FATAL_IF(service_status != android::OK, "service not added: %d", - static_cast(service_status)); - - android::IPCThreadState::self()->joinThreadPool(); - return 0; -} diff --git a/services/vr/vr_window_manager/vr_wm.rc b/services/vr/vr_window_manager/vr_wm.rc deleted file mode 100644 index e515bb7445..0000000000 --- a/services/vr/vr_window_manager/vr_wm.rc +++ /dev/null @@ -1,5 +0,0 @@ -service vr_wm /system/bin/vr_wm - class core - user system - group system graphics input - writepid /dev/cpuset/system/tasks diff --git a/services/vr/vr_window_manager/vr_wm_ctl.cpp b/services/vr/vr_window_manager/vr_wm_ctl.cpp deleted file mode 100644 index 758e02b718..0000000000 --- a/services/vr/vr_window_manager/vr_wm_ctl.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include -#include -#include -#include -#include - -void usage() { fprintf(stderr, "usage: vr_wm_ctl [enter|exit|debug N]\n"); } - -int report(const android::binder::Status& status) { - if (status.isOk()) { - fprintf(stderr, "ok\n"); - return 0; - } - fprintf(stderr, "failed (%" PRId32 ") %s\n", status.exceptionCode(), - status.exceptionMessage().string()); - return (int)status.exceptionCode(); -} - -int main(int argc, char* argv[]) { - android::sp sm(android::defaultServiceManager()); - if (sm == nullptr) { - fprintf(stderr, "service manager not found\n"); - exit(1); - } - - android::sp vrwm = - android::interface_cast( - sm->getService( - android::service::vr::IVrWindowManager::SERVICE_NAME())); - if (vrwm == nullptr) { - fprintf(stderr, "service not found\n"); - exit(1); - } - - android::binder::Status status; - if ((argc == 2) && (strcmp(argv[1], "enter") == 0)) { - exit(report(vrwm->enterVrMode())); - } else if ((argc == 2) && (strcmp(argv[1], "exit") == 0)) { - exit(report(vrwm->exitVrMode())); - } else if ((argc == 3) && (strcmp(argv[1], "debug") == 0)) { - exit(report(vrwm->setDebugMode(atoi(argv[2])))); - } else if ((argc == 3) && (strcmp(argv[1], "2d") == 0)) { - exit(report(vrwm->set2DMode(atoi(argv[2])))); - } else if ((argc == 3) && (strcmp(argv[1], "rotate") == 0)) { - exit(report(vrwm->setRotation(atoi(argv[2])))); - } else { - usage(); - exit(2); - } - - return 0; -} -- 2.11.0