blob: d8559a84e5ebeb99b18b6b1a6c4f654e36585d96 [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_extension_helper.h"
#include "device/vr/openxr/openxr_util.h"
#include "device/vr/public/mojom/xr_session.mojom-shared.h"
#include "third_party/openxr/dev/xr_android.h"
#include "third_party/openxr/src/include/openxr/openxr.h"
namespace device {
OpenXRSceneUnderstandingManagerAndroid::OpenXRSceneUnderstandingManagerAndroid(
const OpenXrExtensionHelper& extension_helper,
XrSession session,
XrSpace mojo_space)
: extension_helper_(extension_helper), mojo_space_(mojo_space) {
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;
OpenXrPlaneManager* OpenXRSceneUnderstandingManagerAndroid::GetPlaneManager() {
return plane_manager_.get();
}
OpenXrHitTestManager*
OpenXRSceneUnderstandingManagerAndroid::GetHitTestManager() {
return hit_test_manager_.get();
}
void OpenXRSceneUnderstandingManagerAndroid::OnFrameUpdate(
XrTime predicted_display_time) {
if (plane_manager_) {
plane_manager_->OnFrameUpdate(predicted_display_time, mojo_space_);
}
}
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 OpenXrExtensionEnumeration* extension_enum) const {
if (!IsEnabled(extension_enum)) {
return {};
}
return {device::mojom::XRSessionFeature::HIT_TEST};
}
std::unique_ptr<OpenXRSceneUnderstandingManager>
OpenXrSceneUnderstandingManagerAndroidFactory::CreateSceneUnderstandingManager(
const OpenXrExtensionHelper& extension_helper,
XrSession session,
XrSpace mojo_space) const {
bool is_supported = IsEnabled(extension_helper.ExtensionEnumeration());
DVLOG(2) << __func__ << " is_supported=" << is_supported;
if (is_supported) {
return std::make_unique<OpenXRSceneUnderstandingManagerAndroid>(
extension_helper, session, mojo_space);
}
return nullptr;
}
} // namespace device