#pragma once
#include "IntSize.h"
#include <memory>
#include <wtf/CompletionHandler.h>
#include <wtf/HashMap.h>
#include <wtf/UniqueRef.h>
#include <wtf/Vector.h>
#include <wtf/WeakPtr.h>
namespace PlatformXR {
enum class SessionMode : uint8_t {
Inline,
ImmersiveVr,
ImmersiveAr,
};
enum class ReferenceSpaceType {
Viewer,
Local,
LocalFloor,
BoundedFloor,
Unbounded
};
#if ENABLE(WEBXR)
class Device : public CanMakeWeakPtr<Device> {
WTF_MAKE_FAST_ALLOCATED;
WTF_MAKE_NONCOPYABLE(Device);
public:
virtual ~Device() = default;
using ListOfEnabledFeatures = Vector<ReferenceSpaceType>;
bool supports(SessionMode mode) const { return m_enabledFeaturesMap.contains(mode); }
void setEnabledFeatures(SessionMode mode, const ListOfEnabledFeatures& features) { m_enabledFeaturesMap.set(mode, features); }
ListOfEnabledFeatures enabledFeatures(SessionMode mode) const { return m_enabledFeaturesMap.get(mode); }
virtual WebCore::IntSize recommendedResolution(SessionMode) { return { 1, 1 }; }
bool supportsOrientationTracking() const { return m_supportsOrientationTracking; }
virtual void initializeTrackingAndRendering(SessionMode) = 0;
virtual void shutDownTrackingAndRendering() = 0;
protected:
Device() = default;
using EnabledFeaturesPerModeMap = WTF::HashMap<SessionMode, ListOfEnabledFeatures, WTF::IntHash<SessionMode>, WTF::StrongEnumHashTraits<SessionMode>>;
EnabledFeaturesPerModeMap m_enabledFeaturesMap;
bool m_supportsOrientationTracking { false };
};
class Instance {
public:
static Instance& singleton();
using DeviceList = Vector<UniqueRef<Device>>;
void enumerateImmersiveXRDevices(CompletionHandler<void(const DeviceList&)>&&);
private:
friend LazyNeverDestroyed<Instance>;
Instance();
~Instance() = default;
struct Impl;
UniqueRef<Impl> m_impl;
DeviceList m_immersiveXRDevices;
};
#endif // ENABLE(WEBXR)
}