From 0b99ad032ed63253aa3f534bcf8eee39a12c0388 Mon Sep 17 00:00:00 2001 From: HampusM Date: Wed, 22 Apr 2026 16:26:19 +0200 Subject: feat(engine): make opengl renderer module not handle window removals --- engine/src/renderer/opengl.rs | 75 +++++++++++++------------------------------ 1 file changed, 22 insertions(+), 53 deletions(-) (limited to 'engine/src/renderer') diff --git a/engine/src/renderer/opengl.rs b/engine/src/renderer/opengl.rs index d744da4..860416e 100644 --- a/engine/src/renderer/opengl.rs +++ b/engine/src/renderer/opengl.rs @@ -1,18 +1,15 @@ //! OpenGL renderer. -use std::any::type_name; use std::borrow::Cow; use std::collections::HashMap; use ecs::actions::Actions; -use ecs::event::component::Removed; -use ecs::pair::{Pair, Wildcard}; +use ecs::pair::Pair; use ecs::query::term::Without; use ecs::sole::Single; -use ecs::system::observer::Observe; use ecs::{Component, Query}; use glutin::display::GetGlDisplay; -use glutin::prelude::GlDisplay; +use glutin::prelude::{GlDisplay, PossiblyCurrentGlContext}; use glutin::surface::{ GlSurface, Surface as GlutinSurface, @@ -163,53 +160,6 @@ impl ecs::extension::Extension for Extension collector.add_system(*POST_RENDER_PHASE, prepare_windows); collector.add_system(*POST_RENDER_PHASE, init_window_graphics); - - collector.add_observer(handle_window_removed); - } -} - -#[tracing::instrument(skip_all)] -fn handle_window_removed(observe: Observe>, mut actions: Actions) -{ - for evt_match in &observe { - let window_ent_id = evt_match.id(); - - let window_ent = evt_match.get_ent_infallible(); - - tracing::debug!( - entity_id = %window_ent_id, - title = %evt_match.get_removed_comp().title, - "Handling removal of window" - ); - - actions.remove_comps::<(SurfaceSpec, WindowGlConfig)>(window_ent_id); - - let Some(with_renderer_ctx_pair) = window_ent - .get_first_wildcard_pair_match::() - else { - tracing::warn!( - "Window entity is missing a ({}, *) pair", - type_name::() - ); - continue; - }; - - let renderer_context_ent_id = with_renderer_ctx_pair.id().target_entity(); - - actions.remove_comps::<(GraphicsContext, RendererObjectStore)>( - renderer_context_ent_id, - ); - - actions.remove_components( - renderer_context_ent_id, - [Pair::builder() - .relation::() - .target_id(window_ent_id) - .build() - .id()], - ); - - actions.remove_components(window_ent_id, [with_renderer_ctx_pair.id()]); } } @@ -480,7 +430,7 @@ fn handle_commands( { let GraphicsContext { ref gl_context, - ref surfaces, + ref mut surfaces, ref mut shader_uniform_buffer_objs, objects: ref mut graphics_ctx_objects, next_object_key: ref mut next_graphics_ctx_object_key, @@ -496,6 +446,25 @@ fn handle_commands( let _tracing_span_enter = tracing_span.enter(); match command { + RendererCommand::RemoveSurface(surface_id) => { + let Some(surface) = surfaces.remove(&surface_id) else { + tracing::error!(surface_id=?surface_id, "Surface does not exist"); + continue; + }; + + if surface.is_current(gl_context.context()) { + opt_curr_gl_ctx = None; + + if let Err(err) = gl_context.context().make_not_current_in_place() + { + tracing::error!( + "Failed to make GL context not current: {err}" + ); + } + } + + drop(surface); + } RendererCommand::MakeCurrent(surface_id) => { let Some(surface) = surfaces.get(&surface_id) else { tracing::error!(surface_id=?surface_id, "Surface does not exist"); -- cgit v1.2.3-18-g5258