Skip to content

Commit fd672db

Browse files
committed
Merge pull request #112227 from dsnopek/openxr-composition-layers-viewport-size-changed
OpenXR: Fix resizing viewports used by `OpenXRCompositionLayer`
2 parents bb5c32a + ca0eb5d commit fd672db

File tree

5 files changed

+30
-6
lines changed

5 files changed

+30
-6
lines changed

drivers/gles3/storage/texture_storage.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2933,9 +2933,11 @@ void TextureStorage::render_target_set_msaa(RID p_render_target, RS::ViewportMSA
29332933

29342934
WARN_PRINT("2D MSAA is not yet supported for GLES3.");
29352935

2936-
_clear_render_target(rt);
2937-
rt->msaa = p_msaa;
2938-
_update_render_target_color(rt);
2936+
if (rt->overridden.color.is_null()) {
2937+
_clear_render_target(rt);
2938+
rt->msaa = p_msaa;
2939+
_update_render_target_color(rt);
2940+
}
29392941
}
29402942

29412943
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
29532955
return;
29542956
}
29552957

2956-
_clear_render_target(rt);
2957-
rt->hdr = p_use_hdr_2d;
2958-
_update_render_target_color(rt);
2958+
if (rt->overridden.color.is_null()) {
2959+
_clear_render_target(rt);
2960+
rt->hdr = p_use_hdr_2d;
2961+
_update_render_target_color(rt);
2962+
}
29592963
}
29602964

29612965
bool TextureStorage::render_target_is_using_hdr(RID p_render_target) const {

modules/openxr/extensions/openxr_composition_layer_extension.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,8 @@ void OpenXRCompositionLayerExtension::CompositionLayer::set_viewport(RID p_viewp
232232
free_swapchain();
233233
subviewport.viewport_size = Size2i();
234234
}
235+
} else if (subviewport.viewport_size != p_size) {
236+
subviewport.viewport_size = p_size;
235237
}
236238
}
237239

modules/openxr/scene/openxr_composition_layer.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,12 @@ void OpenXRCompositionLayer::_clear_composition_layer() {
244244
}
245245
}
246246

247+
void OpenXRCompositionLayer::_viewport_size_changed() {
248+
if (layer_viewport && openxr_session_running && composition_layer_extension && is_natively_supported() && is_visible() && is_inside_tree()) {
249+
composition_layer_extension->composition_layer_set_viewport(composition_layer, layer_viewport->get_viewport_rid(), layer_viewport->get_size());
250+
}
251+
}
252+
247253
void OpenXRCompositionLayer::_on_openxr_session_begun() {
248254
openxr_session_running = true;
249255
if (_should_register()) {
@@ -298,12 +304,18 @@ void OpenXRCompositionLayer::set_layer_viewport(SubViewport *p_viewport) {
298304
ERR_FAIL_COND_MSG(p_viewport != nullptr, RTR("Cannot set SubViewport on an OpenXR composition layer when using an Android surface."));
299305
}
300306

307+
if (layer_viewport) {
308+
layer_viewport->disconnect("size_changed", callable_mp(this, &OpenXRCompositionLayer::_viewport_size_changed));
309+
}
310+
301311
layer_viewport = p_viewport;
302312
if (_should_register()) {
303313
_setup_composition_layer();
304314
}
305315

306316
if (layer_viewport) {
317+
layer_viewport->connect("size_changed", callable_mp(this, &OpenXRCompositionLayer::_viewport_size_changed));
318+
307319
SubViewport::UpdateMode update_mode = layer_viewport->get_update_mode();
308320
if (update_mode == SubViewport::UPDATE_WHEN_VISIBLE || update_mode == SubViewport::UPDATE_WHEN_PARENT_VISIBLE) {
309321
WARN_PRINT_ONCE("OpenXR composition layers cannot use SubViewports with UPDATE_WHEN_VISIBLE or UPDATE_WHEN_PARENT_VISIBLE. Switching to UPDATE_ALWAYS.");

modules/openxr/scene/openxr_composition_layer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ class OpenXRCompositionLayer : public Node3D {
115115
void _setup_composition_layer();
116116
void _clear_composition_layer();
117117

118+
void _viewport_size_changed();
119+
118120
protected:
119121
OpenXRAPI *openxr_api = nullptr;
120122
OpenXRCompositionLayerExtension *composition_layer_extension = nullptr;

servers/rendering/renderer_rd/storage_rd/texture_storage.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3542,6 +3542,10 @@ void TextureStorage::_clear_render_target(RenderTarget *rt) {
35423542
}
35433543

35443544
void TextureStorage::_update_render_target(RenderTarget *rt) {
3545+
if (rt->overridden.color.is_valid()) {
3546+
return;
3547+
}
3548+
35453549
if (rt->texture.is_null()) {
35463550
//create a placeholder until updated
35473551
rt->texture = texture_allocate();

0 commit comments

Comments
 (0)