Changing timing of call to xr_interface->pre_draw_viewport

This commit is contained in:
Bastiaan Olij 2022-10-17 14:19:01 +11:00
parent 9afc8337bd
commit b742b4c6e6

View File

@ -614,19 +614,18 @@ void RendererViewport::draw_viewports() {
if (vp->use_xr) {
if (xr_interface.is_valid()) {
// Ignore update mode we have to commit frames to our XR interface
visible = true;
// Override our size, make sure it matches our required size and is created as a stereo target
Size2 xr_size = xr_interface->get_render_target_size();
_viewport_set_size(vp, xr_size.width, xr_size.height, xr_interface->get_view_count());
// Inform xr interface we're about to render its viewport, if this returns false we don't render
visible = xr_interface->pre_draw_viewport(vp->render_target);
} else {
// don't render anything
visible = false;
vp->size = Size2();
}
}
} else {
if (vp->update_mode == RS::VIEWPORT_UPDATE_ALWAYS || vp->update_mode == RS::VIEWPORT_UPDATE_ONCE) {
visible = true;
}
@ -641,6 +640,7 @@ void RendererViewport::draw_viewports() {
visible = true;
}
}
}
visible = visible && vp->size.x > 1 && vp->size.y > 1;
@ -664,6 +664,11 @@ void RendererViewport::draw_viewports() {
RSG::texture_storage->render_target_set_as_unused(vp->render_target);
if (vp->use_xr && xr_interface.is_valid()) {
// Inform XR interface we're about to render its viewport,
// if this returns false we don't render.
// This usually is a result of the player taking off their headset and OpenXR telling us to skip
// rendering frames.
if (xr_interface->pre_draw_viewport(vp->render_target)) {
RSG::texture_storage->render_target_set_override_color(vp->render_target, xr_interface->get_color_texture());
RSG::texture_storage->render_target_set_override_depth(vp->render_target, xr_interface->get_depth_texture());
RSG::texture_storage->render_target_set_override_velocity(vp->render_target, xr_interface->get_velocity_texture());
@ -674,8 +679,6 @@ void RendererViewport::draw_viewports() {
// and draw viewport
_draw_viewport(vp);
// measure
// commit our eyes
Vector<BlitToScreen> blits = xr_interface->post_draw_viewport(vp->render_target, vp->viewport_to_screen_rect);
if (vp->viewport_to_screen != DisplayServer::INVALID_WINDOW_ID) {
@ -694,6 +697,7 @@ void RendererViewport::draw_viewports() {
}
}
}
}
} else {
RSG::texture_storage->render_target_set_override_color(vp->render_target, RID()); // TODO if fullscreen output, we can set this to our texture chain
RSG::texture_storage->render_target_set_override_depth(vp->render_target, RID());