From b62aed86f920860030db10e0841524691a99cdc9 Mon Sep 17 00:00:00 2001 From: Haroon Qureshi Date: Thu, 12 Mar 2026 04:56:10 -0700 Subject: [PATCH] Recreate swap chain when the window size changes. PiperOrigin-RevId: 882521107 Change-Id: I0d29d2e323e7830256c24eead439b3f2eb55de40 --- .../filament/filament/filament_context.cc | 13 +++++++++++++ .../filament/filament/filament_context.h | 2 ++ 2 files changed, 15 insertions(+) diff --git a/src/experimental/filament/filament/filament_context.cc b/src/experimental/filament/filament/filament_context.cc index 844d3cf1..e514e1d7 100644 --- a/src/experimental/filament/filament/filament_context.cc +++ b/src/experimental/filament/filament/filament_context.cc @@ -140,6 +140,19 @@ void FilamentContext::Render(const mjrRect& viewport, const mjvScene* scene, mju_error("Unexpected context."); } + // If we're rendering to the window, and the window size has changed, we need + // to reacquire the swap chain. + if (scene_swap_chain_target_ == kWindowSwapChain && + (viewport.width != window_width_ || viewport.height != window_height_)) { + if (window_width_ != 0 && window_height_ != 0) { + engine_->flushAndWait(); + engine_->destroy(window_swap_chain_); + window_swap_chain_ = engine_->createSwapChain(config_.native_window); + } + window_width_ = viewport.width; + window_height_ = viewport.height; + } + scene_view_->SetViewport(viewport); scene_view_->UpdateScene(con, scene); // Update the UX renderable entity after processing the scene in case there diff --git a/src/experimental/filament/filament/filament_context.h b/src/experimental/filament/filament/filament_context.h index dc460d9f..d0e7a75e 100644 --- a/src/experimental/filament/filament/filament_context.h +++ b/src/experimental/filament/filament/filament_context.h @@ -89,6 +89,8 @@ class FilamentContext { std::unique_ptr object_manager_; std::unique_ptr scene_view_; std::unique_ptr gui_view_; + int window_width_ = 0; + int window_height_ = 0; }; } // namespace mujoco