1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-17 14:11:06 +00:00

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 (vp->use_xr) {
if (xr_interface.is_valid()) { 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 // 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(); Size2 xr_size = xr_interface->get_render_target_size();
_viewport_set_size(vp, xr_size.width, xr_size.height, xr_interface->get_view_count()); _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 { } else {
// don't render anything // don't render anything
visible = false; visible = false;
vp->size = Size2(); vp->size = Size2();
} }
} } else {
if (vp->update_mode == RS::VIEWPORT_UPDATE_ALWAYS || vp->update_mode == RS::VIEWPORT_UPDATE_ONCE) { if (vp->update_mode == RS::VIEWPORT_UPDATE_ALWAYS || vp->update_mode == RS::VIEWPORT_UPDATE_ONCE) {
visible = true; visible = true;
} }
@@ -641,6 +640,7 @@ void RendererViewport::draw_viewports() {
visible = true; visible = true;
} }
} }
}
visible = visible && vp->size.x > 1 && vp->size.y > 1; 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); RSG::texture_storage->render_target_set_as_unused(vp->render_target);
if (vp->use_xr && xr_interface.is_valid()) { 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_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_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()); 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 // and draw viewport
_draw_viewport(vp); _draw_viewport(vp);
// measure
// commit our eyes // commit our eyes
Vector<BlitToScreen> blits = xr_interface->post_draw_viewport(vp->render_target, vp->viewport_to_screen_rect); 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) { if (vp->viewport_to_screen != DisplayServer::INVALID_WINDOW_ID) {
@@ -694,6 +697,7 @@ void RendererViewport::draw_viewports() {
} }
} }
} }
}
} else { } 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_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()); RSG::texture_storage->render_target_set_override_depth(vp->render_target, RID());