1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-04 12:00:25 +00:00

Merge pull request #112227 from dsnopek/openxr-composition-layers-viewport-size-changed

OpenXR: Fix resizing viewports used by `OpenXRCompositionLayer`
This commit is contained in:
Thaddeus Crews
2025-10-31 09:23:24 -05:00
5 changed files with 30 additions and 6 deletions

View File

@@ -2933,9 +2933,11 @@ void TextureStorage::render_target_set_msaa(RID p_render_target, RS::ViewportMSA
WARN_PRINT("2D MSAA is not yet supported for GLES3."); WARN_PRINT("2D MSAA is not yet supported for GLES3.");
_clear_render_target(rt); if (rt->overridden.color.is_null()) {
rt->msaa = p_msaa; _clear_render_target(rt);
_update_render_target_color(rt); rt->msaa = p_msaa;
_update_render_target_color(rt);
}
} }
RS::ViewportMSAA TextureStorage::render_target_get_msaa(RID p_render_target) const { RS::ViewportMSAA TextureStorage::render_target_get_msaa(RID p_render_target) const {
@@ -2953,9 +2955,11 @@ void TextureStorage::render_target_set_use_hdr(RID p_render_target, bool p_use_h
return; return;
} }
_clear_render_target(rt); if (rt->overridden.color.is_null()) {
rt->hdr = p_use_hdr_2d; _clear_render_target(rt);
_update_render_target_color(rt); rt->hdr = p_use_hdr_2d;
_update_render_target_color(rt);
}
} }
bool TextureStorage::render_target_is_using_hdr(RID p_render_target) const { bool TextureStorage::render_target_is_using_hdr(RID p_render_target) const {

View File

@@ -232,6 +232,8 @@ void OpenXRCompositionLayerExtension::CompositionLayer::set_viewport(RID p_viewp
free_swapchain(); free_swapchain();
subviewport.viewport_size = Size2i(); subviewport.viewport_size = Size2i();
} }
} else if (subviewport.viewport_size != p_size) {
subviewport.viewport_size = p_size;
} }
} }

View File

@@ -244,6 +244,12 @@ void OpenXRCompositionLayer::_clear_composition_layer() {
} }
} }
void OpenXRCompositionLayer::_viewport_size_changed() {
if (layer_viewport && openxr_session_running && composition_layer_extension && is_natively_supported() && is_visible() && is_inside_tree()) {
composition_layer_extension->composition_layer_set_viewport(composition_layer, layer_viewport->get_viewport_rid(), layer_viewport->get_size());
}
}
void OpenXRCompositionLayer::_on_openxr_session_begun() { void OpenXRCompositionLayer::_on_openxr_session_begun() {
openxr_session_running = true; openxr_session_running = true;
if (_should_register()) { if (_should_register()) {
@@ -298,12 +304,18 @@ void OpenXRCompositionLayer::set_layer_viewport(SubViewport *p_viewport) {
ERR_FAIL_COND_MSG(p_viewport != nullptr, RTR("Cannot set SubViewport on an OpenXR composition layer when using an Android surface.")); ERR_FAIL_COND_MSG(p_viewport != nullptr, RTR("Cannot set SubViewport on an OpenXR composition layer when using an Android surface."));
} }
if (layer_viewport) {
layer_viewport->disconnect("size_changed", callable_mp(this, &OpenXRCompositionLayer::_viewport_size_changed));
}
layer_viewport = p_viewport; layer_viewport = p_viewport;
if (_should_register()) { if (_should_register()) {
_setup_composition_layer(); _setup_composition_layer();
} }
if (layer_viewport) { if (layer_viewport) {
layer_viewport->connect("size_changed", callable_mp(this, &OpenXRCompositionLayer::_viewport_size_changed));
SubViewport::UpdateMode update_mode = layer_viewport->get_update_mode(); SubViewport::UpdateMode update_mode = layer_viewport->get_update_mode();
if (update_mode == SubViewport::UPDATE_WHEN_VISIBLE || update_mode == SubViewport::UPDATE_WHEN_PARENT_VISIBLE) { if (update_mode == SubViewport::UPDATE_WHEN_VISIBLE || update_mode == SubViewport::UPDATE_WHEN_PARENT_VISIBLE) {
WARN_PRINT_ONCE("OpenXR composition layers cannot use SubViewports with UPDATE_WHEN_VISIBLE or UPDATE_WHEN_PARENT_VISIBLE. Switching to UPDATE_ALWAYS."); WARN_PRINT_ONCE("OpenXR composition layers cannot use SubViewports with UPDATE_WHEN_VISIBLE or UPDATE_WHEN_PARENT_VISIBLE. Switching to UPDATE_ALWAYS.");

View File

@@ -115,6 +115,8 @@ private:
void _setup_composition_layer(); void _setup_composition_layer();
void _clear_composition_layer(); void _clear_composition_layer();
void _viewport_size_changed();
protected: protected:
OpenXRAPI *openxr_api = nullptr; OpenXRAPI *openxr_api = nullptr;
OpenXRCompositionLayerExtension *composition_layer_extension = nullptr; OpenXRCompositionLayerExtension *composition_layer_extension = nullptr;

View File

@@ -3542,6 +3542,10 @@ void TextureStorage::_clear_render_target(RenderTarget *rt) {
} }
void TextureStorage::_update_render_target(RenderTarget *rt) { void TextureStorage::_update_render_target(RenderTarget *rt) {
if (rt->overridden.color.is_valid()) {
return;
}
if (rt->texture.is_null()) { if (rt->texture.is_null()) {
//create a placeholder until updated //create a placeholder until updated
rt->texture = texture_allocate(); rt->texture = texture_allocate();