#ifndef DEVICE_VR_OPENXR_OPENXR_EXTENSION_HELPER_H_
#define DEVICE_VR_OPENXR_OPENXR_EXTENSION_HELPER_H_
#include <memory>
#include <string>
#include <vector>
#include "base/logging.h"
#include "base/memory/raw_ptr.h"
#include "build/buildflag.h"
#include "device/vr/openxr/openxr_anchor_manager.h"
#include "device/vr/openxr/openxr_depth_sensor.h"
#include "device/vr/openxr/openxr_hand_tracker.h"
#include "device/vr/openxr/openxr_light_estimator.h"
#include "device/vr/openxr/openxr_platform.h"
#include "device/vr/openxr/openxr_scene_understanding_manager.h"
#include "device/vr/openxr/openxr_stage_bounds_provider.h"
#include "device/vr/openxr/openxr_unbounded_space_provider.h"
#include "device/vr/public/mojom/xr_session.mojom-forward.h"
#include "third_party/openxr/dev/xr_android.h"
#include "third_party/openxr/src/include/openxr/openxr.h"
namespace device {
#define OPENXR_DECLARE_FN(name) PFN_##name name = nullptr
struct OpenXrExtensionMethods {
OpenXrExtensionMethods();
~OpenXrExtensionMethods();
OPENXR_DECLARE_FN(xrPollFutureEXT);
OPENXR_DECLARE_FN(xrCreateHandTrackerEXT);
OPENXR_DECLARE_FN(xrDestroyHandTrackerEXT);
OPENXR_DECLARE_FN(xrLocateHandJointsEXT);
OPENXR_DECLARE_FN(xrCreateSpatialAnchorMSFT);
OPENXR_DECLARE_FN(xrDestroySpatialAnchorMSFT);
OPENXR_DECLARE_FN(xrCreateSpatialAnchorSpaceMSFT);
OPENXR_DECLARE_FN(xrEnumerateSceneComputeFeaturesMSFT);
OPENXR_DECLARE_FN(xrCreateSceneObserverMSFT);
OPENXR_DECLARE_FN(xrDestroySceneObserverMSFT);
OPENXR_DECLARE_FN(xrCreateSceneMSFT);
OPENXR_DECLARE_FN(xrDestroySceneMSFT);
OPENXR_DECLARE_FN(xrComputeNewSceneMSFT);
OPENXR_DECLARE_FN(xrGetSceneComputeStateMSFT);
OPENXR_DECLARE_FN(xrGetSceneComponentsMSFT);
OPENXR_DECLARE_FN(xrLocateSceneComponentsMSFT);
OPENXR_DECLARE_FN(xrGetSceneMeshBuffersMSFT);
OPENXR_DECLARE_FN(xrCreateSpatialContextAsyncEXT);
OPENXR_DECLARE_FN(xrCreateSpatialContextCompleteEXT);
OPENXR_DECLARE_FN(xrCreateSpatialDiscoverySnapshotAsyncEXT);
OPENXR_DECLARE_FN(xrCreateSpatialDiscoverySnapshotCompleteEXT);
OPENXR_DECLARE_FN(xrCreateSpatialUpdateSnapshotEXT);
OPENXR_DECLARE_FN(xrDestroySpatialContextEXT);
OPENXR_DECLARE_FN(xrDestroySpatialEntityEXT);
OPENXR_DECLARE_FN(xrDestroySpatialSnapshotEXT);
OPENXR_DECLARE_FN(xrEnumerateSpatialCapabilitiesEXT);
OPENXR_DECLARE_FN(xrEnumerateSpatialCapabilityComponentTypesEXT);
OPENXR_DECLARE_FN(xrQuerySpatialComponentDataEXT);
OPENXR_DECLARE_FN(xrCreateSpatialAnchorEXT);
OPENXR_DECLARE_FN(xrEnumerateSpatialAnchorAttachableComponentsANDROID);
OPENXR_DECLARE_FN(xrGetVisibilityMaskKHR);
#if BUILDFLAG(IS_WIN)
OPENXR_DECLARE_FN(xrConvertWin32PerformanceCounterToTimeKHR);
#endif
#if BUILDFLAG(IS_ANDROID)
OPENXR_DECLARE_FN(xrCreateTrackableTrackerANDROID);
OPENXR_DECLARE_FN(xrDestroyTrackableTrackerANDROID);
OPENXR_DECLARE_FN(xrRaycastANDROID);
OPENXR_DECLARE_FN(xrCreateAnchorSpaceANDROID);
OPENXR_DECLARE_FN(xrCreateLightEstimatorANDROID);
OPENXR_DECLARE_FN(xrDestroyLightEstimatorANDROID);
OPENXR_DECLARE_FN(xrGetLightEstimateANDROID);
OPENXR_DECLARE_FN(xrCreateDepthSwapchainANDROID);
OPENXR_DECLARE_FN(xrDestroyDepthSwapchainANDROID);
OPENXR_DECLARE_FN(xrEnumerateDepthSwapchainImagesANDROID);
OPENXR_DECLARE_FN(xrEnumerateDepthResolutionsANDROID);
OPENXR_DECLARE_FN(xrAcquireDepthSwapchainImagesANDROID);
#endif
};
#undef OPENXR_DECLARE_FN
class OpenXrApiWrapper;
class OpenXrExtensionEnumeration {
public:
OpenXrExtensionEnumeration();
~OpenXrExtensionEnumeration();
bool ExtensionSupported(std::string_view extension_name) const;
private:
std::vector<XrExtensionProperties> extension_properties_;
};
class OpenXrExtensionHelper {
public:
static std::vector<const char*> GetRequiredExtensionsForLayers();
OpenXrExtensionHelper(
XrInstance instance,
const OpenXrExtensionEnumeration* const extension_enumeration);
~OpenXrExtensionHelper();
const OpenXrExtensionEnumeration* ExtensionEnumeration() const {
return extension_enumeration_;
}
const OpenXrExtensionMethods& ExtensionMethods() const {
return extension_methods_;
}
bool IsFeatureSupported(device::mojom::XRSessionFeature feature) const;
std::unique_ptr<OpenXrDepthSensor> CreateDepthSensor(
XrSession session,
XrSpace base_space,
const mojom::XRDepthOptions& depth_options) const;
std::unique_ptr<OpenXrHandTracker> CreateHandTracker(
XrSession session,
OpenXrHandednessType handedness) const;
std::unique_ptr<OpenXrLightEstimator> CreateLightEstimator(
XrSession session,
XrSpace base_space) const;
std::unique_ptr<OpenXRSceneUnderstandingManager>
CreateSceneUnderstandingManager(
OpenXrApiWrapper* openxr,
XrSpace base_space,
const std::vector<mojom::XRSessionFeature>& required_features,
const std::vector<mojom::XRSessionFeature>& optional_features) const;
std::unique_ptr<OpenXrStageBoundsProvider> CreateStageBoundsProvider(
XrSession session) const;
std::unique_ptr<OpenXrUnboundedSpaceProvider> CreateUnboundedSpaceProvider()
const;
private:
bool IsExtensionSupported(const char* extension_name) const;
const OpenXrExtensionMethods extension_methods_;
const raw_ptr<const OpenXrExtensionEnumeration> extension_enumeration_;
};
}
#endif