Skip to content
Snippets Groups Projects
Commit fe2112ff authored by Thomas Müller's avatar Thomas Müller
Browse files

VR: attempt to fix XR/AR video passthrough

parent 8268e2ce
No related branches found
No related tags found
No related merge requests found
......@@ -47,24 +47,24 @@
NGP_NAMESPACE_BEGIN
enum class EnvironmentBlendMode {
enum class EEnvironmentBlendMode {
Opaque = XR_ENVIRONMENT_BLEND_MODE_OPAQUE,
Additive = XR_ENVIRONMENT_BLEND_MODE_ADDITIVE,
AlphaBlend = XR_ENVIRONMENT_BLEND_MODE_ALPHA_BLEND,
};
inline std::string to_string(EnvironmentBlendMode mode) {
inline std::string to_string(EEnvironmentBlendMode mode) {
switch (mode) {
case EnvironmentBlendMode::Opaque: return "Opaque";
case EnvironmentBlendMode::Additive: return "Additive";
case EnvironmentBlendMode::AlphaBlend: return "Blend";
case EEnvironmentBlendMode::Opaque: return "Opaque";
case EEnvironmentBlendMode::Additive: return "Additive";
case EEnvironmentBlendMode::AlphaBlend: return "Blend";
default: throw std::runtime_error{"Invalid blend mode."};
}
}
class OpenXRHMD {
public:
enum class ControlFlow {
enum class EControlFlow {
Continue,
Restart,
Quit,
......@@ -116,22 +116,22 @@ public:
void clear();
// poll events, handle state changes, return control flow information
ControlFlow poll_events();
EControlFlow poll_events();
// begin OpenXR frame, return views to render
FrameInfoPtr begin_frame();
// must be called for each begin_frame
void end_frame(FrameInfoPtr frame_info, float znear, float zfar);
void set_environment_blend_mode(EnvironmentBlendMode mode) {
void set_environment_blend_mode(EEnvironmentBlendMode mode) {
m_environment_blend_mode = mode;
}
EnvironmentBlendMode environment_blend_mode() const {
EEnvironmentBlendMode environment_blend_mode() const {
return m_environment_blend_mode;
}
const std::vector<EnvironmentBlendMode>& supported_environment_blend_modes() const {
const std::vector<EEnvironmentBlendMode>& supported_environment_blend_modes() const {
return m_supported_environment_blend_modes;
}
......@@ -177,7 +177,7 @@ private:
void init_open_gl_shaders();
// session state change
void session_state_change(XrSessionState state, ControlFlow& flow);
void session_state_change(XrSessionState state, EControlFlow& flow);
std::shared_ptr<Buffer2D<uint8_t>> rasterize_hidden_area_mask(uint32_t view_index, const XrCompositionLayerProjectionView& view);
// system/instance
......@@ -192,9 +192,9 @@ private:
XrViewConfigurationType m_view_configuration_type = {};
XrViewConfigurationProperties m_view_configuration_properties = {XR_TYPE_VIEW_CONFIGURATION_PROPERTIES};
std::vector<XrViewConfigurationView> m_view_configuration_views;
std::vector<EnvironmentBlendMode> m_supported_environment_blend_modes;
std::vector<EEnvironmentBlendMode> m_supported_environment_blend_modes;
std::vector<char> m_supported_environment_blend_modes_imgui_string;
EnvironmentBlendMode m_environment_blend_mode = EnvironmentBlendMode::Opaque;
EEnvironmentBlendMode m_environment_blend_mode = EEnvironmentBlendMode::Opaque;
// actions
std::array<XrPath, 2> m_hand_paths;
......
......@@ -451,7 +451,7 @@ void OpenXRHMD::init_check_for_xr_blend_mode() {
tlog::info() << fmt::format("\t{}", XrEnumStr(supported_blend_modes[i]));
}
auto b = (EnvironmentBlendMode)supported_blend_modes[i];
auto b = (EEnvironmentBlendMode)supported_blend_modes[i];
m_supported_environment_blend_modes[i] = b;
auto b_str = to_string(b);
......@@ -802,7 +802,7 @@ void OpenXRHMD::init_open_gl_shaders() {
}
}
void OpenXRHMD::session_state_change(XrSessionState state, ControlFlow& flow) {
void OpenXRHMD::session_state_change(XrSessionState state, EControlFlow& flow) {
//tlog::info() << fmt::format("New session state {}", XrEnumStr(state));
switch (state) {
case XR_SESSION_STATE_READY: {
......@@ -816,11 +816,11 @@ void OpenXRHMD::session_state_change(XrSessionState state, ControlFlow& flow) {
break;
}
case XR_SESSION_STATE_EXITING: {
flow = ControlFlow::Quit;
flow = EControlFlow::Quit;
break;
}
case XR_SESSION_STATE_LOSS_PENDING: {
flow = ControlFlow::Restart;
flow = EControlFlow::Restart;
break;
}
default: {
......@@ -829,9 +829,9 @@ void OpenXRHMD::session_state_change(XrSessionState state, ControlFlow& flow) {
}
}
OpenXRHMD::ControlFlow OpenXRHMD::poll_events() {
OpenXRHMD::EControlFlow OpenXRHMD::poll_events() {
bool more = true;
ControlFlow flow = ControlFlow::Continue;
EControlFlow flow = EControlFlow::Continue;
while (more) {
// poll events
XrEventDataBuffer event {XR_TYPE_EVENT_DATA_BUFFER, nullptr};
......@@ -852,7 +852,7 @@ OpenXRHMD::ControlFlow OpenXRHMD::poll_events() {
}
case XR_TYPE_EVENT_DATA_INSTANCE_LOSS_PENDING: {
flow = ControlFlow::Restart;
flow = EControlFlow::Restart;
break;
}
......@@ -1234,6 +1234,10 @@ void OpenXRHMD::end_frame(FrameInfoPtr frame_info, float znear, float zfar) {
XrCompositionLayerProjection layer{XR_TYPE_COMPOSITION_LAYER_PROJECTION};
layer.space = m_space;
if (m_environment_blend_mode != EEnvironmentBlendMode::Opaque) {
layer.layerFlags = XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT;
}
layer.viewCount = uint32_t(layer_projection_views.size());
layer.views = layer_projection_views.data();
......
......@@ -2872,7 +2872,7 @@ void Testbed::update_vr_performance_settings() {
// If the environment is blended in (such as in XR/AR applications),
// DLSS causes jittering at object sillhouettes (doesn't deal well with alpha),
// and hence stays disabled.
m_dlss = (blend_mode == EnvironmentBlendMode::Opaque) && m_dlss_provider;
m_dlss = (blend_mode == EEnvironmentBlendMode::Opaque) && m_dlss_provider;
// Foveated rendering is similarly vital in getting high performance without losing
// resolution in the middle of the view.
......@@ -2887,7 +2887,7 @@ void Testbed::update_vr_performance_settings() {
// set background color to transparent and, in spherical_checkerboard_kernel(...),
// blend a checkerboard. If the user desires a solid background nonetheless, they can
// set the background color to have an alpha value of 1.0 manually via the GUI or via Python.
m_render_transparency_as_checkerboard = (blend_mode == EnvironmentBlendMode::Opaque);
m_render_transparency_as_checkerboard = (blend_mode == EEnvironmentBlendMode::Opaque);
} else {
m_dlss = (m_testbed_mode == ETestbedMode::Nerf) && m_dlss_provider;
m_foveated_rendering = false;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment