#pragma once
#include "IntSize.h"
#include <memory>
#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; }
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();
void enumerateImmersiveXRDevices();
const Vector<std::unique_ptr<Device>>& immersiveXRDevices() const { return m_immersiveXRDevices; }
private:
friend LazyNeverDestroyed<Instance>;
Instance();
~Instance() = default;
struct Impl;
UniqueRef<Impl> m_impl;
Vector<std::unique_ptr<Device>> m_immersiveXRDevices;
};
#endif // ENABLE(WEBXR)
}