summaryrefslogtreecommitdiff
path: root/engine/src/renderer/opengl.rs
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2026-04-22 16:26:19 +0200
committerHampusM <hampus@hampusmat.com>2026-04-22 16:26:19 +0200
commit0b99ad032ed63253aa3f534bcf8eee39a12c0388 (patch)
treebe3137fc0ca946dc0b4728853aabe7dd70446aca /engine/src/renderer/opengl.rs
parent4c378d7173fae64ea77c6ead7258c30ff64f2789 (diff)
feat(engine): make opengl renderer module not handle window removals
Diffstat (limited to 'engine/src/renderer/opengl.rs')
-rw-r--r--engine/src/renderer/opengl.rs75
1 files changed, 22 insertions, 53 deletions
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<Pair<Removed, Window>>, 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::<WindowUsingRendererCtx, Wildcard>()
- else {
- tracing::warn!(
- "Window entity is missing a ({}, *) pair",
- type_name::<WindowUsingRendererCtx>()
- );
- 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::<RendererCtxUsedByWindow>()
- .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");