diff --git a/include/neural-graphics-primitives/openxr_hmd.h b/include/neural-graphics-primitives/openxr_hmd.h index fd2fc197f39c671417becd20c4fa2dcf7330987b..f31cecaaa0f8084c48a976ea70a47e9545b69dd1 100644 --- a/include/neural-graphics-primitives/openxr_hmd.h +++ b/include/neural-graphics-primitives/openxr_hmd.h @@ -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; diff --git a/src/openxr_hmd.cu b/src/openxr_hmd.cu index b8f64bbe6921f9d5e2925256483f70c01b064b6c..77b98cf99c2fcc3a95617e0a852920f4cae5bb8b 100644 --- a/src/openxr_hmd.cu +++ b/src/openxr_hmd.cu @@ -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(); diff --git a/src/testbed.cu b/src/testbed.cu index 34c0ccd90c1446283616fd3d2db32e92d40849e1..b39de3185772ffa59742c0d3c743505409c498d7 100644 --- a/src/testbed.cu +++ b/src/testbed.cu @@ -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;