blob: 893bcea68feaec7dee79533dd5e6292c8ecb50b3 [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "device/vr/openxr/android/openxr_scene_understanding_manager_android.h"
#include <algorithm>
#include <memory>
#include <optional>
#include <set>
#include <utility>
#include <vector>
#include "base/containers/flat_set.h"
#include "base/no_destructor.h"
#include "device/vr/openxr/openxr_api_wrapper.h"
#include "device/vr/openxr/openxr_extension_helper.h"
#include "device/vr/openxr/openxr_util.h"
#include "device/vr/public/mojom/xr_session.mojom-shared.h"
#include "third_party/openxr/src/include/openxr/openxr.h"
namespace device {
OpenXRSceneUnderstandingManagerAndroid::OpenXRSceneUnderstandingManagerAndroid(
const OpenXrExtensionHelper& extension_helper,
XrSession session,
XrSpace mojo_space)
: mojo_space_(mojo_space) {
const auto* extension_enum = extension_helper.ExtensionEnumeration();
if (extension_enum->ExtensionSupported(
XR_ANDROID_TRACKABLES_EXTENSION_NAME)) {
anchor_manager_ = std::make_unique<OpenXrAnchorManagerAndroid>(
extension_helper, session, mojo_space_);
// For the time being, we only need the plane manager if we can perform
// hit-tests.
if (extension_enum->ExtensionSupported(XR_ANDROID_RAYCAST_EXTENSION_NAME)) {
plane_manager_ = std::make_unique<OpenXrPlaneManagerAndroid>(
extension_helper, session);
hit_test_manager_ = std::make_unique<OpenXrHitTestManagerAndroid>(
plane_manager_.get(), extension_helper, session, mojo_space_);
}
}
}
OpenXRSceneUnderstandingManagerAndroid::
~OpenXRSceneUnderstandingManagerAndroid() = default;
OpenXrSceneUnderstandingManagerType
OpenXRSceneUnderstandingManagerAndroid::GetType() const {
return OpenXrSceneUnderstandingManagerType::kAndroid;
}
OpenXrPlaneManager* OpenXRSceneUnderstandingManagerAndroid::GetPlaneManager() {
return plane_manager_.get();
}
OpenXrAnchorManager*
OpenXRSceneUnderstandingManagerAndroid::GetAnchorManager() {
return anchor_manager_.get();
}
OpenXrHitTestManager*
OpenXRSceneUnderstandingManagerAndroid::GetHitTestManager() {
return hit_test_manager_.get();
}
OpenXrSceneUnderstandingManagerAndroidFactory::
OpenXrSceneUnderstandingManagerAndroidFactory() = default;
OpenXrSceneUnderstandingManagerAndroidFactory::
~OpenXrSceneUnderstandingManagerAndroidFactory() = default;
const base::flat_set<std::string_view>&
OpenXrSceneUnderstandingManagerAndroidFactory::GetRequestedExtensions() const {
static base::NoDestructor<base::flat_set<std::string_view>> kExtensions({
XR_ANDROID_TRACKABLES_EXTENSION_NAME,
XR_ANDROID_RAYCAST_EXTENSION_NAME,
});
return *kExtensions;
}
std::set<device::mojom::XRSessionFeature>
OpenXrSceneUnderstandingManagerAndroidFactory::GetSupportedFeatures() const {
return supported_features_;
}
void OpenXrSceneUnderstandingManagerAndroidFactory::CheckAndUpdateEnabledState(
const OpenXrExtensionEnumeration* extension_enum,
XrInstance instance,
XrSystemId system) {
supported_features_.clear();
if (extension_enum->ExtensionSupported(
XR_ANDROID_TRACKABLES_EXTENSION_NAME)) {
supported_features_.insert(device::mojom::XRSessionFeature::ANCHORS);
// Hit Test needs Trackables and Raycast extensions.
if (extension_enum->ExtensionSupported(XR_ANDROID_RAYCAST_EXTENSION_NAME)) {
supported_features_.insert(device::mojom::XRSessionFeature::HIT_TEST);
}
}
SetEnabled(!supported_features_.empty());
}
std::unique_ptr<OpenXRSceneUnderstandingManager>
OpenXrSceneUnderstandingManagerAndroidFactory::CreateSceneUnderstandingManager(
const OpenXrExtensionHelper& extension_helper,
OpenXrApiWrapper* openxr,
XrSpace mojo_space) const {
bool is_supported = IsEnabled();
DVLOG(2) << __func__ << " is_supported=" << is_supported;
if (is_supported) {
return std::make_unique<OpenXRSceneUnderstandingManagerAndroid>(
extension_helper, openxr->session(), mojo_space);
}
return nullptr;
}
} // namespace device