From 69026cbcd602e425f2e61ba82baed8ec5e2e076e Mon Sep 17 00:00:00 2001 From: Acaki Date: Thu, 7 Aug 2025 04:10:46 +0800 Subject: [PATCH] fix: start stream with graph enabled and metal doesn't show the graph --- .../StreamFrameViewController.m | 41 ++++++++++++++++--- 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/VoidLink/ViewControllers/StreamFrameViewController.m b/VoidLink/ViewControllers/StreamFrameViewController.m index 5ae4ae56..f0c45dcc 100644 --- a/VoidLink/ViewControllers/StreamFrameViewController.m +++ b/VoidLink/ViewControllers/StreamFrameViewController.m @@ -399,12 +399,26 @@ [self.imguiView.mtkView removeFromSuperview]; self.imguiView = nil; } - self.imguiView = [[ImGuiRenderer alloc] initWithFrame:self.view.bounds - streamFps:[_settings.framerate intValue] - enableGraphs:_settings.enableGraphs - graphOpacity:[_settings.graphOpacity intValue]]; - self.imguiView.mtkView.userInteractionEnabled = NO; - [self.view addSubview:self.imguiView.mtkView]; + + // Only create ImGui view if it doesn't exist or we're not using Metal rendering + // (Metal rendering creates it earlier in viewDidLoad) + if (!self.imguiView || [_settings.renderingBackend intValue] != RENDER_METAL) { + self.imguiView = [[ImGuiRenderer alloc] initWithFrame:self.view.bounds + streamFps:[_settings.framerate intValue] + enableGraphs:_settings.enableGraphs + graphOpacity:[_settings.graphOpacity intValue]]; + self.imguiView.mtkView.userInteractionEnabled = NO; + [self.view addSubview:self.imguiView.mtkView]; + } else { + // Update settings for existing ImGui view + self.imguiView.enableGraphs = _settings.enableGraphs; + self.imguiView.graphOpacity = [_settings.graphOpacity intValue] / 100.0f; + if (_settings.enableGraphs) { + [self.imguiView start]; + } else { + [self.imguiView hide]; + } + } // Ensure views are layered correctly if (self.metalViewController && self.metalViewController.view.superview) { @@ -711,6 +725,16 @@ [self.view addSubview:_tipLabel]; if ([_settings.renderingBackend intValue] == RENDER_METAL) { + // Create ImGui view first to get the metrics handler + if (!self.imguiView) { + self.imguiView = [[ImGuiRenderer alloc] initWithFrame:self.view.bounds + streamFps:[_settings.framerate intValue] + enableGraphs:_settings.enableGraphs + graphOpacity:[_settings.graphOpacity intValue]]; + self.imguiView.mtkView.userInteractionEnabled = NO; + [self.view addSubview:self.imguiView.mtkView]; + } + // Metal view for video Log(LOG_I, @"StreamFrameViewController creating MetalViewController"); self.metalViewController = [[MetalViewController alloc] initWithFrame:self.view.bounds @@ -722,6 +746,11 @@ [self.view addSubview:self.metalViewController.view]; [self.metalViewController didMoveToParentViewController:self]; [self.view bringSubviewToFront:self.metalViewController.view]; + + // Ensure ImGui view is on top of Metal view for graphs to be visible + if (self.imguiView && self.imguiView.mtkView.superview) { + [self.view bringSubviewToFront:self.imguiView.mtkView]; + } } }