#ifndef DEVICE_VR_OPENXR_OPENXR_VIEW_CONFIGURATION_H_
#define DEVICE_VR_OPENXR_OPENXR_VIEW_CONFIGURATION_H_
#include <array>
#include <vector>
#include "device/vr/public/mojom/vr_service.mojom-forward.h"
#include "third_party/openxr/src/include/openxr/openxr.h"
#include "ui/gfx/geometry/rect.h"
namespace device {
static constexpr XrViewConfigurationType kPrimaryViewConfiguration =
XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO;
static constexpr std::array<XrViewConfigurationType, 1>
kSecondaryViewConfigurations = {
XR_VIEW_CONFIGURATION_TYPE_SECONDARY_MONO_FIRST_PERSON_OBSERVER_MSFT,
};
static constexpr uint32_t kNumPrimaryViews = 2;
static constexpr uint32_t kLeftView = 0;
static constexpr uint32_t kRightView = 1;
static_assert(kRightView < kNumPrimaryViews,
"kNumPrimaryViews must be greater than kRightView");
mojom::XREye GetEyeFromIndex(int i);
class OpenXrViewProperties {
public:
OpenXrViewProperties(XrViewConfigurationView xr_properties,
uint32_t view_count,
gfx::Size max_texture_size);
~OpenXrViewProperties();
uint32_t Width() const;
uint32_t Height() const;
uint32_t RecommendedSwapchainSampleCount() const;
uint32_t MaxSwapchainSampleCount() const;
float RecommendedViewportScale() const;
XrViewConfigurationView GetPropertiesForTest() const {
return xr_properties_;
}
private:
uint32_t ClampWidth(uint32_t val) const;
uint32_t ClampHeight(uint32_t val) const;
XrViewConfigurationView xr_properties_;
uint32_t view_count_;
gfx::Size max_texture_size_;
};
class OpenXrViewConfiguration {
public:
OpenXrViewConfiguration();
OpenXrViewConfiguration(XrViewConfigurationType type,
bool active,
uint32_t num_views,
uint32_t dimension,
uint32_t swap_count);
OpenXrViewConfiguration(OpenXrViewConfiguration&&);
OpenXrViewConfiguration(const OpenXrViewConfiguration&);
OpenXrViewConfiguration& operator=(const OpenXrViewConfiguration&);
~OpenXrViewConfiguration();
void Initialize(XrViewConfigurationType type,
std::vector<XrViewConfigurationView> properties,
gfx::Size max_texture_size);
bool Initialized() const;
XrViewConfigurationType Type() const;
bool Active() const;
void SetActive(bool active);
const gfx::Rect& Viewport() const;
void SetViewport(uint32_t x, uint32_t y, uint32_t width, uint32_t height);
const std::vector<OpenXrViewProperties>& Properties() const;
void SetProperties(std::vector<XrViewConfigurationView> properties,
gfx::Size max_texture_size);
const std::vector<XrView>& Views() const;
void SetViews(std::vector<XrView> views);
bool CanEnableAntiAliasing() const;
private:
XrViewConfigurationType type_ = XR_VIEW_CONFIGURATION_TYPE_MAX_ENUM;
bool active_ = false;
bool initialized_ = false;
gfx::Rect viewport_;
std::vector<OpenXrViewProperties> properties_;
std::vector<XrView> local_from_view_;
};
}
#endif